@aura3d/engine 4.1.2 → 4.2.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 (268) hide show
  1. package/README.md +52 -730
  2. package/dist/audio/synth/SynthCueBank.d.ts.map +1 -1
  3. package/dist/audio/synth/SynthCueBank.js +11 -2
  4. package/dist/audio/synth/SynthCueBank.js.map +1 -1
  5. package/dist/audio/synth/types.d.ts +4 -0
  6. package/dist/audio/synth/types.d.ts.map +1 -1
  7. package/dist/aura3d-cli/cli.d.ts.map +1 -1
  8. package/dist/aura3d-cli/cli.js +49 -17
  9. package/dist/aura3d-cli/cli.js.map +1 -1
  10. package/dist/aura3d-cli/commands/evidence/index.d.ts +3 -0
  11. package/dist/aura3d-cli/commands/evidence/index.d.ts.map +1 -0
  12. package/dist/aura3d-cli/commands/evidence/index.js +12 -0
  13. package/dist/aura3d-cli/commands/evidence/index.js.map +1 -0
  14. package/dist/aura3d-cli/commands/evidence/judge.d.ts +18 -0
  15. package/dist/aura3d-cli/commands/evidence/judge.d.ts.map +1 -0
  16. package/dist/aura3d-cli/commands/evidence/judge.js +194 -0
  17. package/dist/aura3d-cli/commands/evidence/judge.js.map +1 -0
  18. package/dist/aura3d-cli/commands/evidence/judgeLib.d.ts +84 -0
  19. package/dist/aura3d-cli/commands/evidence/judgeLib.d.ts.map +1 -0
  20. package/dist/aura3d-cli/commands/evidence/judgeLib.js +178 -0
  21. package/dist/aura3d-cli/commands/evidence/judgeLib.js.map +1 -0
  22. package/dist/aura3d-cli/commands/registry.d.ts +1 -0
  23. package/dist/aura3d-cli/commands/registry.d.ts.map +1 -1
  24. package/dist/aura3d-cli/commands/registry.js +1 -0
  25. package/dist/aura3d-cli/commands/registry.js.map +1 -1
  26. package/dist/aura3d-cli/look/capture.d.ts +15 -7
  27. package/dist/aura3d-cli/look/capture.d.ts.map +1 -1
  28. package/dist/aura3d-cli/look/capture.js +85 -13
  29. package/dist/aura3d-cli/look/capture.js.map +1 -1
  30. package/dist/aura3d-cli/pull-bridge/adapters.d.ts +9 -1
  31. package/dist/aura3d-cli/pull-bridge/adapters.d.ts.map +1 -1
  32. package/dist/aura3d-cli/pull-bridge/adapters.js +30 -7
  33. package/dist/aura3d-cli/pull-bridge/adapters.js.map +1 -1
  34. package/dist/aura3d-cli/pull-bridge/search.d.ts +5 -0
  35. package/dist/aura3d-cli/pull-bridge/search.d.ts.map +1 -1
  36. package/dist/aura3d-cli/pull-bridge/search.js +7 -1
  37. package/dist/aura3d-cli/pull-bridge/search.js.map +1 -1
  38. package/dist/aura3d-cli/pull-bridge.js +1 -1
  39. package/dist/aura3d-cli/pull-bridge.js.map +1 -1
  40. package/dist/aura3d-cli/resolve-ladder.d.ts +123 -0
  41. package/dist/aura3d-cli/resolve-ladder.d.ts.map +1 -0
  42. package/dist/aura3d-cli/resolve-ladder.js +410 -0
  43. package/dist/aura3d-cli/resolve-ladder.js.map +1 -0
  44. package/dist/create-aura3d/index.js +1 -1
  45. package/dist/debug/index.d.ts +2 -2
  46. package/dist/debug/index.d.ts.map +1 -1
  47. package/dist/debug/index.js +1 -1
  48. package/dist/debug/index.js.map +1 -1
  49. package/dist/debug/safety/frameBoundary.d.ts +33 -0
  50. package/dist/debug/safety/frameBoundary.d.ts.map +1 -0
  51. package/dist/debug/safety/frameBoundary.js +40 -0
  52. package/dist/debug/safety/frameBoundary.js.map +1 -0
  53. package/dist/debug/safety/index.d.ts +1 -0
  54. package/dist/debug/safety/index.d.ts.map +1 -1
  55. package/dist/debug/safety/index.js +1 -0
  56. package/dist/debug/safety/index.js.map +1 -1
  57. package/dist/engine/agent-api/app/actorBoneMatrixLookup.d.ts +22 -0
  58. package/dist/engine/agent-api/app/actorBoneMatrixLookup.d.ts.map +1 -0
  59. package/dist/engine/agent-api/app/actorBoneMatrixLookup.js +24 -0
  60. package/dist/engine/agent-api/app/actorBoneMatrixLookup.js.map +1 -0
  61. package/dist/engine/agent-api/app/canvas.d.ts +16 -0
  62. package/dist/engine/agent-api/app/canvas.d.ts.map +1 -1
  63. package/dist/engine/agent-api/app/canvas.js +15 -0
  64. package/dist/engine/agent-api/app/canvas.js.map +1 -1
  65. package/dist/engine/agent-api/app/createAuraApp.d.ts.map +1 -1
  66. package/dist/engine/agent-api/app/createAuraApp.js +21 -3
  67. package/dist/engine/agent-api/app/createAuraApp.js.map +1 -1
  68. package/dist/engine/agent-api/app/frameLoop.d.ts.map +1 -1
  69. package/dist/engine/agent-api/app/frameLoop.js +21 -3
  70. package/dist/engine/agent-api/app/frameLoop.js.map +1 -1
  71. package/dist/engine/agent-api/app/mountFailure.d.ts +6 -0
  72. package/dist/engine/agent-api/app/mountFailure.d.ts.map +1 -0
  73. package/dist/engine/agent-api/app/mountFailure.js +9 -0
  74. package/dist/engine/agent-api/app/mountFailure.js.map +1 -0
  75. package/dist/engine/agent-api/app/parentFit.d.ts +35 -0
  76. package/dist/engine/agent-api/app/parentFit.d.ts.map +1 -0
  77. package/dist/engine/agent-api/app/parentFit.js +36 -0
  78. package/dist/engine/agent-api/app/parentFit.js.map +1 -0
  79. package/dist/engine/agent-api/compiler/customMaterial.js +3 -2
  80. package/dist/engine/agent-api/compiler/customMaterial.js.map +1 -1
  81. package/dist/engine/agent-api/compiler/geometry.d.ts +13 -0
  82. package/dist/engine/agent-api/compiler/geometry.d.ts.map +1 -1
  83. package/dist/engine/agent-api/compiler/geometry.js +30 -3
  84. package/dist/engine/agent-api/compiler/geometry.js.map +1 -1
  85. package/dist/engine/agent-api/compiler/primitives.d.ts +1 -2
  86. package/dist/engine/agent-api/compiler/primitives.d.ts.map +1 -1
  87. package/dist/engine/agent-api/compiler/primitives.js +21 -4
  88. package/dist/engine/agent-api/compiler/primitives.js.map +1 -1
  89. package/dist/engine/agent-api/index.d.ts +4 -0
  90. package/dist/engine/agent-api/index.d.ts.map +1 -1
  91. package/dist/engine/agent-api/index.js +1 -0
  92. package/dist/engine/agent-api/index.js.map +1 -1
  93. package/dist/engine/agent-api/nodes/batched.d.ts +10 -0
  94. package/dist/engine/agent-api/nodes/batched.d.ts.map +1 -1
  95. package/dist/engine/agent-api/nodes/batched.js +7 -5
  96. package/dist/engine/agent-api/nodes/batched.js.map +1 -1
  97. package/dist/engine/agent-api/nodes/builder.d.ts +13 -0
  98. package/dist/engine/agent-api/nodes/builder.d.ts.map +1 -1
  99. package/dist/engine/agent-api/nodes/builder.js +7 -3
  100. package/dist/engine/agent-api/nodes/builder.js.map +1 -1
  101. package/dist/engine/agent-api/nodes/cameras.d.ts +7 -0
  102. package/dist/engine/agent-api/nodes/cameras.d.ts.map +1 -1
  103. package/dist/engine/agent-api/nodes/cameras.js +7 -0
  104. package/dist/engine/agent-api/nodes/cameras.js.map +1 -1
  105. package/dist/engine/agent-api/nodes/chaseCamera.d.ts +122 -0
  106. package/dist/engine/agent-api/nodes/chaseCamera.d.ts.map +1 -0
  107. package/dist/engine/agent-api/nodes/chaseCamera.js +130 -0
  108. package/dist/engine/agent-api/nodes/chaseCamera.js.map +1 -0
  109. package/dist/engine/agent-api/nodes/effects.composite.d.ts +1 -0
  110. package/dist/engine/agent-api/nodes/effects.composite.d.ts.map +1 -1
  111. package/dist/engine/agent-api/nodes/effects.composite.js +2 -0
  112. package/dist/engine/agent-api/nodes/effects.composite.js.map +1 -1
  113. package/dist/engine/agent-api/nodes/effects.toon.d.ts +26 -0
  114. package/dist/engine/agent-api/nodes/effects.toon.d.ts.map +1 -0
  115. package/dist/engine/agent-api/nodes/effects.toon.js +70 -0
  116. package/dist/engine/agent-api/nodes/effects.toon.js.map +1 -0
  117. package/dist/engine/agent-api/nodes/instancedMesh.d.ts +10 -0
  118. package/dist/engine/agent-api/nodes/instancedMesh.d.ts.map +1 -1
  119. package/dist/engine/agent-api/nodes/instancedMesh.js +7 -5
  120. package/dist/engine/agent-api/nodes/instancedMesh.js.map +1 -1
  121. package/dist/engine/agent-api/nodes/prefabs/index.d.ts +3 -0
  122. package/dist/engine/agent-api/nodes/prefabs/index.d.ts.map +1 -1
  123. package/dist/engine/agent-api/nodes/prefabs/index.js +3 -0
  124. package/dist/engine/agent-api/nodes/prefabs/index.js.map +1 -1
  125. package/dist/engine/agent-api/nodes/prefabs/objectiveMarker.d.ts +32 -0
  126. package/dist/engine/agent-api/nodes/prefabs/objectiveMarker.d.ts.map +1 -0
  127. package/dist/engine/agent-api/nodes/prefabs/objectiveMarker.js +77 -0
  128. package/dist/engine/agent-api/nodes/prefabs/objectiveMarker.js.map +1 -0
  129. package/dist/engine/lanes/prd06.d.ts.map +1 -1
  130. package/dist/engine/lanes/prd06.js +1 -16
  131. package/dist/engine/lanes/prd06.js.map +1 -1
  132. package/dist/engine/production-runtime/actor/ModelTextureShare.d.ts +1 -1
  133. package/dist/engine/production-runtime/actor/ModelTextureShare.d.ts.map +1 -1
  134. package/dist/engine/production-runtime/actor/ModelTextureShare.js +1 -1
  135. package/dist/engine/production-runtime/actor/ModelTextureShare.js.map +1 -1
  136. package/dist/engine/public/index.d.ts +52 -67
  137. package/dist/engine/public/index.d.ts.map +1 -1
  138. package/dist/engine/public/index.js +59 -56
  139. package/dist/engine/public/index.js.map +1 -1
  140. package/dist/engine/qa/countedRng.d.ts +2 -0
  141. package/dist/engine/qa/countedRng.d.ts.map +1 -1
  142. package/dist/engine/qa/countedRng.js +3 -0
  143. package/dist/engine/qa/countedRng.js.map +1 -1
  144. package/dist/engine/qa/fixedStepLoop.d.ts +4 -0
  145. package/dist/engine/qa/fixedStepLoop.d.ts.map +1 -1
  146. package/dist/engine/qa/fixedStepLoop.js +6 -0
  147. package/dist/engine/qa/fixedStepLoop.js.map +1 -1
  148. package/dist/engine/qa/hooks.js +1 -1
  149. package/dist/engine/qa/hooks.js.map +1 -1
  150. package/dist/game/evidence/beacon.d.ts +16 -6
  151. package/dist/game/evidence/beacon.d.ts.map +1 -1
  152. package/dist/game/evidence/beacon.js +32 -14
  153. package/dist/game/evidence/beacon.js.map +1 -1
  154. package/dist/game/evidence/textureStatus.d.ts +24 -0
  155. package/dist/game/evidence/textureStatus.d.ts.map +1 -0
  156. package/dist/game/evidence/textureStatus.js +27 -0
  157. package/dist/game/evidence/textureStatus.js.map +1 -0
  158. package/dist/game/hud/canvasMinimap.d.ts +60 -0
  159. package/dist/game/hud/canvasMinimap.d.ts.map +1 -0
  160. package/dist/game/hud/canvasMinimap.js +62 -0
  161. package/dist/game/hud/canvasMinimap.js.map +1 -0
  162. package/dist/game/hud/compass.d.ts +16 -0
  163. package/dist/game/hud/compass.d.ts.map +1 -0
  164. package/dist/game/hud/compass.js +15 -0
  165. package/dist/game/hud/compass.js.map +1 -0
  166. package/dist/game/index.d.ts +9 -0
  167. package/dist/game/index.d.ts.map +1 -1
  168. package/dist/game/index.js +5 -0
  169. package/dist/game/index.js.map +1 -1
  170. package/dist/game/motion/boneAttach.d.ts +42 -0
  171. package/dist/game/motion/boneAttach.d.ts.map +1 -0
  172. package/dist/game/motion/boneAttach.js +166 -0
  173. package/dist/game/motion/boneAttach.js.map +1 -0
  174. package/dist/game/motion/cameraClear.d.ts +35 -0
  175. package/dist/game/motion/cameraClear.d.ts.map +1 -0
  176. package/dist/game/motion/cameraClear.js +64 -0
  177. package/dist/game/motion/cameraClear.js.map +1 -0
  178. package/dist/game/motion/doubleFrame.d.ts +37 -0
  179. package/dist/game/motion/doubleFrame.d.ts.map +1 -0
  180. package/dist/game/motion/doubleFrame.js +59 -0
  181. package/dist/game/motion/doubleFrame.js.map +1 -0
  182. package/dist/game/motion/footSlide.d.ts +32 -0
  183. package/dist/game/motion/footSlide.d.ts.map +1 -0
  184. package/dist/game/motion/footSlide.js +59 -0
  185. package/dist/game/motion/footSlide.js.map +1 -0
  186. package/dist/game/motion/impact.d.ts +113 -0
  187. package/dist/game/motion/impact.d.ts.map +1 -0
  188. package/dist/game/motion/impact.js +233 -0
  189. package/dist/game/motion/impact.js.map +1 -0
  190. package/dist/game/motion/index.d.ts +19 -0
  191. package/dist/game/motion/index.d.ts.map +1 -0
  192. package/dist/game/motion/index.js +10 -0
  193. package/dist/game/motion/index.js.map +1 -0
  194. package/dist/game/motion/locomotion.d.ts +55 -0
  195. package/dist/game/motion/locomotion.d.ts.map +1 -0
  196. package/dist/game/motion/locomotion.js +107 -0
  197. package/dist/game/motion/locomotion.js.map +1 -0
  198. package/dist/game/motion/motionGate.d.ts +41 -0
  199. package/dist/game/motion/motionGate.d.ts.map +1 -0
  200. package/dist/game/motion/motionGate.js +71 -0
  201. package/dist/game/motion/motionGate.js.map +1 -0
  202. package/dist/game/motion/presenter.d.ts +37 -0
  203. package/dist/game/motion/presenter.d.ts.map +1 -0
  204. package/dist/game/motion/presenter.js +72 -0
  205. package/dist/game/motion/presenter.js.map +1 -0
  206. package/dist/game/motion/smoothing.d.ts +34 -0
  207. package/dist/game/motion/smoothing.d.ts.map +1 -0
  208. package/dist/game/motion/smoothing.js +92 -0
  209. package/dist/game/motion/smoothing.js.map +1 -0
  210. package/dist/game/session/warmPrograms.d.ts +58 -0
  211. package/dist/game/session/warmPrograms.d.ts.map +1 -0
  212. package/dist/game/session/warmPrograms.js +63 -0
  213. package/dist/game/session/warmPrograms.js.map +1 -0
  214. package/dist/math/Random.d.ts +3 -0
  215. package/dist/math/Random.d.ts.map +1 -1
  216. package/dist/math/Random.js +7 -0
  217. package/dist/math/Random.js.map +1 -1
  218. package/dist/rendering/WebGL2Device.d.ts.map +1 -1
  219. package/dist/rendering/WebGL2Device.js +3 -4
  220. package/dist/rendering/WebGL2Device.js.map +1 -1
  221. package/dist/rendering/environment/EnvironmentCache.d.ts.map +1 -1
  222. package/dist/rendering/environment/EnvironmentCache.js +6 -1
  223. package/dist/rendering/environment/EnvironmentCache.js.map +1 -1
  224. package/dist/rendering/environment/neutralEmbedded.d.ts +5 -0
  225. package/dist/rendering/environment/neutralEmbedded.d.ts.map +1 -0
  226. package/dist/rendering/environment/neutralEmbedded.js +1118 -0
  227. package/dist/rendering/environment/neutralEmbedded.js.map +1 -0
  228. package/dist/rendering/environment/neutralEmbeddedLoader.d.ts +5 -0
  229. package/dist/rendering/environment/neutralEmbeddedLoader.d.ts.map +1 -0
  230. package/dist/rendering/environment/neutralEmbeddedLoader.js +32 -0
  231. package/dist/rendering/environment/neutralEmbeddedLoader.js.map +1 -0
  232. package/dist/rendering/geometry/Primitives.d.ts +4 -1
  233. package/dist/rendering/geometry/Primitives.d.ts.map +1 -1
  234. package/dist/rendering/geometry/Primitives.js +5 -1
  235. package/dist/rendering/geometry/Primitives.js.map +1 -1
  236. package/dist/rendering/renderer/CullingBatching.d.ts.map +1 -1
  237. package/dist/rendering/renderer/CullingBatching.js +3 -7
  238. package/dist/rendering/renderer/CullingBatching.js.map +1 -1
  239. package/dist/rendering/renderer/InstanceBounds.d.ts +18 -0
  240. package/dist/rendering/renderer/InstanceBounds.d.ts.map +1 -0
  241. package/dist/rendering/renderer/InstanceBounds.js +68 -0
  242. package/dist/rendering/renderer/InstanceBounds.js.map +1 -0
  243. package/dist/rendering/renderer/RenderShared.d.ts.map +1 -1
  244. package/dist/rendering/renderer/RenderShared.js +3 -7
  245. package/dist/rendering/renderer/RenderShared.js.map +1 -1
  246. package/dist/rendering/shadows/DirectionalCascadeFitter.d.ts.map +1 -1
  247. package/dist/rendering/shadows/DirectionalCascadeFitter.js +19 -10
  248. package/dist/rendering/shadows/DirectionalCascadeFitter.js.map +1 -1
  249. package/dist/rendering/webgl2/LdrPostprocessShader.d.ts +24 -0
  250. package/dist/rendering/webgl2/LdrPostprocessShader.d.ts.map +1 -0
  251. package/dist/rendering/webgl2/LdrPostprocessShader.js +233 -0
  252. package/dist/rendering/webgl2/LdrPostprocessShader.js.map +1 -0
  253. package/dist/rendering/webgl2/LegacyPost.d.ts +5 -3
  254. package/dist/rendering/webgl2/LegacyPost.d.ts.map +1 -1
  255. package/dist/rendering/webgl2/LegacyPost.js +23 -191
  256. package/dist/rendering/webgl2/LegacyPost.js.map +1 -1
  257. package/package.json +25 -25
  258. package/templates/cinematic-scene/package.json +4 -3
  259. package/templates/mini-game/index.html +3 -1
  260. package/templates/mini-game/package.json +4 -3
  261. package/templates/mini-game/public/fonts/graphik/Graphik-Medium-Web.woff2 +0 -0
  262. package/templates/mini-game/public/fonts/graphik/Graphik-Regular-Web.woff2 +0 -0
  263. package/templates/mini-game/src/main.ts +1 -1
  264. package/templates/product-viewer/package.json +4 -3
  265. package/templates/production-asset-inspector/package.json +1 -1
  266. package/templates/production-material-studio/package.json +1 -1
  267. package/templates/production-product-configurator/package.json +1 -1
  268. package/templates/production-product-viewer/package.json +1 -1
