@aura3d/engine 4.3.7 → 4.6.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 (577) hide show
  1. package/README.md +1 -0
  2. package/dist/animation/AnimationTrack.d.ts.map +1 -1
  3. package/dist/animation/AnimationTrack.js +3 -1
  4. package/dist/animation/AnimationTrack.js.map +1 -1
  5. package/dist/animation/pose/BoneMask.d.ts +8 -0
  6. package/dist/animation/pose/BoneMask.d.ts.map +1 -1
  7. package/dist/animation/pose/BoneMask.js +18 -1
  8. package/dist/animation/pose/BoneMask.js.map +1 -1
  9. package/dist/animation/pose/PoseMixer.d.ts +18 -2
  10. package/dist/animation/pose/PoseMixer.d.ts.map +1 -1
  11. package/dist/animation/pose/PoseMixer.js +55 -4
  12. package/dist/animation/pose/PoseMixer.js.map +1 -1
  13. package/dist/animation/pose/RetargetWorker.d.ts +8 -1
  14. package/dist/animation/pose/RetargetWorker.d.ts.map +1 -1
  15. package/dist/animation/pose/RetargetWorker.js +30 -2
  16. package/dist/animation/pose/RetargetWorker.js.map +1 -1
  17. package/dist/assets/GLTFAnimationRuntime.d.ts.map +1 -1
  18. package/dist/assets/GLTFAnimationRuntime.js +11 -4
  19. package/dist/assets/GLTFAnimationRuntime.js.map +1 -1
  20. package/dist/assets/GLTFLoader.d.ts +2 -0
  21. package/dist/assets/GLTFLoader.d.ts.map +1 -1
  22. package/dist/assets/GLTFLoader.js +17 -3
  23. package/dist/assets/GLTFLoader.js.map +1 -1
  24. package/dist/aura3d-cli/index.d.ts +6 -0
  25. package/dist/aura3d-cli/index.d.ts.map +1 -1
  26. package/dist/aura3d-cli/index.js +28 -0
  27. package/dist/aura3d-cli/index.js.map +1 -1
  28. package/dist/aura3d-cli/migrate-three/emit.d.ts.map +1 -1
  29. package/dist/aura3d-cli/migrate-three/emit.js +109 -29
  30. package/dist/aura3d-cli/migrate-three/emit.js.map +1 -1
  31. package/dist/aura3d-cli/migrate-three/mappings.d.ts +15 -0
  32. package/dist/aura3d-cli/migrate-three/mappings.d.ts.map +1 -1
  33. package/dist/aura3d-cli/migrate-three/mappings.js +70 -60
  34. package/dist/aura3d-cli/migrate-three/mappings.js.map +1 -1
  35. package/dist/aura3d-cli/migrate-three/parse.d.ts +9 -0
  36. package/dist/aura3d-cli/migrate-three/parse.d.ts.map +1 -1
  37. package/dist/aura3d-cli/migrate-three/parse.js +1 -1
  38. package/dist/aura3d-cli/migrate-three/parse.js.map +1 -1
  39. package/dist/create-aura3d/cli.js +22 -2
  40. package/dist/create-aura3d/cli.js.map +1 -1
  41. package/dist/create-aura3d/index.d.ts +11 -0
  42. package/dist/create-aura3d/index.d.ts.map +1 -1
  43. package/dist/create-aura3d/index.js +9 -2
  44. package/dist/create-aura3d/index.js.map +1 -1
  45. package/dist/create-aura3d/template-assets.d.ts +53 -0
  46. package/dist/create-aura3d/template-assets.d.ts.map +1 -0
  47. package/dist/create-aura3d/template-assets.js +116 -0
  48. package/dist/create-aura3d/template-assets.js.map +1 -0
  49. package/dist/engine/agent-api/Clock.d.ts +9 -3
  50. package/dist/engine/agent-api/Clock.d.ts.map +1 -1
  51. package/dist/engine/agent-api/Clock.js +17 -6
  52. package/dist/engine/agent-api/Clock.js.map +1 -1
  53. package/dist/engine/agent-api/animationMask.d.ts +26 -0
  54. package/dist/engine/agent-api/animationMask.d.ts.map +1 -0
  55. package/dist/engine/agent-api/animationMask.js +38 -0
  56. package/dist/engine/agent-api/animationMask.js.map +1 -0
  57. package/dist/engine/agent-api/app/actorAnimationHandle.d.ts +2 -0
  58. package/dist/engine/agent-api/app/actorAnimationHandle.d.ts.map +1 -1
  59. package/dist/engine/agent-api/app/actorAnimationHandle.js +26 -3
  60. package/dist/engine/agent-api/app/actorAnimationHandle.js.map +1 -1
  61. package/dist/engine/agent-api/app/canvas.d.ts +21 -0
  62. package/dist/engine/agent-api/app/canvas.d.ts.map +1 -1
  63. package/dist/engine/agent-api/app/canvas.js +119 -7
  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 +153 -14
  67. package/dist/engine/agent-api/app/createAuraApp.js.map +1 -1
  68. package/dist/engine/agent-api/app/frameLoop.d.ts +13 -0
  69. package/dist/engine/agent-api/app/frameLoop.d.ts.map +1 -1
  70. package/dist/engine/agent-api/app/frameLoop.js +118 -15
  71. package/dist/engine/agent-api/app/frameLoop.js.map +1 -1
  72. package/dist/engine/agent-api/app/mountRenderer.d.ts +6 -1
  73. package/dist/engine/agent-api/app/mountRenderer.d.ts.map +1 -1
  74. package/dist/engine/agent-api/app/mountRenderer.js +2 -2
  75. package/dist/engine/agent-api/app/mountRenderer.js.map +1 -1
  76. package/dist/engine/agent-api/app/parentFit.d.ts +20 -2
  77. package/dist/engine/agent-api/app/parentFit.d.ts.map +1 -1
  78. package/dist/engine/agent-api/app/parentFit.js +13 -9
  79. package/dist/engine/agent-api/app/parentFit.js.map +1 -1
  80. package/dist/engine/agent-api/app/renderPath.d.ts +86 -0
  81. package/dist/engine/agent-api/app/renderPath.d.ts.map +1 -0
  82. package/dist/engine/agent-api/app/renderPath.js +269 -0
  83. package/dist/engine/agent-api/app/renderPath.js.map +1 -0
  84. package/dist/engine/agent-api/app/rendererOptions.d.ts +31 -1
  85. package/dist/engine/agent-api/app/rendererOptions.d.ts.map +1 -1
  86. package/dist/engine/agent-api/app/rendererOptions.js +74 -7
  87. package/dist/engine/agent-api/app/rendererOptions.js.map +1 -1
  88. package/dist/engine/agent-api/app/routeState.d.ts.map +1 -1
  89. package/dist/engine/agent-api/app/routeState.js +8 -3
  90. package/dist/engine/agent-api/app/routeState.js.map +1 -1
  91. package/dist/engine/agent-api/app/runtimeNodes.d.ts +2 -0
  92. package/dist/engine/agent-api/app/runtimeNodes.d.ts.map +1 -1
  93. package/dist/engine/agent-api/app/runtimeNodes.js +111 -2
  94. package/dist/engine/agent-api/app/runtimeNodes.js.map +1 -1
  95. package/dist/engine/agent-api/camera/extension.d.ts.map +1 -1
  96. package/dist/engine/agent-api/camera/extension.js +2 -2
  97. package/dist/engine/agent-api/camera/extension.js.map +1 -1
  98. package/dist/engine/agent-api/camera/rigs/fromSpec.d.ts +2 -0
  99. package/dist/engine/agent-api/camera/rigs/fromSpec.d.ts.map +1 -1
  100. package/dist/engine/agent-api/camera/rigs/fromSpec.js +11 -1
  101. package/dist/engine/agent-api/camera/rigs/fromSpec.js.map +1 -1
  102. package/dist/engine/agent-api/compiler/animation.d.ts.map +1 -1
  103. package/dist/engine/agent-api/compiler/animation.js +4 -2
  104. package/dist/engine/agent-api/compiler/animation.js.map +1 -1
  105. package/dist/engine/agent-api/compiler/camera.d.ts.map +1 -1
  106. package/dist/engine/agent-api/compiler/camera.js +10 -0
  107. package/dist/engine/agent-api/compiler/camera.js.map +1 -1
  108. package/dist/engine/agent-api/compiler/compileScene.d.ts +21 -5
  109. package/dist/engine/agent-api/compiler/compileScene.d.ts.map +1 -1
  110. package/dist/engine/agent-api/compiler/compileScene.js +112 -13
  111. package/dist/engine/agent-api/compiler/compileScene.js.map +1 -1
  112. package/dist/engine/agent-api/compiler/contactShadowKey.d.ts +14 -0
  113. package/dist/engine/agent-api/compiler/contactShadowKey.d.ts.map +1 -0
  114. package/dist/engine/agent-api/compiler/contactShadowKey.js +66 -0
  115. package/dist/engine/agent-api/compiler/contactShadowKey.js.map +1 -0
  116. package/dist/engine/agent-api/compiler/environment.d.ts +56 -2
  117. package/dist/engine/agent-api/compiler/environment.d.ts.map +1 -1
  118. package/dist/engine/agent-api/compiler/environment.js +202 -15
  119. package/dist/engine/agent-api/compiler/environment.js.map +1 -1
  120. package/dist/engine/agent-api/compiler/geometry.d.ts +18 -1
  121. package/dist/engine/agent-api/compiler/geometry.d.ts.map +1 -1
  122. package/dist/engine/agent-api/compiler/geometry.js +25 -5
  123. package/dist/engine/agent-api/compiler/geometry.js.map +1 -1
  124. package/dist/engine/agent-api/compiler/lights.d.ts.map +1 -1
  125. package/dist/engine/agent-api/compiler/lights.js +14 -6
  126. package/dist/engine/agent-api/compiler/lights.js.map +1 -1
  127. package/dist/engine/agent-api/compiler/mountedRoots.d.ts +6 -0
  128. package/dist/engine/agent-api/compiler/mountedRoots.d.ts.map +1 -0
  129. package/dist/engine/agent-api/compiler/mountedRoots.js +25 -0
  130. package/dist/engine/agent-api/compiler/mountedRoots.js.map +1 -0
  131. package/dist/engine/agent-api/compiler/observations.d.ts +9 -1
  132. package/dist/engine/agent-api/compiler/observations.d.ts.map +1 -1
  133. package/dist/engine/agent-api/compiler/observations.js +5 -4
  134. package/dist/engine/agent-api/compiler/observations.js.map +1 -1
  135. package/dist/engine/agent-api/compiler/optionCoverage.js +17 -0
  136. package/dist/engine/agent-api/compiler/optionCoverage.js.map +1 -1
  137. package/dist/engine/agent-api/compiler/postprocess.d.ts.map +1 -1
  138. package/dist/engine/agent-api/compiler/postprocess.js +2 -0
  139. package/dist/engine/agent-api/compiler/postprocess.js.map +1 -1
  140. package/dist/engine/agent-api/compiler/primitives.d.ts +34 -0
  141. package/dist/engine/agent-api/compiler/primitives.d.ts.map +1 -1
  142. package/dist/engine/agent-api/compiler/primitives.js +113 -3
  143. package/dist/engine/agent-api/compiler/primitives.js.map +1 -1
  144. package/dist/engine/agent-api/compiler/renderInput.d.ts.map +1 -1
  145. package/dist/engine/agent-api/compiler/renderInput.js +40 -4
  146. package/dist/engine/agent-api/compiler/renderInput.js.map +1 -1
  147. package/dist/engine/agent-api/compiler/renderer.d.ts +6 -4
  148. package/dist/engine/agent-api/compiler/renderer.d.ts.map +1 -1
  149. package/dist/engine/agent-api/compiler/renderer.js +54 -14
  150. package/dist/engine/agent-api/compiler/renderer.js.map +1 -1
  151. package/dist/engine/agent-api/compiler/shadows.d.ts +35 -1
  152. package/dist/engine/agent-api/compiler/shadows.d.ts.map +1 -1
  153. package/dist/engine/agent-api/compiler/shadows.js +103 -4
  154. package/dist/engine/agent-api/compiler/shadows.js.map +1 -1
  155. package/dist/engine/agent-api/diagnostics.d.ts +22 -0
  156. package/dist/engine/agent-api/diagnostics.d.ts.map +1 -1
  157. package/dist/engine/agent-api/diagnostics.js +53 -1
  158. package/dist/engine/agent-api/diagnostics.js.map +1 -1
  159. package/dist/engine/agent-api/feel/extension.d.ts.map +1 -1
  160. package/dist/engine/agent-api/feel/extension.js +2 -1
  161. package/dist/engine/agent-api/feel/extension.js.map +1 -1
  162. package/dist/engine/agent-api/looks/lookFill.d.ts +4 -0
  163. package/dist/engine/agent-api/looks/lookFill.d.ts.map +1 -0
  164. package/dist/engine/agent-api/looks/lookFill.js +29 -0
  165. package/dist/engine/agent-api/looks/lookFill.js.map +1 -0
  166. package/dist/engine/agent-api/looks/lookPresets.d.ts +13 -0
  167. package/dist/engine/agent-api/looks/lookPresets.d.ts.map +1 -1
  168. package/dist/engine/agent-api/looks/lookPresets.js +5 -0
  169. package/dist/engine/agent-api/looks/lookPresets.js.map +1 -1
  170. package/dist/engine/agent-api/looks/looks.d.ts.map +1 -1
  171. package/dist/engine/agent-api/looks/looks.js +6 -0
  172. package/dist/engine/agent-api/looks/looks.js.map +1 -1
  173. package/dist/engine/agent-api/looks/structuralQA.d.ts.map +1 -1
  174. package/dist/engine/agent-api/looks/structuralQA.js +4 -2
  175. package/dist/engine/agent-api/looks/structuralQA.js.map +1 -1
  176. package/dist/engine/agent-api/nodes/game/instanceTransforms.d.ts +5 -4
  177. package/dist/engine/agent-api/nodes/game/instanceTransforms.d.ts.map +1 -1
  178. package/dist/engine/agent-api/nodes/game/instanceTransforms.js +61 -5
  179. package/dist/engine/agent-api/nodes/game/instanceTransforms.js.map +1 -1
  180. package/dist/engine/agent-api/nodes/groups.d.ts.map +1 -1
  181. package/dist/engine/agent-api/nodes/groups.js +2 -1
  182. package/dist/engine/agent-api/nodes/groups.js.map +1 -1
  183. package/dist/engine/agent-api/nodes/instances.d.ts.map +1 -1
  184. package/dist/engine/agent-api/nodes/instances.js +16 -4
  185. package/dist/engine/agent-api/nodes/instances.js.map +1 -1
  186. package/dist/engine/agent-api/nodes/interactions.d.ts +32 -10
  187. package/dist/engine/agent-api/nodes/interactions.d.ts.map +1 -1
  188. package/dist/engine/agent-api/nodes/interactions.js +40 -11
  189. package/dist/engine/agent-api/nodes/interactions.js.map +1 -1
  190. package/dist/engine/agent-api/nodes/model.d.ts +18 -0
  191. package/dist/engine/agent-api/nodes/model.d.ts.map +1 -1
  192. package/dist/engine/agent-api/nodes/model.js +41 -1
  193. package/dist/engine/agent-api/nodes/model.js.map +1 -1
  194. package/dist/engine/agent-api/nodes/optionDiagnostics.d.ts +14 -0
  195. package/dist/engine/agent-api/nodes/optionDiagnostics.d.ts.map +1 -0
  196. package/dist/engine/agent-api/nodes/optionDiagnostics.js +34 -0
  197. package/dist/engine/agent-api/nodes/optionDiagnostics.js.map +1 -0
  198. package/dist/engine/agent-api/nodes/orbitInteraction.d.ts +9 -0
  199. package/dist/engine/agent-api/nodes/orbitInteraction.d.ts.map +1 -0
  200. package/dist/engine/agent-api/nodes/orbitInteraction.js +52 -0
  201. package/dist/engine/agent-api/nodes/orbitInteraction.js.map +1 -0
  202. package/dist/engine/agent-api/nodes/physics.d.ts +26 -0
  203. package/dist/engine/agent-api/nodes/physics.d.ts.map +1 -1
  204. package/dist/engine/agent-api/nodes/physics.js +115 -7
  205. package/dist/engine/agent-api/nodes/physics.js.map +1 -1
  206. package/dist/engine/agent-api/nodes/primitives.d.ts +16 -1
  207. package/dist/engine/agent-api/nodes/primitives.d.ts.map +1 -1
  208. package/dist/engine/agent-api/nodes/primitives.js +27 -1
  209. package/dist/engine/agent-api/nodes/primitives.js.map +1 -1
  210. package/dist/engine/agent-api/nodes/scene.d.ts.map +1 -1
  211. package/dist/engine/agent-api/nodes/scene.js +4 -2
  212. package/dist/engine/agent-api/nodes/scene.js.map +1 -1
  213. package/dist/engine/agent-api/nodes/text3d.d.ts.map +1 -1
  214. package/dist/engine/agent-api/nodes/text3d.js +11 -2
  215. package/dist/engine/agent-api/nodes/text3d.js.map +1 -1
  216. package/dist/engine/agent-api/nodes/types/runtime.d.ts +38 -0
  217. package/dist/engine/agent-api/nodes/types/runtime.d.ts.map +1 -1
  218. package/dist/engine/agent-api/nodes/types.d.ts +44 -0
  219. package/dist/engine/agent-api/nodes/types.d.ts.map +1 -1
  220. package/dist/engine/agent-api/platform.d.ts +5 -0
  221. package/dist/engine/agent-api/platform.d.ts.map +1 -1
  222. package/dist/engine/agent-api/platform.js +15 -0
  223. package/dist/engine/agent-api/platform.js.map +1 -1
  224. package/dist/engine/agent-api/postBridge.d.ts.map +1 -1
  225. package/dist/engine/agent-api/postBridge.js +5 -1
  226. package/dist/engine/agent-api/postBridge.js.map +1 -1
  227. package/dist/engine/agent-api/sceneKitDiagnostics.d.ts.map +1 -1
  228. package/dist/engine/agent-api/sceneKitDiagnostics.js +5 -2
  229. package/dist/engine/agent-api/sceneKitDiagnostics.js.map +1 -1
  230. package/dist/engine/contracts/animation.d.ts +5 -3
  231. package/dist/engine/contracts/animation.d.ts.map +1 -1
  232. package/dist/engine/contracts/animation.js.map +1 -1
  233. package/dist/engine/contracts/environment.d.ts +9 -0
  234. package/dist/engine/contracts/environment.d.ts.map +1 -1
  235. package/dist/engine/contracts/environment.js.map +1 -1
  236. package/dist/engine/contracts/flags.d.ts.map +1 -1
  237. package/dist/engine/contracts/flags.js +2 -1
  238. package/dist/engine/contracts/flags.js.map +1 -1
  239. package/dist/engine/contracts/lighting.d.ts +3 -0
  240. package/dist/engine/contracts/lighting.d.ts.map +1 -1
  241. package/dist/engine/contracts/lighting.js.map +1 -1
  242. package/dist/engine/contracts/stubs/game.d.ts.map +1 -1
  243. package/dist/engine/contracts/stubs/game.js +9 -1
  244. package/dist/engine/contracts/stubs/game.js.map +1 -1
  245. package/dist/engine/contracts/urlCache.d.ts +4 -0
  246. package/dist/engine/contracts/urlCache.d.ts.map +1 -0
  247. package/dist/engine/contracts/urlCache.js +25 -0
  248. package/dist/engine/contracts/urlCache.js.map +1 -0
  249. package/dist/engine/lanes/prd01/outputSurface.d.ts.map +1 -1
  250. package/dist/engine/lanes/prd01/outputSurface.js +25 -1
  251. package/dist/engine/lanes/prd01/outputSurface.js.map +1 -1
  252. package/dist/engine/lanes/prd02.d.ts +12 -4
  253. package/dist/engine/lanes/prd02.d.ts.map +1 -1
  254. package/dist/engine/lanes/prd02.js +23 -7
  255. package/dist/engine/lanes/prd02.js.map +1 -1
  256. package/dist/game/touch/TouchControls.d.ts.map +1 -1
  257. package/dist/game/touch/TouchControls.js +48 -12
  258. package/dist/game/touch/TouchControls.js.map +1 -1
  259. package/dist/math/SphericalHarmonics3.d.ts +6 -3
  260. package/dist/math/SphericalHarmonics3.d.ts.map +1 -1
  261. package/dist/math/SphericalHarmonics3.js +8 -5
  262. package/dist/math/SphericalHarmonics3.js.map +1 -1
  263. package/dist/math/three/Box3.d.ts +106 -0
  264. package/dist/math/three/Box3.d.ts.map +1 -0
  265. package/dist/math/three/Box3.js +348 -0
  266. package/dist/math/three/Box3.js.map +1 -0
  267. package/dist/math/three/Color.d.ts +127 -0
  268. package/dist/math/three/Color.d.ts.map +1 -0
  269. package/dist/math/three/Color.js +501 -0
  270. package/dist/math/three/Color.js.map +1 -0
  271. package/dist/math/three/Euler.d.ts +50 -0
  272. package/dist/math/three/Euler.d.ts.map +1 -0
  273. package/dist/math/three/Euler.js +210 -0
  274. package/dist/math/three/Euler.js.map +1 -0
  275. package/dist/math/three/Frustum.d.ts +59 -0
  276. package/dist/math/three/Frustum.d.ts.map +1 -0
  277. package/dist/math/three/Frustum.js +135 -0
  278. package/dist/math/three/Frustum.js.map +1 -0
  279. package/dist/math/three/Matrix3.d.ts +56 -0
  280. package/dist/math/three/Matrix3.d.ts.map +1 -0
  281. package/dist/math/three/Matrix3.js +248 -0
  282. package/dist/math/three/Matrix3.js.map +1 -0
  283. package/dist/math/three/Matrix4.d.ts +79 -0
  284. package/dist/math/three/Matrix4.d.ts.map +1 -0
  285. package/dist/math/three/Matrix4.js +708 -0
  286. package/dist/math/three/Matrix4.js.map +1 -0
  287. package/dist/math/three/Plane.d.ts +65 -0
  288. package/dist/math/three/Plane.d.ts.map +1 -0
  289. package/dist/math/three/Plane.js +135 -0
  290. package/dist/math/three/Plane.js.map +1 -0
  291. package/dist/math/three/Quaternion.d.ts +91 -0
  292. package/dist/math/three/Quaternion.d.ts.map +1 -0
  293. package/dist/math/three/Quaternion.js +444 -0
  294. package/dist/math/three/Quaternion.js.map +1 -0
  295. package/dist/math/three/Ray.d.ts +56 -0
  296. package/dist/math/three/Ray.d.ts.map +1 -0
  297. package/dist/math/three/Ray.js +340 -0
  298. package/dist/math/three/Ray.js.map +1 -0
  299. package/dist/math/three/Sphere.d.ts +58 -0
  300. package/dist/math/three/Sphere.d.ts.map +1 -0
  301. package/dist/math/three/Sphere.js +166 -0
  302. package/dist/math/three/Sphere.js.map +1 -0
  303. package/dist/math/three/Triangle.d.ts +58 -0
  304. package/dist/math/three/Triangle.d.ts.map +1 -0
  305. package/dist/math/three/Triangle.js +229 -0
  306. package/dist/math/three/Triangle.js.map +1 -0
  307. package/dist/math/three/Vector2.d.ts +88 -0
  308. package/dist/math/three/Vector2.d.ts.map +1 -0
  309. package/dist/math/three/Vector2.js +283 -0
  310. package/dist/math/three/Vector2.js.map +1 -0
  311. package/dist/math/three/Vector3.d.ts +137 -0
  312. package/dist/math/three/Vector3.d.ts.map +1 -0
  313. package/dist/math/three/Vector3.js +458 -0
  314. package/dist/math/three/Vector3.js.map +1 -0
  315. package/dist/math/three/Vector4.d.ts +100 -0
  316. package/dist/math/three/Vector4.d.ts.map +1 -0
  317. package/dist/math/three/Vector4.js +443 -0
  318. package/dist/math/three/Vector4.js.map +1 -0
  319. package/dist/math/three/index.d.ts +29 -0
  320. package/dist/math/three/index.d.ts.map +1 -0
  321. package/dist/math/three/index.js +29 -0
  322. package/dist/math/three/index.js.map +1 -0
  323. package/dist/react/index.d.ts +21 -0
  324. package/dist/react/index.d.ts.map +1 -1
  325. package/dist/react/index.js +128 -21
  326. package/dist/react/index.js.map +1 -1
  327. package/dist/rendering/DepthPass.d.ts +7 -0
  328. package/dist/rendering/DepthPass.d.ts.map +1 -1
  329. package/dist/rendering/DepthPass.js +43 -6
  330. package/dist/rendering/DepthPass.js.map +1 -1
  331. package/dist/rendering/ForwardPass.d.ts +82 -5
  332. package/dist/rendering/ForwardPass.d.ts.map +1 -1
  333. package/dist/rendering/ForwardPass.js +180 -35
  334. package/dist/rendering/ForwardPass.js.map +1 -1
  335. package/dist/rendering/MaterialBinding.js +6 -2
  336. package/dist/rendering/MaterialBinding.js.map +1 -1
  337. package/dist/rendering/RenderDevice.d.ts +5 -0
  338. package/dist/rendering/RenderDevice.d.ts.map +1 -1
  339. package/dist/rendering/RenderDevice.js.map +1 -1
  340. package/dist/rendering/Renderer.d.ts +8 -0
  341. package/dist/rendering/Renderer.d.ts.map +1 -1
  342. package/dist/rendering/Renderer.js +37 -6
  343. package/dist/rendering/Renderer.js.map +1 -1
  344. package/dist/rendering/RendererPostprocessPlan.d.ts.map +1 -1
  345. package/dist/rendering/RendererPostprocessPlan.js +8 -1
  346. package/dist/rendering/RendererPostprocessPlan.js.map +1 -1
  347. package/dist/rendering/ShaderChunks.d.ts.map +1 -1
  348. package/dist/rendering/ShaderChunks.js +3 -1
  349. package/dist/rendering/ShaderChunks.js.map +1 -1
  350. package/dist/rendering/ShaderLibrary.d.ts.map +1 -1
  351. package/dist/rendering/ShaderLibrary.js +17 -5
  352. package/dist/rendering/ShaderLibrary.js.map +1 -1
  353. package/dist/rendering/ShaderLibraryCore.d.ts.map +1 -1
  354. package/dist/rendering/ShaderLibraryCore.js +2 -1
  355. package/dist/rendering/ShaderLibraryCore.js.map +1 -1
  356. package/dist/rendering/WebGL2Device.d.ts +19 -1
  357. package/dist/rendering/WebGL2Device.d.ts.map +1 -1
  358. package/dist/rendering/WebGL2Device.js +114 -37
  359. package/dist/rendering/WebGL2Device.js.map +1 -1
  360. package/dist/rendering/WebGL2StateCache.d.ts +22 -0
  361. package/dist/rendering/WebGL2StateCache.d.ts.map +1 -1
  362. package/dist/rendering/WebGL2StateCache.js +71 -42
  363. package/dist/rendering/WebGL2StateCache.js.map +1 -1
  364. package/dist/rendering/contracts/core.d.ts.map +1 -1
  365. package/dist/rendering/contracts/core.js +22 -2
  366. package/dist/rendering/contracts/core.js.map +1 -1
  367. package/dist/rendering/contracts/program.d.ts.map +1 -1
  368. package/dist/rendering/contracts/program.js +8 -1
  369. package/dist/rendering/contracts/program.js.map +1 -1
  370. package/dist/rendering/contracts/quality.d.ts +21 -0
  371. package/dist/rendering/contracts/quality.d.ts.map +1 -1
  372. package/dist/rendering/contracts/quality.js +5 -0
  373. package/dist/rendering/contracts/quality.js.map +1 -1
  374. package/dist/rendering/contracts/renderItem.d.ts +6 -0
  375. package/dist/rendering/contracts/renderItem.d.ts.map +1 -1
  376. package/dist/rendering/contracts/structuralMemo.d.ts +23 -0
  377. package/dist/rendering/contracts/structuralMemo.d.ts.map +1 -0
  378. package/dist/rendering/contracts/structuralMemo.js +81 -0
  379. package/dist/rendering/contracts/structuralMemo.js.map +1 -0
  380. package/dist/rendering/environment/EnvironmentCache.d.ts.map +1 -1
  381. package/dist/rendering/environment/EnvironmentCache.js +6 -1
  382. package/dist/rendering/environment/EnvironmentCache.js.map +1 -1
  383. package/dist/rendering/environment/FirstFrameGate.d.ts +23 -0
  384. package/dist/rendering/environment/FirstFrameGate.d.ts.map +1 -0
  385. package/dist/rendering/environment/FirstFrameGate.js +58 -0
  386. package/dist/rendering/environment/FirstFrameGate.js.map +1 -0
  387. package/dist/rendering/environment/Rgb9e5Cube.d.ts.map +1 -1
  388. package/dist/rendering/environment/Rgb9e5Cube.js +8 -4
  389. package/dist/rendering/environment/Rgb9e5Cube.js.map +1 -1
  390. package/dist/rendering/environment/probeBuild.d.ts +29 -0
  391. package/dist/rendering/environment/probeBuild.d.ts.map +1 -1
  392. package/dist/rendering/environment/probeBuild.js +124 -45
  393. package/dist/rendering/environment/probeBuild.js.map +1 -1
  394. package/dist/rendering/forward/Lighting.d.ts +43 -3
  395. package/dist/rendering/forward/Lighting.d.ts.map +1 -1
  396. package/dist/rendering/forward/Lighting.js +127 -17
  397. package/dist/rendering/forward/Lighting.js.map +1 -1
  398. package/dist/rendering/forward/contactShadowMaskStore.d.ts +41 -0
  399. package/dist/rendering/forward/contactShadowMaskStore.d.ts.map +1 -0
  400. package/dist/rendering/forward/contactShadowMaskStore.js +85 -0
  401. package/dist/rendering/forward/contactShadowMaskStore.js.map +1 -0
  402. package/dist/rendering/geometry/Shape.d.ts.map +1 -1
  403. package/dist/rendering/geometry/Shape.js +7 -2
  404. package/dist/rendering/geometry/Shape.js.map +1 -1
  405. package/dist/rendering/geometry/Support.d.ts +4 -0
  406. package/dist/rendering/geometry/Support.d.ts.map +1 -1
  407. package/dist/rendering/geometry/Support.js +3 -2
  408. package/dist/rendering/geometry/Support.js.map +1 -1
  409. package/dist/rendering/index.d.ts +6 -0
  410. package/dist/rendering/index.d.ts.map +1 -1
  411. package/dist/rendering/index.js +5 -0
  412. package/dist/rendering/index.js.map +1 -1
  413. package/dist/rendering/passes/ContactShadowPass.d.ts +40 -3
  414. package/dist/rendering/passes/ContactShadowPass.d.ts.map +1 -1
  415. package/dist/rendering/passes/ContactShadowPass.js +73 -13
  416. package/dist/rendering/passes/ContactShadowPass.js.map +1 -1
  417. package/dist/rendering/passes/Prd02ContactShadowsContributor.d.ts +19 -0
  418. package/dist/rendering/passes/Prd02ContactShadowsContributor.d.ts.map +1 -1
  419. package/dist/rendering/passes/Prd02ContactShadowsContributor.js +179 -28
  420. package/dist/rendering/passes/Prd02ContactShadowsContributor.js.map +1 -1
  421. package/dist/rendering/post/v2Stages.d.ts.map +1 -1
  422. package/dist/rendering/post/v2Stages.js +2 -0
  423. package/dist/rendering/post/v2Stages.js.map +1 -1
  424. package/dist/rendering/program/ProgramFeatures.d.ts +6 -0
  425. package/dist/rendering/program/ProgramFeatures.d.ts.map +1 -1
  426. package/dist/rendering/program/ProgramFeatures.js +11 -5
  427. package/dist/rendering/program/ProgramFeatures.js.map +1 -1
  428. package/dist/rendering/program/ProgramGenerator.d.ts +6 -0
  429. package/dist/rendering/program/ProgramGenerator.d.ts.map +1 -1
  430. package/dist/rendering/program/ProgramGenerator.js +36 -1
  431. package/dist/rendering/program/ProgramGenerator.js.map +1 -1
  432. package/dist/rendering/program/ProgramKey.d.ts.map +1 -1
  433. package/dist/rendering/program/ProgramKey.js +4 -1
  434. package/dist/rendering/program/ProgramKey.js.map +1 -1
  435. package/dist/rendering/program/chunks/shadow_forward.glsl.d.ts +1 -1
  436. package/dist/rendering/program/chunks/shadow_forward.glsl.d.ts.map +1 -1
  437. package/dist/rendering/program/chunks/shadow_forward.glsl.js +4 -1
  438. package/dist/rendering/program/chunks/shadow_forward.glsl.js.map +1 -1
  439. package/dist/rendering/quality/DirectPath.d.ts +56 -0
  440. package/dist/rendering/quality/DirectPath.d.ts.map +1 -0
  441. package/dist/rendering/quality/DirectPath.js +74 -0
  442. package/dist/rendering/quality/DirectPath.js.map +1 -0
  443. package/dist/rendering/renderer/Background.d.ts +0 -5
  444. package/dist/rendering/renderer/Background.d.ts.map +1 -1
  445. package/dist/rendering/renderer/Background.js +56 -4
  446. package/dist/rendering/renderer/Background.js.map +1 -1
  447. package/dist/rendering/renderer/InstanceFrustumCull.d.ts +41 -0
  448. package/dist/rendering/renderer/InstanceFrustumCull.d.ts.map +1 -0
  449. package/dist/rendering/renderer/InstanceFrustumCull.js +138 -0
  450. package/dist/rendering/renderer/InstanceFrustumCull.js.map +1 -0
  451. package/dist/rendering/renderer/ShadowOrchestration.d.ts +2 -0
  452. package/dist/rendering/renderer/ShadowOrchestration.d.ts.map +1 -1
  453. package/dist/rendering/renderer/ShadowOrchestration.js +1 -0
  454. package/dist/rendering/renderer/ShadowOrchestration.js.map +1 -1
  455. package/dist/rendering/renderer/coreOutputPostRoute.d.ts +0 -5
  456. package/dist/rendering/renderer/coreOutputPostRoute.d.ts.map +1 -1
  457. package/dist/rendering/renderer/coreOutputPostRoute.js +12 -2
  458. package/dist/rendering/renderer/coreOutputPostRoute.js.map +1 -1
  459. package/dist/rendering/resources/InstanceBuffer.d.ts +2 -0
  460. package/dist/rendering/resources/InstanceBuffer.d.ts.map +1 -1
  461. package/dist/rendering/resources/InstanceBuffer.js +23 -0
  462. package/dist/rendering/resources/InstanceBuffer.js.map +1 -1
  463. package/dist/rendering/shaders/chunks/contact_shadow.glsl.d.ts +11 -6
  464. package/dist/rendering/shaders/chunks/contact_shadow.glsl.d.ts.map +1 -1
  465. package/dist/rendering/shaders/chunks/contact_shadow.glsl.js +41 -19
  466. package/dist/rendering/shaders/chunks/contact_shadow.glsl.js.map +1 -1
  467. package/dist/rendering/shaders/chunks/contact_shadow_mask.glsl.d.ts +12 -0
  468. package/dist/rendering/shaders/chunks/contact_shadow_mask.glsl.d.ts.map +1 -0
  469. package/dist/rendering/shaders/chunks/contact_shadow_mask.glsl.js +21 -0
  470. package/dist/rendering/shaders/chunks/contact_shadow_mask.glsl.js.map +1 -0
  471. package/dist/rendering/shaders/chunks/lighting_ibl.glsl.d.ts +6 -1
  472. package/dist/rendering/shaders/chunks/lighting_ibl.glsl.d.ts.map +1 -1
  473. package/dist/rendering/shaders/chunks/lighting_ibl.glsl.js +8 -2
  474. package/dist/rendering/shaders/chunks/lighting_ibl.glsl.js.map +1 -1
  475. package/dist/rendering/shadows/CascadeUse.d.ts +31 -0
  476. package/dist/rendering/shadows/CascadeUse.d.ts.map +1 -0
  477. package/dist/rendering/shadows/CascadeUse.js +60 -0
  478. package/dist/rendering/shadows/CascadeUse.js.map +1 -0
  479. package/dist/rendering/shadows/Prd02DepthShaderLibrary.d.ts +7 -1
  480. package/dist/rendering/shadows/Prd02DepthShaderLibrary.d.ts.map +1 -1
  481. package/dist/rendering/shadows/Prd02DepthShaderLibrary.js +12 -3
  482. package/dist/rendering/shadows/Prd02DepthShaderLibrary.js.map +1 -1
  483. package/dist/rendering/shadows/Prd02ShadowBridge.d.ts +12 -1
  484. package/dist/rendering/shadows/Prd02ShadowBridge.d.ts.map +1 -1
  485. package/dist/rendering/shadows/Prd02ShadowBridge.js +17 -5
  486. package/dist/rendering/shadows/Prd02ShadowBridge.js.map +1 -1
  487. package/dist/rendering/shadows/Prd02ShadowsContributor.d.ts +4 -0
  488. package/dist/rendering/shadows/Prd02ShadowsContributor.d.ts.map +1 -1
  489. package/dist/rendering/shadows/Prd02ShadowsContributor.js +3 -1
  490. package/dist/rendering/shadows/Prd02ShadowsContributor.js.map +1 -1
  491. package/dist/rendering/shadows/ShadowFilterTier.d.ts +51 -0
  492. package/dist/rendering/shadows/ShadowFilterTier.d.ts.map +1 -0
  493. package/dist/rendering/shadows/ShadowFilterTier.js +89 -0
  494. package/dist/rendering/shadows/ShadowFilterTier.js.map +1 -0
  495. package/dist/rendering/shadows/ShadowSystem.d.ts +15 -0
  496. package/dist/rendering/shadows/ShadowSystem.d.ts.map +1 -1
  497. package/dist/rendering/shadows/ShadowSystem.js +12 -2
  498. package/dist/rendering/shadows/ShadowSystem.js.map +1 -1
  499. package/dist/rendering/shadows/shadowLegacy.d.ts +12 -0
  500. package/dist/rendering/shadows/shadowLegacy.d.ts.map +1 -1
  501. package/dist/rendering/shadows/shadowLegacy.js +24 -0
  502. package/dist/rendering/shadows/shadowLegacy.js.map +1 -1
  503. package/dist/rendering/webgl2/BloomFusion.d.ts +31 -0
  504. package/dist/rendering/webgl2/BloomFusion.d.ts.map +1 -0
  505. package/dist/rendering/webgl2/BloomFusion.js +25 -0
  506. package/dist/rendering/webgl2/BloomFusion.js.map +1 -0
  507. package/dist/rendering/webgl2/ContextLifecycle.d.ts +14 -0
  508. package/dist/rendering/webgl2/ContextLifecycle.d.ts.map +1 -1
  509. package/dist/rendering/webgl2/ContextLifecycle.js +44 -5
  510. package/dist/rendering/webgl2/ContextLifecycle.js.map +1 -1
  511. package/dist/rendering/webgl2/LegacyPost.d.ts +30 -0
  512. package/dist/rendering/webgl2/LegacyPost.d.ts.map +1 -1
  513. package/dist/rendering/webgl2/LegacyPost.js +259 -27
  514. package/dist/rendering/webgl2/LegacyPost.js.map +1 -1
  515. package/dist/rendering/webgl2/MultiDraw.d.ts +2 -0
  516. package/dist/rendering/webgl2/MultiDraw.d.ts.map +1 -1
  517. package/dist/rendering/webgl2/MultiDraw.js +33 -7
  518. package/dist/rendering/webgl2/MultiDraw.js.map +1 -1
  519. package/dist/rendering/webgl2/Samplers.d.ts +10 -1
  520. package/dist/rendering/webgl2/Samplers.d.ts.map +1 -1
  521. package/dist/rendering/webgl2/Samplers.js +24 -1
  522. package/dist/rendering/webgl2/Samplers.js.map +1 -1
  523. package/dist/rendering/webgl2/TextureFormats.d.ts +12 -0
  524. package/dist/rendering/webgl2/TextureFormats.d.ts.map +1 -1
  525. package/dist/rendering/webgl2/TextureFormats.js +16 -0
  526. package/dist/rendering/webgl2/TextureFormats.js.map +1 -1
  527. package/package.json +25 -25
  528. package/templates/cinematic-scene/package.json +2 -2
  529. package/templates/mini-game/package.json +2 -2
  530. package/templates/product-viewer/package.json +2 -2
  531. package/templates/production-asset-inspector/package.json +1 -1
  532. package/templates/production-material-studio/package.json +1 -1
  533. package/templates/production-product-configurator/package.json +1 -1
  534. package/templates/production-product-viewer/package.json +1 -1
  535. package/dist/environments/EnvironmentPreview.d.ts +0 -13
  536. package/dist/environments/EnvironmentPreview.d.ts.map +0 -1
  537. package/dist/environments/EnvironmentPreview.js +0 -16
  538. package/dist/environments/EnvironmentPreview.js.map +0 -1
  539. package/dist/environments/EnvironmentRegistry.d.ts +0 -35
  540. package/dist/environments/EnvironmentRegistry.d.ts.map +0 -1
  541. package/dist/environments/EnvironmentRegistry.js +0 -39
  542. package/dist/environments/EnvironmentRegistry.js.map +0 -1
  543. package/dist/environments/HDRIEnvironment.d.ts +0 -38
  544. package/dist/environments/HDRIEnvironment.d.ts.map +0 -1
  545. package/dist/environments/HDRIEnvironment.js +0 -34
  546. package/dist/environments/HDRIEnvironment.js.map +0 -1
  547. package/dist/environments/PMREMPreset.d.ts +0 -14
  548. package/dist/environments/PMREMPreset.d.ts.map +0 -1
  549. package/dist/environments/PMREMPreset.js +0 -16
  550. package/dist/environments/PMREMPreset.js.map +0 -1
  551. package/dist/environments/index.d.ts +0 -6
  552. package/dist/environments/index.d.ts.map +0 -1
  553. package/dist/environments/index.js +0 -3
  554. package/dist/environments/index.js.map +0 -1
  555. package/dist/environments/node.d.ts +0 -7
  556. package/dist/environments/node.d.ts.map +0 -1
  557. package/dist/environments/node.js +0 -5
  558. package/dist/environments/node.js.map +0 -1
  559. package/dist/environments/production-runtime/ProductionEnvironmentCorpus.d.ts +0 -78
  560. package/dist/environments/production-runtime/ProductionEnvironmentCorpus.d.ts.map +0 -1
  561. package/dist/environments/production-runtime/ProductionEnvironmentCorpus.js +0 -67
  562. package/dist/environments/production-runtime/ProductionEnvironmentCorpus.js.map +0 -1
  563. package/dist/environments/production-runtime/index.d.ts +0 -3
  564. package/dist/environments/production-runtime/index.d.ts.map +0 -1
  565. package/dist/environments/production-runtime/index.js +0 -2
  566. package/dist/environments/production-runtime/index.js.map +0 -1
  567. package/dist/environments/threejs-example-parity/index.d.ts +0 -17
  568. package/dist/environments/threejs-example-parity/index.d.ts.map +0 -1
  569. package/dist/environments/threejs-example-parity/index.js +0 -49
  570. package/dist/environments/threejs-example-parity/index.js.map +0 -1
  571. package/templates/cinematic-scene/node_modules/.vite/deps/_metadata.json +0 -8
  572. package/templates/cinematic-scene/node_modules/.vite/deps/package.json +0 -3
  573. package/templates/cinematic-scene/test-results/.last-run.json +0 -6
  574. package/templates/cinematic-scene/test-results/route-health-Aura3D-cinematic-scene-reaches-ready-state/error-context.md +0 -64
  575. package/templates/mini-game/package-lock.json +0 -1312
  576. package/templates/product-viewer/node_modules/.vite/deps/_metadata.json +0 -8
  577. package/templates/product-viewer/node_modules/.vite/deps/package.json +0 -3
