@aura3d/rendering 1.4.4 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (199) hide show
  1. package/dist/CascadedShadowMaps.d.ts +9 -1
  2. package/dist/CascadedShadowMaps.d.ts.map +1 -1
  3. package/dist/CascadedShadowMaps.js +68 -0
  4. package/dist/CascadedShadowMaps.js.map +1 -1
  5. package/dist/ClusteredForwardLighting.d.ts +28 -0
  6. package/dist/ClusteredForwardLighting.d.ts.map +1 -0
  7. package/dist/ClusteredForwardLighting.js +156 -0
  8. package/dist/ClusteredForwardLighting.js.map +1 -0
  9. package/dist/DepthPass.d.ts +14 -1
  10. package/dist/DepthPass.d.ts.map +1 -1
  11. package/dist/DepthPass.js +19 -4
  12. package/dist/DepthPass.js.map +1 -1
  13. package/dist/EnvironmentMapResources.d.ts +59 -1
  14. package/dist/EnvironmentMapResources.d.ts.map +1 -1
  15. package/dist/EnvironmentMapResources.js +140 -100
  16. package/dist/EnvironmentMapResources.js.map +1 -1
  17. package/dist/EnvironmentPlatform.d.ts +3 -2
  18. package/dist/EnvironmentPlatform.d.ts.map +1 -1
  19. package/dist/EnvironmentPlatform.js +99 -44
  20. package/dist/EnvironmentPlatform.js.map +1 -1
  21. package/dist/ForwardPass.d.ts +37 -0
  22. package/dist/ForwardPass.d.ts.map +1 -1
  23. package/dist/ForwardPass.js +234 -7
  24. package/dist/ForwardPass.js.map +1 -1
  25. package/dist/Geometry.d.ts +19 -0
  26. package/dist/Geometry.d.ts.map +1 -1
  27. package/dist/Geometry.js +64 -0
  28. package/dist/Geometry.js.map +1 -1
  29. package/dist/IBL.d.ts.map +1 -1
  30. package/dist/IBL.js +0 -1
  31. package/dist/IBL.js.map +1 -1
  32. package/dist/LightCollector.d.ts +5 -1
  33. package/dist/LightCollector.d.ts.map +1 -1
  34. package/dist/LightCollector.js +16 -3
  35. package/dist/LightCollector.js.map +1 -1
  36. package/dist/LightUniforms.d.ts +26 -1
  37. package/dist/LightUniforms.d.ts.map +1 -1
  38. package/dist/LightUniforms.js +140 -8
  39. package/dist/LightUniforms.js.map +1 -1
  40. package/dist/LightingRig.d.ts +77 -0
  41. package/dist/LightingRig.d.ts.map +1 -1
  42. package/dist/LightingRig.js +100 -11
  43. package/dist/LightingRig.js.map +1 -1
  44. package/dist/MeshConsolidation.d.ts +63 -0
  45. package/dist/MeshConsolidation.d.ts.map +1 -0
  46. package/dist/MeshConsolidation.js +251 -0
  47. package/dist/MeshConsolidation.js.map +1 -0
  48. package/dist/PMREM.d.ts +13 -1
  49. package/dist/PMREM.d.ts.map +1 -1
  50. package/dist/PMREM.js +18 -4
  51. package/dist/PMREM.js.map +1 -1
  52. package/dist/PostProcessPass.d.ts +24 -2
  53. package/dist/PostProcessPass.d.ts.map +1 -1
  54. package/dist/PostProcessPass.js +136 -18
  55. package/dist/PostProcessPass.js.map +1 -1
  56. package/dist/PrimitiveSubmissionAudit.d.ts +195 -0
  57. package/dist/PrimitiveSubmissionAudit.d.ts.map +1 -0
  58. package/dist/PrimitiveSubmissionAudit.js +280 -0
  59. package/dist/PrimitiveSubmissionAudit.js.map +1 -0
  60. package/dist/ProductTurntableFixtures.d.ts.map +1 -1
  61. package/dist/ProductTurntableFixtures.js +93 -13
  62. package/dist/ProductTurntableFixtures.js.map +1 -1
  63. package/dist/ReflectionProbe.d.ts +59 -0
  64. package/dist/ReflectionProbe.d.ts.map +1 -1
  65. package/dist/ReflectionProbe.js +224 -0
  66. package/dist/ReflectionProbe.js.map +1 -1
  67. package/dist/ReflectionSurfaces.d.ts +4 -2
  68. package/dist/ReflectionSurfaces.d.ts.map +1 -1
  69. package/dist/ReflectionSurfaces.js +13 -8
  70. package/dist/ReflectionSurfaces.js.map +1 -1
  71. package/dist/RenderBackend.d.ts +1 -1
  72. package/dist/RenderBackend.d.ts.map +1 -1
  73. package/dist/RenderBackend.js +5 -1
  74. package/dist/RenderBackend.js.map +1 -1
  75. package/dist/RenderDevice.d.ts +13 -2
  76. package/dist/RenderDevice.d.ts.map +1 -1
  77. package/dist/RenderDevice.js +5 -2
  78. package/dist/RenderDevice.js.map +1 -1
  79. package/dist/Renderer.d.ts +41 -1
  80. package/dist/Renderer.d.ts.map +1 -1
  81. package/dist/Renderer.js +406 -61
  82. package/dist/Renderer.js.map +1 -1
  83. package/dist/RendererPostprocessPlan.d.ts +10 -3
  84. package/dist/RendererPostprocessPlan.d.ts.map +1 -1
  85. package/dist/RendererPostprocessPlan.js +25 -5
  86. package/dist/RendererPostprocessPlan.js.map +1 -1
  87. package/dist/RendererVisualPipelineReport.d.ts +3 -2
  88. package/dist/RendererVisualPipelineReport.d.ts.map +1 -1
  89. package/dist/RendererVisualPipelineReport.js +2 -0
  90. package/dist/RendererVisualPipelineReport.js.map +1 -1
  91. package/dist/ScreenSpaceLineMaterial.d.ts +34 -0
  92. package/dist/ScreenSpaceLineMaterial.d.ts.map +1 -0
  93. package/dist/ScreenSpaceLineMaterial.js +93 -0
  94. package/dist/ScreenSpaceLineMaterial.js.map +1 -0
  95. package/dist/ShaderChunks.d.ts +7 -0
  96. package/dist/ShaderChunks.d.ts.map +1 -1
  97. package/dist/ShaderChunks.js +137 -0
  98. package/dist/ShaderChunks.js.map +1 -1
  99. package/dist/ShaderLibrary.d.ts +17 -0
  100. package/dist/ShaderLibrary.d.ts.map +1 -1
  101. package/dist/ShaderLibrary.js +940 -98
  102. package/dist/ShaderLibrary.js.map +1 -1
  103. package/dist/ShadowPass.d.ts +10 -0
  104. package/dist/ShadowPass.d.ts.map +1 -1
  105. package/dist/ShadowPass.js +8 -1
  106. package/dist/ShadowPass.js.map +1 -1
  107. package/dist/SkinnedLitMaterial.d.ts +6 -0
  108. package/dist/SkinnedLitMaterial.d.ts.map +1 -1
  109. package/dist/SkinnedLitMaterial.js +22 -8
  110. package/dist/SkinnedLitMaterial.js.map +1 -1
  111. package/dist/SkinnedUnlitMaterial.d.ts +8 -0
  112. package/dist/SkinnedUnlitMaterial.d.ts.map +1 -1
  113. package/dist/SkinnedUnlitMaterial.js +26 -9
  114. package/dist/SkinnedUnlitMaterial.js.map +1 -1
  115. package/dist/SpecularPrefilter.d.ts +42 -0
  116. package/dist/SpecularPrefilter.d.ts.map +1 -0
  117. package/dist/SpecularPrefilter.js +480 -0
  118. package/dist/SpecularPrefilter.js.map +1 -0
  119. package/dist/TerrainFixtures.d.ts +24 -0
  120. package/dist/TerrainFixtures.d.ts.map +1 -1
  121. package/dist/TerrainFixtures.js +96 -0
  122. package/dist/TerrainFixtures.js.map +1 -1
  123. package/dist/Texture.d.ts +7 -0
  124. package/dist/Texture.d.ts.map +1 -1
  125. package/dist/Texture.js +9 -0
  126. package/dist/Texture.js.map +1 -1
  127. package/dist/VertexFormat.d.ts +34 -1
  128. package/dist/VertexFormat.d.ts.map +1 -1
  129. package/dist/VertexFormat.js +61 -0
  130. package/dist/VertexFormat.js.map +1 -1
  131. package/dist/WebGL2Device.d.ts +48 -0
  132. package/dist/WebGL2Device.d.ts.map +1 -1
  133. package/dist/WebGL2Device.js +1298 -44
  134. package/dist/WebGL2Device.js.map +1 -1
  135. package/dist/WebGPUDevice.d.ts +7 -2
  136. package/dist/WebGPUDevice.d.ts.map +1 -1
  137. package/dist/WebGPUDevice.js +111 -17
  138. package/dist/WebGPUDevice.js.map +1 -1
  139. package/dist/WebGPUSkinningLimits.d.ts +14 -0
  140. package/dist/WebGPUSkinningLimits.d.ts.map +1 -0
  141. package/dist/WebGPUSkinningLimits.js +14 -0
  142. package/dist/WebGPUSkinningLimits.js.map +1 -0
  143. package/dist/cartoon/CartoonMaterialStyle.d.ts +19 -0
  144. package/dist/cartoon/CartoonMaterialStyle.d.ts.map +1 -0
  145. package/dist/cartoon/CartoonMaterialStyle.js +13 -0
  146. package/dist/cartoon/CartoonMaterialStyle.js.map +1 -0
  147. package/dist/cartoon/CartoonRenderPreset.d.ts +36 -0
  148. package/dist/cartoon/CartoonRenderPreset.d.ts.map +1 -0
  149. package/dist/cartoon/CartoonRenderPreset.js +23 -0
  150. package/dist/cartoon/CartoonRenderPreset.js.map +1 -0
  151. package/dist/cartoon/CartoonToonMaterial.d.ts +130 -0
  152. package/dist/cartoon/CartoonToonMaterial.d.ts.map +1 -0
  153. package/dist/cartoon/CartoonToonMaterial.js +303 -0
  154. package/dist/cartoon/CartoonToonMaterial.js.map +1 -0
  155. package/dist/cartoon/CartoonVisualQuality.d.ts +28 -0
  156. package/dist/cartoon/CartoonVisualQuality.d.ts.map +1 -0
  157. package/dist/cartoon/CartoonVisualQuality.js +39 -0
  158. package/dist/cartoon/CartoonVisualQuality.js.map +1 -0
  159. package/dist/cartoon/applyCartoonRenderPreset.d.ts +79 -0
  160. package/dist/cartoon/applyCartoonRenderPreset.d.ts.map +1 -0
  161. package/dist/cartoon/applyCartoonRenderPreset.js +88 -0
  162. package/dist/cartoon/applyCartoonRenderPreset.js.map +1 -0
  163. package/dist/cartoon/index.d.ts +6 -0
  164. package/dist/cartoon/index.d.ts.map +1 -0
  165. package/dist/cartoon/index.js +6 -0
  166. package/dist/cartoon/index.js.map +1 -0
  167. package/dist/index.d.ts +26 -15
  168. package/dist/index.d.ts.map +1 -1
  169. package/dist/index.js +15 -9
  170. package/dist/index.js.map +1 -1
  171. package/dist/postprocess/NativeLdrEffectLuts.d.ts +93 -0
  172. package/dist/postprocess/NativeLdrEffectLuts.d.ts.map +1 -0
  173. package/dist/postprocess/NativeLdrEffectLuts.js +202 -0
  174. package/dist/postprocess/NativeLdrEffectLuts.js.map +1 -0
  175. package/dist/production-runtime/PBRHDRPipeline.d.ts.map +1 -1
  176. package/dist/production-runtime/PBRHDRPipeline.js +3 -0
  177. package/dist/production-runtime/PBRHDRPipeline.js.map +1 -1
  178. package/dist/production-runtime/ProductionRendererTypes.d.ts +1 -0
  179. package/dist/production-runtime/ProductionRendererTypes.d.ts.map +1 -1
  180. package/dist/production-runtime/ProductionRendererTypes.js.map +1 -1
  181. package/dist/production-runtime/ProductionWebGL2Renderer.d.ts.map +1 -1
  182. package/dist/production-runtime/ProductionWebGL2Renderer.js +5 -3
  183. package/dist/production-runtime/ProductionWebGL2Renderer.js.map +1 -1
  184. package/dist/production-runtime/ProductionWebGPURenderer.d.ts.map +1 -1
  185. package/dist/production-runtime/ProductionWebGPURenderer.js +9 -5
  186. package/dist/production-runtime/ProductionWebGPURenderer.js.map +1 -1
  187. package/dist/production-runtime/TransmissionBackdropCapture.d.ts +5 -0
  188. package/dist/production-runtime/TransmissionBackdropCapture.d.ts.map +1 -1
  189. package/dist/production-runtime/TransmissionBackdropCapture.js +40 -0
  190. package/dist/production-runtime/TransmissionBackdropCapture.js.map +1 -1
  191. package/dist/production-runtime/environment/HDRLoader.d.ts +6 -0
  192. package/dist/production-runtime/environment/HDRLoader.d.ts.map +1 -1
  193. package/dist/production-runtime/environment/HDRLoader.js +19 -0
  194. package/dist/production-runtime/environment/HDRLoader.js.map +1 -1
  195. package/dist/production-runtime/index.d.ts +3 -1
  196. package/dist/production-runtime/index.d.ts.map +1 -1
  197. package/dist/production-runtime/index.js +1 -0
  198. package/dist/production-runtime/index.js.map +1 -1
  199. package/package.json +3 -3
