Skip to content

feat: add thin-instance LOD and CSM caster caps#421

Merged
RaananW merged 8 commits into
masterfrom
feat/thin-instance-lod-culling
Jul 17, 2026
Merged

feat: add thin-instance LOD and CSM caster caps#421
RaananW merged 8 commits into
masterfrom
feat/thin-instance-lod-culling

Conversation

@deltakosh

@deltakosh deltakosh commented Jul 16, 2026

Copy link
Copy Markdown
Contributor

Summary

  • add GPU-driven thin-instance distance LOD through setThinInstanceLodPartner and clearThinInstanceLodPartner, with near/far compaction buckets, deterministic transition bands, partner lifecycle handling, and safe fallback behavior
  • preserve the selected pixel's original framebuffer fragmentCoord in GPU picking discard shaders, including DPR and camera viewport offsets
  • add setShadowCasterMaxCascade so CSM casters can skip far cascade layers, including incremental live cap updates when the caster array is re-supplied
  • retry transient GitHub 429/5xx responses in release-marker validation, with a child-process regression for the Azure failure seen on this PR
  • update architecture docs, regression coverage, and all affected per-scene bundle manifests

Validation

  • pnpm run lint
  • pnpm test:unit: 885 passed
  • pnpm test: all 214 bundle builds and every bundle ceiling passed; parity completed with 427 passed and the five established local baseline failures in Scenes 47, 104, 105, 106, and 265
  • clean origin/master reproduced the exact Scene 104, 105, 106, and 265 MAD values; Scene 47 is the known nondeterministic Havok baseline
  • visual GPU probe confirmed all 121 instances switch between the full-detail and LOD meshes, with one compute dispatch and two indirect draws

Bundle size

  • Scene 1: 88.2 KB -> 88.2 KB (+0.0 KB)
  • Scene 214 CSM: 68.4 KB -> 68.5 KB (+0.1 KB, limit 69 KB)
  • Scene 215 CSM PBR: 80.0 KB -> 80.1 KB (+0.1 KB, limit 80.1 KB)
  • no bundle ceilings changed

Add GPU-driven near/far thin-instance partitioning with partner lifecycle handling, preserve original framebuffer coordinates for picking discard shaders, and support per-caster CSM cascade limits.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

Copilot-Session: 956e9bbb-057c-48ee-87ad-0e25093fd1ce
Copilot AI review requested due to automatic review settings July 16, 2026 22:28

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.

Copilot encountered an error and was unable to review this pull request. You can try again by re-requesting a review.

@bjsplat

bjsplat commented Jul 16, 2026

Copy link
Copy Markdown

API Changes

API Extractor detected public API changes for @babylonjs/lite.

No removed public API lines were detected; this appears to be additive.

API Extractor diff
diff --git a/home/vsts/work/1/s/test-results/api-report/target/temp/babylon-lite.api.md b/home/vsts/work/1/s/test-results/api-report/current/temp/babylon-lite.api.md
index 0910ad69..2778db08 100644
--- a/home/vsts/work/1/s/test-results/api-report/target/temp/babylon-lite.api.md
+++ b/home/vsts/work/1/s/test-results/api-report/current/temp/babylon-lite.api.md
@@ -959,6 +959,9 @@ export function clearSprite2DLayer(layer: Sprite2DLayer): void;
 // @public
 export function clearSpriteAnimations(manager: SpriteAnimationManager): void;
 
+// @public
+export function clearThinInstanceLodPartner(fullMesh: Mesh): void;
+
 // @public
 export type ClipPlane = readonly [number, number, number, number];
 