@@ -10,6 +10,7 @@ import { BLOOM_BRIGHT_LUT_HEIGHT, BLOOM_BRIGHT_LUT_WIDTH, BLOOM_COMPOSITE_LUT_SI
10
10
  // `u_hasFxaa` taps stay the default path.
11
11
  import { FXAA_185_FRAGMENT_GLSL } from "../post/shaders/fxaa.glsl.js";
12
12
  import { recordPostSkipped } from "../renderer/postSkipped.js";
13
+ import { ldrFragmentSource, ldrVariantKey } from "./LdrPostprocessShader.js";
13
14
  export class WebGL2LegacyPostPipeline {
14
15
  host;
15
16
  constructor(host) {
@@ -29,7 +30,8 @@ export class WebGL2LegacyPostPipeline {
29
30
  bloomPyramidResources = null;
30
31
  depthOfFieldProgram = null;
31
32
  lastBloomDiagnostics = null;
32
- ldrPostprocessProgram = null;
33
+ /** One compiled program per feature variant (see `ldrFragmentSource`). */
34
+ ldrPostprocessPrograms = new Map();
33
35
  motionBlurProgram = null;
34
36
  nativeFxaaFinalizeProgram = null;
35
37
  motionBlurVelocitySize = null;
@@ -159,7 +161,6 @@ export class WebGL2LegacyPostPipeline {
159
161
  const ssrOptions = ssrPass ? normalizeNativeSsrOptions(ssrPass.options) : undefined;
160
162
  const taaOptions = taaPass ? normalizeNativeTaaOptions(taaPass.options, source.width, source.height) : undefined;
161
163
  const outlineOptions = outlinePass ? normalizeNativeOutlineOptions(outlinePass.options) : undefined;
162
- const program = this.ensureLdrPostprocessProgram();
163
164
  const vertexArray = this.ensurePresentationVertexArray();
164
165
  const sourceIsHdr = source.colorTexture.format !== "rgba8";
165
166
  // PRD-03 Phase 1: `fxaa.variant === "r185"` splits the finalize — the
@@ -243,7 +244,7 @@ export class WebGL2LegacyPostPipeline {
243
244
  if ((depthOfFieldOptions || motionBlurOptions || ssaoOptions || ssrOptions || taaOptions || outlineOptions) && bloomResources) {
244
245
  if (tonePass || colorPass) {
245
246
  const baseTargetIndex = 0;
246
- this.drawNativeLdrStage(ldrSourceHandle, bloomResources.framebuffers[baseTargetIndex], source.width, source.height, program, vertexArray, tonePass, colorPass, undefined, options.toneMappingDefaults);
247
+ this.drawNativeLdrStage(ldrSourceHandle, bloomResources.framebuffers[baseTargetIndex], source.width, source.height, vertexArray, tonePass, colorPass, undefined, options.toneMappingDefaults);
247
248
  ldrSourceHandle = bloomResources.textures[baseTargetIndex];
248
249
  temporarySourceIndex = baseTargetIndex;
249
250
  }
@@ -280,11 +281,11 @@ export class WebGL2LegacyPostPipeline {
280
281
  }
281
282
  if (fxaaSplit && bloomResources) {
282
283
  const fxaaScratchIndex = temporarySourceIndex === 0 ? 1 : 0;
283
- this.drawNativeLdrStage(ldrSourceHandle, bloomResources.framebuffers[fxaaScratchIndex], source.width, source.height, program, vertexArray, depthOfFieldOptions || motionBlurOptions || ssaoOptions || ssrOptions || taaOptions || outlineOptions ? undefined : tonePass, depthOfFieldOptions || motionBlurOptions || ssaoOptions || ssrOptions || taaOptions || outlineOptions ? undefined : colorPass, undefined, options.toneMappingDefaults);
284
+ this.drawNativeLdrStage(ldrSourceHandle, bloomResources.framebuffers[fxaaScratchIndex], source.width, source.height, vertexArray, depthOfFieldOptions || motionBlurOptions || ssaoOptions || ssrOptions || taaOptions || outlineOptions ? undefined : tonePass, depthOfFieldOptions || motionBlurOptions || ssaoOptions || ssrOptions || taaOptions || outlineOptions ? undefined : colorPass, undefined, options.toneMappingDefaults);
284
285
  this.executeNativeFxaaFinalize(bloomResources.textures[fxaaScratchIndex], webglOutputTarget?.framebuffer ?? null, outputWidth, outputHeight, source.width, source.height, vertexArray);
285
286
  }
286
287
  else {
287
- this.drawNativeLdrStage(ldrSourceHandle, webglOutputTarget?.framebuffer ?? null, outputWidth, outputHeight, program, vertexArray, depthOfFieldOptions || motionBlurOptions || ssaoOptions || ssrOptions || taaOptions || outlineOptions ? undefined : tonePass, depthOfFieldOptions || motionBlurOptions || ssaoOptions || ssrOptions || taaOptions || outlineOptions ? undefined : colorPass, fxaaPass, options.toneMappingDefaults);
288
+ this.drawNativeLdrStage(ldrSourceHandle, webglOutputTarget?.framebuffer ?? null, outputWidth, outputHeight, vertexArray, depthOfFieldOptions || motionBlurOptions || ssaoOptions || ssrOptions || taaOptions || outlineOptions ? undefined : tonePass, depthOfFieldOptions || motionBlurOptions || ssaoOptions || ssrOptions || taaOptions || outlineOptions ? undefined : colorPass, fxaaPass, options.toneMappingDefaults);
288
289
  }
289
290
  this.host.gl.flush();
290
291
  }
@@ -483,10 +484,19 @@ export class WebGL2LegacyPostPipeline {
483
484
  this.host.stateCache.invalidate();
484
485
  }
485
486
  }
486
- drawNativeLdrStage(sourceTexture, framebuffer, width, height, program, vertexArray, tonePass, colorPass, fxaaPass, toneMappingDefaults) {
487
+ drawNativeLdrStage(sourceTexture, framebuffer, width, height, vertexArray, tonePass, colorPass, fxaaPass, toneMappingDefaults) {
487
488
  const toneOptions = { ...(toneMappingDefaults ?? {}), ...(tonePass?.options ?? {}) };
488
489
  const colorOptions = colorPass?.options ?? {};
489
490
  const fxaaOptions = fxaaPass?.options ?? {};
491
+ const program = this.ensureLdrPostprocessProgram({
492
+ toneMapping: Boolean(tonePass),
493
+ operator: toneMappingOperatorId(stringOption(toneOptions, "operator", "reinhard")),
494
+ inputSrgb: colorSpaceId(stringOption(toneOptions, "inputColorSpace", "linear")) === 1,
495
+ outputSrgb: colorSpaceId(stringOption(toneOptions, "outputColorSpace", "linear")) === 1,
496
+ grade: Boolean(colorPass),
497
+ sharpening: Boolean(colorPass) && numberOption(colorOptions, "sharpening", 0) > 0,
498
+ fxaa: Boolean(fxaaPass)
499
+ });
490
500
  this.host.lifecycle.bindOutput(framebuffer, width, height);
491
501
  this.host.gl.useProgram(program);
492
502
  this.host.gl.bindVertexArray(vertexArray);
@@ -1808,10 +1818,11 @@ void main() {
1808
1818
  }
1809
1819
  return program;
1810
1820
  }
1811
- ensureLdrPostprocessProgram() {
1812
- if (this.ldrPostprocessProgram) {
1813
- return this.ldrPostprocessProgram;
1814
- }
1821
+ ensureLdrPostprocessProgram(variant) {
1822
+ const key = ldrVariantKey(variant);
1823
+ const cached = this.ldrPostprocessPrograms.get(key);
1824
+ if (cached)
1825
+ return cached;
1815
1826
  const vertex = this.host.device.compileShader(this.host.gl.VERTEX_SHADER, `#version 300 es
1816
1827
  precision highp float;
1817
1828
  out vec2 v_uv;
@@ -1821,186 +1832,7 @@ void main() {
1821
1832
  gl_Position = vec4(position * 2.0 - 1.0, 0.0, 1.0);
1822
1833
  }
1823
1834
  `, "webgl2-ldr-postprocess");
1824
- const fragment = this.host.device.compileShader(this.host.gl.FRAGMENT_SHADER, `#version 300 es
1825
- precision highp float;
1826
- uniform sampler2D u_source;
1827
- uniform vec2 u_texelSize;
1828
- uniform int u_hasToneMapping;
1829
- uniform int u_toneOperator;
1830
- uniform int u_inputColorSpace;
1831
- uniform int u_outputColorSpace;
1832
- uniform float u_exposure;
1833
- uniform float u_whitePoint;
1834
- uniform float u_gamma;
1835
- uniform int u_hasColorGrade;
1836
- uniform float u_contrast;
1837
- uniform float u_temperature;
1838
- uniform float u_tint;
1839
- uniform float u_saturation;
1840
- uniform float u_vibrance;
1841
- uniform float u_vignette;
1842
- uniform float u_sharpening;
1843
- uniform int u_hasFxaa;
1844
- uniform float u_edgeThreshold;
1845
- uniform float u_subpixelBlend;
1846
- in vec2 v_uv;
1847
- out vec4 outColor;
1848
-
1849
- float srgbToLinear(float value) {
1850
- return value <= 0.04045 ? value / 12.92 : pow((value + 0.055) / 1.055, 2.4);
1851
- }
1852
-
1853
- float linearToSrgb(float value) {
1854
- return value <= 0.0031308 ? value * 12.92 : 1.055 * pow(value, 1.0 / 2.4) - 0.055;
1855
- }
1856
-
1857
- vec3 decodeColor(vec3 color) {
1858
- return u_inputColorSpace == 1 ? vec3(srgbToLinear(color.r), srgbToLinear(color.g), srgbToLinear(color.b)) : color;
1859
- }
1860
-
1861
- vec3 encodeColor(vec3 color) {
1862
- vec3 linear = clamp(color, 0.0, 1.0);
1863
- return u_outputColorSpace == 1 ? vec3(linearToSrgb(linear.r), linearToSrgb(linear.g), linearToSrgb(linear.b)) : linear;
1864
- }
1865
-
1866
- vec3 acesRrtAndOdtFit(vec3 value) {
1867
- vec3 numerator = value * (value + 0.0245786) - 0.000090537;
1868
- vec3 denominator = value * (0.983729 * value + 0.4329510) + 0.238081;
1869
- return numerator / denominator;
1870
- }
1871
-
1872
- vec3 acesFilmic(vec3 color) {
1873
- // Match current Three.js ACESFilmicToneMapping. ACES is a coupled RGB
1874
- // transform; a scalar approximation shifts hue and washes saturated colors.
1875
- const mat3 acesInput = mat3(
1876
- vec3(0.59719, 0.07600, 0.02840),
1877
- vec3(0.35458, 0.90834, 0.13383),
1878
- vec3(0.04823, 0.01566, 0.83777)
1879
- );
1880
- const mat3 acesOutput = mat3(
1881
- vec3(1.60475, -0.10208, -0.00327),
1882
- vec3(-0.53108, 1.10813, -0.07276),
1883
- vec3(-0.07367, -0.00605, 1.07602)
1884
- );
1885
- vec3 acesColor = acesInput * (color / 0.6);
1886
- acesColor = acesRrtAndOdtFit(acesColor);
1887
- return clamp(acesOutput * acesColor, 0.0, 1.0);
1888
- }
1889
-
1890
- float filmic(float value) {
1891
- float x = max(0.0, value);
1892
- float toe = max(0.0, x - 0.004);
1893
- float curve = (toe * (6.2 * toe + 0.5)) / (toe * (6.2 * toe + 1.7) + 0.06);
1894
- return min(curve, x * 1.08);
1895
- }
1896
-
1897
- float uncharted2(float value) {
1898
- float a = 0.15;
1899
- float b = 0.5;
1900
- float c = 0.1;
1901
- float d = 0.2;
1902
- float e = 0.02;
1903
- float f = 0.3;
1904
- float w = 11.2;
1905
- float x = value * 2.0;
1906
- float curve = ((x * (a * x + c * b) + d * e) / (x * (a * x + b) + d * f)) - e / f;
1907
- float wx = w;
1908
- float white = ((wx * (a * wx + c * b) + d * e) / (wx * (a * wx + b) + d * f)) - e / f;
1909
- return clamp(curve / white, 0.0, 1.0);
1910
- }
1911
-
1912
- float agx(float value) {
1913
- float x = max(0.0, value);
1914
- float encoded = log2(1.0 + x) / log2(17.0);
1915
- return clamp(encoded * encoded * (3.0 - 2.0 * encoded), 0.0, 1.0);
1916
- }
1917
-
1918
- float neutral(float value) {
1919
- float x = max(0.0, value);
1920
- return min(1.0, (x * (1.0 + x / 7.5)) / (1.0 + x));
1921
- }
1922
-
1923
- float toneMapChannel(float value) {
1924
- float exposed = max(0.0, value * u_exposure) / max(0.0001, u_whitePoint);
1925
- if (u_toneOperator == 0) return min(1.0, exposed);
1926
- if (u_toneOperator == 1) return exposed / (1.0 + exposed);
1927
- if (u_toneOperator == 2) return exposed;
1928
- if (u_toneOperator == 3) return filmic(exposed);
1929
- if (u_toneOperator == 4) return uncharted2(exposed);
1930
- if (u_toneOperator == 5) return agx(exposed);
1931
- return neutral(exposed);
1932
- }
1933
-
1934
- vec3 applyToneMapping(vec3 color) {
1935
- if (u_hasToneMapping == 0) return color;
1936
- vec3 decoded = decodeColor(color);
1937
- vec3 mapped = u_toneOperator == 2
1938
- ? acesFilmic(max(vec3(0.0), decoded * u_exposure) / max(0.0001, u_whitePoint))
1939
- : vec3(toneMapChannel(decoded.r), toneMapChannel(decoded.g), toneMapChannel(decoded.b));
1940
- return encodeColor(mapped);
1941
- }
1942
-
1943
- vec3 applyColorGrade(vec3 color, vec2 uv) {
1944
- if (u_hasColorGrade == 0) return color;
1945
- float contrastOffset = 0.5 - 0.5 * u_contrast;
1946
- float redShift = u_temperature * 0.08 - u_tint * 0.02;
1947
- float greenShift = u_tint * 0.06;
1948
- float blueShift = -u_temperature * 0.08 - u_tint * 0.02;
1949
- float luma = dot(color, vec3(0.2126, 0.7152, 0.0722));
1950
- vec3 graded = color * u_contrast + vec3(contrastOffset + redShift, contrastOffset + greenShift, contrastOffset + blueShift);
1951
- float distanceFromLuma = min(1.0, abs(graded.r - luma) + abs(graded.g - luma) + abs(graded.b - luma));
1952
- float vibranceBoost = u_vibrance == 0.0 ? 0.0 : u_vibrance * (1.0 - distanceFromLuma);
1953
- float saturation = u_saturation + vibranceBoost;
1954
- graded = vec3(luma) + (graded - vec3(luma)) * saturation;
1955
- vec2 centered = uv * 2.0 - 1.0;
1956
- float vignette = 1.0 - u_vignette * clamp((length(centered) - 0.28) / 1.12, 0.0, 1.0);
1957
- return clamp(graded * vignette, 0.0, 1.0);
1958
- }
1959
-
1960
- vec3 baseColorAt(vec2 uv) {
1961
- vec2 clampedUv = clamp(uv, vec2(0.0), vec2(1.0));
1962
- vec3 color = texture(u_source, clampedUv).rgb;
1963
- return applyColorGrade(applyToneMapping(color), clampedUv);
1964
- }
1965
-
1966
- vec3 finalColorAt(vec2 uv) {
1967
- vec3 center = baseColorAt(uv);
1968
- if (u_hasColorGrade == 0 || u_sharpening <= 0.0) return center;
1969
- vec3 blur = (
1970
- baseColorAt(uv + vec2(-u_texelSize.x, 0.0)) +
1971
- baseColorAt(uv + vec2(u_texelSize.x, 0.0)) +
1972
- baseColorAt(uv + vec2(0.0, -u_texelSize.y)) +
1973
- baseColorAt(uv + vec2(0.0, u_texelSize.y))
1974
- ) * 0.25;
1975
- return clamp(center + (center - blur) * u_sharpening, 0.0, 1.0);
1976
- }
1977
-
1978
- float luma(vec3 color) {
1979
- return dot(color, vec3(0.2126, 0.7152, 0.0722));
1980
- }
1981
-
1982
- void main() {
1983
- vec3 center = finalColorAt(v_uv);
1984
- float alpha = texture(u_source, clamp(v_uv, vec2(0.0), vec2(1.0))).a;
1985
- if (u_hasFxaa == 0) {
1986
- outColor = vec4(center, alpha);
1987
- return;
1988
- }
1989
- vec3 north = finalColorAt(v_uv + vec2(0.0, -u_texelSize.y));
1990
- vec3 south = finalColorAt(v_uv + vec2(0.0, u_texelSize.y));
1991
- vec3 west = finalColorAt(v_uv + vec2(-u_texelSize.x, 0.0));
1992
- vec3 east = finalColorAt(v_uv + vec2(u_texelSize.x, 0.0));
1993
- float centerLuma = luma(center);
1994
- float minLuma = min(centerLuma, min(min(luma(north), luma(south)), min(luma(west), luma(east))));
1995
- float maxLuma = max(centerLuma, max(max(luma(north), luma(south)), max(luma(west), luma(east))));
1996
- if (maxLuma - minLuma < u_edgeThreshold) {
1997
- outColor = vec4(center, alpha);
1998
- return;
1999
- }
2000
- vec3 average = (north + south + west + east) * 0.25;
2001
- outColor = vec4(mix(center, average, clamp(u_subpixelBlend, 0.0, 1.0)), alpha);
2002
- }
2003
- `, "webgl2-ldr-postprocess");
1835
+ const fragment = this.host.device.compileShader(this.host.gl.FRAGMENT_SHADER, ldrFragmentSource(variant), "webgl2-ldr-postprocess");
2004
1836
  const program = this.host.gl.createProgram();
2005
1837
  if (!program) {
2006
1838
  this.host.gl.deleteShader(vertex);
@@ -2018,7 +1850,7 @@ void main() {
2018
1850
  this.host.gl.deleteProgram(program);
2019
1851
  throw new RenderDeviceError("WebGL2 LDR postprocess shader link failed", "SHADER_LINK_FAILED", { log });
2020
1852
  }
2021
- this.ldrPostprocessProgram = program;
1853
+ this.ldrPostprocessPrograms.set(key, program);
2022
1854
  return program;
2023
1855
  }
2024
1856
  }