@@ -39,7 +39,33 @@ export type RenderMaterial = Material | MaterialInstance;
39
39
  export interface SkinningPaletteBinding {
40
40
  readonly jointCount: number;
41
41
  readonly matrices: Float32Array;
42
+ /**
43
+ * Second influence set for eight-influence skinning. Only meaningful when the
44
+ * geometry carries `joints1`/`weights1` attributes and the material uses an
45
+ * eight-influence shader.
46
+ */
47
+ readonly extraInfluences?: boolean;
42
48
  }
49
+ /** Which GPU path carried the joint palette for a submission. */
50
+ export type SkinningPalettePath = "uniform-array" | "data-texture";
51
+ export interface SkinningPaletteDiagnostics {
52
+ readonly submissions: number;
53
+ readonly jointsUploaded: number;
54
+ readonly maxJointCount: number;
55
+ readonly uniformArraySubmissions: number;
56
+ readonly dataTextureSubmissions: number;
57
+ readonly eightInfluenceSubmissions: number;
58
+ readonly maxUniformJoints: number;
59
+ }
60
+ /** Joints addressable through the uniform-array palette. Re-exported for shaders. */
61
+ export declare const MAX_UNIFORM_SKINNING_JOINTS = 96;
62
+ /**
63
+ * Upper bound on joints per skin, using the data-texture palette path.
64
+ *
65
+ * Chosen to stay well inside a 1024-wide RGBA32F texture (1024 joints = 4096 texels =
66
+ * a 1024x4 texture) while covering rigs far beyond anything the uniform path allows.
67
+ */
68
+ export declare const MAX_SKINNING_JOINTS = 1024;
43
69
  export declare const MAX_GPU_MORPH_VERTICES = 64;