@@ -4911,6 +4914,9 @@ export function setShaderUniform(material: ShaderMaterial, name: string, value:
 // @public
 export function setShaderVector3(material: ShaderMaterial, name: string, value: readonly [number, number, number]): void;
 
+// @public
+export function setShadowCasterMaxCascade(mesh: Mesh, maxCascade: number): void;
+
 // @public
 export function setShadowTaskCasterMeshes(shadowGenerator: ShadowGenerator, casterMeshes: readonly Mesh[]): void;
 
@@ -4985,6 +4991,9 @@ export function setThinInstanceCullBoundsPad(mesh: Mesh, pad: number): void;
 // @public
 export function setThinInstanceDrawCount(mesh: Mesh, count: number): void;
 
+// @public
+export function setThinInstanceLodPartner(fullMesh: Mesh, lodMesh: Mesh, options: ThinInstanceLodPartnerOptions): void;
+
 // @public
 export function setThinInstanceMatrix(mesh: Mesh, index: number, matrix: Mat4): void;
 
@@ -6028,6 +6037,12 @@ export interface ThinInstanceData {
     matrices: Float32Array | Float64Array;
 }
 
+// @public
+export interface ThinInstanceLodPartnerOptions {
+    band?: number;
+    distance: number;
+}
+
 // @public
 export interface TintProps {
     atDistance?: number;

@bjsplat

bjsplat commented Jul 16, 2026

Copy link
Copy Markdown

Lite Playground - Static Site

Open deployed site

Build 20260716.9 - merge @ 184bf43

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

Copilot-Session: 956e9bbb-057c-48ee-87ad-0e25093fd1ce
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

Copilot-Session: 956e9bbb-057c-48ee-87ad-0e25093fd1ce
@deltakosh deltakosh closed this Jul 16, 2026
@deltakosh deltakosh reopened this Jul 16, 2026
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

Copilot-Session: 956e9bbb-057c-48ee-87ad-0e25093fd1ce
Retry GitHub 429 and 5xx responses before failing release-marker validation, preventing short API outages from failing required PR checks.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

Copilot-Session: 956e9bbb-057c-48ee-87ad-0e25093fd1ce
@bjsplat

bjsplat commented Jul 17, 2026

Copy link
Copy Markdown

API Changes

API Extractor detected public API changes for @babylonjs/lite.

No removed public API lines were detected; this appears to be additive.

API Extractor diff
diff --git a/home/vsts/work/1/s/test-results/api-report/target/temp/babylon-lite.api.md b/home/vsts/work/1/s/test-results/api-report/current/temp/babylon-lite.api.md
index 0910ad69..2778db08 100644
--- a/home/vsts/work/1/s/test-results/api-report/target/temp/babylon-lite.api.md
+++ b/home/vsts/work/1/s/test-results/api-report/current/temp/babylon-lite.api.md
@@ -959,6 +959,9 @@ export function clearSprite2DLayer(layer: Sprite2DLayer): void;
 // @public
 export function clearSpriteAnimations(manager: SpriteAnimationManager): void;
 
+// @public
+export function clearThinInstanceLodPartner(fullMesh: Mesh): void;
+
 // @public
 export type ClipPlane = readonly [number, number, number, number];
 
@@ -4911,6 +4914,9 @@ export function setShaderUniform(material: ShaderMaterial, name: string, value:
 // @public
 export function setShaderVector3(material: ShaderMaterial, name: string, value: readonly [number, number, number]): void;
 
+// @public
+export function setShadowCasterMaxCascade(mesh: Mesh, maxCascade: number): void;
+
 // @public
 export function setShadowTaskCasterMeshes(shadowGenerator: ShadowGenerator, casterMeshes: readonly Mesh[]): void;
 
@@ -4985,6 +4991,9 @@ export function setThinInstanceCullBoundsPad(mesh: Mesh, pad: number): void;
 // @public
 export function setThinInstanceDrawCount(mesh: Mesh, count: number): void;
 
+// @public
+export function setThinInstanceLodPartner(fullMesh: Mesh, lodMesh: Mesh, options: ThinInstanceLodPartnerOptions): void;
+
 // @public
 export function setThinInstanceMatrix(mesh: Mesh, index: number, matrix: Mat4): void;
 
@@ -6028,6 +6037,12 @@ export interface ThinInstanceData {
     matrices: Float32Array | Float64Array;
 }
 
+// @public
+export interface ThinInstanceLodPartnerOptions {
+    band?: number;
+    distance: number;
+}
+
 // @public
 export interface TintProps {
     atDistance?: number;

@bjsplat

bjsplat commented Jul 17, 2026

Copy link
Copy Markdown

Lite Playground - Static Site

Open deployed site

Build 20260717.3 - merge @ a198c4f

@bjsplat

bjsplat commented Jul 17, 2026

Copy link
Copy Markdown

Bundle Size Changes

Increases

Package Current Master Change
Scene 173 - Navigation Dynamic Obstacles
scene173
63 KB 62 KB +1 KB
Scene 214 — Cascaded Shadow Maps
scene214
69 KB 68 KB +1 KB
Scene 223 — Camera + Light Gizmos
scene223
65 KB 64 KB +1 KB

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

@bjsplat

bjsplat commented Jul 17, 2026

Copy link
Copy Markdown

Lab - Static Site

Open deployed site

Build 20260717.3 - merge @ a198c4f

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

Copilot reviewed 143 out of 143 changed files in this pull request and generated 1 comment.

Comment thread scripts/validate-pr-release-markers.ts
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

Copilot-Session: 956e9bbb-057c-48ee-87ad-0e25093fd1ce
Cancel retryable response streams before the next metadata request so undici can release and reuse connections during GitHub API outages.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

Copilot-Session: 956e9bbb-057c-48ee-87ad-0e25093fd1ce
@bjsplat

bjsplat commented Jul 17, 2026

Copy link
Copy Markdown

API Changes

API Extractor detected public API changes for @babylonjs/lite.

No removed public API lines were detected; this appears to be additive.

API Extractor diff
diff --git a/home/vsts/work/1/s/test-results/api-report/target/temp/babylon-lite.api.md b/home/vsts/work/1/s/test-results/api-report/current/temp/babylon-lite.api.md
index 0910ad69..2778db08 100644
--- a/home/vsts/work/1/s/test-results/api-report/target/temp/babylon-lite.api.md
+++ b/home/vsts/work/1/s/test-results/api-report/current/temp/babylon-lite.api.md
@@ -959,6 +959,9 @@ export function clearSprite2DLayer(layer: Sprite2DLayer): void;
 // @public
 export function clearSpriteAnimations(manager: SpriteAnimationManager): void;
 
+// @public
+export function clearThinInstanceLodPartner(fullMesh: Mesh): void;
+
 // @public
 export type ClipPlane = readonly [number, number, number, number];
 
@@ -4911,6 +4914,9 @@ export function setShaderUniform(material: ShaderMaterial, name: string, value:
 // @public
 export function setShaderVector3(material: ShaderMaterial, name: string, value: readonly [number, number, number]): void;
 
+// @public
+export function setShadowCasterMaxCascade(mesh: Mesh, maxCascade: number): void;
+
 // @public
 export function setShadowTaskCasterMeshes(shadowGenerator: ShadowGenerator, casterMeshes: readonly Mesh[]): void;
 
@@ -4985,6 +4991,9 @@ export function setThinInstanceCullBoundsPad(mesh: Mesh, pad: number): void;
 // @public
 export function setThinInstanceDrawCount(mesh: Mesh, count: number): void;
 
+// @public
+export function setThinInstanceLodPartner(fullMesh: Mesh, lodMesh: Mesh, options: ThinInstanceLodPartnerOptions): void;
+
 // @public
 export function setThinInstanceMatrix(mesh: Mesh, index: number, matrix: Mat4): void;
 
@@ -6028,6 +6037,12 @@ export interface ThinInstanceData {
     matrices: Float32Array | Float64Array;
 }
 
+// @public
+export interface ThinInstanceLodPartnerOptions {
+    band?: number;
+    distance: number;
+}
+
 // @public
 export interface TintProps {
     atDistance?: number;

@bjsplat

bjsplat commented Jul 17, 2026

Copy link
Copy Markdown

Lite Playground - Static Site

Open deployed site

Build 20260717.6 - merge @ d572dd0

@bjsplat

bjsplat commented Jul 17, 2026

Copy link
Copy Markdown

Bundle Size Changes

Increases

Package Current Master Change
Scene 173 - Navigation Dynamic Obstacles
scene173
63 KB 62 KB +1 KB
Scene 214 — Cascaded Shadow Maps
scene214
69 KB 68 KB +1 KB
Scene 223 — Camera + Light Gizmos
scene223
65 KB 64 KB +1 KB

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

@bjsplat

bjsplat commented Jul 17, 2026

Copy link
Copy Markdown

Lab - Static Site

Open deployed site

Build 20260717.6 - merge @ d572dd0

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

Copilot reviewed 143 out of 143 changed files in this pull request and generated no new comments.

@deltakosh
deltakosh requested a review from RaananW July 17, 2026 04:25
# Conflicts:
#	lab/public/bundle/manifest/scene1.json
#	lab/public/bundle/manifest/scene10.json
#	lab/public/bundle/manifest/scene104.json
#	lab/public/bundle/manifest/scene105.json
#	lab/public/bundle/manifest/scene11.json
#	lab/public/bundle/manifest/scene111.json
#	lab/public/bundle/manifest/scene112.json
#	lab/public/bundle/manifest/scene114.json
#	lab/public/bundle/manifest/scene115.json
#	lab/public/bundle/manifest/scene116.json
#	lab/public/bundle/manifest/scene12.json
#	lab/public/bundle/manifest/scene129.json
#	lab/public/bundle/manifest/scene13.json
#	lab/public/bundle/manifest/scene14.json
#	lab/public/bundle/manifest/scene141.json
#	lab/public/bundle/manifest/scene144.json
#	lab/public/bundle/manifest/scene146.json
#	lab/public/bundle/manifest/scene147.json
#	lab/public/bundle/manifest/scene148.json
#	lab/public/bundle/manifest/scene149.json
#	lab/public/bundle/manifest/scene152.json
#	lab/public/bundle/manifest/scene157.json
#	lab/public/bundle/manifest/scene158.json
#	lab/public/bundle/manifest/scene164.json
#	lab/public/bundle/manifest/scene17.json
#	lab/public/bundle/manifest/scene171.json
#	lab/public/bundle/manifest/scene174.json
#	lab/public/bundle/manifest/scene175.json
#	lab/public/bundle/manifest/scene176.json
#	lab/public/bundle/manifest/scene177.json
#	lab/public/bundle/manifest/scene178.json
#	lab/public/bundle/manifest/scene179.json
#	lab/public/bundle/manifest/scene19.json
#	lab/public/bundle/manifest/scene20.json
#	lab/public/bundle/manifest/scene205.json
#	lab/public/bundle/manifest/scene21.json
#	lab/public/bundle/manifest/scene210.json
#	lab/public/bundle/manifest/scene211.json
#	lab/public/bundle/manifest/scene212.json
#	lab/public/bundle/manifest/scene215.json
#	lab/public/bundle/manifest/scene216.json
#	lab/public/bundle/manifest/scene217.json
#	lab/public/bundle/manifest/scene218.json
#	lab/public/bundle/manifest/scene219.json
#	lab/public/bundle/manifest/scene22.json
#	lab/public/bundle/manifest/scene223.json
#	lab/public/bundle/manifest/scene229.json
#	lab/public/bundle/manifest/scene23.json
#	lab/public/bundle/manifest/scene240.json
#	lab/public/bundle/manifest/scene241.json
#	lab/public/bundle/manifest/scene242.json
#	lab/public/bundle/manifest/scene243.json
#	lab/public/bundle/manifest/scene244.json
#	lab/public/bundle/manifest/scene245.json
#	lab/public/bundle/manifest/scene246.json
#	lab/public/bundle/manifest/scene247.json
#	lab/public/bundle/manifest/scene248.json
#	lab/public/bundle/manifest/scene249.json
#	lab/public/bundle/manifest/scene251.json
#	lab/public/bundle/manifest/scene253.json
#	lab/public/bundle/manifest/scene254.json
#	lab/public/bundle/manifest/scene255.json
#	lab/public/bundle/manifest/scene257.json
#	lab/public/bundle/manifest/scene258.json
#	lab/public/bundle/manifest/scene259.json
#	lab/public/bundle/manifest/scene26.json
#	lab/public/bundle/manifest/scene260.json
#	lab/public/bundle/manifest/scene265.json
#	lab/public/bundle/manifest/scene27.json
#	lab/public/bundle/manifest/scene28.json
#	lab/public/bundle/manifest/scene29.json
#	lab/public/bundle/manifest/scene30.json
#	lab/public/bundle/manifest/scene31.json
#	lab/public/bundle/manifest/scene32.json
#	lab/public/bundle/manifest/scene33.json
#	lab/public/bundle/manifest/scene34.json
#	lab/public/bundle/manifest/scene35.json
#	lab/public/bundle/manifest/scene37.json
#	lab/public/bundle/manifest/scene39.json
#	lab/public/bundle/manifest/scene41.json
#	lab/public/bundle/manifest/scene47.json
#	lab/public/bundle/manifest/scene5.json
#	lab/public/bundle/manifest/scene6.json
#	lab/public/bundle/manifest/scene7.json
#	lab/public/bundle/manifest/scene73.json
#	lab/public/bundle/manifest/scene8.json
#	lab/public/bundle/manifest/scene99.json
@bjsplat

bjsplat commented Jul 17, 2026

Copy link
Copy Markdown

API Changes

API Extractor detected public API changes for @babylonjs/lite.

No removed public API lines were detected; this appears to be additive.

API Extractor diff
diff --git a/home/vsts/work/1/s/test-results/api-report/target/temp/babylon-lite.api.md b/home/vsts/work/1/s/test-results/api-report/current/temp/babylon-lite.api.md
index 0910ad69..2778db08 100644
--- a/home/vsts/work/1/s/test-results/api-report/target/temp/babylon-lite.api.md
+++ b/home/vsts/work/1/s/test-results/api-report/current/temp/babylon-lite.api.md
@@ -959,6 +959,9 @@ export function clearSprite2DLayer(layer: Sprite2DLayer): void;
 // @public
 export function clearSpriteAnimations(manager: SpriteAnimationManager): void;
 
+// @public
+export function clearThinInstanceLodPartner(fullMesh: Mesh): void;
+
 // @public
 export type ClipPlane = readonly [number, number, number, number];
 
@@ -4911,6 +4914,9 @@ export function setShaderUniform(material: ShaderMaterial, name: string, value:
 // @public
 export function setShaderVector3(material: ShaderMaterial, name: string, value: readonly [number, number, number]): void;
 
+// @public
+export function setShadowCasterMaxCascade(mesh: Mesh, maxCascade: number): void;
+
 // @public
 export function setShadowTaskCasterMeshes(shadowGenerator: ShadowGenerator, casterMeshes: readonly Mesh[]): void;
 
@@ -4985,6 +4991,9 @@ export function setThinInstanceCullBoundsPad(mesh: Mesh, pad: number): void;
 // @public
 export function setThinInstanceDrawCount(mesh: Mesh, count: number): void;
 
+// @public
+export function setThinInstanceLodPartner(fullMesh: Mesh, lodMesh: Mesh, options: ThinInstanceLodPartnerOptions): void;
+
 // @public
 export function setThinInstanceMatrix(mesh: Mesh, index: number, matrix: Mat4): void;
 
@@ -6028,6 +6037,12 @@ export interface ThinInstanceData {
     matrices: Float32Array | Float64Array;
 }
 
+// @public
+export interface ThinInstanceLodPartnerOptions {
+    band?: number;
+    distance: number;
+}
+
 // @public
 export interface TintProps {
     atDistance?: number;

@bjsplat

bjsplat commented Jul 17, 2026

Copy link
Copy Markdown

Lite Playground - Static Site

Open deployed site

Build 20260717.10 - merge @ 89f6d24

@bjsplat

bjsplat commented Jul 17, 2026

Copy link
Copy Markdown

Bundle Size Changes

Increases

Package Current Master Change
Scene 173 - Navigation Dynamic Obstacles
scene173
63 KB 62 KB +1 KB
Scene 214 — Cascaded Shadow Maps
scene214
69 KB 68 KB +1 KB

Decreases

Package Current Master Change
Scene 222 — Composite Gizmos
scene222
118 KB 119 KB -1 KB

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

@bjsplat

bjsplat commented Jul 17, 2026

Copy link
Copy Markdown

Lab - Static Site

Open deployed site

Build 20260717.10 - merge @ 89f6d24

@RaananW
RaananW merged commit 71889eb into master Jul 17, 2026
12 checks passed
@RaananW
RaananW deleted the feat/thin-instance-lod-culling branch July 17, 2026 12:11
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.

4 participants