@aura3d/rendering 4.3.7 → 4.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 (182) hide show
  1. package/dist/DepthPass.d.ts.map +1 -1
  2. package/dist/DepthPass.js +3 -2
  3. package/dist/DepthPass.js.map +1 -1
  4. package/dist/ForwardPass.d.ts +13 -0
  5. package/dist/ForwardPass.d.ts.map +1 -1
  6. package/dist/ForwardPass.js +64 -11
  7. package/dist/ForwardPass.js.map +1 -1
  8. package/dist/MaterialBinding.js +6 -2
  9. package/dist/MaterialBinding.js.map +1 -1
  10. package/dist/Renderer.d.ts +8 -0
  11. package/dist/Renderer.d.ts.map +1 -1
  12. package/dist/Renderer.js +37 -6
  13. package/dist/Renderer.js.map +1 -1
  14. package/dist/ShaderChunks.d.ts.map +1 -1
  15. package/dist/ShaderChunks.js +3 -1
  16. package/dist/ShaderChunks.js.map +1 -1
  17. package/dist/ShaderLibrary.d.ts.map +1 -1
  18. package/dist/ShaderLibrary.js +17 -5
  19. package/dist/ShaderLibrary.js.map +1 -1
  20. package/dist/ShaderLibraryCore.d.ts.map +1 -1
  21. package/dist/ShaderLibraryCore.js +2 -1
  22. package/dist/ShaderLibraryCore.js.map +1 -1
  23. package/dist/WebGL2Device.d.ts +16 -1
  24. package/dist/WebGL2Device.d.ts.map +1 -1
  25. package/dist/WebGL2Device.js +94 -37
  26. package/dist/WebGL2Device.js.map +1 -1
  27. package/dist/WebGL2StateCache.d.ts +22 -0
  28. package/dist/WebGL2StateCache.d.ts.map +1 -1
  29. package/dist/WebGL2StateCache.js +71 -42
  30. package/dist/WebGL2StateCache.js.map +1 -1
  31. package/dist/contracts/core.d.ts.map +1 -1
  32. package/dist/contracts/core.js +22 -2
  33. package/dist/contracts/core.js.map +1 -1
  34. package/dist/contracts/program.d.ts.map +1 -1
  35. package/dist/contracts/program.js +8 -1
  36. package/dist/contracts/program.js.map +1 -1
  37. package/dist/contracts/quality.d.ts +21 -0
  38. package/dist/contracts/quality.d.ts.map +1 -1
  39. package/dist/contracts/quality.js +5 -0
  40. package/dist/contracts/quality.js.map +1 -1
  41. package/dist/contracts/renderItem.d.ts +6 -0
  42. package/dist/contracts/renderItem.d.ts.map +1 -1
  43. package/dist/contracts/structuralMemo.d.ts +23 -0
  44. package/dist/contracts/structuralMemo.d.ts.map +1 -0
  45. package/dist/contracts/structuralMemo.js +81 -0
  46. package/dist/contracts/structuralMemo.js.map +1 -0
  47. package/dist/environment/EnvironmentCache.d.ts.map +1 -1
  48. package/dist/environment/EnvironmentCache.js +6 -1
  49. package/dist/environment/EnvironmentCache.js.map +1 -1
  50. package/dist/environment/FirstFrameGate.d.ts +23 -0
  51. package/dist/environment/FirstFrameGate.d.ts.map +1 -0
  52. package/dist/environment/FirstFrameGate.js +58 -0
  53. package/dist/environment/FirstFrameGate.js.map +1 -0
  54. package/dist/environment/Rgb9e5Cube.d.ts.map +1 -1
  55. package/dist/environment/Rgb9e5Cube.js +8 -4
  56. package/dist/environment/Rgb9e5Cube.js.map +1 -1
  57. package/dist/environment/probeBuild.d.ts +29 -0
  58. package/dist/environment/probeBuild.d.ts.map +1 -1
  59. package/dist/environment/probeBuild.js +124 -45
  60. package/dist/environment/probeBuild.js.map +1 -1
  61. package/dist/forward/Lighting.d.ts +11 -3
  62. package/dist/forward/Lighting.d.ts.map +1 -1
  63. package/dist/forward/Lighting.js +25 -15
  64. package/dist/forward/Lighting.js.map +1 -1
  65. package/dist/forward/contactShadowMaskStore.d.ts +41 -0
  66. package/dist/forward/contactShadowMaskStore.d.ts.map +1 -0
  67. package/dist/forward/contactShadowMaskStore.js +85 -0
  68. package/dist/forward/contactShadowMaskStore.js.map +1 -0
  69. package/dist/geometry/Shape.d.ts.map +1 -1
  70. package/dist/geometry/Shape.js +7 -2
  71. package/dist/geometry/Shape.js.map +1 -1
  72. package/dist/geometry/Support.d.ts +4 -0
  73. package/dist/geometry/Support.d.ts.map +1 -1
  74. package/dist/geometry/Support.js +3 -2
  75. package/dist/geometry/Support.js.map +1 -1
  76. package/dist/index.d.ts +6 -0
  77. package/dist/index.d.ts.map +1 -1
  78. package/dist/index.js +5 -0
  79. package/dist/index.js.map +1 -1
  80. package/dist/passes/ContactShadowPass.d.ts +40 -3
  81. package/dist/passes/ContactShadowPass.d.ts.map +1 -1
  82. package/dist/passes/ContactShadowPass.js +73 -13
  83. package/dist/passes/ContactShadowPass.js.map +1 -1
  84. package/dist/passes/Prd02ContactShadowsContributor.d.ts +19 -0
  85. package/dist/passes/Prd02ContactShadowsContributor.d.ts.map +1 -1
  86. package/dist/passes/Prd02ContactShadowsContributor.js +179 -28
  87. package/dist/passes/Prd02ContactShadowsContributor.js.map +1 -1
  88. package/dist/program/ProgramFeatures.d.ts +6 -0
  89. package/dist/program/ProgramFeatures.d.ts.map +1 -1
  90. package/dist/program/ProgramFeatures.js +11 -5
  91. package/dist/program/ProgramFeatures.js.map +1 -1
  92. package/dist/program/ProgramGenerator.d.ts +6 -0
  93. package/dist/program/ProgramGenerator.d.ts.map +1 -1
  94. package/dist/program/ProgramGenerator.js +36 -1
  95. package/dist/program/ProgramGenerator.js.map +1 -1
  96. package/dist/program/ProgramKey.d.ts.map +1 -1
  97. package/dist/program/ProgramKey.js +4 -1
  98. package/dist/program/ProgramKey.js.map +1 -1
  99. package/dist/program/chunks/shadow_forward.glsl.d.ts +1 -1
  100. package/dist/program/chunks/shadow_forward.glsl.d.ts.map +1 -1
  101. package/dist/program/chunks/shadow_forward.glsl.js +4 -1
  102. package/dist/program/chunks/shadow_forward.glsl.js.map +1 -1
  103. package/dist/quality/DirectPath.d.ts +43 -0
  104. package/dist/quality/DirectPath.d.ts.map +1 -0
  105. package/dist/quality/DirectPath.js +42 -0
  106. package/dist/quality/DirectPath.js.map +1 -0
  107. package/dist/renderer/Background.d.ts +0 -5
  108. package/dist/renderer/Background.d.ts.map +1 -1
  109. package/dist/renderer/Background.js +25 -2
  110. package/dist/renderer/Background.js.map +1 -1
  111. package/dist/renderer/InstanceFrustumCull.d.ts +39 -0
  112. package/dist/renderer/InstanceFrustumCull.d.ts.map +1 -0
  113. package/dist/renderer/InstanceFrustumCull.js +127 -0
  114. package/dist/renderer/InstanceFrustumCull.js.map +1 -0
  115. package/dist/renderer/ShadowOrchestration.d.ts +2 -0
  116. package/dist/renderer/ShadowOrchestration.d.ts.map +1 -1
  117. package/dist/renderer/ShadowOrchestration.js +1 -0
  118. package/dist/renderer/ShadowOrchestration.js.map +1 -1
  119. package/dist/renderer/coreOutputPostRoute.d.ts +0 -5
  120. package/dist/renderer/coreOutputPostRoute.d.ts.map +1 -1
  121. package/dist/renderer/coreOutputPostRoute.js +12 -2
  122. package/dist/renderer/coreOutputPostRoute.js.map +1 -1
  123. package/dist/resources/InstanceBuffer.d.ts +2 -0
  124. package/dist/resources/InstanceBuffer.d.ts.map +1 -1
  125. package/dist/resources/InstanceBuffer.js +23 -0
  126. package/dist/resources/InstanceBuffer.js.map +1 -1
  127. package/dist/shaders/chunks/contact_shadow.glsl.d.ts +11 -6
  128. package/dist/shaders/chunks/contact_shadow.glsl.d.ts.map +1 -1
  129. package/dist/shaders/chunks/contact_shadow.glsl.js +41 -19
  130. package/dist/shaders/chunks/contact_shadow.glsl.js.map +1 -1
  131. package/dist/shaders/chunks/contact_shadow_mask.glsl.d.ts +12 -0
  132. package/dist/shaders/chunks/contact_shadow_mask.glsl.d.ts.map +1 -0
  133. package/dist/shaders/chunks/contact_shadow_mask.glsl.js +21 -0
  134. package/dist/shaders/chunks/contact_shadow_mask.glsl.js.map +1 -0
  135. package/dist/shadows/CascadeUse.d.ts +28 -0
  136. package/dist/shadows/CascadeUse.d.ts.map +1 -0
  137. package/dist/shadows/CascadeUse.js +45 -0
  138. package/dist/shadows/CascadeUse.js.map +1 -0
  139. package/dist/shadows/Prd02DepthShaderLibrary.d.ts +7 -1
  140. package/dist/shadows/Prd02DepthShaderLibrary.d.ts.map +1 -1
  141. package/dist/shadows/Prd02DepthShaderLibrary.js +12 -3
  142. package/dist/shadows/Prd02DepthShaderLibrary.js.map +1 -1
  143. package/dist/shadows/Prd02ShadowBridge.d.ts +12 -1
  144. package/dist/shadows/Prd02ShadowBridge.d.ts.map +1 -1
  145. package/dist/shadows/Prd02ShadowBridge.js +17 -5
  146. package/dist/shadows/Prd02ShadowBridge.js.map +1 -1
  147. package/dist/shadows/ShadowFilterTier.d.ts +51 -0
  148. package/dist/shadows/ShadowFilterTier.d.ts.map +1 -0
  149. package/dist/shadows/ShadowFilterTier.js +89 -0
  150. package/dist/shadows/ShadowFilterTier.js.map +1 -0
  151. package/dist/shadows/ShadowSystem.d.ts +15 -0
  152. package/dist/shadows/ShadowSystem.d.ts.map +1 -1
  153. package/dist/shadows/ShadowSystem.js +12 -2
  154. package/dist/shadows/ShadowSystem.js.map +1 -1
  155. package/dist/shadows/shadowLegacy.d.ts +12 -0
  156. package/dist/shadows/shadowLegacy.d.ts.map +1 -1
  157. package/dist/shadows/shadowLegacy.js +24 -0
  158. package/dist/shadows/shadowLegacy.js.map +1 -1
  159. package/dist/webgl2/BloomFusion.d.ts +31 -0
  160. package/dist/webgl2/BloomFusion.d.ts.map +1 -0
  161. package/dist/webgl2/BloomFusion.js +25 -0
  162. package/dist/webgl2/BloomFusion.js.map +1 -0
  163. package/dist/webgl2/ContextLifecycle.d.ts +14 -0
  164. package/dist/webgl2/ContextLifecycle.d.ts.map +1 -1
  165. package/dist/webgl2/ContextLifecycle.js +30 -3
  166. package/dist/webgl2/ContextLifecycle.js.map +1 -1
  167. package/dist/webgl2/LegacyPost.d.ts +30 -0
  168. package/dist/webgl2/LegacyPost.d.ts.map +1 -1
  169. package/dist/webgl2/LegacyPost.js +259 -27
  170. package/dist/webgl2/LegacyPost.js.map +1 -1
  171. package/dist/webgl2/MultiDraw.d.ts.map +1 -1
  172. package/dist/webgl2/MultiDraw.js +9 -1
  173. package/dist/webgl2/MultiDraw.js.map +1 -1
  174. package/dist/webgl2/Samplers.d.ts +10 -1
  175. package/dist/webgl2/Samplers.d.ts.map +1 -1
  176. package/dist/webgl2/Samplers.js +24 -1
  177. package/dist/webgl2/Samplers.js.map +1 -1
  178. package/dist/webgl2/TextureFormats.d.ts +12 -0
  179. package/dist/webgl2/TextureFormats.d.ts.map +1 -1
  180. package/dist/webgl2/TextureFormats.js +16 -0
  181. package/dist/webgl2/TextureFormats.js.map +1 -1
  182. package/package.json +3 -3