44
70
  export declare const MAX_GPU_MORPH_TARGETS = 4;
45
71
  export declare const MAX_GPU_INSTANCES = 64;
@@ -51,6 +77,8 @@ export interface ForwardPassOptions {
51
77
  readonly inputColorResource?: string;
52
78
  readonly shadowMap?: ForwardShadowMapOptions;
53
79
  readonly cameraPosition?: readonly [number, number, number];
80
+ readonly cameraViewMatrix?: Float32Array | readonly number[];
81
+ readonly cameraViewProjectionMatrix?: Float32Array | readonly number[];
54
82
  readonly outputColorSpace?: "linear" | "srgb";
55
83
  readonly shaderLibrary?: ShaderLibrary;
56
84
  }
@@ -95,6 +123,13 @@ export interface ForwardShadowMapOptions {
95
123
  readonly texelSize?: readonly [number, number];
96
124
  readonly filterKernel?: ShadowFilterKernel;
97
125
  readonly pointLight?: ForwardPointShadowMapOptions;
126
+ readonly cascades?: readonly ForwardShadowCascadeOptions[];
127
+ }
128
+ export interface ForwardShadowCascadeOptions {
129
+ readonly index: number;
130
+ readonly near: number;
131
+ readonly far: number;
132
+ readonly shadowMap: Omit<ForwardShadowMapOptions, "cascades">;
98
133
  }
