Skip to content

fix(camera): invalidate projection cache on fov/near/far change#357

Open
RaananW wants to merge 2 commits into
masterfrom
raananw-super-tribble
Open

fix(camera): invalidate projection cache on fov/near/far change#357
RaananW wants to merge 2 commits into
masterfrom
raananw-super-tribble

Conversation

@RaananW

@RaananW RaananW commented Jul 2, 2026

Copy link
Copy Markdown
Member

Fixes #271.

Problem

Changing camera.fov, camera.nearPlane, or camera.farPlane at runtime did not update the rendered projection until the camera moved or the aspect ratio changed.

getProjectionMatrix() cached the matrix keyed on worldMatrixVersion + aspect. But the perspective projection depends only on (fov, aspect, nearPlane, farPlane) — never on the world matrix. Mutating the public projection fields left worldMatrixVersion unchanged, so the stale cached matrix was reused. Moving the camera bumped worldMatrixVersion, which is why the change 'became visible after moving.'

Fix

  • getProjectionMatrix now keys the cache on its real inputs: fov, aspect, nearPlane, farPlane.
  • getViewProjectionMatrix keeps the view key (worldMatrixVersion) and additionally tracks the projection inputs.
  • updateShadowCameraBase injects 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.fov every 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.
  • bundle-size spec — 204 passed.
  • 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.

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>
Copilot AI review requested due to automatic review settings July 2, 2026 19:00

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 getProjectionMatrix and getViewProjectionMatrix caching to invalidate on (fov, aspect, nearPlane, farPlane) changes (instead of worldMatrixVersion for 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.

Comment thread playground/examples/camera-fov-invalidation.ts Outdated
Comment thread packages/babylon-lite/src/camera/camera.ts
@bjsplat

bjsplat commented Jul 2, 2026

Copy link
Copy Markdown

Bundle Size Changes

Increases

Package Current Master Change
Scene 10 — PBR Rough Sphere
scene10
53 KB 52 KB +1 KB
Scene 12 — PBR Shader Balls
scene12
104 KB 103 KB +1 KB
Scene 14 — Flight Helmet
scene14
90 KB 89 KB +1 KB
Scene 15 — SpotLights + Ground
scene15
48 KB 47 KB +1 KB
Scene 38 — Procedural Builders
scene38
62 KB 61 KB +1 KB
Scene 45 — Physics Collision Filtering
scene45
52 KB 51 KB +1 KB
Scene 48 — Physics Center of Mass
scene48
55 KB 54 KB +1 KB
Scene 55 — Billboard Sorting
scene55
32 KB 31 KB +1 KB
Scene 61 — NME Normal As Color
scene61
55 KB 54 KB +1 KB
Scene 67 — NME PBR Core
scene67
77 KB 76 KB +1 KB
Scene 72 — NME PBR Full (D8AK3Z)
scene72
109 KB 108 KB +1 KB
Scene 75 — Effect RTT Sphere
scene75
51 KB 50 KB +1 KB
Scene 82 — NME Procedural Noise
scene82
67 KB 66 KB +1 KB
Scene 83 — NME Normals
scene83
71 KB 70 KB +1 KB
Scene 85 — NME Matrix
scene85
61 KB 60 KB +1 KB
Scene 90 — CSG Operations
scene90
60 KB 59 KB +1 KB
Scene 100 — Physics Collision Event
scene100
51 KB 50 KB +1 KB
Scene 105 — Character Controller + Moving Platform
scene105
103 KB 102 KB +1 KB
Scene 125 — Gaussian Splatting bakeCurrentTransformIntoVertices
scene125
38 KB 37 KB +1 KB
Scene 127 — Gaussian Splatting Depth Rendering
scene127
59 KB 58 KB +1 KB
Scene 128 — Gaussian Splatting Depth Rendering (Alpha-blended)
scene128
59 KB 58 KB +1 KB
Scene 143 — Pipelined Post-processes
scene143
71 KB 70 KB +1 KB
Scene 150 — Manual X Slide Animation
scene150
56 KB 55 KB +1 KB
Scene 157 — glTF Weighted Animation Blend
scene157
96 KB 95 KB +1 KB
Scene 175 - Navigation Raycast
scene175
96 KB 95 KB +1 KB
Scene 202 - LWR Point Light
scene202
50 KB 49 KB +1 KB
Scene 206 - LWR Cutout Billboards
scene206
63 KB 62 KB +1 KB
Scene 209 — LWR Physics
scene209
55 KB 54 KB +1 KB
Scene 212 - DispersionTest glTF
scene212
105 KB 104 KB +1 KB
Scene 214 — Cascaded Shadow Maps
scene214
69 KB 68 KB +1 KB
Scene 218 — Vertex Animation Texture (VAT)
scene218
93 KB 92 KB +1 KB
Scene 227 — Multi-Canvas (Same Scene)
scene227
49 KB 48 KB +1 KB
Scene 245 — RecursiveSkeletons
scene245
101 KB 100 KB +1 KB

Sizes rounded to nearest KB. Run pnpm build:bundle-scenes locally to verify.

@bjsplat

bjsplat commented Jul 2, 2026

Copy link
Copy Markdown

Lab - Static Site

Open deployed site

Build 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>
@bjsplat

bjsplat commented Jul 2, 2026

Copy link
Copy Markdown

Bundle Size Changes

Increases

Package Current Master Change
Scene 10 — PBR Rough Sphere
scene10
53 KB 52 KB +1 KB
Scene 12 — PBR Shader Balls
scene12
104 KB 103 KB +1 KB
Scene 14 — Flight Helmet
scene14
90 KB 89 KB +1 KB
Scene 15 — SpotLights + Ground
scene15
48 KB 47 KB +1 KB
Scene 38 — Procedural Builders
scene38
62 KB 61 KB +1 KB
Scene 45 — Physics Collision Filtering
scene45
52 KB 51 KB +1 KB
Scene 48 — Physics Center of Mass
scene48
55 KB 54 KB +1 KB
Scene 55 — Billboard Sorting
scene55
32 KB 31 KB +1 KB
Scene 61 — NME Normal As Color
scene61
55 KB 54 KB +1 KB
Scene 67 — NME PBR Core
scene67
77 KB 76 KB +1 KB
Scene 72 — NME PBR Full (D8AK3Z)
scene72
109 KB 108 KB +1 KB
Scene 75 — Effect RTT Sphere
scene75
51 KB 50 KB +1 KB
Scene 82 — NME Procedural Noise
scene82
67 KB 66 KB +1 KB
Scene 83 — NME Normals
scene83
71 KB 70 KB +1 KB
Scene 85 — NME Matrix
scene85
61 KB 60 KB +1 KB
Scene 90 — CSG Operations
scene90
60 KB 59 KB +1 KB
Scene 100 — Physics Collision Event
scene100
51 KB 50 KB +1 KB
Scene 105 — Character Controller + Moving Platform
scene105
103 KB 102 KB +1 KB
Scene 125 — Gaussian Splatting bakeCurrentTransformIntoVertices
scene125
38 KB 37 KB +1 KB
Scene 127 — Gaussian Splatting Depth Rendering
scene127
59 KB 58 KB +1 KB
Scene 128 — Gaussian Splatting Depth Rendering (Alpha-blended)
scene128
59 KB 58 KB +1 KB
Scene 143 — Pipelined Post-processes
scene143
71 KB 70 KB +1 KB
Scene 150 — Manual X Slide Animation
scene150
56 KB 55 KB +1 KB
Scene 157 — glTF Weighted Animation Blend
scene157
96 KB 95 KB +1 KB
Scene 175 - Navigation Raycast
scene175
96 KB 95 KB +1 KB
Scene 202 - LWR Point Light
scene202
50 KB 49 KB +1 KB
Scene 206 - LWR Cutout Billboards
scene206
63 KB 62 KB +1 KB
Scene 209 — LWR Physics
scene209
55 KB 54 KB +1 KB
Scene 212 - DispersionTest glTF
scene212
105 KB 104 KB +1 KB
Scene 214 — Cascaded Shadow Maps
scene214
69 KB 68 KB +1 KB
Scene 218 — Vertex Animation Texture (VAT)
scene218
93 KB 92 KB +1 KB
Scene 227 — Multi-Canvas (Same Scene)
scene227
49 KB 48 KB +1 KB
Scene 245 — RecursiveSkeletons
scene245
101 KB 100 KB +1 KB

Sizes rounded to nearest KB. Run pnpm build:bundle-scenes locally to verify.

@bjsplat

bjsplat commented Jul 2, 2026

Copy link
Copy Markdown

Lab - Static Site

Open deployed site

Build 20260702.17 - merge @ debeacf

@RaananW RaananW enabled auto-merge (squash) July 3, 2026 10:14

@sebavan sebavan left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 ?

@RaananW

RaananW commented Jul 3, 2026

Copy link
Copy Markdown
Member Author

@sebavan - Size increase is 0.1k, rounded to 1kb in the report. What perf hit do you see? the variable assignment?

@sebavan

sebavan commented Jul 3, 2026

Copy link
Copy Markdown
Member

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.

@RaananW

RaananW commented Jul 3, 2026

Copy link
Copy Markdown
Member Author

the extra 3 comparisons? is runs once per camera per frame, I can't really think of a cleaner way of doing that.
A "dirty" flag will, most certainly hurt performance or make the user force an update on their own. This is the other available solution - make the user set a flag saying "i changed the fov", or making the fov and the others a getter/setter.
comparisons are relatively cheap, but if you see it any other way I will change it, of couse

@sebavan

sebavan commented Jul 3, 2026

Copy link
Copy Markdown
Member

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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Camera projection cache not invalidated after changing public projection properties

4 participants