package/dist/Renderer.js CHANGED
@@ -36,6 +36,7 @@ import { prd11LiveQualityTier } from "./quality/liveTier.js";
36
36
  import { MaterialInstance } from "./MaterialInstance.js";
37
37
  import { featuresForGeometry, materialRoutesToGeneratedProgram } from "./program/MaterialFeatures.js";
38
38
  import { selectShaderFeatureBits } from "./program/FeatureSelect.js";
39
+ import { PROGRAM_OUTPUT_SRGB_FEATURE } from "./program/ProgramFeatures.js";
39
40
  import { collectWarmupFeatures, ProgramWarmup } from "./program/ProgramWarmup.js";
40
41
  import { PRD03_EXPOSURE, rendererQrFlags, setRendererQrFlags, withRendererQrFlags } from "./renderer/FrameGraph.js";
41
42
  import { consumeTaaHistoryWritten } from "./renderer/postSkipped.js";
@@ -48,6 +49,7 @@ import { ensureSceneDepthCopyTarget, SceneDepthCopyPass } from "./renderer/Scene
48
49
  import { probeHdrTargetFormat, DEFAULT_TONE_MAPPING } from "./contracts/output.js";
49
50
  import { resolveForwardClusteredLighting } from "./forward/Lighting.js";
50
51
  import { assertRendererFeatures, createRendererFeatureReport } from "./RendererFeatureGates.js";