@@ -1,8 +1,8 @@
1
1
  const EPSILON = 0.5;
2
- export function createParentFit(canvas) {
3
- const own = canvas.getBoundingClientRect();
4
- const mountedWidth = parseFloat(canvas.style.width) || own.width || canvas.clientWidth;
5
- const mountedHeight = parseFloat(canvas.style.height) || own.height || canvas.clientHeight;
2
+ export function createParentFit(canvas, own) {
3
+ const mountedRect = canvas.getBoundingClientRect();
4
+ const mountedWidth = parseFloat(canvas.style.width) || mountedRect.width || canvas.clientWidth;
5
+ const mountedHeight = parseFloat(canvas.style.height) || mountedRect.height || canvas.clientHeight;
6
6
  let contentWidth = false;
7
7
  let contentHeight = false;
8
8
  let lastParentWidth = 0;
@@ -12,20 +12,24 @@ export function createParentFit(canvas) {
12
12
  const parentRect = canvas.parentElement?.getBoundingClientRect();
13
13
  lastParentWidth = parentRect?.width ?? 0;
14
14
  lastParentHeight = parentRect?.height ?? 0;
15
- const cssWidth = contentWidth && mountedWidth > 0 ? mountedWidth : lastParentWidth || canvas.clientWidth || fallbackWidth;
16
- const cssHeight = contentHeight && mountedHeight > 0 ? mountedHeight : lastParentHeight || canvas.clientHeight || fallbackHeight;
17
- return { cssWidth, cssHeight };
15
+ const ownBox = own && (own.width || own.height) ? own.box() : undefined;
16
+ const ownWidth = Boolean(own?.width && ownBox && ownBox.width > 0);
17
+ const ownHeight = Boolean(own?.height && ownBox && ownBox.height > 0);
18
+ const cssWidth = ownWidth ? ownBox.width : contentWidth && mountedWidth > 0 ? mountedWidth : lastParentWidth || canvas.clientWidth || fallbackWidth;
19
+ const cssHeight = ownHeight ? ownBox.height : contentHeight && mountedHeight > 0 ? mountedHeight : lastParentHeight || canvas.clientHeight || fallbackHeight;
20
+ return { cssWidth, cssHeight, ownWidth, ownHeight };
18
21
  },
19
22
  settle() {
20
23
  const parentRect = canvas.parentElement?.getBoundingClientRect();
21
24
  if (!parentRect)
22
25
  return false;
23
26
  let frozen = false;
24
- if (!contentWidth && Math.abs(parentRect.width - lastParentWidth) > EPSILON) {
27
+ // Axes sized by the page's CSS do not follow the parent, so they cannot feed back into it.
28
+ if (!own?.width && !contentWidth && Math.abs(parentRect.width - lastParentWidth) > EPSILON) {
25
29
  contentWidth = true;
26
30
  frozen = true;
27
31
  }
28
- if (!contentHeight && Math.abs(parentRect.height - lastParentHeight) > EPSILON) {
32
+ if (!own?.height && !contentHeight && Math.abs(parentRect.height - lastParentHeight) > EPSILON) {
29
33
  contentHeight = true;
30
34
  frozen = true;
31
35
  }
@@ -1 +1 @@
1
- {"version":3,"file":"parentFit.js","sourceRoot":"","sources":["../../../../../../packages/engine/src/agent-api/app/parentFit.ts"],"names":[],"mappings":"AAqBA,MAAM,OAAO,GAAG,GAAG,CAAC;AAEpB,MAAM,UAAU,eAAe,CAAC,MAAuB;IACrD,MAAM,GAAG,GAAG,MAAM,CAAC,qBAAqB,EAAE,CAAC;IAC3C,MAAM,YAAY,GAAG,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,KAAK,IAAI,MAAM,CAAC,WAAW,CAAC;IACvF,MAAM,aAAa,GAAG,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,MAAM,IAAI,MAAM,CAAC,YAAY,CAAC;IAC3F,IAAI,YAAY,GAAG,KAAK,CAAC;IACzB,IAAI,aAAa,GAAG,KAAK,CAAC;IAC1B,IAAI,eAAe,GAAG,CAAC,CAAC;IACxB,IAAI,gBAAgB,GAAG,CAAC,CAAC;IACzB,OAAO;QACL,OAAO,CAAC,aAAa,EAAE,cAAc;YACnC,MAAM,UAAU,GAAG,MAAM,CAAC,aAAa,EAAE,qBAAqB,EAAE,CAAC;YACjE,eAAe,GAAG,UAAU,EAAE,KAAK,IAAI,CAAC,CAAC;YACzC,gBAAgB,GAAG,UAAU,EAAE,MAAM,IAAI,CAAC,CAAC;YAC3C,MAAM,QAAQ,GAAG,YAAY,IAAI,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,eAAe,IAAI,MAAM,CAAC,WAAW,IAAI,aAAa,CAAC;YAC1H,MAAM,SAAS,GAAG,aAAa,IAAI,aAAa,GAAG,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,gBAAgB,IAAI,MAAM,CAAC,YAAY,IAAI,cAAc,CAAC;YACjI,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;QACjC,CAAC;QACD,MAAM;YACJ,MAAM,UAAU,GAAG,MAAM,CAAC,aAAa,EAAE,qBAAqB,EAAE,CAAC;YACjE,IAAI,CAAC,UAAU;gBAAE,OAAO,KAAK,CAAC;YAC9B,IAAI,MAAM,GAAG,KAAK,CAAC;YACnB,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,GAAG,eAAe,CAAC,GAAG,OAAO,EAAE,CAAC;gBAAC,YAAY,GAAG,IAAI,CAAC;gBAAC,MAAM,GAAG,IAAI,CAAC;YAAC,CAAC;YACpH,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,GAAG,gBAAgB,CAAC,GAAG,OAAO,EAAE,CAAC;gBAAC,aAAa,GAAG,IAAI,CAAC;gBAAC,MAAM,GAAG,IAAI,CAAC;YAAC,CAAC;YACxH,OAAO,MAAM,CAAC;QAChB,CAAC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"parentFit.js","sourceRoot":"","sources":["../../../../../../packages/engine/src/agent-api/app/parentFit.ts"],"names":[],"mappings":"AAmCA,MAAM,OAAO,GAAG,GAAG,CAAC;AAEpB,MAAM,UAAU,eAAe,CAAC,MAAuB,EAAE,GAAe;IACtE,MAAM,WAAW,GAAG,MAAM,CAAC,qBAAqB,EAAE,CAAC;IACnD,MAAM,YAAY,GAAG,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,WAAW,CAAC,KAAK,IAAI,MAAM,CAAC,WAAW,CAAC;IAC/F,MAAM,aAAa,GAAG,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,WAAW,CAAC,MAAM,IAAI,MAAM,CAAC,YAAY,CAAC;IACnG,IAAI,YAAY,GAAG,KAAK,CAAC;IACzB,IAAI,aAAa,GAAG,KAAK,CAAC;IAC1B,IAAI,eAAe,GAAG,CAAC,CAAC;IACxB,IAAI,gBAAgB,GAAG,CAAC,CAAC;IACzB,OAAO;QACL,OAAO,CAAC,aAAa,EAAE,cAAc;YACnC,MAAM,UAAU,GAAG,MAAM,CAAC,aAAa,EAAE,qBAAqB,EAAE,CAAC;YACjE,eAAe,GAAG,UAAU,EAAE,KAAK,IAAI,CAAC,CAAC;YACzC,gBAAgB,GAAG,UAAU,EAAE,MAAM,IAAI,CAAC,CAAC;YAC3C,MAAM,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;YACxE,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,EAAE,KAAK,IAAI,MAAM,IAAI,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;YACnE,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,EAAE,MAAM,IAAI,MAAM,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACtE,MAAM,QAAQ,GAAG,QAAQ,CAAC,CAAC,CAAC,MAAO,CAAC,KAAK,CAAC,CAAC,CAAC,YAAY,IAAI,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,eAAe,IAAI,MAAM,CAAC,WAAW,IAAI,aAAa,CAAC;YACrJ,MAAM,SAAS,GAAG,SAAS,CAAC,CAAC,CAAC,MAAO,CAAC,MAAM,CAAC,CAAC,CAAC,aAAa,IAAI,aAAa,GAAG,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,gBAAgB,IAAI,MAAM,CAAC,YAAY,IAAI,cAAc,CAAC;YAC9J,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;QACtD,CAAC;QACD,MAAM;YACJ,MAAM,UAAU,GAAG,MAAM,CAAC,aAAa,EAAE,qBAAqB,EAAE,CAAC;YACjE,IAAI,CAAC,UAAU;gBAAE,OAAO,KAAK,CAAC;YAC9B,IAAI,MAAM,GAAG,KAAK,CAAC;YACnB,2FAA2F;YAC3F,IAAI,CAAC,GAAG,EAAE,KAAK,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,GAAG,eAAe,CAAC,GAAG,OAAO,EAAE,CAAC;gBAAC,YAAY,GAAG,IAAI,CAAC;gBAAC,MAAM,GAAG,IAAI,CAAC;YAAC,CAAC;YACnI,IAAI,CAAC,GAAG,EAAE,MAAM,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,GAAG,gBAAgB,CAAC,GAAG,OAAO,EAAE,CAAC;gBAAC,aAAa,GAAG,IAAI,CAAC;gBAAC,MAAM,GAAG,IAAI,CAAC;YAAC,CAAC;YACxI,OAAO,MAAM,CAAC;QAChB,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,86 @@
1
+ import { type AuraQualityMode, type BloomFusionConfig, type DirectPathItemLike, type RenderPathDecision } from "../../../rendering/index.js";
2
+ import type { AuraBloomFusion, QrFlags } from "../../../rendering/contracts/index.js";
3
+ import type { AuraCreateAppOptions, AuraSceneSnapshot } from "../nodes/types.js";
4
+ /** What `app.diagnostics().renderPath` reports. */
5
+ export interface AuraRenderPathReport {
6
+ readonly path: RenderPathDecision["path"];
7
+ readonly quality: AuraQualityMode;
8
+ readonly reason: string;
9
+ /**
10
+ * Bloom pass fusion mode that applies to this mount. `"off"` whenever no fused bloom pass can be issued: quality `production` or
11
+ * `safe-basic`, the direct path (no post chain), the legacy LDR route (not HDR, so the pyramid never fuses), or a scene with no
12
+ * bloom effect. Otherwise the selected mode. The pyramid itself additionally needs a five-mip-or-fewer plan, which depends on the
13
+ * canvas size and is only known at render time.
14
+ */
15
+ readonly bloomFusion: AuraBloomFusion | "off";
16
+ }
17
+ /** Fusion is allowed only under quality `auto` or `cinematic`; the mount (`applyRenderPathToCanvas`) and the report both use this. */
18
+ export declare function bloomFusionAllowed(quality: AuraQualityMode): boolean;
19
+ export interface AppRenderPath {
20
+ readonly report: AuraRenderPathReport;
21
+ /** Flags to hand the renderer; the app's own flags unchanged on the HDR path. */
22
+ readonly flags: QrFlags;
23
+ /**
24
+ * True when this mount chose the direct path over the HDR one: the source then carries no
25
+ * postprocess at all (no default tone-mapping chain), so the forward pass renders straight into
26
+ * the canvas framebuffer and encodes in-shader.
27
+ */
28
+ readonly direct: boolean;
29
+ /**
30
+ * Warnings for `diagnostics().warnings`: ignored URL switches (RP-04, `QUALITY_URL_IGNORED:`) and what `safe-basic` does not
31
+ * render (RP-06, `SAFE_BASIC_DROPS:`).
32
+ */
33
+ readonly warnings: readonly string[];
34
+ }
35
+ /** Record (per canvas, per mount) that the direct path was chosen; read by the render-input and clear-colour code. */
36
+ export declare function setDirectRenderPath(canvas: object, direct: boolean): void;
37
+ /** Record (per canvas, per mount) that look-neutral bloom pass fusion is allowed: quality `auto` or `cinematic`, never `production`. */
38
+ export declare function setFusedBloomPasses(canvas: object, enabled: boolean): void;
39
+ export declare function isFusedBloomPasses(canvas: object | undefined): boolean;
40
+ /** Record this mount's route on the canvas: whether it is direct, and whether bloom pass fusion is allowed (one predicate: `bloomFusionAllowed`). */
41
+ export declare function applyRenderPathToCanvas(canvas: object, renderPath: Pick<AppRenderPath, "direct" | "report">): void;
42
+ /** The device fields the fused bloom pyramid reads. */
43
+ export interface BloomFusionDevice {
44
+ bloomFusedPasses?: boolean;
45
+ bloomFusion?: BloomFusionConfig;
46
+ }
47
+ /**
48
+ * Configure a freshly created render device for this canvas's route: fused bloom passes plus the selected mode when the mount
49
+ * allowed fusion (`auto` / `cinematic`), nothing at all otherwise so `production` keeps the original pass sequence.
50
+ */
51
+ export declare function configureBloomFusionDevice(device: BloomFusionDevice, canvas: object | undefined, rendererOptions: AuraCreateAppOptions["renderer"]): void;
52
+ export declare function isDirectRenderPath(canvas: object | undefined): boolean;
53
+ /** Add a reason that keeps `canvas` off the direct path; returns a release function (reference counted per reason). */
54
+ export declare function vetoDirectPath(canvas: object, reason: string): () => void;
55
+ export declare function directPathVetoReasons(canvas: object | undefined): string[];
56
+ /** RP-01: decoded-material blockers of a mounted scene's GLB actors (their render items at the default placement). */
57
+ export declare function decodedModelDirectPathBlockers(actors: readonly {
58
+ readonly actor: {
59
+ collectRenderItems(): readonly DirectPathItemLike[];
60
+ };
61
+ }[]): string[];
62
+ /** Called by the mount once its GLBs are decoded (direct path only); read once by the frame loop through {@link takeDecodedDirectPathBlockers}. */
63
+ export declare function recordDecodedDirectPathBlockers(canvas: object, blockers: readonly string[]): void;
64
+ export declare function takeDecodedDirectPathBlockers(canvas: object): readonly string[];
65
+ /** Reasons this scene needs the HDR target. Conservative: anything not known to render identically on the direct path is listed. */
66
+ export declare function renderPathBlockers(snapshot: AuraSceneSnapshot, options: AuraCreateAppOptions): string[];
67
+ /**
68
+ * The node-level part of {@link renderPathBlockers}: effects other than fog, node kinds the direct path does not draw, HDRI
69
+ * environments, and custom, transmissive or transparent materials (authored, from the asset manifest, or overrides). Also used for
70
+ * nodes added at runtime (RP-03).
71
+ */
72
+ export declare function nodeDirectPathBlockers(nodes: AuraSceneSnapshot["nodes"]): string[];
73
+ export interface ResolveAppRenderPathContext {
74
+ /** URL query to read the debug switches from; defaults to `location.search`. */
75
+ readonly search?: string | null;
76
+ /** Reasons found after mount that keep this canvas off the direct path (see {@link vetoDirectPath}). */
77
+ readonly extraBlockers?: readonly string[];
78
+ }
79
+ export declare function resolveAppRenderPath(snapshot: AuraSceneSnapshot, options: AuraCreateAppOptions, flags: QrFlags, context?: ResolveAppRenderPathContext): AppRenderPath;
80
+ /**
81
+ * Whether the WebGL drawing buffer must survive presentation: capture and
82
+ * evidence runs read the canvas after the frame was presented. An explicit
83
+ * `preserveDrawingBuffer` option wins; otherwise `?capture=1` / `?qa=1`.
84
+ */
85
+ export declare function wantsPreservedDrawingBuffer(options: Pick<AuraCreateAppOptions, "preserveDrawingBuffer">, search?: string | null): boolean;
86
+ //# sourceMappingURL=renderPath.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renderPath.d.ts","sourceRoot":"","sources":["../../../../../../packages/engine/src/agent-api/app/renderPath.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,269 @@
1
+ // beat-three.js L-P1: pick the render path for one mount (direct canvas MSAA vs HDR multisampled target).
2
+ import { directPathItemBlockers, isQualityMode, qrCoreOutputOn, resolveBloomFusionConfig, resolveRenderPath, withDirectPath } from "../../../rendering/index.js";
3
+ import { groups } from "../nodes/groups.js";
4
+ import { ignoreInvalidUrlValue, parseBloomFusionOption } from "./rendererOptions.js";
5
+ /** Fusion is allowed only under quality `auto` or `cinematic`; the mount (`applyRenderPathToCanvas`) and the report both use this. */
6
+ export function bloomFusionAllowed(quality) {
7
+ return quality === "auto" || quality === "cinematic";
8
+ }
9
+ /**
10
+ * The bloom fusion mode to report. The pyramid fuses only on the HDR route (`hdr-msaa`) and only when the scene has a bloom
11
+ * effect (the only source of a bloom pass), so every other combination reports `"off"`. The option is validated first so a
12
+ * typo throws whatever the quality.
13
+ */
14
+ function reportedBloomFusion(quality, path, legacyLdrRoute, snapshot, options, search, policy) {
15
+ const mode = parseBloomFusionOption(options.renderer, search, policy);
16
+ if (!bloomFusionAllowed(quality) || path !== "hdr-msaa" || legacyLdrRoute)
17
+ return "off";
18
+ const hasBloom = groups.flatten(snapshot.nodes).some((node) => node.kind === "effect" && node.effect === "bloom");
19
+ return hasBloom ? mode : "off";
20
+ }
21
+ const directPathCanvases = new WeakSet();
22
+ /** Record (per canvas, per mount) that the direct path was chosen; read by the render-input and clear-colour code. */
23
+ export function setDirectRenderPath(canvas, direct) {
24
+ if (direct)
25
+ directPathCanvases.add(canvas);
26
+ else
27
+ directPathCanvases.delete(canvas);
28
+ }
29
+ const fusedBloomCanvases = new WeakSet();
30
+ /** Record (per canvas, per mount) that look-neutral bloom pass fusion is allowed: quality `auto` or `cinematic`, never `production`. */
31
+ export function setFusedBloomPasses(canvas, enabled) {
32
+ if (enabled)
33
+ fusedBloomCanvases.add(canvas);
34
+ else
35
+ fusedBloomCanvases.delete(canvas);
36
+ }
37
+ export function isFusedBloomPasses(canvas) {
38
+ return canvas !== undefined && fusedBloomCanvases.has(canvas);
39
+ }
40
+ /** Record this mount's route on the canvas: whether it is direct, and whether bloom pass fusion is allowed (one predicate: `bloomFusionAllowed`). */
41
+ export function applyRenderPathToCanvas(canvas, renderPath) {
42
+ setDirectRenderPath(canvas, renderPath.direct);
43
+ setFusedBloomPasses(canvas, bloomFusionAllowed(renderPath.report.quality));
44
+ }
45
+ /**
46
+ * Configure a freshly created render device for this canvas's route: fused bloom passes plus the selected mode when the mount
47
+ * allowed fusion (`auto` / `cinematic`), nothing at all otherwise so `production` keeps the original pass sequence.
48
+ */
49
+ export function configureBloomFusionDevice(device, canvas, rendererOptions) {
50
+ if (!isFusedBloomPasses(canvas))
51
+ return;
52
+ device.bloomFusedPasses = true;
53
+ device.bloomFusion = resolveBloomFusionConfig(parseBloomFusionOption(rendererOptions));
54
+ }
55
+ export function isDirectRenderPath(canvas) {
56
+ return canvas !== undefined && directPathCanvases.has(canvas);
57
+ }
58
+ /*
59
+ * RP-01 / RP-03: reasons, found after the path was chosen, why this canvas must leave the direct path. The direct-path decision
60
+ * reads the authored snapshot, so it cannot see a GLB's own BLEND or transmission materials (known only once decoded) or a custom
61
+ * post pass registered after mount. Each mount on the canvas reads these as extra blockers, so the re-mount takes the HDR target.
62
+ */
63
+ const directPathVetoes = new WeakMap();
64
+ /** Add a reason that keeps `canvas` off the direct path; returns a release function (reference counted per reason). */
65
+ export function vetoDirectPath(canvas, reason) {
66
+ let reasons = directPathVetoes.get(canvas);
67
+ if (!reasons)
68
+ directPathVetoes.set(canvas, (reasons = new Map()));
69
+ reasons.set(reason, (reasons.get(reason) ?? 0) + 1);
70
+ let released = false;
71
+ return () => {
72
+ if (released)
73
+ return;
74
+ released = true;
75
+ const count = (reasons.get(reason) ?? 1) - 1;
76
+ if (count > 0)
77
+ reasons.set(reason, count);
78
+ else
79
+ reasons.delete(reason);
80
+ };
81
+ }
82
+ export function directPathVetoReasons(canvas) {
83
+ return canvas === undefined ? [] : [...(directPathVetoes.get(canvas)?.keys() ?? [])];
84
+ }
85
+ /** RP-01: decoded-material blockers of a mounted scene's GLB actors (their render items at the default placement). */
86
+ export function decodedModelDirectPathBlockers(actors) {
87
+ if (actors.length === 0)
88
+ return [];
89
+ const items = [];
90
+ for (const entry of actors) {
91
+ try {
92
+ items.push(...entry.actor.collectRenderItems());
93
+ }
94
+ catch {
95
+ // An actor that cannot collect here is not evidence either way; the frame loop reports its own errors.
96
+ }
97
+ }
98
+ return directPathItemBlockers(items);
99
+ }
100
+ const decodedBlockers = new WeakMap();
101
+ /** Called by the mount once its GLBs are decoded (direct path only); read once by the frame loop through {@link takeDecodedDirectPathBlockers}. */
102
+ export function recordDecodedDirectPathBlockers(canvas, blockers) {
103
+ if (blockers.length > 0)
104
+ decodedBlockers.set(canvas, blockers);
105
+ else
106
+ decodedBlockers.delete(canvas);
107
+ }
108
+ export function takeDecodedDirectPathBlockers(canvas) {
109
+ const blockers = decodedBlockers.get(canvas) ?? [];
110
+ decodedBlockers.delete(canvas);
111
+ return blockers;
112
+ }
113
+ /** Effects the forward pass draws itself; every other effect is a post pass or a frame contributor that reads the HDR target. */
114
+ const FORWARD_ONLY_EFFECTS = new Set(["fog"]);
115
+ const DIRECT_SAFE_NODE_KINDS = new Set(["model", "primitive", "group", "light", "environment", "interaction", "label"]);
116
+ /** Reasons this scene needs the HDR target. Conservative: anything not known to render identically on the direct path is listed. */
117
+ export function renderPathBlockers(snapshot, options) {
118
+ const blockers = [];
119
+ if (options.output !== undefined || options.renderer?.output !== undefined)
120
+ blockers.push("output options (tone mapping, exposure, dithering) are authored");
121
+ if (options.renderer?.backend !== undefined && options.renderer.backend !== "webgl2")
122
+ blockers.push(`backend ${String(options.renderer.backend)}`);
123
+ if (typeof location !== "undefined" && /[?&](aura3d-tonemap|tm|aura3d-exp|exp)=/.test(location.search))
124
+ blockers.push("URL tone-mapping or exposure override");
125
+ if (snapshot.backgroundToneMapped === false)
126
+ blockers.push("background opts out of tone mapping");
127
+ // RP-02: the background-image shader encodes with its own ACES fit (Narkowicz), not the r185 curve the direct path's forward
128
+ // shader uses, so on the direct path the backdrop and the scene would be tone-mapped differently (linear 0.18 grey: 141 vs 127).
129
+ if (snapshot.backgroundImage !== undefined)
130
+ blockers.push("background image");
131
+ for (const reason of nodeDirectPathBlockers(snapshot.nodes))
132
+ blockers.push(reason);
133
+ return blockers;
134
+ }
135
+ /**
136
+ * The node-level part of {@link renderPathBlockers}: effects other than fog, node kinds the direct path does not draw, HDRI
137
+ * environments, and custom, transmissive or transparent materials (authored, from the asset manifest, or overrides). Also used for
138
+ * nodes added at runtime (RP-03).
139
+ */
140
+ export function nodeDirectPathBlockers(nodes) {
141
+ const blockers = [];
142
+ const seen = new Set();
143
+ const note = (message) => {
144
+ if (seen.has(message))
145
+ return;
146
+ seen.add(message);
147
+ blockers.push(message);
148
+ };
149
+ for (const node of groups.flatten(nodes)) {
150
+ if (node.kind === "effect") {
151
+ if (!FORWARD_ONLY_EFFECTS.has(node.effect))
152
+ note(`effect "${node.effect}"`);
153
+ continue;
154
+ }
155
+ if (!DIRECT_SAFE_NODE_KINDS.has(node.kind)) {
156
+ note(`${node.kind} node`);
157
+ continue;
158
+ }
159
+ // A visible HDRI background is encoded by the environment-background shader's own (different) filmic curve.
160
+ if (node.kind === "environment" && node.environment === "hdri")
161
+ note("hdri environment");
162
+ if (node.kind !== "model" && node.kind !== "primitive")
163
+ continue;
164
+ if (node.kind === "model")
165
+ for (const reason of modelAssetBlockers(node))
166
+ note(reason);
167
+ const material = node.material;
168
+ if (!material)
169
+ continue;
170
+ if (material.kind !== undefined)
171
+ note(`${material.kind} material`);
172
+ if (material.shader !== undefined)
173
+ note(`shader material "${material.shader}"`);
174
+ if (typeof material.transmission === "number" && material.transmission > 0)
175
+ note("transmission material");
176
+ // Blending happens after the in-shader encode on the direct path (display space) but before it on the HDR path (linear).
177
+ if (material.alphaMode === "blend" || material.blend !== undefined || (typeof material.opacity === "number" && material.opacity < 1))
178
+ note("transparent material");
179
+ }
180
+ return blockers;
181
+ }
182
+ /**
183
+ * RP-01: material facts the asset manifest records for a typed GLB (`metadata.materialMetadata`, written by `aura3d assets add`
184
+ * and `assets typegen`), plus `materialOverrides` opacity. A BLEND or partly transparent material blends after the in-shader encode
185
+ * on the direct path. Transmission is not in the manifest; the mount catches it after decode (`decodedModelDirectPathBlockers`).
186
+ */
187
+ function modelAssetBlockers(node) {
188
+ const reasons = [];
189
+ const facts = node.asset?.metadata?.materialMetadata;
190
+ if (Array.isArray(facts)) {
191
+ const transparent = facts.some((fact) => fact !== null && typeof fact === "object"
192
+ // glTF ignores base-colour alpha on OPAQUE and MASK materials, so opacity counts only when no alpha mode was recorded.
193
+ && (typeof fact.alphaMode === "string" ? fact.alphaMode.toUpperCase() === "BLEND" : typeof fact.opacity === "number" && fact.opacity < 1));
194
+ if (transparent)
195
+ reasons.push("model asset has a transparent (BLEND) material");
196
+ }
197
+ if (node.materialOverrides?.some((override) => typeof override.opacity === "number" && override.opacity < 1))
198
+ reasons.push("transparent material override");
199
+ return reasons;
200
+ }
201
+ function requestedQuality(options, search, policy) {
202
+ let fromOptions;
203
+ if (options.quality !== undefined) {
204
+ if (!isQualityMode(options.quality)) {
205
+ throw new Error(`QUALITY_OPTION_INVALID:quality=${String(options.quality)} (expected auto|production|safe-basic|cinematic)`);
206
+ }
207
+ fromOptions = options.quality;
208
+ }
209
+ // `?aura3d-render=<mode>` wins over the option (like `?aura3d-quality=`): compare a page's two render paths without a rebuild.
210
+ // RP-04: a typo there warns and keeps the code option (strict apps still throw).
211
+ const fromUrl = search ? new URLSearchParams(search).get("aura3d-render") : null;
212
+ if (fromUrl !== null) {
213
+ if (isQualityMode(fromUrl))
214
+ return fromUrl;
215
+ ignoreInvalidUrlValue(`?aura3d-render=${fromUrl} (expected auto|production|safe-basic|cinematic); using "${fromOptions ?? "auto"}"`, policy);
216
+ }
217
+ // `renderer.qualityProfile` is a deprecated pixel-ratio/draw-budget preset, not a pipeline request.
218
+ return fromOptions;
219
+ }
220
+ export function resolveAppRenderPath(snapshot, options, flags, context = {}) {
221
+ const search = context.search !== undefined ? context.search : typeof location !== "undefined" ? location.search : null;
222
+ const warnings = [];
223
+ const policy = { strict: options.strict ?? flags.on("A3D_QR_STRICT"), warnings };
224
+ const quality = requestedQuality(options, search, policy) ?? "auto";
225
+ if (!qrCoreOutputOn(flags)) {
226
+ const explicit = flags.values.A3D_QR_CORE_OUTPUT !== undefined;
227
+ return {
228
+ report: { path: "direct", quality, reason: explicit ? "A3D_QR_CORE_OUTPUT is off: legacy LDR route" : "A3D_QR_CORE is off: legacy LDR route (its own post chain is kept)", bloomFusion: reportedBloomFusion(quality, "direct", true, snapshot, options, search, policy) },
229
+ flags,
230
+ direct: false,
231
+ warnings
232
+ };
233
+ }
234
+ if (flags.values.A3D_QR_CORE_OUTPUT !== undefined) {
235
+ return { report: { path: "hdr-msaa", quality, reason: "A3D_QR_CORE_OUTPUT is set explicitly", bloomFusion: reportedBloomFusion(quality, "hdr-msaa", false, snapshot, options, search, policy) }, flags, direct: false, warnings };
236
+ }
237
+ // RP-06: blockers are computed for safe-basic too, so what it does not render is named instead of dropped silently.
238
+ const blockers = quality === "auto" || quality === "safe-basic"
239
+ ? [...new Set([...renderPathBlockers(snapshot, options), ...(context.extraBlockers ?? [])])]
240
+ : [];
241
+ const decision = resolveRenderPath({ quality, blockers });
242
+ if (quality === "safe-basic" && blockers.length > 0) {
243
+ warnings.push(`SAFE_BASIC_DROPS: quality "safe-basic" renders on the direct path, which has no post chain or HDR target, so these are not rendered: ${blockers.join("; ")}. Use quality "auto" or "production" to keep them.`);
244
+ }
245
+ return {
246
+ report: { path: decision.path, quality: decision.quality, reason: decision.reason, bloomFusion: reportedBloomFusion(decision.quality, decision.path, false, snapshot, options, search, policy) },
247
+ flags: decision.path === "direct" ? withDirectPath(flags) : flags,
248
+ direct: decision.path === "direct",
249
+ warnings
250
+ };
251
+ }
252
+ /**
253
+ * Whether the WebGL drawing buffer must survive presentation: capture and
254
+ * evidence runs read the canvas after the frame was presented. An explicit
255
+ * `preserveDrawingBuffer` option wins; otherwise `?capture=1` / `?qa=1`.
256
+ */
257
+ export function wantsPreservedDrawingBuffer(options, search = typeof location !== "undefined" ? location.search : null) {
258
+ if (typeof options.preserveDrawingBuffer === "boolean")
259
+ return options.preserveDrawingBuffer;
260
+ if (!search)
261
+ return false;
262
+ const params = new URLSearchParams(search);
263
+ const on = (key) => {
264
+ const raw = params.get(key);
265
+ return raw !== null && raw !== "0" && raw.toLowerCase() !== "false";
266
+ };
267
+ return on("capture") || on("qa");
268
+ }
269
+ //# sourceMappingURL=renderPath.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renderPath.js","sourceRoot":"","sources":["../../../../../../packages/engine/src/agent-api/app/renderPath.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import type { AuraCreateAppRendererOptions, AuraRendererQualityPreset, AuraRendererQualityProfile, AuraRendererQualityProfileId } from "../nodes/types.js";
2
+ import { type AuraBloomFusion } from "../../../rendering/contracts/index.js";
2
3
  /**
3
4
  * PRD 11 Phase 1 freeze (§6.2): thrown when a caller requests the frozen
4
5
  * `experimental-webgpu` quality profile. The union member stays for CCR
@@ -41,5 +42,34 @@ export declare function resetRendererOptionDeprecationsForTests(): void;
41
42
  */
42
43
  export declare function parseQualityRendererOptions(renderer: AuraCreateAppRendererOptions | undefined, search?: string | null, root?: {
43
44
  readonly performanceQuality?: unknown;
44
- }): ParsedQualityRendererOptions;
45
+ }, urlPolicy?: Pick<UrlOptionPolicy, "strict">): ParsedQualityRendererOptions;
46
+ /** How URL-sourced debug switches behave on an invalid value (RP-04). */
47
+ export interface UrlOptionPolicy {
48
+ /** Throw on an invalid URL value, like an invalid code option. Default false: warn and fall back. */
49
+ readonly strict?: boolean;
50
+ /** Receives one `QUALITY_URL_IGNORED:` message per ignored URL value. */
51
+ readonly warnings?: string[];
52
+ /** Also `console.warn` the message (once per message). Default true; false when the caller prints `warnings` itself. */
53
+ readonly console?: boolean;
54
+ }
55
+ /**
56
+ * RP-04: a typo in a debug URL switch (`?aura3d-render=`, `?aura3d-bloom-fusion=`, `?aura3d-quality=`, `?aura3d-adaptive=`) used to
57
+ * throw inside the mount, so every game showed its "needs WebGL 2" error screen. URL values are a tester's switch, not code: warn
58
+ * once (console and `diagnostics().warnings`) and keep the code option or default. Strict apps keep the throw.
59
+ */
60
+ export declare function ignoreInvalidUrlValue(message: string, policy: UrlOptionPolicy | undefined): void;
61
+ /**
62
+ * Bloom pass-fusion mode (PRD beat-threejs-2 contract 2.1): `renderer.bloomFusion` (`"separable"` default | `"fused-2d"`),
63
+ * overridden by `?aura3d-bloom-fusion=`. An invalid code option throws so a typo never silently runs the default; an invalid URL
64
+ * value warns and falls back to the code option (RP-04) unless `policy.strict`. The mode only takes effect under
65
+ * `quality: "auto"` / `"cinematic"`; `production` never fuses.
66
+ */
67
+ export declare function parseBloomFusionOption(renderer: Pick<AuraCreateAppRendererOptions, "bloomFusion"> | undefined, search?: string | null, policy?: UrlOptionPolicy): AuraBloomFusion;
68
+ /**
69
+ * Top-tennis C11 (engine part): `renderer.quality` diagnostics, reported in `diagnostics().warnings` (not the console, since the
70
+ * string form is valid). A tier-name string is a fixed tier: every device, phones included, mounts at that tier, which a reader
71
+ * of `renderer: { quality: "high" }` easily takes for a no-op or for "best available". An unknown name used to mount at "high"
72
+ * with no message while the quality lane is off.
73
+ */
74
+ export declare function rendererQualityWarnings(renderer: Pick<AuraCreateAppRendererOptions, "quality"> | undefined): string[];
45
75
  //# sourceMappingURL=rendererOptions.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"rendererOptions.d.ts","sourceRoot":"","sources":["../../../../../../packages/engine/src/agent-api/app/rendererOptions.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,4BAA4B,EAAE,yBAAyB,EAAE,0BAA0B,EAAE,4BAA4B,EAAE,MAAM,mBAAmB,CAAC;AAE3J;;;;GAIG;AACH,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C,QAAQ,CAAC,IAAI,EAAG,oBAAoB,CAAU;gBAElC,OAAO,EAAE,MAAM;CAI5B;AAED,eAAO,MAAM,sBAAsB,EAAE,QAAQ,CAAC,MAAM,CAAC,aAAa,GAAG,YAAY,EAAE,yBAAyB,CAAC,CAqB5G,CAAC;AAEF,eAAO,MAAM,uBAAuB,EAAE,QAAQ,CAAC,MAAM,CAAC,4BAA4B,EAAE,0BAA0B,CAAC,CA6D9G,CAAC;AAEF,wBAAgB,6BAA6B,CAAC,EAAE,EAAE,4BAA4B,GAAG,SAAS,GAAG,0BAA0B,CAOtH;AAED,wBAAgB,iCAAiC,CAAC,OAAO,EAAE,4BAA4B,GAAG,SAAS,GAAG,QAAQ,CAAC,4BAA4B,CAAC,GAAG;IAC7I,QAAQ,CAAC,OAAO,EAAE,0BAA0B,CAAC;CAC9C,CAYA;AAED,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAM7E;AAQD,MAAM,MAAM,mBAAmB,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAC;AAEtE,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,SAAS,EAAE,mBAAmB,GAAG,MAAM,CAAC;IACjD,6EAA6E;IAC7E,QAAQ,CAAC,eAAe,EAAE,KAAK,GAAG,SAAS,CAAC;IAC5C,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;IAClE,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,+CAA+C;IAC/C,QAAQ,CAAC,cAAc,EAAE,KAAK,GAAG,SAAS,CAAC;IAC3C,QAAQ,CAAC,eAAe,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7C,QAAQ,CAAC,QAAQ,EAAE,OAAO,GAAG,MAAM,CAAC;IACpC,2EAA2E;IAC3E,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;CACtC;AAiBD,kFAAkF;AAClF,wBAAgB,uCAAuC,IAAI,IAAI,CAE9D;AAED;;;;;;;GAOG;AACH,wBAAgB,2BAA2B,CACzC,QAAQ,EAAE,4BAA4B,GAAG,SAAS,EAClD,MAAM,GAAE,MAAM,GAAG,IAA+D,EAChF,IAAI,GAAE;IAAE,QAAQ,CAAC,kBAAkB,CAAC,EAAE,OAAO,CAAA;CAAO,GACnD,4BAA4B,CA4D9B"}
1
+ {"version":3,"file":"rendererOptions.d.ts","sourceRoot":"","sources":["../../../../../../packages/engine/src/agent-api/app/rendererOptions.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  // PR 0b-1 carve-out (CONTRACTS.md §3.2) — verbatim move from agent-api/index.ts; 0 changed logic lines.
2
+ import { DEFAULT_BLOOM_FUSION_MODE, isBloomFusion } from "../../../rendering/contracts/index.js";
2
3
  /**
3
4
  * PRD 11 Phase 1 freeze (§6.2): thrown when a caller requests the frozen
4
5
  * `experimental-webgpu` quality profile. The union member stays for CCR
@@ -140,6 +141,7 @@ function deprecation(id, message, out) {
140
141
  /** Test seam: forget which one-time deprecation warnings were already emitted. */
141
142
  export function resetRendererOptionDeprecationsForTests() {
142
143
  warnedDeprecations.clear();
144
+ warnedUrlValues.clear();
143
145
  }
144
146
  /**
145
147
  * Parse `renderer.quality` (tier string or `{ tier, overrides }`),
@@ -149,7 +151,7 @@ export function resetRendererOptionDeprecationsForTests() {
149
151
  * `source: "url"`). `qualityProfile` and root `performanceQuality` stay
150
152
  * accepted and emit a one-time deprecation warning pointing at `quality`.
151
153
  */
152
- export function parseQualityRendererOptions(renderer, search = typeof location !== "undefined" ? location.search : null, root = {}) {
154
+ export function parseQualityRendererOptions(renderer, search = typeof location !== "undefined" ? location.search : null, root = {}, urlPolicy) {
153
155
  const warnings = [];
154
156
  const quality = renderer?.quality;
155
157
  let requested;
@@ -185,16 +187,24 @@ export function parseQualityRendererOptions(renderer, search = typeof location !
185
187
  const params = new URLSearchParams(search);
186
188
  const urlTier = params.get("aura3d-quality");
187
189
  if (urlTier !== null) {
188
- requested = parseTier(urlTier, "?aura3d-quality");
189
- requestedSource = "url";
190
+ // RP-04: a URL typo warns and keeps the code option (strict apps still throw).
191
+ if (urlTier === "auto" || QUALITY_TIER_NAMES.includes(urlTier)) {
192
+ requested = urlTier;
193
+ requestedSource = "url";
194
+ }
195
+ else {
196
+ ignoreInvalidUrlValue(`?aura3d-quality=${urlTier} (expected low|medium|high|ultra|auto); using "${requested}"`, { strict: urlPolicy?.strict, warnings, console: false });
197
+ }
190
198
  }
191
199
  const urlAdaptive = params.get("aura3d-adaptive");
192
200
  if (urlAdaptive !== null) {
193
- if (urlAdaptive !== "0" && urlAdaptive !== "1") {
194
- throw new Error(`QUALITY_OPTION_INVALID:?aura3d-adaptive=${urlAdaptive} (expected 0|1)`);
201
+ if (urlAdaptive === "0" || urlAdaptive === "1") {
202
+ adaptive = urlAdaptive === "1";
203
+ adaptiveSource = "url";
204
+ }
205
+ else {
206
+ ignoreInvalidUrlValue(`?aura3d-adaptive=${urlAdaptive} (expected 0|1); using ${adaptive ? "1" : "0"}`, { strict: urlPolicy?.strict, warnings, console: false });
195
207
  }
196
- adaptive = urlAdaptive === "1";
197
- adaptiveSource = "url";
198
208
  }
199
209
  }
200
210
  if (renderer?.qualityProfile !== undefined) {
@@ -205,4 +215,61 @@ export function parseQualityRendererOptions(renderer, search = typeof location !
205
215
  }
206
216
  return { requested, requestedSource, overrides, adaptive, adaptiveSource, targetFrameRate, batching, warnings };
207
217
  }
218
+ const warnedUrlValues = new Set();
219
+ /**
220
+ * RP-04: a typo in a debug URL switch (`?aura3d-render=`, `?aura3d-bloom-fusion=`, `?aura3d-quality=`, `?aura3d-adaptive=`) used to
221
+ * throw inside the mount, so every game showed its "needs WebGL 2" error screen. URL values are a tester's switch, not code: warn
222
+ * once (console and `diagnostics().warnings`) and keep the code option or default. Strict apps keep the throw.
223
+ */
224
+ export function ignoreInvalidUrlValue(message, policy) {
225
+ if (policy?.strict)
226
+ throw new Error(`QUALITY_OPTION_INVALID:${message}`);
227
+ const warning = `QUALITY_URL_IGNORED: ${message}`;
228
+ policy?.warnings?.push(warning);
229
+ if (policy?.console !== false && !warnedUrlValues.has(warning)) {
230
+ warnedUrlValues.add(warning);
231
+ if (typeof console !== "undefined")
232
+ console.warn(`[aura3d] ${warning}`);
233
+ }
234
+ }
235
+ /**
236
+ * Bloom pass-fusion mode (PRD beat-threejs-2 contract 2.1): `renderer.bloomFusion` (`"separable"` default | `"fused-2d"`),
237
+ * overridden by `?aura3d-bloom-fusion=`. An invalid code option throws so a typo never silently runs the default; an invalid URL
238
+ * value warns and falls back to the code option (RP-04) unless `policy.strict`. The mode only takes effect under
239
+ * `quality: "auto"` / `"cinematic"`; `production` never fuses.
240
+ */
241
+ export function parseBloomFusionOption(renderer, search = typeof location !== "undefined" ? location.search : null, policy) {
242
+ const mode = renderer?.bloomFusion ?? DEFAULT_BLOOM_FUSION_MODE;
243
+ if (!isBloomFusion(mode))
244
+ throw new Error(`QUALITY_OPTION_INVALID:renderer.bloomFusion=${String(mode)} (expected separable|fused-2d)`);
245
+ if (search) {
246
+ const fromUrl = new URLSearchParams(search).get("aura3d-bloom-fusion");
247
+ if (fromUrl !== null) {
248
+ if (isBloomFusion(fromUrl))
249
+ return fromUrl;
250
+ ignoreInvalidUrlValue(`?aura3d-bloom-fusion=${fromUrl} (expected separable|fused-2d); using "${mode}"`, policy);
251
+ }
252
+ }
253
+ return mode;
254
+ }
255
+ /**
256
+ * Top-tennis C11 (engine part): `renderer.quality` diagnostics, reported in `diagnostics().warnings` (not the console, since the
257
+ * string form is valid). A tier-name string is a fixed tier: every device, phones included, mounts at that tier, which a reader
258
+ * of `renderer: { quality: "high" }` easily takes for a no-op or for "best available". An unknown name used to mount at "high"
259
+ * with no message while the quality lane is off.
260
+ */
261
+ export function rendererQualityWarnings(renderer) {
262
+ const quality = renderer?.quality;
263
+ if (quality === undefined || quality === "auto")
264
+ return [];
265
+ const tier = typeof quality === "string" ? quality : quality !== null && typeof quality === "object" ? quality.tier : quality;
266
+ if (tier === undefined || tier === "auto")
267
+ return [];
268
+ if (typeof tier !== "string" || !QUALITY_TIER_NAMES.includes(tier)) {
269
+ return [`RENDERER_QUALITY_INVALID: renderer.quality${typeof quality === "object" ? ".tier" : ""}=${String(tier)} is not a tier (expected low|medium|high|ultra|auto); the mount uses "high".`];
270
+ }
271
+ if (typeof quality !== "string")
272
+ return [];
273
+ return [`RENDERER_QUALITY_STRING: renderer.quality "${tier}" is a fixed tier, so every device, phones included, mounts at "${tier}" (pixel-ratio cap, shadow and post settings). Use "auto" or { tier: "auto" } to let the tier follow the device where the quality lane (A3D_QR_TIERS) is on.`];
274
+ }
208
275
  //# sourceMappingURL=rendererOptions.js.map