fix(camera): invalidate projection cache on fov/near/far change#357
fix(camera): invalidate projection cache on fov/near/far change#357RaananW wants to merge 2 commits into
Conversation
getProjectionMatrix cached by worldMatrixVersion + aspect, but the projection matrix depends only on (fov, aspect, nearPlane, farPlane) and never on the world matrix. Mutating the public fov/nearPlane/farPlane fields left worldMatrixVersion unchanged, so the stale cached matrix was reused until the camera moved or the aspect ratio changed (#271). Key the projection cache on its real inputs (fov/aspect/near/far) and extend the view-projection cache key with the same projection inputs so runtime changes take effect on the next frame. The shadow camera facade injects a custom light-space vp matrix directly, so updateShadowCameraBase now also seeds the new vp cache-key fields to keep that injection valid. Adds a playground example (camera-fov-invalidation) that pulses fov on a static camera as a live repro/verification. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
There was a problem hiding this comment.
Pull request overview
Fixes a core camera caching bug where runtime updates to camera.fov, camera.nearPlane, or camera.farPlane were not reflected until the camera moved or the aspect ratio changed, by keying the projection/view-projection caches on the actual projection inputs.
Changes:
- Reworked
getProjectionMatrixandgetViewProjectionMatrixcaching to invalidate on(fov, aspect, nearPlane, farPlane)changes (instead ofworldMatrixVersionfor projection). - Updated shadow-camera cache seeding so injected light-space view-projection matrices remain valid under the new cache keying.
- Added a playground repro example and regenerated per-scene bundle manifests.
Reviewed changes
Copilot reviewed 201 out of 201 changed files in this pull request and generated 2 comments.
Show a summary per file
| File | Description |
|---|---|
| playground/src/examples.ts | Registers the new repro example in the playground examples list. |
| playground/examples/camera-fov-invalidation.ts | Adds a focused repro that pulses camera.fov (and near/far) without moving the camera. |
| packages/babylon-lite/src/shadow/shadow-base.ts | Seeds additional VP cache-key fields for injected shadow view-projection matrices. |
| packages/babylon-lite/src/camera/camera.ts | Keys projection caches on projection inputs so runtime fov/near/far mutations take effect immediately. |
| lab/public/bundle/manifest/scene1.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene2.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene3.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene4.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene5.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene6.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene7.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene8.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene9.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene10.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene11.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene12.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene13.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene14.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene15.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene16.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene17.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene18.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene19.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene20.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene21.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene22.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene23.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene24.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene25.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene26.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene27.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene28.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene29.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene30.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene31.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene32.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene33.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene34.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene35.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene36.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene37.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene38.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene39.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene40.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene41.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene42.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene43.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene44.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene45.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene46.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene47.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene48.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene49.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene52.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene53.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene54.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene55.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene56.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene57.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene59.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene60.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene61.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene62.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene63.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene64.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene65.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene66.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene67.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene68.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene69.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene70.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene71.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene72.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene73.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene75.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene77.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene78.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene79.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene80.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene81.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene82.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene83.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene84.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene85.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene86.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene87.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene88.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene89.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene90.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene91.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene94.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene95.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene98.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene99.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene100.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene101.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene102.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene103.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene104.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene105.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene106.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene110.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene111.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene112.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene113.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene114.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene115.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene116.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene120.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene121.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene122.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene123.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene124.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene125.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene126.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene127.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene128.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene129.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene140.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene141.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene142.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene143.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene144.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene145.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene146.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene147.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene148.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene149.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene150.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene151.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene152.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene154.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene155.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene156.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene157.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene158.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene159.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene160.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene161.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene162.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene163.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene164.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene165.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene170.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene171.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene172.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene173.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene174.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene175.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene176.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene177.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene178.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene179.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene181.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene200.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene201.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene202.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene203.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene204.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene205.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene206.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene207.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene209.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene210.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene211.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene212.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene213.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene214.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene215.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene216.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene217.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene218.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene219.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene221.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene222.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene223.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene224.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene225.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene227.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene228.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene229.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene240.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene241.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene242.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene243.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene244.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene245.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene246.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene247.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene248.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene249.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene251.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene252.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene253.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene254.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene255.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene257.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene258.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene259.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene260.json | Updates bundle-size baseline after camera cache-key change. |
| lab/public/bundle/manifest/scene261.json | Updates bundle-size baseline after camera cache-key change. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
Bundle Size ChangesIncreases
Sizes rounded to nearest KB. Run |
Lab - Static SiteBuild 20260702.16 - merge @ 0649cb7 |
Address Copilot PR review feedback on #357: - Add unit test (tests/lite/unit/camera-projection-cache.test.ts) covering that fov / nearPlane / farPlane changes invalidate the projection and view-projection caches on a stationary camera (worldMatrixVersion fixed), plus aspect-ratio invalidation and cache stability when nothing changes. - Clarify the playground repro doc/comment: the camera is only stationary if you don't orbit; attachControl stays enabled for inspection but interacting bumps worldMatrixVersion and would mask the old bug. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Bundle Size ChangesIncreases
Sizes rounded to nearest KB. Run |
Lab - Static SiteBuild 20260702.17 - merge @ debeacf |
sebavan
left a comment
There was a problem hiding this comment.
Code LGTM. Regarding the size growth and perf hit. Wondering if we should have a manual invalidate instead or props to prevent the extra check every frame ? Not sure those params animates for instance ?
|
@sebavan - Size increase is 0.1k, rounded to 1kb in the report. What perf hit do you see? the variable assignment? |
|
I am thinking of the constant check for changes on every call to getProjectionMatrix which on its own is pretty much nothing but one of the reason lite is so much faster than .js when adding it up accross the app. |
|
the extra 3 comparisons? is runs once per camera per frame, I can't really think of a cleaner way of doing that. |
|
yup this is what I meant by "manual invalidate instead or props", those are the 2 other options and they might be a better fit for lite favoring raw perf despite more verbose coding. Manual invalidate function could be ok as it would probably only be used in an editor scenario or not so common fov animation. so only those would pay byte + cpu cost. I let you pick the right approach with @ryantrem. |
Fixes #271.
Problem
Changing
camera.fov,camera.nearPlane, orcamera.farPlaneat runtime did not update the rendered projection until the camera moved or the aspect ratio changed.getProjectionMatrix()cached the matrix keyed onworldMatrixVersion+ aspect. But the perspective projection depends only on(fov, aspect, nearPlane, farPlane)— never on the world matrix. Mutating the public projection fields leftworldMatrixVersionunchanged, so the stale cached matrix was reused. Moving the camera bumpedworldMatrixVersion, which is why the change 'became visible after moving.'Fix
getProjectionMatrixnow keys the cache on its real inputs: fov, aspect, nearPlane, farPlane.getViewProjectionMatrixkeeps the view key (worldMatrixVersion) and additionally tracks the projection inputs.updateShadowCameraBaseinjects a custom light-space vp matrix directly, so it now also seeds the new vp cache-key fields to keep that injection valid.No public API change —
camera.fov = …now takes effect on the next frame.Repro / verification
Added a playground example 'Camera — FOV cache invalidation (#271)' that pulses
camera.fovevery frame on a static camera whose worldMatrixVersion never changes. Before the fix the scene was frozen at the initial FOV; with the fix the cubes visibly breathe in/out.Testing
pnpm run lint— clean.pnpm build:bundle-scenes— manifests regenerated/committed; largest delta ~+0.2 KB raw, all within ceilings.pnpm test:parity— 418 passed, 2 failed (scene116, scene144). Both reproduce byte-identically on master (verified by stashing the change), so pre-existing and unrelated.