52
+ import { armFirstFrameGate, notifyFirstFramePresented } from "./environment/FirstFrameGate.js";
51
53
  import { batchStaticRenderItems } from "./SceneOptimization.js";
52
54
  import { createStaticMeshConsolidationCache } from "./MeshConsolidation.js";
53
55
  /**
@@ -130,6 +132,10 @@ export class Renderer {
130
132
  get postSkipped() {
131
133
  return this.lastPostSkipped;
132
134
  }
135
+ /** False when this renderer's flags pin the HDR-target/OutputPass route off (the direct canvas path). */
136
+ get outputPathActive() {
137
+ return qrCoreOutputOn(rendererQrFlags(this.device));
138
+ }
133
139
  resolutionGovernor;
134
140
  renderScaleCeiling = 1;
135
141
  unsubscribeDprWatch;
@@ -139,6 +145,7 @@ export class Renderer {
139
145
  probeGraph;
140
146
  constructor(device, options, temporalHistory) {
141
147
  this.device = device;
148
+ armFirstFrameGate();
142
149
  if (options.qrFlags)
143
150
  setRendererQrFlags(options.qrFlags, device);
144
151
  this.temporalHistory = temporalHistory;
@@ -264,6 +271,7 @@ export class Renderer {
264
271
  const cameraViewProjection = resolvedCamera?.viewProjectionMatrix;
265
272
  const collected = collectRenderItemsWithDiagnostics(source, cameraViewProjection, resolvedCamera?.camera);
266
273
  const before = this.device.getDiagnostics().programCompileCount ?? 0;
274
+ this.warmOutputSrgb = this.frameOutputsSrgb(source);
267
275
  await this.warmGeneratedPrograms(collected.items, collectRenderLights(source), collectEnvironmentLighting(source), collectEnvironmentFog(source), collectForwardShadowMap(source), cameraViewProjection);
268
276
  const after = this.device.getDiagnostics().programCompileCount ?? before;
269
277
  return {
@@ -603,7 +611,8 @@ export class Renderer {
603
611
  const shadowOptions = collectRendererShadowOptions(source);
604
612
  // C-02/T0-06: sync-path warm — kick generated-program compiles for the
605
613
  // exact draw feature records before the pass runs (bounded per frame).
606
- this.warmGeneratedProgramsSync(items, lights, environmentLighting, environmentFog, explicitShadowMap, cameraViewProjection);
614
+ this.warmOutputSrgb = this.frameOutputsSrgb(source);
615
+ // The warm itself runs after the shadow step below: with renderer-owned shadows the program key's shadow axis only exists once the map does.
607
616
  const sourceCameraPosition = collectSourceCameraPosition(source);
608
617
  const explicitRenderTarget = collectRenderTarget(source);
609
618
  validateExplicitRenderTarget(explicitRenderTarget);
@@ -719,7 +728,8 @@ export class Renderer {
719
728
  ownedTargets,
720
729
  ownedShadowPasses,
721
730
  camera: resolvedCamera?.camera,
722
- frameCamera: shadowFrameCamera(cameraViewProjection, cameraPosition)
731
+ frameCamera: shadowFrameCamera(cameraViewProjection, cameraPosition, resolvedCamera?.viewMatrix),
732
+ receivers: items
723
733
  })) ?? explicitShadowMap ?? this.executeRendererShadowMap({
724
734
  shadowOptions,
725
735
  source,
@@ -728,9 +738,13 @@ export class Renderer {
728
738
  ownedTargets,
729
739
  ownedShadowPasses,
730
740
  camera: resolvedCamera?.camera,
731
- frameCamera: shadowFrameCamera(cameraViewProjection, cameraPosition)
741
+ frameCamera: shadowFrameCamera(cameraViewProjection, cameraPosition, resolvedCamera?.viewMatrix),
742
+ receivers: items
732
743
  });
733
744
  frameHooks.addPasses(this.graph, "shadows", items);
745
+ // C-02/T0-06 sync-path warm, keyed on the shadow map this frame actually draws with (warming before it existed compiled no-shadow
746
+ // variants nothing draws: 2 dead programs on a one-material scene, 4 with a skinned model).
747
+ this.warmGeneratedProgramsSync(items, lights, environmentLighting, environmentFog, rendererShadowMap, cameraViewProjection);
734
748
  this.lastShadowEvidence = rendererShadowMap ? {
735
749
  lightMatrix: Array.from(rendererShadowMap.lightMatrix),
736
750
  cascades: rendererShadowMap.cascades?.map(c => ({ index: c.index, near: c.near, far: c.far, lightMatrix: Array.from(c.shadowMap.lightMatrix) })) ?? [],
@@ -935,6 +949,7 @@ export class Renderer {
935
949
  }
936
950
  }
937
951
  this.submittedFrames += 1;
952
+ notifyFirstFramePresented();
938
953
  this.submittedShadowFrameId += 1;
939
954
  if (this.lastShadowEvidence)
940
955
  this.lastShadowEvidence = { ...this.lastShadowEvidence, submissionFrameId: this.submittedShadowFrameId };
@@ -1002,6 +1017,7 @@ export class Renderer {
1002
1017
  const shadowOptions = collectRendererShadowOptions(source);
1003
1018
  // C-02 (PRD-01 §403): pre-render warm-then-block compile of the generated
1004
1019
  // programs this scene needs. Flag-off: nothing (sync path untouched).
1020
+ this.warmOutputSrgb = this.frameOutputsSrgb(source);
1005
1021
  await this.warmGeneratedPrograms(items, lights, environmentLighting, environmentFog, explicitShadowMap, cameraViewProjection);
1006
1022
  if (this.disposed || this.device.disposed) {
1007
1023
  return withRendererFrameDiagnostics(this.device.getDiagnostics(), collectionDiagnostics);
@@ -1121,7 +1137,8 @@ export class Renderer {
1121
1137
  ownedTargets,
1122
1138
  ownedShadowPasses,
1123
1139
  camera: resolvedCamera?.camera,
1124
- frameCamera: shadowFrameCamera(cameraViewProjection, cameraPosition)
1140
+ frameCamera: shadowFrameCamera(cameraViewProjection, cameraPosition, resolvedCamera?.viewMatrix),
1141
+ receivers: items
1125
1142
  })) ?? explicitShadowMap ?? this.executeRendererShadowMap({
1126
1143
  shadowOptions,
1127
1144
  source,
@@ -1130,7 +1147,8 @@ export class Renderer {
1130
1147
  ownedTargets,
1131
1148
  ownedShadowPasses,
1132
1149
  camera: resolvedCamera?.camera,
1133
- frameCamera: shadowFrameCamera(cameraViewProjection, cameraPosition)
1150
+ frameCamera: shadowFrameCamera(cameraViewProjection, cameraPosition, resolvedCamera?.viewMatrix),
1151
+ receivers: items
1134
1152
  });
1135
1153
  frameHooks.addPasses(this.graph, "shadows", items);
1136
1154
  this.lastShadowEvidence = rendererShadowMap ? {
@@ -1345,6 +1363,7 @@ export class Renderer {
1345
1363
  }
1346
1364
  }
1347
1365
  this.submittedFrames += 1;
1366
+ notifyFirstFramePresented();
1348
1367
  this.submittedShadowFrameId += 1;
1349
1368
  if (this.lastShadowEvidence)
1350
1369
  this.lastShadowEvidence = { ...this.lastShadowEvidence, submissionFrameId: this.submittedShadowFrameId };
@@ -1366,6 +1385,14 @@ export class Renderer {
1366
1385
  * generated-program materials need (lights/shadow/environment axes at the
1367
1386
  * current tier). Returns `materials: []` early when nothing generated.
1368
1387
  */
1388
+ /**
1389
+ * Whether the frame being warmed writes straight to the canvas (no postprocess, no OutputPass): its generated programs
1390
+ * carry the sRGB-encode feature bit, so the warmed keys match the draw keys. Set right before each warm call.
1391
+ */
1392
+ warmOutputSrgb = false;
1393
+ frameOutputsSrgb(source) {
1394
+ return !collectPostprocess(source) && !qrCoreOutputOn(rendererQrFlags(this.device));
1395
+ }
1369
1396
  collectWarmupInput(items, lights, environmentLighting, environmentFog, shadowMap, cameraViewProjection, flags, tier) {
1370
1397
  const ctx = { flags, tier: QUALITY_TIERS[tier] };
1371
1398
  // T0-05: one record per (material revision, selected feature bits) — the
@@ -1384,6 +1411,8 @@ export class Renderer {
1384
1411
  if (selected[PRD02_IBL_FEATURE] !== undefined && !prd02IblEnvironmentAvailable(environmentLighting, item)) {
1385
1412
  delete selected[PRD02_IBL_FEATURE];
1386
1413
  }
1414
+ if (this.warmOutputSrgb)
1415
+ selected[PROGRAM_OUTPUT_SRGB_FEATURE] = true;
1387
1416
  // #867 (games): same geometry-driven feature mask ForwardPass applies.
1388
1417
  const attrs = item.geometry.vertexBuffer.format.attributes;
1389
1418
  const has = (name) => attrs.some((a) => a.semantic === name || a.shaderName === name);
@@ -1402,7 +1431,9 @@ export class Renderer {
1402
1431
  materials: [...records.values()],
1403
1432
  lights: [axes.lights],
1404
1433
  shadows: axes.shadows ? [axes.shadows] : [],
1405
- environments: [axes.environment]
1434
+ environments: [axes.environment],
1435
+ // Nothing draws a generated `pass: "depth"` program: shadow casters render through the PRD-02 depth shaders.
1436
+ includeDepth: false
1406
1437
  };
1407
1438
  }
1408
1439
  async warmGeneratedPrograms(items, lights, environmentLighting, environmentFog, shadowMap, cameraViewProjection) {