@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
@@ -1,12 +1,16 @@
1
1
  import { Light, Scene } from "@aura3d/scene";
2
- export type CollectedLightKind = "directional" | "point" | "spot";
2
+ export type CollectedLightKind = "directional" | "point" | "spot" | "rect-area";
3
3
  export interface CollectedLight {
4
4
  readonly kind: CollectedLightKind;
5
5
  readonly color: readonly [number, number, number];
6
6
  readonly intensity: number;
7
7
  readonly position: readonly [number, number, number];
8
8
  readonly direction: readonly [number, number, number];
9
+ readonly right?: readonly [number, number, number];
10
+ readonly up?: readonly [number, number, number];
9
11
  readonly range: number;
12
+ readonly width?: number;
13
+ readonly height?: number;
10
14
  readonly spotAngle: number;
11
15
  readonly penumbra: number;
12
16
  readonly castsShadow: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"LightCollector.d.ts","sourceRoot":"","sources":["../../../../packages/rendering/src/LightCollector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,KAAK,EAAc,KAAK,EAAa,MAAM,eAAe,CAAC;AAEtF,MAAM,MAAM,kBAAkB,GAAG,aAAa,GAAG,OAAO,GAAG,MAAM,CAAC;AAElE,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAC;IAClC,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAClD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACrD,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACtD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;IAC9B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC;CACxB;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,eAAe,CAAC,EAAE,OAAO,CAAC;CACpC;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,GAAE,qBAA0B,GAAG,SAAS,cAAc,EAAE;CActF"}
1
+ {"version":3,"file":"LightCollector.d.ts","sourceRoot":"","sources":["../../../../packages/rendering/src/LightCollector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,KAAK,EAA6B,KAAK,EAAa,MAAM,eAAe,CAAC;AAErG,MAAM,MAAM,kBAAkB,GAAG,aAAa,GAAG,OAAO,GAAG,MAAM,GAAG,WAAW,CAAC;AAEhF,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAC;IAClC,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAClD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACrD,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACtD,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACnD,QAAQ,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAChD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;IAC9B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC;CACxB;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,eAAe,CAAC,EAAE,OAAO,CAAC;CACpC;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,GAAE,qBAA0B,GAAG,SAAS,cAAc,EAAE;CActF"}
@@ -1,4 +1,4 @@
1
- import { DirectionalLight, Light, PointLight, Scene, SpotLight } from "@aura3d/scene";
1
+ import { DirectionalLight, Light, PointLight, RectAreaLight, Scene, SpotLight } from "@aura3d/scene";
2
2
  export class LightCollector {
3
3
  collect(scene, options = {}) {
4
4
  const maxLights = options.maxLights ?? Number.POSITIVE_INFINITY;
@@ -21,7 +21,11 @@ function collectLight(light) {
21
21
  const direction = light instanceof DirectionalLight
22
22
  ? vectorToTuple(light.getDirection())
23
23
  : normalize([-matrix[8], -matrix[9], -matrix[10]]);
24
- const range = light instanceof PointLight || light instanceof SpotLight ? light.range : 0;
24
+ const right = normalize([matrix[0], matrix[1], matrix[2]]);
25
+ const up = normalize([matrix[4], matrix[5], matrix[6]]);
26
+ const range = light instanceof PointLight || light instanceof SpotLight || light instanceof RectAreaLight ? light.range : 0;
27
+ const width = light instanceof RectAreaLight ? light.width : 0;
28
+ const height = light instanceof RectAreaLight ? light.height : 0;
25
29
  const spotAngle = light instanceof SpotLight ? light.angle : 0;
26
30
  const penumbra = light instanceof SpotLight ? light.penumbra : 0;
27
31
  return {
@@ -30,7 +34,11 @@ function collectLight(light) {
30
34
  intensity: light.intensity,
31
35
  position,
32
36
  direction,
37
+ right,
38
+ up,
33
39
  range,
40
+ width,
41
+ height,
34
42
  spotAngle,
35
43
  penumbra,
36
44
  castsShadow: light.castsShadow,
@@ -51,6 +59,11 @@ function matrixElements(value) {
51
59
  }
52
60
  function normalize(value) {
53
61
  const length = Math.hypot(value[0], value[1], value[2]);
54
- return length === 0 ? [0, 0, -1] : [value[0] / length, value[1] / length, value[2] / length];
62
+ return length === 0
63
+ ? [0, 0, -1]
64
+ : [canonicalZero(value[0] / length), canonicalZero(value[1] / length), canonicalZero(value[2] / length)];
65
+ }
66
+ function canonicalZero(value) {
67
+ return value === 0 ? 0 : value;
55
68
  }
56
69
  //# sourceMappingURL=LightCollector.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"LightCollector.js","sourceRoot":"","sources":["../../../../packages/rendering/src/LightCollector.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"LightCollector.js","sourceRoot":"","sources":["../../../../packages/rendering/src/LightCollector.ts"],"names":[],"mappings":"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"}
@@ -1,13 +1,38 @@
1
1
  import { type CollectedLight } from "./LightCollector";
2
2
  import { UniformLayout } from "./UniformLayout";
3
3
  export declare const MAX_DIRECT_LIGHTS = 16;
4
+ export type DirectLightSelectionStrategy = "intensity-times-relative-luminance";
5
+ export type DirectLightSelectionOrder = "input" | "contribution-descending";
6
+ export interface DirectLightSelectionEntry {
7
+ readonly sourceId: string;
8
+ readonly sourceName: string;
9
+ readonly kind: CollectedLight["kind"];
10
+ readonly contribution: number;
11
+ }
12
+ export interface DirectLightSelectionDiagnostics {
13
+ readonly source: "LightUniforms.pack";
14
+ readonly strategy: DirectLightSelectionStrategy;
15
+ readonly order: DirectLightSelectionOrder;
16
+ readonly requestedMaxLights: number;
17
+ readonly maxLights: number;
18
+ readonly capacityClamped: boolean;
19
+ readonly requestedCount: number;
20
+ readonly selectedCount: number;
21
+ readonly droppedCount: number;
22
+ readonly degraded: boolean;
23
+ readonly selected: readonly DirectLightSelectionEntry[];
24
+ readonly dropped: readonly DirectLightSelectionEntry[];
25
+ readonly message: string;
26
+ }
4
27
  export interface PackedLightUniforms {
5
28
  readonly lightCount: number;
6
29
  readonly data: Float32Array;
7
30
  readonly layout: UniformLayout;
31
+ readonly diagnostics: DirectLightSelectionDiagnostics;
8
32
  }
9
33
  export declare class LightUniforms {
10
- static readonly floatsPerLight = 16;
34
+ static readonly floatsPerLight = 24;
35
+ static readonly vec4sPerLight: number;
11
36
  static readonly layout: UniformLayout;
12
37
  static pack(lights: readonly CollectedLight[], maxLights?: number): PackedLightUniforms;
13
38
  }
@@ -1 +1 @@
1
- {"version":3,"file":"LightUniforms.d.ts","sourceRoot":"","sources":["../../../../packages/rendering/src/LightUniforms.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,eAAO,MAAM,iBAAiB,KAAK,CAAC;AAEpC,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;CAChC;AAED,qBAAa,aAAa;IACxB,MAAM,CAAC,QAAQ,CAAC,cAAc,MAAM;IAEpC,MAAM,CAAC,QAAQ,CAAC,MAAM,gBAGnB;IAEH,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,cAAc,EAAE,EAAE,SAAS,SAAoB,GAAG,mBAAmB;CAgBnG"}
1
+ {"version":3,"file":"LightUniforms.d.ts","sourceRoot":"","sources":["../../../../packages/rendering/src/LightUniforms.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,eAAO,MAAM,iBAAiB,KAAK,CAAC;AAEpC,MAAM,MAAM,4BAA4B,GAAG,oCAAoC,CAAC;AAChF,MAAM,MAAM,yBAAyB,GAAG,OAAO,GAAG,yBAAyB,CAAC;AAE5E,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC;IACtC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,+BAA+B;IAC9C,QAAQ,CAAC,MAAM,EAAE,oBAAoB,CAAC;IACtC,QAAQ,CAAC,QAAQ,EAAE,4BAA4B,CAAC;IAChD,QAAQ,CAAC,KAAK,EAAE,yBAAyB,CAAC;IAC1C,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC;IAClC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,SAAS,yBAAyB,EAAE,CAAC;IACxD,QAAQ,CAAC,OAAO,EAAE,SAAS,yBAAyB,EAAE,CAAC;IACvD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAC/B,QAAQ,CAAC,WAAW,EAAE,+BAA+B,CAAC;CACvD;AAED,qBAAa,aAAa;IACxB,MAAM,CAAC,QAAQ,CAAC,cAAc,MAAM;IACpC,MAAM,CAAC,QAAQ,CAAC,aAAa,SAAoC;IAEjE,MAAM,CAAC,QAAQ,CAAC,MAAM,gBAGnB;IAEH,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,cAAc,EAAE,EAAE,SAAS,SAAoB,GAAG,mBAAmB;CAiEnG"}
@@ -2,28 +2,158 @@ import {} from "./LightCollector.js";
2
2
  import { UniformLayout } from "./UniformLayout.js";
3
3
  export const MAX_DIRECT_LIGHTS = 16;
4
4
  export class LightUniforms {
5
- static floatsPerLight = 16;
5
+ static floatsPerLight = 24;
6
+ static vec4sPerLight = LightUniforms.floatsPerLight / 4;
6
7
  static layout = new UniformLayout([
7
8
  { name: "u_lightCount", type: "float" },
8
- { name: "u_lightData", type: "vec4", arrayLength: MAX_DIRECT_LIGHTS * 4 }
9
+ { name: "u_lightData", type: "vec4", arrayLength: MAX_DIRECT_LIGHTS * LightUniforms.vec4sPerLight }
9
10
  ]);
10
11
  static pack(lights, maxLights = MAX_DIRECT_LIGHTS) {
11
- if (!Number.isInteger(maxLights) || maxLights <= 0 || maxLights > MAX_DIRECT_LIGHTS) {
12
- throw new RangeError(`maxLights must be an integer in [1, ${MAX_DIRECT_LIGHTS}]`);
12
+ if (!Number.isInteger(maxLights) || maxLights <= 0) {
13
+ throw new RangeError("maxLights must be a positive integer");
13
14
  }
14
- const selected = lights.slice(0, maxLights);
15
+ const effectiveMaxLights = Math.min(maxLights, MAX_DIRECT_LIGHTS);
16
+ const evaluated = evaluateLights(lights);
17
+ const order = lights.length > effectiveMaxLights
18
+ ? "contribution-descending"
19
+ : "input";
20
+ const ordered = order === "contribution-descending"
21
+ ? rankLightsByContribution(evaluated)
22
+ : evaluated;
23
+ const selected = ordered.slice(0, effectiveMaxLights);
24
+ const dropped = ordered.slice(effectiveMaxLights);
15
25
  const data = new Float32Array(MAX_DIRECT_LIGHTS * LightUniforms.floatsPerLight);
16
- selected.forEach((light, index) => {
26
+ selected.forEach(({ light }, index) => {
17
27
  const offset = index * LightUniforms.floatsPerLight;
18
28
  const forwardShadowSupported = light.castsShadow;
19
29
  data.set([light.color[0], light.color[1], light.color[2], light.intensity], offset);
20
30
  data.set([light.position[0], light.position[1], light.position[2], light.range], offset + 4);
21
31
  data.set([light.direction[0], light.direction[1], light.direction[2], kindToFloat(light.kind)], offset + 8);
22
- data.set([light.spotAngle, light.penumbra, forwardShadowSupported ? 1 : 0, light.layerMask], offset + 12);
32
+ data.set([
33
+ light.kind === "rect-area" ? light.width ?? 1 : light.spotAngle,
34
+ light.kind === "rect-area" ? light.height ?? 1 : light.penumbra,
35
+ forwardShadowSupported && light.kind !== "rect-area" ? 1 : 0,
36
+ light.layerMask
37
+ ], offset + 12);
38
+ data.set([...(light.right ?? [1, 0, 0]), 0], offset + 16);
39
+ data.set([...(light.up ?? [0, 1, 0]), 0], offset + 20);
23
40
  });
24
- return { lightCount: selected.length, data, layout: LightUniforms.layout };
41
+ const selectedEntries = selected.map(selectionEntry);
42
+ const droppedEntries = dropped.map(selectionEntry);
43
+ const droppedCount = droppedEntries.length;
44
+ const degraded = droppedCount > 0;
45
+ const capacityClamped = maxLights > effectiveMaxLights;
46
+ const selectedNames = selectedEntries.map((entry) => entry.sourceName).join(", ");
47
+ const capacityMessage = capacityClamped
48
+ ? ` Requested capacity ${maxLights} was clamped to the interim limit ${effectiveMaxLights}.`
49
+ : "";
50
+ const message = (degraded
51
+ ? `Direct-light limit applied: selected ${selectedEntries.length} of ${lights.length} by ${DIRECT_LIGHT_SELECTION_STRATEGY}, dropped ${droppedCount}. Selected: ${selectedNames}.`
52
+ : `Direct-light selection kept all ${selectedEntries.length} requested lights in input order; dropped 0. Contribution scores use ${DIRECT_LIGHT_SELECTION_STRATEGY}. Selected: ${selectedNames || "none"}.`) + capacityMessage;
53
+ return {
54
+ lightCount: selected.length,
55
+ data,
56
+ layout: LightUniforms.layout,
57
+ diagnostics: {
58
+ source: "LightUniforms.pack",
59
+ strategy: DIRECT_LIGHT_SELECTION_STRATEGY,
60
+ order,
61
+ requestedMaxLights: maxLights,
62
+ maxLights: effectiveMaxLights,
63
+ capacityClamped,
64
+ requestedCount: lights.length,
65
+ selectedCount: selectedEntries.length,
66
+ droppedCount,
67
+ degraded,
68
+ selected: selectedEntries,
69
+ dropped: droppedEntries,
70
+ message
71
+ }
72
+ };
25
73
  }
26
74
  }
75
+ const DIRECT_LIGHT_SELECTION_STRATEGY = "intensity-times-relative-luminance";
76
+ const RELATIVE_LUMINANCE_RED = 0.2126;
77
+ const RELATIVE_LUMINANCE_GREEN = 0.7152;
78
+ const RELATIVE_LUMINANCE_BLUE = 0.0722;
79
+ function evaluateLights(lights) {
80
+ return lights
81
+ .map((light, inputIndex) => ({
82
+ light,
83
+ inputIndex,
84
+ sourceId: lightSourceId(light),
85
+ sourceName: lightSourceName(light),
86
+ stableKey: stableLightKey(light),
87
+ contribution: estimateLightContribution(light)
88
+ }));
89
+ }
90
+ function rankLightsByContribution(lights) {
91
+ return [...lights].sort((left, right) => {
92
+ const contributionOrder = right.contribution - left.contribution;
93
+ if (contributionOrder !== 0)
94
+ return contributionOrder;
95
+ const sourceNameOrder = compareText(left.sourceName, right.sourceName);
96
+ if (sourceNameOrder !== 0)
97
+ return sourceNameOrder;
98
+ const sourceIdOrder = compareText(left.sourceId, right.sourceId);
99
+ if (sourceIdOrder !== 0)
100
+ return sourceIdOrder;
101
+ const stableKeyOrder = compareText(left.stableKey, right.stableKey);
102
+ if (stableKeyOrder !== 0)
103
+ return stableKeyOrder;
104
+ return left.inputIndex - right.inputIndex;
105
+ });
106
+ }
107
+ // Packing has no receiver, camera, or scene-bounds context, so emitted linear-RGB
108
+ // luminance is the strongest deterministic contribution estimate available here.
109
+ // Per-fragment range, cone, and distance attenuation remains shader-owned.
110
+ function estimateLightContribution(light) {
111
+ const luminance = (finiteNonNegative(light.color[0]) * RELATIVE_LUMINANCE_RED
112
+ + finiteNonNegative(light.color[1]) * RELATIVE_LUMINANCE_GREEN
113
+ + finiteNonNegative(light.color[2]) * RELATIVE_LUMINANCE_BLUE);
114
+ const contribution = finiteNonNegative(light.intensity) * luminance;
115
+ return Number.isFinite(contribution) ? contribution : Number.MAX_VALUE;
116
+ }
117
+ function selectionEntry(light) {
118
+ return {
119
+ sourceId: light.sourceId,
120
+ sourceName: light.sourceName,
121
+ kind: light.light.kind,
122
+ contribution: light.contribution
123
+ };
124
+ }
125
+ function lightSourceId(light) {
126
+ const id = light.source.id.trim();
127
+ return id || `anonymous-${light.kind}`;
128
+ }
129
+ function lightSourceName(light) {
130
+ const name = light.source.name.trim();
131
+ return name || lightSourceId(light);
132
+ }
133
+ function stableLightKey(light) {
134
+ return [
135
+ light.kind,
136
+ light.color,
137
+ light.intensity,
138
+ light.position,
139
+ light.direction,
140
+ light.right,
141
+ light.up,
142
+ light.range,
143
+ light.width,
144
+ light.height,
145
+ light.spotAngle,
146
+ light.penumbra,
147
+ light.castsShadow ? 1 : 0,
148
+ light.layerMask
149
+ ].join("|");
150
+ }
151
+ function finiteNonNegative(value) {
152
+ return Number.isFinite(value) ? Math.max(0, value) : 0;
153
+ }
154
+ function compareText(left, right) {
155
+ return left < right ? -1 : left > right ? 1 : 0;
156
+ }
27
157
  function kindToFloat(kind) {
28
158
  switch (kind) {
29
159
  case "directional":
@@ -32,6 +162,8 @@ function kindToFloat(kind) {
32
162
  return 1;
33
163
  case "spot":
34
164
  return 2;
165
+ case "rect-area":
166
+ return 3;
35
167
  }
36
168
  }
37
169
  //# sourceMappingURL=LightUniforms.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"LightUniforms.js","sourceRoot":"","sources":["../../../../packages/rendering/src/LightUniforms.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,MAAM,CAAC,MAAM,iBAAiB,GAAG,EAAE,CAAC;AAQpC,MAAM,OAAO,aAAa;IACxB,MAAM,CAAU,cAAc,GAAG,EAAE,CAAC;IAEpC,MAAM,CAAU,MAAM,GAAG,IAAI,aAAa,CAAC;QACzC,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,OAAO,EAAE;QACvC,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,iBAAiB,GAAG,CAAC,EAAE;KAC1E,CAAC,CAAC;IAEH,MAAM,CAAC,IAAI,CAAC,MAAiC,EAAE,SAAS,GAAG,iBAAiB;QAC1E,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,SAAS,IAAI,CAAC,IAAI,SAAS,GAAG,iBAAiB,EAAE,CAAC;YACpF,MAAM,IAAI,UAAU,CAAC,uCAAuC,iBAAiB,GAAG,CAAC,CAAC;QACpF,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;QAC5C,MAAM,IAAI,GAAG,IAAI,YAAY,CAAC,iBAAiB,GAAG,aAAa,CAAC,cAAc,CAAC,CAAC;QAChF,QAAQ,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;YAChC,MAAM,MAAM,GAAG,KAAK,GAAG,aAAa,CAAC,cAAc,CAAC;YACpD,MAAM,sBAAsB,GAAG,KAAK,CAAC,WAAW,CAAC;YACjD,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC,CAAC;YACpF,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC;YAC7F,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC;YAC5G,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,QAAQ,EAAE,sBAAsB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,EAAE,CAAC,CAAC;QAC5G,CAAC,CAAC,CAAC;QACH,OAAO,EAAE,UAAU,EAAE,QAAQ,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,aAAa,CAAC,MAAM,EAAE,CAAC;IAC7E,CAAC;;AAGH,SAAS,WAAW,CAAC,IAA4B;IAC/C,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,aAAa;YAChB,OAAO,CAAC,CAAC;QACX,KAAK,OAAO;YACV,OAAO,CAAC,CAAC;QACX,KAAK,MAAM;YACT,OAAO,CAAC,CAAC;IACb,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"LightUniforms.js","sourceRoot":"","sources":["../../../../packages/rendering/src/LightUniforms.ts"],"names":[],"mappings":"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"}
@@ -12,6 +12,8 @@ export interface LightingRigLightDescriptor {
12
12
  readonly range: number;
13
13
  readonly spotAngle: number;
14
14
  readonly penumbra: number;
15
+ readonly width: number;
16
+ readonly height: number;
15
17
  readonly castsShadow: boolean;
16
18
  readonly claimBoundary: string;
17
19
  }
@@ -47,7 +49,82 @@ export interface LightingRigOptions {
47
49
  readonly intensityScale?: number;
48
50
  readonly shadows?: boolean;
49
51
  readonly includeUnsupportedDiagnostics?: boolean;
52
+ /**
53
+ * Scale light *placements* to the rendered subject, keeping the rig's geometry across asset swaps.
54
+ *
55
+ * ## Why this exists
56
+ *
57
+ * Preset positions are authored for a subject about 1 unit tall. Every showcase route therefore ignored
58
+ * them and hand-authored its own coordinates: Turbo as `SCENE_SIZE` multiples, Blockfall and Aura Clash as
59
+ * bare numbers. The *structure* those routes built was identical -- ambient, key, opposing rims -- and only
60
+ * the coordinates differed, because each route re-derived where a rim belongs for its own subject size.
61
+ *
62
+ * That is the same defect class as the framing constants: a coordinate correct for one subject reads as a
63
+ * design decision, survives an asset swap, and is then silently wrong. Turbo's `CAR_SCENE_HEIGHT` and its
64
+ * hand-tuned chase height both outlived their assets exactly this way.
65
+ *
66
+ * Supplying `subject` multiplies each preset position by `subjectHeight` (and lateral placement by the
67
+ * subject's widest horizontal extent, since a rim must reach the silhouette edge to do anything), then
68
+ * lifts the rig onto `floorY`. Intensities are untouched: a rig that dimmed with subject size would make
69
+ * large subjects dark for no photographic reason.
70
+ */
71
+ readonly subject?: LightingRigSubject;
72
+ }
73
+ /** Rendered subject measurements a rig scales its placements to. */
74
+ export interface LightingRigSubject {
75
+ /** Rendered subject height in world units. Pair with `resolveSubjectRenderedSize` so it is derived. */
76
+ readonly height: number;
77
+ /** Widest horizontal extent, used for lateral rim placement. Defaults to `height`. */
78
+ readonly width?: number;
79
+ /** World Y of the surface the subject stands on. Defaults to 0. */
80
+ readonly floorY?: number;
50
81
  }
51
82
  export declare function createLightingRig(options?: LightingRigOptions): LightingRig;
83
+ /** Placement for a rim light that follows a moving subject. */
84
+ export interface SubjectRimPlacement {
85
+ /** World position for the rim light. */
86
+ readonly position: readonly [number, number, number];
87
+ /** Point-light range, sized so falloff keeps the rim on the subject rather than the backdrop. */
88
+ readonly range: number;
89
+ }
90
+ export interface SubjectRimPlacementOptions {
91
+ /** Subject's current world position (its ground contact point). */
92
+ readonly subjectPosition: readonly [number, number, number];
93
+ /** Rendered subject height in world units. Everything below is a fraction of it. */
94
+ readonly subjectHeight: number;
95
+ /** Which side of the subject the rim sits on. */
96
+ readonly side: "left" | "right";
97
+ /**
98
+ * Depth offset behind the subject, as a fraction of subject height.
99
+ *
100
+ * Negative values sit behind a subject viewed down -z, which is what makes the light graze the silhouette
101
+ * edge instead of front-lighting the body.
102
+ */
103
+ readonly depthFraction?: number | undefined;
104
+ /** Height above the subject's contact point, as a fraction of subject height. */
105
+ readonly heightFraction?: number | undefined;
106
+ /** Lateral offset, as a fraction of subject height. */
107
+ readonly lateralFraction?: number | undefined;
108
+ /** Range as a fraction of subject height. */
109
+ readonly rangeFraction?: number | undefined;
110
+ }
111
+ /**
112
+ * Place a rim light relative to a moving subject.
113
+ *
114
+ * ## Why this is reusable rather than route-local
115
+ *
116
+ * Aura Clash computes per-fighter rim placement inline as
117
+ * `(fighter.x ± 0.34, fighter.y + 1.22, -0.72)` with `range = 1.5`. Against its 1.829-unit fighter rig those
118
+ * are 0.186x, 0.667x, -0.394x and 0.820x of subject height respectively — clean photographic ratios written as
119
+ * absolute literals. Any fighter rig of a different height silently breaks them: the rim drifts off the
120
+ * silhouette and stops separating the subject from the backdrop, which is the one thing a rim exists to do.
121
+ *
122
+ * That is the same defect class as the framing constants removed earlier in this work: a coordinate correct
123
+ * for one asset reads as a design decision, survives a swap, and is then wrong. Expressing the ratios keeps
124
+ * the intent ("upper-torso height, slightly outboard, behind the subject") and lets the numbers follow the rig.
125
+ *
126
+ * The defaults are Aura Clash's measured values, so adopting this helper is a no-op for its current rig.
127
+ */
128
+ export declare function resolveSubjectRimPlacement(options: SubjectRimPlacementOptions): SubjectRimPlacement;
52
129
  export declare function listLightingRigPresets(): readonly LightingRigPreset[];
53
130
  //# sourceMappingURL=LightingRig.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"LightingRig.d.ts","sourceRoot":"","sources":["../../../../packages/rendering/src/LightingRig.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"LightingRig.d.ts","sourceRoot":"","sources":["../../../../packages/rendering/src/LightingRig.ts"],"names":[],"mappings":"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"}