feat: add thin-instance LOD and CSM caster caps#421
Conversation
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
API ChangesAPI Extractor detected public API changes for No removed public API lines were detected; this appears to be additive. API Extractor diffdiff --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; |
Lite Playground - Static SiteBuild 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
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
API ChangesAPI Extractor detected public API changes for No removed public API lines were detected; this appears to be additive. API Extractor diffdiff --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; |
Lite Playground - Static SiteBuild 20260717.3 - merge @ a198c4f |
Bundle Size ChangesIncreases
Sizes rounded to nearest KB. Run |
Lab - Static SiteBuild 20260717.3 - merge @ a198c4f |
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
API ChangesAPI Extractor detected public API changes for No removed public API lines were detected; this appears to be additive. API Extractor diffdiff --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; |
Lite Playground - Static SiteBuild 20260717.6 - merge @ d572dd0 |
Bundle Size ChangesIncreases
Sizes rounded to nearest KB. Run |
Lab - Static SiteBuild 20260717.6 - merge @ d572dd0 |
# 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
API ChangesAPI Extractor detected public API changes for No removed public API lines were detected; this appears to be additive. API Extractor diffdiff --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; |
Lite Playground - Static SiteBuild 20260717.10 - merge @ 89f6d24 |
Bundle Size ChangesIncreases
Decreases
Sizes rounded to nearest KB. Run |
Lab - Static SiteBuild 20260717.10 - merge @ 89f6d24 |
Summary
setThinInstanceLodPartnerandclearThinInstanceLodPartner, with near/far compaction buckets, deterministic transition bands, partner lifecycle handling, and safe fallback behaviorfragmentCoordin GPU picking discard shaders, including DPR and camera viewport offsetssetShadowCasterMaxCascadeso CSM casters can skip far cascade layers, including incremental live cap updates when the caster array is re-supplied429/5xxresponses in release-marker validation, with a child-process regression for the Azure failure seen on this PRValidation
pnpm run lintpnpm test:unit: 885 passedpnpm 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 265origin/masterreproduced the exact Scene 104, 105, 106, and 265 MAD values; Scene 47 is the known nondeterministic Havok baselineBundle size