99
134
  export interface ForwardPointShadowMapOptions {
100
135
  readonly texture: TextureBinding;
@@ -114,10 +149,12 @@ export declare class ForwardPass extends BaseRenderPass {
114
149
  private readonly materialBinding;
115
150
  private readonly shaderLibrary;
116
151
  private readonly skinningPaletteUploads;
152
+ private clusteredLighting;
117
153
  constructor(options: ForwardPassOptions);
118
154
  execute(context: RenderPassContext): void;
119
155
  private drawItem;
120
156
  private applyLightUniforms;
121
157
  private getShader;
122
158
  }
159
+ export declare function selectForwardShadowMap(shadowMap: ForwardShadowMapOptions | undefined, item: RenderItem, cameraViewMatrix?: Float32Array | readonly number[], cameraPosition?: readonly [number, number, number]): ForwardShadowMapOptions | undefined;
123
160
  //# sourceMappingURL=ForwardPass.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ForwardPass.d.ts","sourceRoot":"","sources":["../../../../packages/rendering/src/ForwardPass.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ForwardPass.d.ts","sourceRoot":"","sources":["../../../../packages/rendering/src/ForwardPass.ts"],"names":[],"mappings":"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"}
@@ -8,12 +8,26 @@ import { applyMorphTargets } from "./MorphTarget.js";
8
8
  import { RenderDeviceError } from "./RenderDevice.js";
9
9
  import { RenderPipeline } from "./RenderPipeline.js";
10
10
  import { BaseRenderPass } from "./RenderPass.js";
11
+ import { MAX_UNIFORM_SKINNING_JOINTS as SHADER_MAX_UNIFORM_SKINNING_JOINTS } from "./ShaderChunks.js";
11
12
  import { ShaderModule } from "./ShaderModule.js";
12
13
  import { createDefaultShaderLibrary } from "./ShaderLibrary.js";
13
14
  import { createShadowFilterKernel } from "./ShadowMap.js";
15
+ import { Sampler } from "./Sampler.js";
16
+ import { Texture } from "./Texture.js";
14
17
  import { TextureBinding } from "./TextureBinding.js";
15
18
  import { UnlitMaterial } from "./UnlitMaterial.js";
16
19
  import { sortRenderQueueItems } from "./performance/RenderItemSorting.js";
20
+ import { createClusteredForwardLighting } from "./ClusteredForwardLighting.js";
21
+ /** Joints addressable through the uniform-array palette. Re-exported for shaders. */
22
+ export const MAX_UNIFORM_SKINNING_JOINTS = SHADER_MAX_UNIFORM_SKINNING_JOINTS;
23
+ /**
24
+ * Upper bound on joints per skin, using the data-texture palette path.
25
+ *
26
+ * Chosen to stay well inside a 1024-wide RGBA32F texture (1024 joints = 4096 texels =
27
+ * a 1024x4 texture) while covering rigs far beyond anything the uniform path allows.
28
+ */
29
+ export const MAX_SKINNING_JOINTS = 1024;
30
+ const SKINNING_PALETTE_TEXTURE_MAX_WIDTH = 1024;
17
31
  export const MAX_GPU_MORPH_VERTICES = 64;
18
32
  export const MAX_GPU_MORPH_TARGETS = 4;
19
33
  export const MAX_GPU_INSTANCES = 64;
@@ -31,6 +45,7 @@ export class ForwardPass extends BaseRenderPass {
31
45
  materialBinding = new MaterialBinding();
32
46
  shaderLibrary;
33
47
  skinningPaletteUploads = new SkinningPaletteUploadManager();
48
+ clusteredLighting = null;
34
49
  constructor(options) {
35
50
  super("forward", options.inputColorResource ? [options.inputColorResource] : [], ["color"]);
36
51
  this.options = options;
@@ -38,8 +53,17 @@ export class ForwardPass extends BaseRenderPass {
38
53
  }
39
54
  execute(context) {
40
55
  this.skinningPaletteUploads.beginFrame();
41
- for (const item of sortForwardRenderItems(this.options.items, this.options.cameraPosition)) {
42
- this.drawItem(context.device, item);
56
+ this.clusteredLighting = (this.options.lights?.length ?? 0) > 16
57
+ ? createClusteredForwardLighting(this.options.lights ?? [], context.width, context.height, this.options.cameraViewProjectionMatrix)
58
+ : null;
59
+ try {
60
+ for (const item of sortForwardRenderItems(this.options.items, this.options.cameraPosition)) {
61
+ this.drawItem(context.device, item);
62
+ }
63
+ }
64
+ finally {
65
+ this.clusteredLighting?.dispose();
66
+ this.clusteredLighting = null;
43
67
  }
44
68
  }
45
69
  drawItem(device, item) {
@@ -67,9 +91,10 @@ export class ForwardPass extends BaseRenderPass {
67
91
  }
68
92
  const binding = this.materialBinding.bind(material, shader);
69
93
  const uniforms = new Map(binding.uniforms);
94
+ applyClusteredLightingUniforms(this.clusteredLighting, shader, uniforms);
70
95
  applyEnvironmentLightingUniforms(this.options.environmentLighting, item, shader, uniforms);
71
96
  applyEnvironmentFogUniforms(this.options.environmentFog, item, shader, uniforms);
72
- applyForwardShadowMapUniforms(this.options.shadowMap, item, shader, uniforms);
97
+ applyForwardShadowMapUniforms(selectForwardShadowMap(this.options.shadowMap, item, this.options.cameraViewMatrix, this.options.cameraPosition), item, shader, uniforms);
73
98
  applyOutputColorSpaceUniform(this.options.outputColorSpace ?? "srgb", item, shader, uniforms);
74
99
  applyCameraUniforms(this.options.cameraPosition, item, shader, uniforms);
75
100
  applyAlphaCutoffUniform(item, shader, uniforms);
@@ -153,13 +178,42 @@ class SkinningPaletteUploadManager {
153
178
  submissions = 0;
154
179
  jointsUploaded = 0;
155
180
  maxJointCount = 0;
181
+ uniformArraySubmissions = 0;
182
+ dataTextureSubmissions = 0;
183
+ eightInfluenceSubmissions = 0;
156
184
  beginFrame() {
157
185
  this.submissions = 0;
158
186
  this.jointsUploaded = 0;
159
187
  this.maxJointCount = 0;
188
+ this.uniformArraySubmissions = 0;
189
+ this.dataTextureSubmissions = 0;
190
+ this.eightInfluenceSubmissions = 0;
191
+ }
192
+ /**
193
+ * Which palette paths this frame actually used. Published rather than inferred so a
194
+ * claim about data-texture or eight-influence skinning rests on observed submissions.
195
+ */
196
+ diagnostics() {
197
+ return {
198
+ submissions: this.submissions,
199
+ jointsUploaded: this.jointsUploaded,
200
+ maxJointCount: this.maxJointCount,
201
+ uniformArraySubmissions: this.uniformArraySubmissions,
202
+ dataTextureSubmissions: this.dataTextureSubmissions,
203
+ eightInfluenceSubmissions: this.eightInfluenceSubmissions,
204
+ maxUniformJoints: MAX_UNIFORM_SKINNING_JOINTS
205
+ };
160
206
  }
161
207
  bind(item, skinning, material, shader, uniforms) {
162
- applySkinningUniforms(skinning, material, shader, uniforms);
208
+ const path = applySkinningUniforms(skinning, material, shader, uniforms);
209
+ if (path === "data-texture")
210
+ this.dataTextureSubmissions += 1;
211
+ else
212
+ this.uniformArraySubmissions += 1;
213
+ const eightInfluence = item.geometry.vertexBuffer.format.hasAttribute("joints1")
214
+ && item.geometry.vertexBuffer.format.hasAttribute("weights1");
215
+ if (eightInfluence)
216
+ this.eightInfluenceSubmissions += 1;
163
217
  const validatedJointCounts = SkinningPaletteUploadManager.validatedGeometryJointCounts.get(item.geometry) ?? new Set();
164
218
  if (!validatedJointCounts.has(skinning.jointCount)) {
165
219
  validateSkinningGeometryContract(item, skinning);
@@ -457,6 +511,37 @@ function invertMat4(matrix) {
457
511
  (a20 * b03 - a21 * b01 + a22 * b00) * invDet
458
512
  ];
459
513
  }
514
+ export function selectForwardShadowMap(shadowMap, item, cameraViewMatrix, cameraPosition) {
515
+ const cascades = shadowMap?.cascades;
516
+ if (!shadowMap || !cascades || cascades.length === 0)
517
+ return shadowMap;
518
+ const center = renderItemWorldCenter(item);
519
+ const depth = cameraViewMatrix && cameraViewMatrix.length >= 16
520
+ ? Math.max(0, -(cameraViewMatrix[2] * center[0]
521
+ + cameraViewMatrix[6] * center[1]
522
+ + cameraViewMatrix[10] * center[2]
523
+ + cameraViewMatrix[14]))
524
+ : cameraPosition
525
+ ? Math.hypot(center[0] - cameraPosition[0], center[1] - cameraPosition[1], center[2] - cameraPosition[2])
526
+ : cascades[0].near;
527
+ const selected = cascades.find((cascade) => depth <= cascade.far) ?? cascades[cascades.length - 1];
528
+ return selected.shadowMap;
529
+ }
530
+ function renderItemWorldCenter(item) {
531
+ const local = item.boundingBoxCenter ?? [
532
+ (item.geometry.bounds.min[0] + item.geometry.bounds.max[0]) / 2,
533
+ (item.geometry.bounds.min[1] + item.geometry.bounds.max[1]) / 2,
534
+ (item.geometry.bounds.min[2] + item.geometry.bounds.max[2]) / 2
535
+ ];
536
+ const matrix = item.modelMatrix;
537
+ if (!matrix || matrix.length < 16)
538
+ return local;
539
+ return [
540
+ matrix[0] * local[0] + matrix[4] * local[1] + matrix[8] * local[2] + matrix[12],
541
+ matrix[1] * local[0] + matrix[5] * local[1] + matrix[9] * local[2] + matrix[13],
542
+ matrix[2] * local[0] + matrix[6] * local[1] + matrix[10] * local[2] + matrix[14]
543
+ ];
544
+ }
460
545
  function applyForwardShadowMapUniforms(shadowMap, item, shader, uniforms) {
461
546
  const requiredUniforms = [
462
547
  "u_shadowMapTexture",
@@ -535,6 +620,33 @@ function applyForwardShadowMapUniforms(shadowMap, item, shader, uniforms) {
535
620
  uniforms.set("u_shadowPcfSampleCount", filterKernel.samples.length);
536
621
  uniforms.set("u_shadowPcfSamples", pcfSamples);
537
622
  }
623
+ function applyClusteredLightingUniforms(clustered, shader, uniforms) {
624
+ const required = [
625
+ "u_clusteredLightEnabled",
626
+ "u_clusterGridSize",
627
+ "u_clusterViewportSize",
628
+ "u_clusterLightData",
629
+ "u_clusterLightIndices"
630
+ ];
631
+ if (!required.every((name) => shader.reflection.uniforms.has(name)))
632
+ return;
633
+ if (!clustered) {
634
+ uniforms.set("u_clusteredLightEnabled", 0);
635
+ uniforms.set("u_clusterGridSize", [1, 1]);
636
+ uniforms.set("u_clusterViewportSize", [1, 1]);
637
+ uniforms.set("u_clusterLightData", new TextureBinding({ name: "u_clusterLightData", required: false }));
638
+ uniforms.set("u_clusterLightIndices", new TextureBinding({ name: "u_clusterLightIndices", required: false }));
639
+ return;
640
+ }
641
+ uniforms.set("u_clusteredLightEnabled", 1);
642
+ uniforms.set("u_clusterGridSize", [clustered.diagnostics.gridWidth, clustered.diagnostics.gridHeight]);
643
+ uniforms.set("u_clusterViewportSize", [
644
+ clustered.diagnostics.viewportWidth,
645
+ clustered.diagnostics.viewportHeight
646
+ ]);
647
+ uniforms.set("u_clusterLightData", clustered.lightData);
648
+ uniforms.set("u_clusterLightIndices", clustered.lightIndices);
649
+ }
538
650
  function applyForwardPointShadowMapUniforms(pointShadowMap, item, shader, uniforms) {
539
651
  const requiredUniforms = [
540
652
  "u_pointShadowMapTexture",
@@ -1242,9 +1354,11 @@ function applySkinningUniforms(skinning, material, shader, uniforms) {
1242
1354
  material: material.name
1243
1355
  });
1244
1356
  }
1245
- if (!Number.isInteger(skinning.jointCount) || skinning.jointCount <= 0 || skinning.jointCount > 96) {
1246
- throw new RenderDeviceError("Skinning jointCount must be an integer in [1, 96]", "INVALID_SKINNING_PALETTE", {
1247
- jointCount: skinning.jointCount
1357
+ if (!Number.isInteger(skinning.jointCount) || skinning.jointCount <= 0 || skinning.jointCount > MAX_SKINNING_JOINTS) {
1358
+ throw new RenderDeviceError(`Skinning jointCount must be an integer in [1, ${MAX_SKINNING_JOINTS}]`, "INVALID_SKINNING_PALETTE", {
1359
+ jointCount: skinning.jointCount,
1360
+ maxUniformJoints: MAX_UNIFORM_SKINNING_JOINTS,
1361
+ maxJoints: MAX_SKINNING_JOINTS
1248
1362
  });
1249
1363
  }
1250
1364
  if (skinning.matrices.length !== skinning.jointCount * 16) {
@@ -1259,7 +1373,68 @@ function applySkinningUniforms(skinning, material, shader, uniforms) {
1259
1373
  });
1260
1374
  }
1261
1375
  uniforms.set("u_jointCount", skinning.jointCount);
1376
+ // Over the uniform-array limit the palette travels as an RGBA32F data texture, four
1377
+ // texels per matrix. A mat4 uniform costs four vec4 slots, so a uniform array cannot
1378
+ // be grown far enough for large rigs without exhausting MAX_VERTEX_UNIFORM_VECTORS.
1379
+ const path = skinning.jointCount > MAX_UNIFORM_SKINNING_JOINTS ? "data-texture" : "uniform-array";
1380
+ if (path === "data-texture") {
1381
+ if (!shader.reflection.uniforms.has("u_jointPaletteTexture") || !shader.reflection.uniforms.has("u_jointPaletteMode")) {
1382
+ throw new RenderDeviceError(`Skinning palettes above ${MAX_UNIFORM_SKINNING_JOINTS} joints require a shader with data-texture palette uniforms`, "SKINNING_SHADER_CONTRACT", { material: material.name, jointCount: skinning.jointCount });
1383
+ }
1384
+ const texture = createSkinningPaletteTexture(skinning, material.name);
1385
+ uniforms.set("u_jointPaletteMode", 1);
1386
+ uniforms.set("u_jointPaletteTexture", new TextureBinding({
1387
+ name: "u_jointPaletteTexture",
1388
+ texture,
1389
+ sampler: new Sampler({ minFilter: "nearest", magFilter: "nearest", addressU: "clamp-to-edge", addressV: "clamp-to-edge" }),
1390
+ required: true
1391
+ }));
1392
+ uniforms.set("u_jointPaletteTextureSize", [texture.width, texture.height]);
1393
+ // The uniform array is still declared by the shader, so give it a valid value.
1394
+ uniforms.set("u_jointMatrices", new Float32Array(MAX_UNIFORM_SKINNING_JOINTS * 16));
1395
+ return path;
1396
+ }
1397
+ if (shader.reflection.uniforms.has("u_jointPaletteMode")) {
1398
+ uniforms.set("u_jointPaletteMode", 0);
1399
+ if (shader.reflection.uniforms.has("u_jointPaletteTextureSize"))
1400
+ uniforms.set("u_jointPaletteTextureSize", [1, 1]);
1401
+ if (shader.reflection.uniforms.has("u_jointPaletteTexture")) {
1402
+ uniforms.set("u_jointPaletteTexture", new TextureBinding({ name: "u_jointPaletteTexture", required: false }));
1403
+ }
1404
+ }
1262
1405
  uniforms.set("u_jointMatrices", skinning.matrices);
1406
+ return path;
1407
+ }
1408
+ /**
1409
+ * Packs a joint palette into an RGBA32F texture, one texel per matrix column.
1410
+ *
1411
+ * Width is a multiple of four so no matrix straddles a row boundary, which keeps the
1412
+ * shader's texel addressing a simple divide and avoids per-column row recomputation.
1413
+ */
1414
+ function createSkinningPaletteTexture(skinning, materialName) {
1415
+ const texelsPerMatrix = 4;
1416
+ const totalTexels = skinning.jointCount * texelsPerMatrix;
1417
+ const width = Math.min(SKINNING_PALETTE_TEXTURE_MAX_WIDTH, Math.max(texelsPerMatrix, ceilToMultiple(Math.ceil(Math.sqrt(totalTexels)), texelsPerMatrix)));
1418
+ const height = Math.ceil(totalTexels / width);
1419
+ const data = new Float32Array(width * height * 4);
1420
+ data.set(skinning.matrices.subarray(0, Math.min(skinning.matrices.length, data.length)));
1421
+ if (skinning.matrices.length > data.length) {
1422
+ throw new RenderDeviceError("Skinning palette does not fit the data texture", "INVALID_SKINNING_PALETTE", {
1423
+ material: materialName,
1424
+ jointCount: skinning.jointCount
1425
+ });
1426
+ }
1427
+ return new Texture({
1428
+ width,
1429
+ height,
1430
+ format: "rgba32f",
1431
+ colorSpace: "linear",
1432
+ label: `aura3d-skinning-palette-${skinning.jointCount}-joints`,
1433
+ data
1434
+ });
1435
+ }
1436
+ function ceilToMultiple(value, multiple) {
1437
+ return Math.ceil(value / multiple) * multiple;
1263
1438
  }
1264
1439
  function validateSkinningGeometryContract(item, skinning) {
1265
1440
  const format = item.geometry.vertexBuffer.format;
@@ -1284,10 +1459,62 @@ function validateSkinningGeometryContract(item, skinning) {
1284
1459
  weightComponents: weightsAttribute.components
1285
1460
  });
1286
1461
  }
1462
+ // Eight-influence geometry must supply both halves of the second set, and both must
1463
+ // be vec4. A half-declared second set would silently drop influences at draw time.
1464
+ const hasJoints1 = format.hasAttribute("joints1");
1465
+ const hasWeights1 = format.hasAttribute("weights1");
1466
+ if (hasJoints1 !== hasWeights1) {
1467
+ throw new RenderDeviceError("Eight-influence skinned geometry must declare both joints1 and weights1", "SKINNING_GEOMETRY_CONTRACT", {
1468
+ label: item.label,
1469
+ hasJoints1,
1470
+ hasWeights1
1471
+ });
1472
+ }
1473
+ const eightInfluence = hasJoints1 && hasWeights1;
1474
+ if (eightInfluence) {
1475
+ const joints1Attribute = format.getAttribute("joints1");
1476
+ const weights1Attribute = format.getAttribute("weights1");
1477
+ if (joints1Attribute.components !== 4 || weights1Attribute.components !== 4) {
1478
+ throw new RenderDeviceError("Eight-influence skinned geometry must use four components per second-set attribute", "SKINNING_GEOMETRY_CONTRACT", {
1479
+ label: item.label,
1480
+ joints1Components: joints1Attribute.components,
1481
+ weights1Components: weights1Attribute.components
1482
+ });
1483
+ }
1484
+ }
1287
1485
  for (let vertex = 0; vertex < item.geometry.vertexBuffer.vertexCount; vertex += 1) {
1288
1486
  const joints = item.geometry.vertexBuffer.getAttribute(vertex, "joints");
1289
1487
  const weights = item.geometry.vertexBuffer.getAttribute(vertex, "weights");
1290
1488
  let weightSum = 0;
1489
+ if (eightInfluence) {
1490
+ // Validate the second set with the same rules, and fold it into the weight sum so
1491
+ // a vertex whose influence is split across both sets is not reported as unweighted.
1492
+ const joints1 = item.geometry.vertexBuffer.getAttribute(vertex, "joints1");
1493
+ const weights1 = item.geometry.vertexBuffer.getAttribute(vertex, "weights1");
1494
+ for (let influence = 0; influence < 4; influence += 1) {
1495
+ const joint = joints1[influence] ?? 0;
1496
+ const weight = weights1[influence] ?? 0;
1497
+ if (!Number.isFinite(weight) || weight < 0) {
1498
+ throw new RenderDeviceError("Skinned render item weights must be finite non-negative values", "SKINNING_GEOMETRY_CONTRACT", {
1499
+ label: item.label,
1500
+ jointCount: skinning.jointCount,
1501
+ vertex,
1502
+ influence: influence + 4,
1503
+ weight
1504
+ });
1505
+ }
1506
+ if (!Number.isInteger(joint) || joint < 0 || joint >= skinning.jointCount) {
1507
+ throw new RenderDeviceError("Skinned render item joint indices must reference palette joints", "SKINNING_GEOMETRY_CONTRACT", {
1508
+ label: item.label,
1509
+ jointCount: skinning.jointCount,
1510
+ vertex,
1511
+ influence: influence + 4,
1512
+ joint
1513
+ });
1514
+ }
1515
+ weightSum += weight;
1516
+ }
1517
+ }
1291
1518
  for (let influence = 0; influence < 4; influence += 1) {
1292
1519
  const joint = joints[influence] ?? 0;
1293
1520
  const weight = weights[influence] ?? 0;