@aura3d/engine 2.0.3 → 3.0.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 (704) hide show
  1. package/README.md +37 -46
  2. package/dist/animation/AnimationAction.d.ts.map +1 -1
  3. package/dist/animation/AnimationAction.js +20 -2
  4. package/dist/animation/AnimationAction.js.map +1 -1
  5. package/dist/animation/AnimationLayer.d.ts +1 -0
  6. package/dist/animation/AnimationLayer.d.ts.map +1 -1
  7. package/dist/animation/AnimationLayer.js +24 -3
  8. package/dist/animation/AnimationLayer.js.map +1 -1
  9. package/dist/animation/AnimationMixer.d.ts +3 -0
  10. package/dist/animation/AnimationMixer.d.ts.map +1 -1
  11. package/dist/animation/AnimationMixer.js +69 -5
  12. package/dist/animation/AnimationMixer.js.map +1 -1
  13. package/dist/animation/AnimationTrack.d.ts.map +1 -1
  14. package/dist/animation/AnimationTrack.js +13 -0
  15. package/dist/animation/AnimationTrack.js.map +1 -1
  16. package/dist/animation/FootIk.d.ts +10 -0
  17. package/dist/animation/FootIk.d.ts.map +1 -1
  18. package/dist/animation/FootIk.js +95 -3
  19. package/dist/animation/FootIk.js.map +1 -1
  20. package/dist/animation/HumanoidRetargeting.d.ts +29 -0
  21. package/dist/animation/HumanoidRetargeting.d.ts.map +1 -1
  22. package/dist/animation/HumanoidRetargeting.js +41 -1
  23. package/dist/animation/HumanoidRetargeting.js.map +1 -1
  24. package/dist/animation/LocomotionKit.d.ts +6 -0
  25. package/dist/animation/LocomotionKit.d.ts.map +1 -1
  26. package/dist/animation/LocomotionKit.js +6 -0
  27. package/dist/animation/LocomotionKit.js.map +1 -1
  28. package/dist/animation/RootMotion.d.ts +27 -0
  29. package/dist/animation/RootMotion.d.ts.map +1 -1
  30. package/dist/animation/RootMotion.js +38 -0
  31. package/dist/animation/RootMotion.js.map +1 -1
  32. package/dist/animation/SpringBones.d.ts +28 -0
  33. package/dist/animation/SpringBones.d.ts.map +1 -1
  34. package/dist/animation/SpringBones.js +24 -0
  35. package/dist/animation/SpringBones.js.map +1 -1
  36. package/dist/assets/GLTFAnimationRuntime.d.ts +95 -2
  37. package/dist/assets/GLTFAnimationRuntime.d.ts.map +1 -1
  38. package/dist/assets/GLTFAnimationRuntime.js +328 -3
  39. package/dist/assets/GLTFAnimationRuntime.js.map +1 -1
  40. package/dist/assets/GLTFExtensionSupport.js +2 -2
  41. package/dist/assets/GLTFExtensionSupport.js.map +1 -1
  42. package/dist/assets/GLTFLoader.d.ts +360 -1
  43. package/dist/assets/GLTFLoader.d.ts.map +1 -1
  44. package/dist/assets/GLTFLoader.js +197 -1
  45. package/dist/assets/GLTFLoader.js.map +1 -1
  46. package/dist/assets/KTX2BasisTextureTranscoder.d.ts +39 -0
  47. package/dist/assets/KTX2BasisTextureTranscoder.d.ts.map +1 -1
  48. package/dist/assets/KTX2BasisTextureTranscoder.js +70 -0
  49. package/dist/assets/KTX2BasisTextureTranscoder.js.map +1 -1
  50. package/dist/assets/TexturePipeline.d.ts +20 -0
  51. package/dist/assets/TexturePipeline.d.ts.map +1 -1
  52. package/dist/assets/TexturePipeline.js +20 -0
  53. package/dist/assets/TexturePipeline.js.map +1 -1
  54. package/dist/assets/TextureStreaming.d.ts +30 -0
  55. package/dist/assets/TextureStreaming.d.ts.map +1 -1
  56. package/dist/assets/TextureStreaming.js +53 -0
  57. package/dist/assets/TextureStreaming.js.map +1 -1
  58. package/dist/assets/browser-index.d.ts +7 -3
  59. package/dist/assets/browser-index.d.ts.map +1 -1
  60. package/dist/assets/browser-index.js +3 -1
  61. package/dist/assets/browser-index.js.map +1 -1
  62. package/dist/assets/gltf-runtime.d.ts +1 -1
  63. package/dist/assets/gltf-runtime.d.ts.map +1 -1
  64. package/dist/assets/gltf-runtime.js.map +1 -1
  65. package/dist/assets/index.d.ts +7 -7
  66. package/dist/assets/index.d.ts.map +1 -1
  67. package/dist/assets/index.js +3 -3
  68. package/dist/assets/index.js.map +1 -1
  69. package/dist/assets/loaders/HDRLoader.d.ts +40 -0
  70. package/dist/assets/loaders/HDRLoader.d.ts.map +1 -1
  71. package/dist/assets/loaders/HDRLoader.js +158 -0
  72. package/dist/assets/loaders/HDRLoader.js.map +1 -1
  73. package/dist/audio/AudioSource.d.ts +2 -0
  74. package/dist/audio/AudioSource.d.ts.map +1 -1
  75. package/dist/audio/AudioSource.js +7 -0
  76. package/dist/audio/AudioSource.js.map +1 -1
  77. package/dist/audio/Footsteps.d.ts +47 -0
  78. package/dist/audio/Footsteps.d.ts.map +1 -0
  79. package/dist/audio/Footsteps.js +73 -0
  80. package/dist/audio/Footsteps.js.map +1 -0
  81. package/dist/audio/GameMixer.d.ts +69 -0
  82. package/dist/audio/GameMixer.d.ts.map +1 -0
  83. package/dist/audio/GameMixer.js +141 -0
  84. package/dist/audio/GameMixer.js.map +1 -0
  85. package/dist/audio/PositionalEmitter.d.ts +95 -0
  86. package/dist/audio/PositionalEmitter.d.ts.map +1 -0
  87. package/dist/audio/PositionalEmitter.js +199 -0
  88. package/dist/audio/PositionalEmitter.js.map +1 -0
  89. package/dist/audio/index.d.ts +6 -0
  90. package/dist/audio/index.d.ts.map +1 -1
  91. package/dist/audio/index.js +3 -0
  92. package/dist/audio/index.js.map +1 -1
  93. package/dist/aura3d-cli/asset-core-types.d.ts +19 -0
  94. package/dist/aura3d-cli/asset-core-types.d.ts.map +1 -1
  95. package/dist/aura3d-cli/asset-manifest.d.ts.map +1 -1
  96. package/dist/aura3d-cli/asset-manifest.js +2 -1
  97. package/dist/aura3d-cli/asset-manifest.js.map +1 -1
  98. package/dist/aura3d-cli/cli-help.d.ts.map +1 -1
  99. package/dist/aura3d-cli/cli-help.js +2 -0
  100. package/dist/aura3d-cli/cli-help.js.map +1 -1
  101. package/dist/aura3d-cli/cli.js +24 -1
  102. package/dist/aura3d-cli/cli.js.map +1 -1
  103. package/dist/aura3d-cli/index.d.ts +5 -1
  104. package/dist/aura3d-cli/index.d.ts.map +1 -1
  105. package/dist/aura3d-cli/index.js +5 -1
  106. package/dist/aura3d-cli/index.js.map +1 -1
  107. package/dist/aura3d-cli/meshy/admission.d.ts +40 -0
  108. package/dist/aura3d-cli/meshy/admission.d.ts.map +1 -0
  109. package/dist/aura3d-cli/meshy/admission.js +126 -0
  110. package/dist/aura3d-cli/meshy/admission.js.map +1 -0
  111. package/dist/aura3d-cli/meshy/evidence.d.ts +12 -0
  112. package/dist/aura3d-cli/meshy/evidence.d.ts.map +1 -0
  113. package/dist/aura3d-cli/meshy/evidence.js +37 -0
  114. package/dist/aura3d-cli/meshy/evidence.js.map +1 -0
  115. package/dist/aura3d-cli/meshy/import.d.ts +25 -0
  116. package/dist/aura3d-cli/meshy/import.d.ts.map +1 -0
  117. package/dist/aura3d-cli/meshy/import.js +104 -0
  118. package/dist/aura3d-cli/meshy/import.js.map +1 -0
  119. package/dist/aura3d-cli/meshy/index.d.ts +10 -0
  120. package/dist/aura3d-cli/meshy/index.d.ts.map +1 -0
  121. package/dist/aura3d-cli/meshy/index.js +6 -0
  122. package/dist/aura3d-cli/meshy/index.js.map +1 -0
  123. package/dist/aura3d-cli/meshy/metadata.d.ts +22 -0
  124. package/dist/aura3d-cli/meshy/metadata.d.ts.map +1 -0
  125. package/dist/aura3d-cli/meshy/metadata.js +176 -0
  126. package/dist/aura3d-cli/meshy/metadata.js.map +1 -0
  127. package/dist/aura3d-cli/meshy/provenance.d.ts +4 -0
  128. package/dist/aura3d-cli/meshy/provenance.d.ts.map +1 -0
  129. package/dist/aura3d-cli/meshy/provenance.js +21 -0
  130. package/dist/aura3d-cli/meshy/provenance.js.map +1 -0
  131. package/dist/aura3d-cli/meshy/thumbnail.d.ts +19 -0
  132. package/dist/aura3d-cli/meshy/thumbnail.d.ts.map +1 -0
  133. package/dist/aura3d-cli/meshy/thumbnail.js +59 -0
  134. package/dist/aura3d-cli/meshy/thumbnail.js.map +1 -0
  135. package/dist/aura3d-cli/meshy/validation.d.ts +5 -0
  136. package/dist/aura3d-cli/meshy/validation.d.ts.map +1 -0
  137. package/dist/aura3d-cli/meshy/validation.js +64 -0
  138. package/dist/aura3d-cli/meshy/validation.js.map +1 -0
  139. package/dist/aura3d-cli/pull-bridge/profiles.d.ts +12 -2
  140. package/dist/aura3d-cli/pull-bridge/profiles.d.ts.map +1 -1
  141. package/dist/aura3d-cli/pull-bridge/profiles.js +35 -4
  142. package/dist/aura3d-cli/pull-bridge/profiles.js.map +1 -1
  143. package/dist/aura3d-cli/pull-bridge/provenance.d.ts +15 -1
  144. package/dist/aura3d-cli/pull-bridge/provenance.d.ts.map +1 -1
  145. package/dist/aura3d-cli/pull-bridge/provenance.js +60 -1
  146. package/dist/aura3d-cli/pull-bridge/provenance.js.map +1 -1
  147. package/dist/aura3d-cli/pull-bridge/scoring.d.ts +10 -1
  148. package/dist/aura3d-cli/pull-bridge/scoring.d.ts.map +1 -1
  149. package/dist/aura3d-cli/pull-bridge/scoring.js +9 -1
  150. package/dist/aura3d-cli/pull-bridge/scoring.js.map +1 -1
  151. package/dist/aura3d-cli/pull-bridge/search.js +2 -2
  152. package/dist/aura3d-cli/pull-bridge/search.js.map +1 -1
  153. package/dist/aura3d-cli/pull-bridge.d.ts +15 -3
  154. package/dist/aura3d-cli/pull-bridge.d.ts.map +1 -1
  155. package/dist/aura3d-cli/pull-bridge.js +68 -5
  156. package/dist/aura3d-cli/pull-bridge.js.map +1 -1
  157. package/dist/controls/ArcballControls.d.ts +92 -0
  158. package/dist/controls/ArcballControls.d.ts.map +1 -0
  159. package/dist/controls/ArcballControls.js +286 -0
  160. package/dist/controls/ArcballControls.js.map +1 -0
  161. package/dist/controls/DragControls.d.ts +13 -0
  162. package/dist/controls/DragControls.d.ts.map +1 -1
  163. package/dist/controls/DragControls.js +24 -1
  164. package/dist/controls/DragControls.js.map +1 -1
  165. package/dist/controls/FlyControls.d.ts +9 -0
  166. package/dist/controls/FlyControls.d.ts.map +1 -1
  167. package/dist/controls/FlyControls.js +20 -2
  168. package/dist/controls/FlyControls.js.map +1 -1
  169. package/dist/controls/FocusFrame.d.ts +34 -0
  170. package/dist/controls/FocusFrame.d.ts.map +1 -0
  171. package/dist/controls/FocusFrame.js +82 -0
  172. package/dist/controls/FocusFrame.js.map +1 -0
  173. package/dist/controls/HoverOutline.d.ts +46 -0
  174. package/dist/controls/HoverOutline.d.ts.map +1 -0
  175. package/dist/controls/HoverOutline.js +87 -0
  176. package/dist/controls/HoverOutline.js.map +1 -0
  177. package/dist/controls/InteractionControls.d.ts +7 -0
  178. package/dist/controls/InteractionControls.d.ts.map +1 -1
  179. package/dist/controls/InteractionControls.js +12 -1
  180. package/dist/controls/InteractionControls.js.map +1 -1
  181. package/dist/controls/NativeControlTypes.d.ts +17 -0
  182. package/dist/controls/NativeControlTypes.d.ts.map +1 -1
  183. package/dist/controls/NativeControlTypes.js.map +1 -1
  184. package/dist/controls/OrbitControls.d.ts +9 -0
  185. package/dist/controls/OrbitControls.d.ts.map +1 -1
  186. package/dist/controls/OrbitControls.js +26 -6
  187. package/dist/controls/OrbitControls.js.map +1 -1
  188. package/dist/controls/Picking.d.ts +15 -0
  189. package/dist/controls/Picking.d.ts.map +1 -1
  190. package/dist/controls/Picking.js +62 -23
  191. package/dist/controls/Picking.js.map +1 -1
  192. package/dist/controls/PointerLockControls.d.ts.map +1 -1
  193. package/dist/controls/PointerLockControls.js +4 -0
  194. package/dist/controls/PointerLockControls.js.map +1 -1
  195. package/dist/controls/SelectionManager.d.ts +8 -0
  196. package/dist/controls/SelectionManager.d.ts.map +1 -1
  197. package/dist/controls/SelectionManager.js +11 -0
  198. package/dist/controls/SelectionManager.js.map +1 -1
  199. package/dist/controls/TrackballControls.d.ts +7 -0
  200. package/dist/controls/TrackballControls.d.ts.map +1 -1
  201. package/dist/controls/TrackballControls.js +19 -5
  202. package/dist/controls/TrackballControls.js.map +1 -1
  203. package/dist/controls/TransformControls.d.ts +8 -0
  204. package/dist/controls/TransformControls.d.ts.map +1 -1
  205. package/dist/controls/TransformControls.js +15 -2
  206. package/dist/controls/TransformControls.js.map +1 -1
  207. package/dist/controls/index.d.ts +6 -0
  208. package/dist/controls/index.d.ts.map +1 -1
  209. package/dist/controls/index.js +3 -0
  210. package/dist/controls/index.js.map +1 -1
  211. package/dist/create-aura3d/index.js +1 -1
  212. package/dist/create-aura3d/showcase-spec-game-geometry-extractor.d.ts.map +1 -1
  213. package/dist/create-aura3d/showcase-spec-game-geometry-extractor.js +86 -4
  214. package/dist/create-aura3d/showcase-spec-game-geometry-extractor.js.map +1 -1
  215. package/dist/editor-runtime/RootEditorSurface.d.ts +65 -0
  216. package/dist/editor-runtime/RootEditorSurface.d.ts.map +1 -0
  217. package/dist/editor-runtime/RootEditorSurface.js +62 -0
  218. package/dist/editor-runtime/RootEditorSurface.js.map +1 -0
  219. package/dist/editor-runtime/index.d.ts +2 -0
  220. package/dist/editor-runtime/index.d.ts.map +1 -1
  221. package/dist/editor-runtime/index.js +1 -0
  222. package/dist/editor-runtime/index.js.map +1 -1
  223. package/dist/engine/agent-api/AnimationController.d.ts +9 -1
  224. package/dist/engine/agent-api/AnimationController.d.ts.map +1 -1
  225. package/dist/engine/agent-api/AnimationController.js +5 -1
  226. package/dist/engine/agent-api/AnimationController.js.map +1 -1
  227. package/dist/engine/agent-api/AnimationDebugOverlay.d.ts +56 -0
  228. package/dist/engine/agent-api/AnimationDebugOverlay.d.ts.map +1 -0
  229. package/dist/engine/agent-api/AnimationDebugOverlay.js +148 -0
  230. package/dist/engine/agent-api/AnimationDebugOverlay.js.map +1 -0
  231. package/dist/engine/agent-api/AnimationMixerBuilders.d.ts +41 -0
  232. package/dist/engine/agent-api/AnimationMixerBuilders.d.ts.map +1 -0
  233. package/dist/engine/agent-api/AnimationMixerBuilders.js +146 -0
  234. package/dist/engine/agent-api/AnimationMixerBuilders.js.map +1 -0
  235. package/dist/engine/agent-api/AssetDecoders.d.ts +17 -0
  236. package/dist/engine/agent-api/AssetDecoders.d.ts.map +1 -0
  237. package/dist/engine/agent-api/AssetDecoders.js +18 -0
  238. package/dist/engine/agent-api/AssetDecoders.js.map +1 -0
  239. package/dist/engine/agent-api/Decals.d.ts +174 -0
  240. package/dist/engine/agent-api/Decals.d.ts.map +1 -0
  241. package/dist/engine/agent-api/Decals.js +350 -0
  242. package/dist/engine/agent-api/Decals.js.map +1 -0
  243. package/dist/engine/agent-api/FootPlanting.d.ts +75 -0
  244. package/dist/engine/agent-api/FootPlanting.d.ts.map +1 -0
  245. package/dist/engine/agent-api/FootPlanting.js +60 -0
  246. package/dist/engine/agent-api/FootPlanting.js.map +1 -0
  247. package/dist/engine/agent-api/GameAppRuntime.d.ts +19 -0
  248. package/dist/engine/agent-api/GameAppRuntime.d.ts.map +1 -1
  249. package/dist/engine/agent-api/GameAppRuntime.js +37 -1
  250. package/dist/engine/agent-api/GameAppRuntime.js.map +1 -1
  251. package/dist/engine/agent-api/GameCameraRigs.d.ts +185 -0
  252. package/dist/engine/agent-api/GameCameraRigs.d.ts.map +1 -0
  253. package/dist/engine/agent-api/GameCameraRigs.js +414 -0
  254. package/dist/engine/agent-api/GameCameraRigs.js.map +1 -0
  255. package/dist/engine/agent-api/GameFeel.d.ts +100 -0
  256. package/dist/engine/agent-api/GameFeel.d.ts.map +1 -0
  257. package/dist/engine/agent-api/GameFeel.js +226 -0
  258. package/dist/engine/agent-api/GameFeel.js.map +1 -0
  259. package/dist/engine/agent-api/GameGenreKits.d.ts.map +1 -1
  260. package/dist/engine/agent-api/GameGenreKits.js +26 -3
  261. package/dist/engine/agent-api/GameGenreKits.js.map +1 -1
  262. package/dist/engine/agent-api/LabelTelemetry.d.ts +108 -0
  263. package/dist/engine/agent-api/LabelTelemetry.d.ts.map +1 -0
  264. package/dist/engine/agent-api/LabelTelemetry.js +116 -0
  265. package/dist/engine/agent-api/LabelTelemetry.js.map +1 -0
  266. package/dist/engine/agent-api/NavigationCrowds.d.ts +146 -0
  267. package/dist/engine/agent-api/NavigationCrowds.d.ts.map +1 -0
  268. package/dist/engine/agent-api/NavigationCrowds.js +104 -0
  269. package/dist/engine/agent-api/NavigationCrowds.js.map +1 -0
  270. package/dist/engine/agent-api/PhysicsRuntime.d.ts +61 -5
  271. package/dist/engine/agent-api/PhysicsRuntime.d.ts.map +1 -1
  272. package/dist/engine/agent-api/PhysicsRuntime.js +53 -21
  273. package/dist/engine/agent-api/PhysicsRuntime.js.map +1 -1
  274. package/dist/engine/agent-api/RootGeometry.d.ts +16 -1
  275. package/dist/engine/agent-api/RootGeometry.d.ts.map +1 -1
  276. package/dist/engine/agent-api/RootGeometry.js.map +1 -1
  277. package/dist/engine/agent-api/RuntimeNodeHandle.d.ts +6 -0
  278. package/dist/engine/agent-api/RuntimeNodeHandle.d.ts.map +1 -1
  279. package/dist/engine/agent-api/RuntimeNodeHandle.js.map +1 -1
  280. package/dist/engine/agent-api/Scatter.d.ts +18 -0
  281. package/dist/engine/agent-api/Scatter.d.ts.map +1 -0
  282. package/dist/engine/agent-api/Scatter.js +18 -0
  283. package/dist/engine/agent-api/Scatter.js.map +1 -0
  284. package/dist/engine/agent-api/TouchControlBinding.d.ts +32 -0
  285. package/dist/engine/agent-api/TouchControlBinding.d.ts.map +1 -1
  286. package/dist/engine/agent-api/TouchControlBinding.js +36 -0
  287. package/dist/engine/agent-api/TouchControlBinding.js.map +1 -1
  288. package/dist/engine/agent-api/VehicleChassis.d.ts.map +1 -1
  289. package/dist/engine/agent-api/VehicleChassis.js +76 -13
  290. package/dist/engine/agent-api/VehicleChassis.js.map +1 -1
  291. package/dist/engine/agent-api/index.d.ts +723 -6
  292. package/dist/engine/agent-api/index.d.ts.map +1 -1
  293. package/dist/engine/agent-api/index.js +1805 -137
  294. package/dist/engine/agent-api/index.js.map +1 -1
  295. package/dist/engine/agent-api/product-viewer-runtime.d.ts.map +1 -1
  296. package/dist/engine/game/GameAudio.d.ts +66 -0
  297. package/dist/engine/game/GameAudio.d.ts.map +1 -1
  298. package/dist/engine/game/GameAudio.js +179 -44
  299. package/dist/engine/game/GameAudio.js.map +1 -1
  300. package/dist/engine/instances-model/InstancedModel.d.ts +111 -0
  301. package/dist/engine/instances-model/InstancedModel.d.ts.map +1 -0
  302. package/dist/engine/instances-model/InstancedModel.js +108 -0
  303. package/dist/engine/instances-model/InstancedModel.js.map +1 -0
  304. package/dist/engine/material-physical/PhysicalMaterialSpec.d.ts +72 -0
  305. package/dist/engine/material-physical/PhysicalMaterialSpec.d.ts.map +1 -0
  306. package/dist/engine/material-physical/PhysicalMaterialSpec.js +95 -0
  307. package/dist/engine/material-physical/PhysicalMaterialSpec.js.map +1 -0
  308. package/dist/engine/production-runtime/GameAppRuntime.d.ts +1 -1
  309. package/dist/engine/production-runtime/GameAppRuntime.d.ts.map +1 -1
  310. package/dist/engine/production-runtime/GameRenderPreset.d.ts +76 -0
  311. package/dist/engine/production-runtime/GameRenderPreset.d.ts.map +1 -1
  312. package/dist/engine/production-runtime/GameRenderPreset.js +167 -0
  313. package/dist/engine/production-runtime/GameRenderPreset.js.map +1 -1
  314. package/dist/engine/production-runtime/TypedGLBActor.d.ts +36 -2
  315. package/dist/engine/production-runtime/TypedGLBActor.d.ts.map +1 -1
  316. package/dist/engine/production-runtime/TypedGLBActor.js +92 -5
  317. package/dist/engine/production-runtime/TypedGLBActor.js.map +1 -1
  318. package/dist/engine/production-runtime/index.d.ts +4 -4
  319. package/dist/engine/production-runtime/index.d.ts.map +1 -1
  320. package/dist/engine/production-runtime/index.js +5 -3
  321. package/dist/engine/production-runtime/index.js.map +1 -1
  322. package/dist/input/ActionMap.d.ts +40 -0
  323. package/dist/input/ActionMap.d.ts.map +1 -1
  324. package/dist/input/ActionMap.js +179 -0
  325. package/dist/input/ActionMap.js.map +1 -1
  326. package/dist/input/ComboDetector.d.ts +49 -0
  327. package/dist/input/ComboDetector.d.ts.map +1 -0
  328. package/dist/input/ComboDetector.js +102 -0
  329. package/dist/input/ComboDetector.js.map +1 -0
  330. package/dist/input/Haptics.d.ts +46 -0
  331. package/dist/input/Haptics.d.ts.map +1 -0
  332. package/dist/input/Haptics.js +67 -0
  333. package/dist/input/Haptics.js.map +1 -0
  334. package/dist/input/TouchLayouts.d.ts +35 -0
  335. package/dist/input/TouchLayouts.d.ts.map +1 -0
  336. package/dist/input/TouchLayouts.js +88 -0
  337. package/dist/input/TouchLayouts.js.map +1 -0
  338. package/dist/input/WebXRSessionController.d.ts +53 -0
  339. package/dist/input/WebXRSessionController.d.ts.map +1 -1
  340. package/dist/input/WebXRSessionController.js +88 -2
  341. package/dist/input/WebXRSessionController.js.map +1 -1
  342. package/dist/input/index.d.ts +8 -2
  343. package/dist/input/index.d.ts.map +1 -1
  344. package/dist/input/index.js +3 -0
  345. package/dist/input/index.js.map +1 -1
  346. package/dist/lean/game.d.ts +98 -0
  347. package/dist/lean/game.d.ts.map +1 -1
  348. package/dist/lean/game.js +192 -0
  349. package/dist/lean/game.js.map +1 -1
  350. package/dist/materials/GameReadyMaterialLibrary.d.ts +39 -0
  351. package/dist/materials/GameReadyMaterialLibrary.d.ts.map +1 -0
  352. package/dist/materials/GameReadyMaterialLibrary.js +253 -0
  353. package/dist/materials/GameReadyMaterialLibrary.js.map +1 -0
  354. package/dist/materials/MaterialValidation.d.ts +21 -0
  355. package/dist/materials/MaterialValidation.d.ts.map +1 -1
  356. package/dist/materials/MaterialValidation.js +105 -0
  357. package/dist/materials/MaterialValidation.js.map +1 -1
  358. package/dist/materials/browser-index.d.ts +2 -0
  359. package/dist/materials/browser-index.d.ts.map +1 -1
  360. package/dist/materials/browser-index.js +1 -0
  361. package/dist/materials/browser-index.js.map +1 -1
  362. package/dist/materials/node.d.ts +2 -2
  363. package/dist/materials/node.d.ts.map +1 -1
  364. package/dist/materials/node.js +1 -1
  365. package/dist/materials/node.js.map +1 -1
  366. package/dist/physics/CollisionVolumes.d.ts +59 -0
  367. package/dist/physics/CollisionVolumes.d.ts.map +1 -1
  368. package/dist/physics/CollisionVolumes.js +87 -0
  369. package/dist/physics/CollisionVolumes.js.map +1 -1
  370. package/dist/physics/PhysicsDebugDraw.d.ts +37 -0
  371. package/dist/physics/PhysicsDebugDraw.d.ts.map +1 -1
  372. package/dist/physics/PhysicsDebugDraw.js +38 -1
  373. package/dist/physics/PhysicsDebugDraw.js.map +1 -1
  374. package/dist/physics/PhysicsWorld.d.ts +15 -0
  375. package/dist/physics/PhysicsWorld.d.ts.map +1 -1
  376. package/dist/physics/PhysicsWorld.js +8 -1
  377. package/dist/physics/PhysicsWorld.js.map +1 -1
  378. package/dist/physics/solverless.d.ts +1 -1
  379. package/dist/physics/solverless.d.ts.map +1 -1
  380. package/dist/physics/solverless.js.map +1 -1
  381. package/dist/physics-rapier/index.d.ts +7 -1
  382. package/dist/physics-rapier/index.d.ts.map +1 -1
  383. package/dist/physics-rapier/index.js +1 -1
  384. package/dist/physics-rapier/index.js.map +1 -1
  385. package/dist/react/index.d.ts +136 -2
  386. package/dist/react/index.d.ts.map +1 -1
  387. package/dist/react/index.js +251 -10
  388. package/dist/react/index.js.map +1 -1
  389. package/dist/rendering/AtmosphereWetness.d.ts +61 -0
  390. package/dist/rendering/AtmosphereWetness.d.ts.map +1 -0
  391. package/dist/rendering/AtmosphereWetness.js +99 -0
  392. package/dist/rendering/AtmosphereWetness.js.map +1 -0
  393. package/dist/rendering/ClusteredForwardLighting.d.ts +25 -1
  394. package/dist/rendering/ClusteredForwardLighting.d.ts.map +1 -1
  395. package/dist/rendering/ClusteredForwardLighting.js +80 -3
  396. package/dist/rendering/ClusteredForwardLighting.js.map +1 -1
  397. package/dist/rendering/DayNightSky.d.ts +63 -0
  398. package/dist/rendering/DayNightSky.d.ts.map +1 -0
  399. package/dist/rendering/DayNightSky.js +156 -0
  400. package/dist/rendering/DayNightSky.js.map +1 -0
  401. package/dist/rendering/EnvironmentPresetPack.d.ts +30 -0
  402. package/dist/rendering/EnvironmentPresetPack.d.ts.map +1 -0
  403. package/dist/rendering/EnvironmentPresetPack.js +49 -0
  404. package/dist/rendering/EnvironmentPresetPack.js.map +1 -0
  405. package/dist/rendering/ForwardPass.d.ts +67 -0
  406. package/dist/rendering/ForwardPass.d.ts.map +1 -1
  407. package/dist/rendering/ForwardPass.js +196 -2
  408. package/dist/rendering/ForwardPass.js.map +1 -1
  409. package/dist/rendering/InstancedPBRMaterial.d.ts +1 -0
  410. package/dist/rendering/InstancedPBRMaterial.d.ts.map +1 -1
  411. package/dist/rendering/InstancedPBRMaterial.js +3 -0
  412. package/dist/rendering/InstancedPBRMaterial.js.map +1 -1
  413. package/dist/rendering/InstancingDiagnostics.d.ts +69 -0
  414. package/dist/rendering/InstancingDiagnostics.d.ts.map +1 -0
  415. package/dist/rendering/InstancingDiagnostics.js +98 -0
  416. package/dist/rendering/InstancingDiagnostics.js.map +1 -0
  417. package/dist/rendering/LightingRig.d.ts +19 -1
  418. package/dist/rendering/LightingRig.d.ts.map +1 -1
  419. package/dist/rendering/LightingRig.js +61 -1
  420. package/dist/rendering/LightingRig.js.map +1 -1
  421. package/dist/rendering/MeshConsolidation.d.ts +12 -0
  422. package/dist/rendering/MeshConsolidation.d.ts.map +1 -1
  423. package/dist/rendering/MeshConsolidation.js +28 -0
  424. package/dist/rendering/MeshConsolidation.js.map +1 -1
  425. package/dist/rendering/MorphTargetPlan.d.ts +29 -2
  426. package/dist/rendering/MorphTargetPlan.d.ts.map +1 -1
  427. package/dist/rendering/MorphTargetPlan.js +23 -4
  428. package/dist/rendering/MorphTargetPlan.js.map +1 -1
  429. package/dist/rendering/NormalMappedPBRMaterial.d.ts.map +1 -1
  430. package/dist/rendering/NormalMappedPBRMaterial.js +22 -2
  431. package/dist/rendering/NormalMappedPBRMaterial.js.map +1 -1
  432. package/dist/rendering/OceanSurface.d.ts +75 -0
  433. package/dist/rendering/OceanSurface.d.ts.map +1 -1
  434. package/dist/rendering/OceanSurface.js +211 -0
  435. package/dist/rendering/OceanSurface.js.map +1 -1
  436. package/dist/rendering/PBRMaterial.d.ts +1 -0
  437. package/dist/rendering/PBRMaterial.d.ts.map +1 -1
  438. package/dist/rendering/PBRMaterial.js +23 -2
  439. package/dist/rendering/PBRMaterial.js.map +1 -1
  440. package/dist/rendering/PbrReference.d.ts +48 -0
  441. package/dist/rendering/PbrReference.d.ts.map +1 -1
  442. package/dist/rendering/PbrReference.js +126 -0
  443. package/dist/rendering/PbrReference.js.map +1 -1
  444. package/dist/rendering/PlanarReflection.d.ts +221 -0
  445. package/dist/rendering/PlanarReflection.d.ts.map +1 -0
  446. package/dist/rendering/PlanarReflection.js +541 -0
  447. package/dist/rendering/PlanarReflection.js.map +1 -0
  448. package/dist/rendering/PostProcessPass.d.ts +13 -0
  449. package/dist/rendering/PostProcessPass.d.ts.map +1 -1
  450. package/dist/rendering/PostProcessPass.js +15 -4
  451. package/dist/rendering/PostProcessPass.js.map +1 -1
  452. package/dist/rendering/ReflectionSurfaces.d.ts +14 -0
  453. package/dist/rendering/ReflectionSurfaces.d.ts.map +1 -1
  454. package/dist/rendering/ReflectionSurfaces.js +93 -0
  455. package/dist/rendering/ReflectionSurfaces.js.map +1 -1
  456. package/dist/rendering/RenderDevice.d.ts +87 -0
  457. package/dist/rendering/RenderDevice.d.ts.map +1 -1
  458. package/dist/rendering/RenderDevice.js +85 -0
  459. package/dist/rendering/RenderDevice.js.map +1 -1
  460. package/dist/rendering/Renderer.js +8 -5
  461. package/dist/rendering/Renderer.js.map +1 -1
  462. package/dist/rendering/RendererPostprocessPlan.d.ts +48 -0
  463. package/dist/rendering/RendererPostprocessPlan.d.ts.map +1 -1
  464. package/dist/rendering/RendererPostprocessPlan.js +101 -11
  465. package/dist/rendering/RendererPostprocessPlan.js.map +1 -1
  466. package/dist/rendering/RendererVisualPipelineReport.d.ts.map +1 -1
  467. package/dist/rendering/RendererVisualPipelineReport.js +3 -1
  468. package/dist/rendering/RendererVisualPipelineReport.js.map +1 -1
  469. package/dist/rendering/Sampler.d.ts +29 -0
  470. package/dist/rendering/Sampler.d.ts.map +1 -1
  471. package/dist/rendering/Sampler.js +47 -0
  472. package/dist/rendering/Sampler.js.map +1 -1
  473. package/dist/rendering/SceneOptimization.d.ts +1 -0
  474. package/dist/rendering/SceneOptimization.d.ts.map +1 -1
  475. package/dist/rendering/SceneOptimization.js +4 -2
  476. package/dist/rendering/SceneOptimization.js.map +1 -1
  477. package/dist/rendering/SdfText.d.ts +250 -0
  478. package/dist/rendering/SdfText.d.ts.map +1 -0
  479. package/dist/rendering/SdfText.js +551 -0
  480. package/dist/rendering/SdfText.js.map +1 -0
  481. package/dist/rendering/ShaderChunks.d.ts.map +1 -1
  482. package/dist/rendering/ShaderChunks.js +30 -12
  483. package/dist/rendering/ShaderChunks.js.map +1 -1
  484. package/dist/rendering/ShaderLibrary.d.ts.map +1 -1
  485. package/dist/rendering/ShaderLibrary.js +478 -34
  486. package/dist/rendering/ShaderLibrary.js.map +1 -1
  487. package/dist/rendering/ShaderLibraryCore.d.ts.map +1 -1
  488. package/dist/rendering/ShaderLibraryCore.js +70 -12
  489. package/dist/rendering/ShaderLibraryCore.js.map +1 -1
  490. package/dist/rendering/ShadowMap.d.ts +24 -0
  491. package/dist/rendering/ShadowMap.d.ts.map +1 -1
  492. package/dist/rendering/ShadowMap.js +43 -0
  493. package/dist/rendering/ShadowMap.js.map +1 -1
  494. package/dist/rendering/SkinnedLitMaterial.d.ts.map +1 -1
  495. package/dist/rendering/SkinnedLitMaterial.js +2 -0
  496. package/dist/rendering/SkinnedLitMaterial.js.map +1 -1
  497. package/dist/rendering/SkinningBounds.d.ts +10 -0
  498. package/dist/rendering/SkinningBounds.d.ts.map +1 -1
  499. package/dist/rendering/SkinningBounds.js +27 -0
  500. package/dist/rendering/SkinningBounds.js.map +1 -1
  501. package/dist/rendering/SpriteFlipbook.d.ts +60 -0
  502. package/dist/rendering/SpriteFlipbook.d.ts.map +1 -0
  503. package/dist/rendering/SpriteFlipbook.js +128 -0
  504. package/dist/rendering/SpriteFlipbook.js.map +1 -0
  505. package/dist/rendering/TerrainTiles.d.ts +120 -0
  506. package/dist/rendering/TerrainTiles.d.ts.map +1 -0
  507. package/dist/rendering/TerrainTiles.js +221 -0
  508. package/dist/rendering/TerrainTiles.js.map +1 -0
  509. package/dist/rendering/TexturedPBRMaterial.d.ts +1 -0
  510. package/dist/rendering/TexturedPBRMaterial.d.ts.map +1 -1
  511. package/dist/rendering/TexturedPBRMaterial.js +23 -2
  512. package/dist/rendering/TexturedPBRMaterial.js.map +1 -1
  513. package/dist/rendering/TexturedUnlitMaterial.d.ts.map +1 -1
  514. package/dist/rendering/TexturedUnlitMaterial.js +20 -2
  515. package/dist/rendering/TexturedUnlitMaterial.js.map +1 -1
  516. package/dist/rendering/UnlitMaterial.d.ts.map +1 -1
  517. package/dist/rendering/UnlitMaterial.js +20 -2
  518. package/dist/rendering/UnlitMaterial.js.map +1 -1
  519. package/dist/rendering/VertexFormat.d.ts +6 -0
  520. package/dist/rendering/VertexFormat.d.ts.map +1 -1
  521. package/dist/rendering/VertexFormat.js +12 -0
  522. package/dist/rendering/VertexFormat.js.map +1 -1
  523. package/dist/rendering/VolumetricFog.d.ts +55 -0
  524. package/dist/rendering/VolumetricFog.d.ts.map +1 -0
  525. package/dist/rendering/VolumetricFog.js +91 -0
  526. package/dist/rendering/VolumetricFog.js.map +1 -0
  527. package/dist/rendering/WaterSurface.d.ts +77 -0
  528. package/dist/rendering/WaterSurface.d.ts.map +1 -0
  529. package/dist/rendering/WaterSurface.js +133 -0
  530. package/dist/rendering/WaterSurface.js.map +1 -0
  531. package/dist/rendering/WebGL2Device.d.ts +58 -0
  532. package/dist/rendering/WebGL2Device.d.ts.map +1 -1
  533. package/dist/rendering/WebGL2Device.js +536 -17
  534. package/dist/rendering/WebGL2Device.js.map +1 -1
  535. package/dist/rendering/WebGPUDevice.d.ts +50 -0
  536. package/dist/rendering/WebGPUDevice.d.ts.map +1 -1
  537. package/dist/rendering/WebGPUDevice.js +504 -10
  538. package/dist/rendering/WebGPUDevice.js.map +1 -1
  539. package/dist/rendering/WebGPUSkinningLimits.d.ts +40 -0
  540. package/dist/rendering/WebGPUSkinningLimits.d.ts.map +1 -1
  541. package/dist/rendering/WebGPUSkinningLimits.js +32 -0
  542. package/dist/rendering/WebGPUSkinningLimits.js.map +1 -1
  543. package/dist/rendering/effects/CollisionModule.d.ts +9 -0
  544. package/dist/rendering/effects/CollisionModule.d.ts.map +1 -1
  545. package/dist/rendering/effects/CollisionModule.js +10 -0
  546. package/dist/rendering/effects/CollisionModule.js.map +1 -1
  547. package/dist/rendering/effects/ColorModule.d.ts +7 -0
  548. package/dist/rendering/effects/ColorModule.d.ts.map +1 -1
  549. package/dist/rendering/effects/ColorModule.js +23 -0
  550. package/dist/rendering/effects/ColorModule.js.map +1 -1
  551. package/dist/rendering/effects/ForceModule.d.ts +35 -0
  552. package/dist/rendering/effects/ForceModule.d.ts.map +1 -1
  553. package/dist/rendering/effects/ForceModule.js +49 -0
  554. package/dist/rendering/effects/ForceModule.js.map +1 -1
  555. package/dist/rendering/effects/GPUParticleBackend.d.ts +186 -0
  556. package/dist/rendering/effects/GPUParticleBackend.d.ts.map +1 -1
  557. package/dist/rendering/effects/GPUParticleBackend.js +692 -1
  558. package/dist/rendering/effects/GPUParticleBackend.js.map +1 -1
  559. package/dist/rendering/effects/HeightfieldModule.d.ts +58 -0
  560. package/dist/rendering/effects/HeightfieldModule.d.ts.map +1 -0
  561. package/dist/rendering/effects/HeightfieldModule.js +129 -0
  562. package/dist/rendering/effects/HeightfieldModule.js.map +1 -0
  563. package/dist/rendering/effects/LightingModule.d.ts +34 -0
  564. package/dist/rendering/effects/LightingModule.d.ts.map +1 -0
  565. package/dist/rendering/effects/LightingModule.js +54 -0
  566. package/dist/rendering/effects/LightingModule.js.map +1 -0
  567. package/dist/rendering/effects/ParticleDiagnostics.d.ts +8 -0
  568. package/dist/rendering/effects/ParticleDiagnostics.d.ts.map +1 -1
  569. package/dist/rendering/effects/ParticleDiagnostics.js +3 -0
  570. package/dist/rendering/effects/ParticleDiagnostics.js.map +1 -1
  571. package/dist/rendering/effects/ParticleModule.d.ts +8 -0
  572. package/dist/rendering/effects/ParticleModule.d.ts.map +1 -1
  573. package/dist/rendering/effects/ParticleModule.js.map +1 -1
  574. package/dist/rendering/effects/ParticleRenderer.d.ts +20 -0
  575. package/dist/rendering/effects/ParticleRenderer.d.ts.map +1 -1
  576. package/dist/rendering/effects/ParticleRenderer.js +57 -7
  577. package/dist/rendering/effects/ParticleRenderer.js.map +1 -1
  578. package/dist/rendering/effects/ParticleSystem.d.ts +45 -1
  579. package/dist/rendering/effects/ParticleSystem.d.ts.map +1 -1
  580. package/dist/rendering/effects/ParticleSystem.js +373 -4
  581. package/dist/rendering/effects/ParticleSystem.js.map +1 -1
  582. package/dist/rendering/effects/SizeModule.d.ts +4 -0
  583. package/dist/rendering/effects/SizeModule.d.ts.map +1 -1
  584. package/dist/rendering/effects/SizeModule.js +16 -0
  585. package/dist/rendering/effects/SizeModule.js.map +1 -1
  586. package/dist/rendering/effects/SubEmitterModule.d.ts +61 -0
  587. package/dist/rendering/effects/SubEmitterModule.d.ts.map +1 -0
  588. package/dist/rendering/effects/SubEmitterModule.js +119 -0
  589. package/dist/rendering/effects/SubEmitterModule.js.map +1 -0
  590. package/dist/rendering/effects/TrailModule.d.ts +38 -0
  591. package/dist/rendering/effects/TrailModule.d.ts.map +1 -1
  592. package/dist/rendering/effects/TrailModule.js +95 -2
  593. package/dist/rendering/effects/TrailModule.js.map +1 -1
  594. package/dist/rendering/effects/TurbulenceModule.d.ts +43 -0
  595. package/dist/rendering/effects/TurbulenceModule.d.ts.map +1 -0
  596. package/dist/rendering/effects/TurbulenceModule.js +130 -0
  597. package/dist/rendering/effects/TurbulenceModule.js.map +1 -0
  598. package/dist/rendering/effects/index.d.ts +4 -0
  599. package/dist/rendering/effects/index.d.ts.map +1 -1
  600. package/dist/rendering/effects/index.js +4 -0
  601. package/dist/rendering/effects/index.js.map +1 -1
  602. package/dist/rendering/index.d.ts +57 -19
  603. package/dist/rendering/index.d.ts.map +1 -1
  604. package/dist/rendering/index.js +31 -10
  605. package/dist/rendering/index.js.map +1 -1
  606. package/dist/rendering/materials/MaterialExtensions.js +3 -3
  607. package/dist/rendering/materials/MaterialExtensions.js.map +1 -1
  608. package/dist/rendering/postprocess/NativeBloomPyramid.d.ts +28 -0
  609. package/dist/rendering/postprocess/NativeBloomPyramid.d.ts.map +1 -0
  610. package/dist/rendering/postprocess/NativeBloomPyramid.js +54 -0
  611. package/dist/rendering/postprocess/NativeBloomPyramid.js.map +1 -0
  612. package/dist/rendering/postprocess/NativeLdrEffectLuts.d.ts +10 -1
  613. package/dist/rendering/postprocess/NativeLdrEffectLuts.d.ts.map +1 -1
  614. package/dist/rendering/postprocess/NativeLdrEffectLuts.js +19 -2
  615. package/dist/rendering/postprocess/NativeLdrEffectLuts.js.map +1 -1
  616. package/dist/rendering/postprocess/index.d.ts +2 -0
  617. package/dist/rendering/postprocess/index.d.ts.map +1 -1
  618. package/dist/rendering/postprocess/index.js +1 -0
  619. package/dist/rendering/postprocess/index.js.map +1 -1
  620. package/dist/rendering/production-runtime/PBRHDRPipeline.d.ts +22 -0
  621. package/dist/rendering/production-runtime/PBRHDRPipeline.d.ts.map +1 -1
  622. package/dist/rendering/production-runtime/PBRHDRPipeline.js +125 -0
  623. package/dist/rendering/production-runtime/PBRHDRPipeline.js.map +1 -1
  624. package/dist/rendering/production-runtime/ProductionWebGPURenderer.d.ts +52 -0
  625. package/dist/rendering/production-runtime/ProductionWebGPURenderer.d.ts.map +1 -1
  626. package/dist/rendering/production-runtime/ProductionWebGPURenderer.js +101 -0
  627. package/dist/rendering/production-runtime/ProductionWebGPURenderer.js.map +1 -1
  628. package/dist/rendering/production-runtime/index.d.ts +5 -4
  629. package/dist/rendering/production-runtime/index.d.ts.map +1 -1
  630. package/dist/rendering/production-runtime/index.js +3 -2
  631. package/dist/rendering/production-runtime/index.js.map +1 -1
  632. package/dist/rendering/production-runtime/passes/DepthPrepass.d.ts +26 -1
  633. package/dist/rendering/production-runtime/passes/DepthPrepass.d.ts.map +1 -1
  634. package/dist/rendering/production-runtime/passes/DepthPrepass.js +49 -2
  635. package/dist/rendering/production-runtime/passes/DepthPrepass.js.map +1 -1
  636. package/dist/rendering/production-runtime/passes/FramegraphTopology.d.ts +13 -0
  637. package/dist/rendering/production-runtime/passes/FramegraphTopology.d.ts.map +1 -0
  638. package/dist/rendering/production-runtime/passes/FramegraphTopology.js +59 -0
  639. package/dist/rendering/production-runtime/passes/FramegraphTopology.js.map +1 -0
  640. package/dist/rendering/production-runtime/passes/OpaquePass.d.ts +24 -1
  641. package/dist/rendering/production-runtime/passes/OpaquePass.d.ts.map +1 -1
  642. package/dist/rendering/production-runtime/passes/OpaquePass.js +41 -2
  643. package/dist/rendering/production-runtime/passes/OpaquePass.js.map +1 -1
  644. package/dist/rendering/production-runtime/passes/ShadowPass.d.ts +24 -1
  645. package/dist/rendering/production-runtime/passes/ShadowPass.d.ts.map +1 -1
  646. package/dist/rendering/production-runtime/passes/ShadowPass.js +43 -2
  647. package/dist/rendering/production-runtime/passes/ShadowPass.js.map +1 -1
  648. package/dist/rendering/production-runtime/passes/SkyboxPass.d.ts +21 -1
  649. package/dist/rendering/production-runtime/passes/SkyboxPass.d.ts.map +1 -1
  650. package/dist/rendering/production-runtime/passes/SkyboxPass.js +39 -2
  651. package/dist/rendering/production-runtime/passes/SkyboxPass.js.map +1 -1
  652. package/dist/rendering/production-runtime/passes/ToneMappingPass.d.ts +29 -1
  653. package/dist/rendering/production-runtime/passes/ToneMappingPass.d.ts.map +1 -1
  654. package/dist/rendering/production-runtime/passes/ToneMappingPass.js +53 -2
  655. package/dist/rendering/production-runtime/passes/ToneMappingPass.js.map +1 -1
  656. package/dist/rendering/production-runtime/passes/TransparentPass.d.ts +24 -1
  657. package/dist/rendering/production-runtime/passes/TransparentPass.d.ts.map +1 -1
  658. package/dist/rendering/production-runtime/passes/TransparentPass.js +42 -2
  659. package/dist/rendering/production-runtime/passes/TransparentPass.js.map +1 -1
  660. package/dist/rendering/shadows/CascadeHysteresis.d.ts +67 -0
  661. package/dist/rendering/shadows/CascadeHysteresis.d.ts.map +1 -0
  662. package/dist/rendering/shadows/CascadeHysteresis.js +104 -0
  663. package/dist/rendering/shadows/CascadeHysteresis.js.map +1 -0
  664. package/dist/rendering/shadows/ContactShadows.d.ts +52 -0
  665. package/dist/rendering/shadows/ContactShadows.d.ts.map +1 -1
  666. package/dist/rendering/shadows/ContactShadows.js +122 -0
  667. package/dist/rendering/shadows/ContactShadows.js.map +1 -1
  668. package/dist/rendering/shadows/SpotShadowMaps.d.ts +77 -0
  669. package/dist/rendering/shadows/SpotShadowMaps.d.ts.map +1 -0
  670. package/dist/rendering/shadows/SpotShadowMaps.js +106 -0
  671. package/dist/rendering/shadows/SpotShadowMaps.js.map +1 -0
  672. package/dist/rendering/webgpu/WebGPUPostProcess.d.ts +2 -0
  673. package/dist/rendering/webgpu/WebGPUPostProcess.d.ts.map +1 -1
  674. package/dist/rendering/webgpu/WebGPUPostProcess.js +1 -0
  675. package/dist/rendering/webgpu/WebGPUPostProcess.js.map +1 -1
  676. package/dist/rendering/webgpu/WebGPUPostShaders.d.ts +78 -0
  677. package/dist/rendering/webgpu/WebGPUPostShaders.d.ts.map +1 -0
  678. package/dist/rendering/webgpu/WebGPUPostShaders.js +262 -0
  679. package/dist/rendering/webgpu/WebGPUPostShaders.js.map +1 -0
  680. package/dist/scene/Scene.d.ts +8 -1
  681. package/dist/scene/Scene.d.ts.map +1 -1
  682. package/dist/scene/Scene.js +12 -2
  683. package/dist/scene/Scene.js.map +1 -1
  684. package/dist/scripting/VisualGraphContext.d.ts +31 -0
  685. package/dist/scripting/VisualGraphContext.d.ts.map +1 -1
  686. package/dist/scripting/VisualGraphExecutor.d.ts.map +1 -1
  687. package/dist/scripting/VisualGraphExecutor.js +110 -0
  688. package/dist/scripting/VisualGraphExecutor.js.map +1 -1
  689. package/dist/scripting/VisualNodeCatalog.d.ts +1 -1
  690. package/dist/scripting/VisualNodeCatalog.d.ts.map +1 -1
  691. package/dist/scripting/VisualNodeCatalog.js +20 -0
  692. package/dist/scripting/VisualNodeCatalog.js.map +1 -1
  693. package/dist/scripting/VisualScriptingRoot.d.ts +96 -0
  694. package/dist/scripting/VisualScriptingRoot.d.ts.map +1 -0
  695. package/dist/scripting/VisualScriptingRoot.js +150 -0
  696. package/dist/scripting/VisualScriptingRoot.js.map +1 -0
  697. package/dist/scripting/index.d.ts +3 -1
  698. package/dist/scripting/index.d.ts.map +1 -1
  699. package/dist/scripting/index.js +1 -0
  700. package/dist/scripting/index.js.map +1 -1
  701. package/package.json +30 -23
  702. package/templates/cinematic-scene/package.json +1 -1
  703. package/templates/mini-game/package.json +1 -1
  704. package/templates/product-viewer/package.json +1 -1
@@ -1,9 +1,10 @@
1
- import { RenderDeviceError, } from "./RenderDevice.js";
1
+ import { RenderDeviceError, resolveGpuTargetOwner, spreadGpuTargetInventory, } from "./RenderDevice.js";
2
2
  import { Texture, isCompressedTextureFormat, isFloatColorTextureFormat } from "./Texture.js";
3
3
  import { isTextureBinding, TextureBinding } from "./TextureBinding.js";
4
4
  import {} from "./VertexFormat.js";
5
5
  import { WebGL2StateCache } from "./WebGL2StateCache.js";
6
6
  import { BLOOM_BRIGHT_LUT_HEIGHT, BLOOM_BRIGHT_LUT_WIDTH, BLOOM_COMPOSITE_LUT_SIZE, OUTLINE_BLEND_LUT_WIDTH, OUTLINE_LIMB_RADIX, createOutlineBlendLut, createOutlineGradientBound, createBloomBrightThresholdLut, createBloomCompositeLut } from "./postprocess/NativeLdrEffectLuts.js";
7
+ import { normalizeBloomQualityPreset, resolveBloomPyramidPlan, } from "./postprocess/NativeBloomPyramid.js";
7
8
  const WEBGL_CUBE_FACES = ["px", "nx", "py", "ny", "pz", "nz"];
8
9
  class WebGL2Buffer {
9
10
  id;
@@ -125,19 +126,26 @@ export class WebGL2Device {
125
126
  bloomBrightExtractProgram = null;
126
127
  bloomBlurProgram = null;
127
128
  bloomCompositeProgram = null;
129
+ bloomDownsampleProgram = null;
130
+ bloomAccumulateProgram = null;
131
+ bloomPyramidResources = null;
128
132
  outlineProgram = null;
129
133
  ssaoProgram = null;
130
134
  ssrProgram = null;
131
135
  depthOfFieldProgram = null;
132
136
  motionBlurProgram = null;
133
137
  motionBlurVelocityTexture = null;
138
+ motionBlurVelocitySize = null;
134
139
  taaProgram = null;
135
140
  taaHistoryTexture = null;
141
+ taaHistorySize = null;
136
142
  bloomPingPongResources = null;
137
143
  bloomBrightLutTexture = null;
138
144
  bloomBrightLutThreshold = null;
139
145
  bloomCompositeLutTexture = null;
140
146
  bloomCompositeLutIntensity = null;
147
+ bloomCompositeLutShoulder = null;
148
+ lastBloomDiagnostics = null;
141
149
  outlineBlendLutTexture = null;
142
150
  outlineBlendLutKey = null;
143
151
  depthReadbackProgram = null;
@@ -645,6 +653,10 @@ export class WebGL2Device {
645
653
  pass: depthOfFieldPass ? "depth-of-field" : ssaoPass ? "ssao" : "ssr"
646
654
  });
647
655
  }
656
+ // Raw GL depth is nonlinear (0.1/1000 defaults park the play area past
657
+ // 0.97), which blinded every depth-gated native pass. SSR and DOF compare
658
+ // linearized depth; SSAO keeps its legacy response (documented partial).
659
+ const depthRange = normalizeLdrDepthRange(options.depthRange);
648
660
  const outputTarget = options.outputTarget;
649
661
  if (outputTarget && (!(outputTarget instanceof WebGL2RenderTarget) || !this.renderTargets.has(outputTarget) || outputTarget.disposed)) {
650
662
  throw new RenderDeviceError("Output render target is not a live WebGL2 resource owned by this device", "INVALID_RESOURCE", {
@@ -702,8 +714,43 @@ export class WebGL2Device {
702
714
  let ldrSourceHandle = source.colorHandle;
703
715
  let temporarySourceIndex = -1;
704
716
  if (bloomOptions && bloomResources) {
705
- ldrSourceHandle = this.executeNativeBloomPasses(ldrSourceHandle, bloomResources, bloomOptions, vertexArray, sourceIsHdr);
706
- temporarySourceIndex = 1;
717
+ if (bloomOptions.quality === "performance") {
718
+ ldrSourceHandle = this.executeNativeBloomPasses(ldrSourceHandle, bloomResources, bloomOptions, vertexArray, sourceIsHdr);
719
+ temporarySourceIndex = 1;
720
+ this.recordBloomDiagnostics(bloomOptions, source.width, source.height, sourceIsHdr, 1);
721
+ }
722
+ else {
723
+ const plan = resolveBloomPyramidPlan(source.width, source.height, bloomOptions.quality, sourceIsHdr);
724
+ const pyramid = this.ensureBloomPyramidResources(plan, sourceIsHdr);
725
+ const pyramidResult = this.executeNativeBloomPyramidPasses(ldrSourceHandle, source.width, source.height, pyramid, {
726
+ textureA: bloomResources.textures[0],
727
+ framebufferA: bloomResources.framebuffers[0],
728
+ textureB: bloomResources.textures[1],
729
+ framebufferB: bloomResources.framebuffers[1]
730
+ }, bloomOptions, vertexArray, sourceIsHdr);
731
+ // The pyramid sum lands in ping-pong texture A; composite it with the
732
+ // source through the proven single-scale composite program.
733
+ this.gl.bindFramebuffer(this.gl.FRAMEBUFFER, bloomResources.framebuffers[1]);
734
+ this.gl.viewport(0, 0, source.width, source.height);
735
+ const pyramidComposite = this.ensureBloomCompositeProgram();
736
+ this.gl.useProgram(pyramidComposite);
737
+ this.gl.bindVertexArray(vertexArray);
738
+ this.bindFullscreenTexture(0, ldrSourceHandle);
739
+ this.bindFullscreenTexture(1, pyramidResult);
740
+ if (this.bloomCompositeLutTexture)
741
+ this.bindFullscreenTexture(2, this.bloomCompositeLutTexture);
742
+ this.gl.uniform1i(this.gl.getUniformLocation(pyramidComposite, "u_source"), 0);
743
+ this.gl.uniform1i(this.gl.getUniformLocation(pyramidComposite, "u_blurred"), 1);
744
+ this.gl.uniform1i(this.gl.getUniformLocation(pyramidComposite, "u_compositeLut"), 2);
745
+ this.gl.uniform1i(this.gl.getUniformLocation(pyramidComposite, "u_hdr"), sourceIsHdr ? 1 : 0);
746
+ this.gl.uniform1f(this.gl.getUniformLocation(pyramidComposite, "u_intensity"), bloomOptions.intensity);
747
+ this.gl.drawArrays(this.gl.TRIANGLES, 0, 3);
748
+ ldrSourceHandle = bloomResources.textures[1];
749
+ // The composited result lives in texture B, so subsequent passes
750
+ // must write texture A (index 0) to avoid sampling a bound target.
751
+ temporarySourceIndex = 0;
752
+ this.recordBloomDiagnostics(bloomOptions, source.width, source.height, sourceIsHdr, plan.mipCount);
753
+ }
707
754
  }
708
755
  if ((depthOfFieldOptions || motionBlurOptions || ssaoOptions || ssrOptions || taaOptions || outlineOptions) && bloomResources) {
709
756
  if (tonePass || colorPass) {
@@ -714,7 +761,7 @@ export class WebGL2Device {
714
761
  }
715
762
  if (depthOfFieldOptions && source.depthTextureHandle) {
716
763
  const depthOfFieldTargetIndex = temporarySourceIndex === 0 ? 1 : 0;
717
- ldrSourceHandle = this.executeNativeDepthOfFieldPass(ldrSourceHandle, source.depthTextureHandle, bloomResources, depthOfFieldOptions, vertexArray, depthOfFieldTargetIndex);
764
+ ldrSourceHandle = this.executeNativeDepthOfFieldPass(ldrSourceHandle, source.depthTextureHandle, bloomResources, depthOfFieldOptions, vertexArray, depthOfFieldTargetIndex, depthRange);
718
765
  temporarySourceIndex = depthOfFieldTargetIndex;
719
766
  }
720
767
  if (motionBlurOptions) {
@@ -729,7 +776,7 @@ export class WebGL2Device {
729
776
  }
730
777
  if (ssrOptions && source.depthTextureHandle) {
731
778
  const ssrTargetIndex = temporarySourceIndex === 0 ? 1 : 0;
732
- ldrSourceHandle = this.executeNativeSsrPass(ldrSourceHandle, source.depthTextureHandle, bloomResources, ssrOptions, vertexArray, ssrTargetIndex);
779
+ ldrSourceHandle = this.executeNativeSsrPass(ldrSourceHandle, source.depthTextureHandle, bloomResources, ssrOptions, vertexArray, ssrTargetIndex, depthRange);
733
780
  temporarySourceIndex = ssrTargetIndex;
734
781
  }
735
782
  if (taaOptions) {
@@ -1023,6 +1070,7 @@ export class WebGL2Device {
1023
1070
  const stateCacheStats = this.stateCache.stats();
1024
1071
  const bufferBytes = [...this.buffers].filter((buffer) => !buffer.disposed).reduce((total, buffer) => total + buffer.byteLength, 0);
1025
1072
  const textureBytes = liveTextureList.reduce((total, texture) => total + texture.byteLength, 0);
1073
+ const gpuTargetEntries = this.describeGpuTargetInventory(liveRenderTargets);
1026
1074
  return {
1027
1075
  drawCalls: this.drawCalls,
1028
1076
  buffers: [...this.buffers].filter((buffer) => !buffer.disposed).length,
@@ -1041,6 +1089,7 @@ export class WebGL2Device {
1041
1089
  nativeShadowMapBindings: this.nativeShadowMapBindings,
1042
1090
  shadowRenderTargetsAllocated: this.shadowRenderTargetsAllocated,
1043
1091
  nativeInstancedSubmissions: this.nativeInstancedSubmissions,
1092
+ bloom: this.lastBloomDiagnostics,
1044
1093
  samplerAnisotropyUploads: this.samplerAnisotropyUploadCount,
1045
1094
  maxTextureAnisotropy: this.maxTextureAnisotropy,
1046
1095
  stateCacheIssued: stateCacheStats.issued,
@@ -1054,6 +1103,7 @@ export class WebGL2Device {
1054
1103
  disposedShaders: [...this.shaders].filter((shader) => shader.disposed).length,
1055
1104
  disposedRenderTargets: [...this.renderTargets].filter((target) => target.disposed).length,
1056
1105
  disposedTextures: [...this.renderTargets].filter((target) => target.colorTexture.disposed).length + this.releasedTextureHandles,
1106
+ ...spreadGpuTargetInventory(gpuTargetEntries),
1057
1107
  lastError: this.lastError,
1058
1108
  contextLost: this.contextLost
1059
1109
  };
@@ -1116,6 +1166,14 @@ export class WebGL2Device {
1116
1166
  this.gl.deleteProgram(this.bloomCompositeProgram);
1117
1167
  this.bloomCompositeProgram = null;
1118
1168
  }
1169
+ if (this.bloomDownsampleProgram) {
1170
+ this.gl.deleteProgram(this.bloomDownsampleProgram);
1171
+ this.bloomDownsampleProgram = null;
1172
+ }
1173
+ if (this.bloomAccumulateProgram) {
1174
+ this.gl.deleteProgram(this.bloomAccumulateProgram);
1175
+ this.bloomAccumulateProgram = null;
1176
+ }
1119
1177
  if (this.outlineProgram) {
1120
1178
  this.gl.deleteProgram(this.outlineProgram);
1121
1179
  this.outlineProgram = null;
@@ -1139,6 +1197,7 @@ export class WebGL2Device {
1139
1197
  if (this.motionBlurVelocityTexture) {
1140
1198
  this.gl.deleteTexture(this.motionBlurVelocityTexture);
1141
1199
  this.motionBlurVelocityTexture = null;
1200
+ this.motionBlurVelocitySize = null;
1142
1201
  }
1143
1202
  if (this.taaProgram) {
1144
1203
  this.gl.deleteProgram(this.taaProgram);
@@ -1147,8 +1206,10 @@ export class WebGL2Device {
1147
1206
  if (this.taaHistoryTexture) {
1148
1207
  this.gl.deleteTexture(this.taaHistoryTexture);
1149
1208
  this.taaHistoryTexture = null;
1209
+ this.taaHistorySize = null;
1150
1210
  }
1151
1211
  this.disposeBloomPingPongResources();
1212
+ this.disposeBloomPyramidResources();
1152
1213
  if (this.bloomBrightLutTexture) {
1153
1214
  this.gl.deleteTexture(this.bloomBrightLutTexture);
1154
1215
  this.bloomBrightLutTexture = null;
@@ -1158,6 +1219,7 @@ export class WebGL2Device {
1158
1219
  this.gl.deleteTexture(this.bloomCompositeLutTexture);
1159
1220
  this.bloomCompositeLutTexture = null;
1160
1221
  this.bloomCompositeLutIntensity = null;
1222
+ this.bloomCompositeLutShoulder = null;
1161
1223
  }
1162
1224
  if (this.outlineBlendLutTexture) {
1163
1225
  this.gl.deleteTexture(this.outlineBlendLutTexture);
@@ -1283,6 +1345,7 @@ export class WebGL2Device {
1283
1345
  return current;
1284
1346
  }
1285
1347
  this.disposeBloomPingPongResources();
1348
+ this.disposeBloomPyramidResources();
1286
1349
  const textureUnit0 = this.captureTextureUnit0();
1287
1350
  const previousFramebuffer = this.gl.getParameter(this.gl.FRAMEBUFFER_BINDING);
1288
1351
  const textures = [];
@@ -1347,7 +1410,8 @@ export class WebGL2Device {
1347
1410
  }
1348
1411
  ensureBloomLutTextures(options) {
1349
1412
  const updateBright = this.bloomBrightLutThreshold !== options.threshold;
1350
- const updateComposite = this.bloomCompositeLutIntensity !== options.intensity;
1413
+ const updateComposite = this.bloomCompositeLutIntensity !== options.intensity ||
1414
+ this.bloomCompositeLutShoulder !== options.shoulder;
1351
1415
  if (this.bloomBrightLutTexture && this.bloomCompositeLutTexture && !updateBright && !updateComposite) {
1352
1416
  return;
1353
1417
  }
@@ -1366,10 +1430,11 @@ export class WebGL2Device {
1366
1430
  this.bloomCompositeLutTexture = this.createNativeBloomDataTexture();
1367
1431
  }
1368
1432
  if (updateComposite) {
1369
- const pixels = createBloomCompositeLut(options.intensity);
1433
+ const pixels = createBloomCompositeLut(options.intensity, { shoulder: options.shoulder });
1370
1434
  this.gl.bindTexture(this.gl.TEXTURE_2D, this.bloomCompositeLutTexture);
1371
1435
  this.gl.texImage2D(this.gl.TEXTURE_2D, 0, this.gl.RGBA8, BLOOM_COMPOSITE_LUT_SIZE, BLOOM_COMPOSITE_LUT_SIZE, 0, this.gl.RGBA, this.gl.UNSIGNED_BYTE, pixels);
1372
1436
  this.bloomCompositeLutIntensity = options.intensity;
1437
+ this.bloomCompositeLutShoulder = options.shoulder;
1373
1438
  }
1374
1439
  }
1375
1440
  finally {
@@ -1414,6 +1479,7 @@ export class WebGL2Device {
1414
1479
  if (!this.motionBlurVelocityTexture) {
1415
1480
  this.motionBlurVelocityTexture = this.createNativeBloomDataTexture();
1416
1481
  }
1482
+ this.motionBlurVelocitySize = { width, height };
1417
1483
  this.gl.bindTexture(this.gl.TEXTURE_2D, this.motionBlurVelocityTexture);
1418
1484
  this.gl.texImage2D(this.gl.TEXTURE_2D, 0, this.gl.RG32F, width, height, 0, this.gl.RG, this.gl.FLOAT, velocity);
1419
1485
  }
@@ -1428,6 +1494,7 @@ export class WebGL2Device {
1428
1494
  if (!this.taaHistoryTexture) {
1429
1495
  this.taaHistoryTexture = this.createNativeBloomDataTexture();
1430
1496
  }
1497
+ this.taaHistorySize = { width, height };
1431
1498
  this.gl.bindTexture(this.gl.TEXTURE_2D, this.taaHistoryTexture);
1432
1499
  this.gl.texImage2D(this.gl.TEXTURE_2D, 0, this.gl.RGBA8, width, height, 0, this.gl.RGBA, this.gl.UNSIGNED_BYTE, history);
1433
1500
  }
@@ -1487,6 +1554,7 @@ export class WebGL2Device {
1487
1554
  this.gl.uniform1i(this.gl.getUniformLocation(brightProgram, "u_brightLut"), 1);
1488
1555
  this.gl.uniform1i(this.gl.getUniformLocation(brightProgram, "u_hdr"), hdr ? 1 : 0);
1489
1556
  this.gl.uniform1f(this.gl.getUniformLocation(brightProgram, "u_threshold"), options.threshold);
1557
+ this.gl.uniform1f(this.gl.getUniformLocation(brightProgram, "u_softKnee"), options.softKnee);
1490
1558
  this.gl.drawArrays(this.gl.TRIANGLES, 0, 3);
1491
1559
  const blurProgram = this.ensureBloomBlurProgram();
1492
1560
  this.gl.bindFramebuffer(this.gl.FRAMEBUFFER, framebufferB);
@@ -1517,6 +1585,140 @@ export class WebGL2Device {
1517
1585
  this.gl.drawArrays(this.gl.TRIANGLES, 0, 3);
1518
1586
  return textureB;
1519
1587
  }
1588
+ /**
1589
+ * Balanced/cinematic bloom: bright-extract once, then a half-resolution mip
1590
+ * chain where every level is downsampled, separably blurred, and accumulated
1591
+ * with its energy-preserving weight. Returns a full-resolution bloom texture
1592
+ * holding the weighted sum, ready for the existing composite program.
1593
+ */
1594
+ executeNativeBloomPyramidPasses(sourceTexture, sourceWidth, sourceHeight, resources, fullResStaging, options, vertexArray, hdr) {
1595
+ const plan = resources.plan;
1596
+ const mipCount = plan.mips.length;
1597
+ const downsampleProgram = this.ensureBloomDownsampleProgram();
1598
+ const brightProgram = this.ensureBloomBrightExtractProgram();
1599
+ const blurProgram = this.ensureBloomBlurProgram();
1600
+ const accumulateProgram = this.ensureBloomAccumulateProgram();
1601
+ const brightLut = this.bloomBrightLutTexture;
1602
+ const mipTexture = (level, slot) => resources.textures[level * 2 + slot];
1603
+ const mipFramebuffer = (level, slot) => resources.framebuffers[level * 2 + slot];
1604
+ const mipSize = (level) => plan.mips[level];
1605
+ // Blurred result settles in slot 1 for level 0, slot 0 for levels >= 1.
1606
+ const blurredSlot = (level) => (level === 0 ? 1 : 0);
1607
+ const drawDownsample = (fromTexture, fromWidth, fromHeight, toFramebuffer, toWidth, toHeight) => {
1608
+ this.gl.bindFramebuffer(this.gl.FRAMEBUFFER, toFramebuffer);
1609
+ this.gl.viewport(0, 0, toWidth, toHeight);
1610
+ this.gl.useProgram(downsampleProgram);
1611
+ this.gl.bindVertexArray(vertexArray);
1612
+ this.bindFullscreenTexture(0, fromTexture);
1613
+ this.gl.uniform1i(this.gl.getUniformLocation(downsampleProgram, "u_source"), 0);
1614
+ this.gl.uniform2f(this.gl.getUniformLocation(downsampleProgram, "u_texelSize"), 1 / fromWidth, 1 / fromHeight);
1615
+ this.gl.drawArrays(this.gl.TRIANGLES, 0, 3);
1616
+ };
1617
+ const drawBrightExtract = (fromTexture, toFramebuffer, size) => {
1618
+ this.gl.bindFramebuffer(this.gl.FRAMEBUFFER, toFramebuffer);
1619
+ this.gl.viewport(0, 0, size.width, size.height);
1620
+ this.gl.useProgram(brightProgram);
1621
+ this.gl.bindVertexArray(vertexArray);
1622
+ this.bindFullscreenTexture(0, fromTexture);
1623
+ if (brightLut)
1624
+ this.bindFullscreenTexture(1, brightLut);
1625
+ this.gl.uniform1i(this.gl.getUniformLocation(brightProgram, "u_source"), 0);
1626
+ this.gl.uniform1i(this.gl.getUniformLocation(brightProgram, "u_brightLut"), 1);
1627
+ this.gl.uniform1i(this.gl.getUniformLocation(brightProgram, "u_hdr"), hdr ? 1 : 0);
1628
+ this.gl.uniform1f(this.gl.getUniformLocation(brightProgram, "u_threshold"), options.threshold);
1629
+ this.gl.uniform1f(this.gl.getUniformLocation(brightProgram, "u_softKnee"), options.softKnee);
1630
+ this.gl.drawArrays(this.gl.TRIANGLES, 0, 3);
1631
+ };
1632
+ const drawSeparableBlur = (readTexture, tmpTexture, tmpFramebuffer, outFramebuffer, size) => {
1633
+ // Horizontal into the temp target, vertical back into the output target.
1634
+ this.gl.bindFramebuffer(this.gl.FRAMEBUFFER, tmpFramebuffer);
1635
+ this.gl.viewport(0, 0, size.width, size.height);
1636
+ this.gl.useProgram(blurProgram);
1637
+ this.gl.bindVertexArray(vertexArray);
1638
+ this.bindFullscreenTexture(0, readTexture);
1639
+ this.gl.uniform1i(this.gl.getUniformLocation(blurProgram, "u_source"), 0);
1640
+ this.gl.uniform2i(this.gl.getUniformLocation(blurProgram, "u_size"), size.width, size.height);
1641
+ this.gl.uniform1i(this.gl.getUniformLocation(blurProgram, "u_radius"), options.radius);
1642
+ this.gl.uniform1i(this.gl.getUniformLocation(blurProgram, "u_horizontal"), 1);
1643
+ this.gl.uniform1i(this.gl.getUniformLocation(blurProgram, "u_hdr"), hdr ? 1 : 0);
1644
+ this.gl.drawArrays(this.gl.TRIANGLES, 0, 3);
1645
+ this.gl.bindFramebuffer(this.gl.FRAMEBUFFER, outFramebuffer);
1646
+ this.bindFullscreenTexture(0, tmpTexture);
1647
+ this.gl.uniform1i(this.gl.getUniformLocation(blurProgram, "u_horizontal"), 0);
1648
+ this.gl.drawArrays(this.gl.TRIANGLES, 0, 3);
1649
+ };
1650
+ // Level 0: downsample, bright-extract into slot 1, blur H into slot 0 and
1651
+ // V back into slot 1. Blurred result settles in slot 1.
1652
+ const level0 = mipSize(0);
1653
+ drawDownsample(sourceTexture, sourceWidth, sourceHeight, mipFramebuffer(0, 0), level0.width, level0.height);
1654
+ drawBrightExtract(mipTexture(0, 0), mipFramebuffer(0, 1), level0);
1655
+ drawSeparableBlur(mipTexture(0, 1), mipTexture(0, 0), mipFramebuffer(0, 0), mipFramebuffer(0, 1), level0);
1656
+ for (let level = 1; level < mipCount; level += 1) {
1657
+ const size = mipSize(level);
1658
+ const previous = mipSize(level - 1);
1659
+ drawDownsample(mipTexture(level - 1, blurredSlot(level - 1)), previous.width, previous.height, mipFramebuffer(level, 0), size.width, size.height);
1660
+ // H into slot 1, V back into slot 0: blurred result settles in slot 0.
1661
+ drawSeparableBlur(mipTexture(level, 0), mipTexture(level, 1), mipFramebuffer(level, 1), mipFramebuffer(level, 0), size);
1662
+ }
1663
+ // Accumulate smallest-to-largest, ping-ponging between the two
1664
+ // accumulators (a pass must never sample its own bound target).
1665
+ const weights = plan.weights;
1666
+ let readAccumulator = { texture: resources.accumulatorTextureA, framebuffer: resources.accumulatorFramebufferA };
1667
+ let writeAccumulator = { texture: resources.accumulatorTextureB, framebuffer: resources.accumulatorFramebufferB };
1668
+ // Clear both accumulators; the seed reads the cleared sibling, never the
1669
+ // bound target (feedback loop).
1670
+ for (const acc of [readAccumulator, writeAccumulator]) {
1671
+ this.gl.bindFramebuffer(this.gl.FRAMEBUFFER, acc.framebuffer);
1672
+ this.gl.viewport(0, 0, level0.width, level0.height);
1673
+ this.gl.clearColor(0, 0, 0, 0);
1674
+ this.gl.clear(this.gl.COLOR_BUFFER_BIT);
1675
+ }
1676
+ // Seed: smallest mip onto the cleared sibling accumulator.
1677
+ this.gl.bindFramebuffer(this.gl.FRAMEBUFFER, writeAccumulator.framebuffer);
1678
+ this.gl.viewport(0, 0, level0.width, level0.height);
1679
+ this.gl.useProgram(accumulateProgram);
1680
+ this.gl.bindVertexArray(vertexArray);
1681
+ this.bindFullscreenTexture(0, readAccumulator.texture);
1682
+ this.bindFullscreenTexture(1, mipTexture(mipCount - 1, blurredSlot(mipCount - 1)));
1683
+ this.gl.uniform1i(this.gl.getUniformLocation(accumulateProgram, "u_base"), 0);
1684
+ this.gl.uniform1i(this.gl.getUniformLocation(accumulateProgram, "u_bloom"), 1);
1685
+ this.gl.uniform1f(this.gl.getUniformLocation(accumulateProgram, "u_weight"), weights[mipCount - 1]);
1686
+ this.gl.drawArrays(this.gl.TRIANGLES, 0, 3);
1687
+ for (let level = mipCount - 2; level >= 0; level -= 1) {
1688
+ const nextRead = writeAccumulator;
1689
+ const nextWrite = readAccumulator;
1690
+ readAccumulator = nextRead;
1691
+ writeAccumulator = nextWrite;
1692
+ this.gl.bindFramebuffer(this.gl.FRAMEBUFFER, writeAccumulator.framebuffer);
1693
+ this.gl.viewport(0, 0, level0.width, level0.height);
1694
+ this.gl.useProgram(accumulateProgram);
1695
+ this.gl.bindVertexArray(vertexArray);
1696
+ this.bindFullscreenTexture(0, readAccumulator.texture);
1697
+ this.bindFullscreenTexture(1, mipTexture(level, blurredSlot(level)));
1698
+ this.gl.uniform1i(this.gl.getUniformLocation(accumulateProgram, "u_base"), 0);
1699
+ this.gl.uniform1i(this.gl.getUniformLocation(accumulateProgram, "u_bloom"), 1);
1700
+ this.gl.uniform1f(this.gl.getUniformLocation(accumulateProgram, "u_weight"), weights[level]);
1701
+ this.gl.drawArrays(this.gl.TRIANGLES, 0, 3);
1702
+ }
1703
+ // Upsample the weighted sum onto full-resolution staging target A, using
1704
+ // the cleared staging target B as the zero base (never sample A while
1705
+ // rendering into it).
1706
+ this.gl.bindFramebuffer(this.gl.FRAMEBUFFER, fullResStaging.framebufferB);
1707
+ this.gl.viewport(0, 0, sourceWidth, sourceHeight);
1708
+ this.gl.clearColor(0, 0, 0, 0);
1709
+ this.gl.clear(this.gl.COLOR_BUFFER_BIT);
1710
+ this.gl.bindFramebuffer(this.gl.FRAMEBUFFER, fullResStaging.framebufferA);
1711
+ this.gl.viewport(0, 0, sourceWidth, sourceHeight);
1712
+ this.gl.useProgram(accumulateProgram);
1713
+ this.gl.bindVertexArray(vertexArray);
1714
+ this.bindFullscreenTexture(0, fullResStaging.textureB);
1715
+ this.bindFullscreenTexture(1, writeAccumulator.texture);
1716
+ this.gl.uniform1i(this.gl.getUniformLocation(accumulateProgram, "u_base"), 0);
1717
+ this.gl.uniform1i(this.gl.getUniformLocation(accumulateProgram, "u_bloom"), 1);
1718
+ this.gl.uniform1f(this.gl.getUniformLocation(accumulateProgram, "u_weight"), 1);
1719
+ this.gl.drawArrays(this.gl.TRIANGLES, 0, 3);
1720
+ return fullResStaging.textureA;
1721
+ }
1520
1722
  executeNativeOutlinePasses(sourceTexture, resources, options, vertexArray, targetIndex) {
1521
1723
  const blendLut = this.outlineBlendLutTexture;
1522
1724
  if (!blendLut) {
@@ -1559,7 +1761,7 @@ export class WebGL2Device {
1559
1761
  this.gl.drawArrays(this.gl.TRIANGLES, 0, 3);
1560
1762
  return targetTexture;
1561
1763
  }
1562
- executeNativeSsrPass(sourceTexture, depthTexture, resources, options, vertexArray, targetIndex) {
1764
+ executeNativeSsrPass(sourceTexture, depthTexture, resources, options, vertexArray, targetIndex, depthRange) {
1563
1765
  const program = this.ensureSsrProgram();
1564
1766
  const targetTexture = resources.textures[targetIndex];
1565
1767
  this.gl.bindFramebuffer(this.gl.FRAMEBUFFER, resources.framebuffers[targetIndex]);
@@ -1573,10 +1775,12 @@ export class WebGL2Device {
1573
1775
  this.gl.uniform2i(this.gl.getUniformLocation(program, "u_size"), resources.width, resources.height);
1574
1776
  this.gl.uniform1f(this.gl.getUniformLocation(program, "u_intensity"), options.intensity);
1575
1777
  this.gl.uniform1i(this.gl.getUniformLocation(program, "u_maxDistance"), options.maxDistance);
1778
+ this.gl.uniform1f(this.gl.getUniformLocation(program, "u_depthNear"), depthRange.near);
1779
+ this.gl.uniform1f(this.gl.getUniformLocation(program, "u_depthFar"), depthRange.far);
1576
1780
  this.gl.drawArrays(this.gl.TRIANGLES, 0, 3);
1577
1781
  return targetTexture;
1578
1782
  }
1579
- executeNativeDepthOfFieldPass(sourceTexture, depthTexture, resources, options, vertexArray, targetIndex) {
1783
+ executeNativeDepthOfFieldPass(sourceTexture, depthTexture, resources, options, vertexArray, targetIndex, depthRange) {
1580
1784
  const program = this.ensureDepthOfFieldProgram();
1581
1785
  const targetTexture = resources.textures[targetIndex];
1582
1786
  this.gl.bindFramebuffer(this.gl.FRAMEBUFFER, resources.framebuffers[targetIndex]);
@@ -1591,6 +1795,8 @@ export class WebGL2Device {
1591
1795
  this.gl.uniform1f(this.gl.getUniformLocation(program, "u_focusDepth"), options.focusDepth);
1592
1796
  this.gl.uniform1f(this.gl.getUniformLocation(program, "u_focusRange"), options.focusRange);
1593
1797
  this.gl.uniform1i(this.gl.getUniformLocation(program, "u_maxRadius"), options.maxRadius);
1798
+ this.gl.uniform1f(this.gl.getUniformLocation(program, "u_depthNear"), depthRange.near);
1799
+ this.gl.uniform1f(this.gl.getUniformLocation(program, "u_depthFar"), depthRange.far);
1594
1800
  this.gl.drawArrays(this.gl.TRIANGLES, 0, 3);
1595
1801
  return targetTexture;
1596
1802
  }
@@ -1648,6 +1854,223 @@ export class WebGL2Device {
1648
1854
  this.gl.deleteFramebuffer(framebuffer);
1649
1855
  this.bloomPingPongResources = null;
1650
1856
  }
1857
+ /**
1858
+ * Diagnostics for the most recent native bloom execution (muse3jsparity-PRD
1859
+ * A1). Null when no native bloom pass has run yet on this device.
1860
+ */
1861
+ getBloomDiagnostics() {
1862
+ return this.lastBloomDiagnostics;
1863
+ }
1864
+ recordBloomDiagnostics(options, sourceWidth, sourceHeight, hdr, mipCount) {
1865
+ const plan = resolveBloomPyramidPlan(sourceWidth, sourceHeight, options.quality, hdr);
1866
+ const pingPongBytes = sourceWidth * sourceHeight * 4 * (hdr ? 2 : 1) * 2;
1867
+ const bytesPerChannel = plan.halfFloat ? 2 : 1;
1868
+ const level0 = plan.mips[0];
1869
+ const accumulatorBytes = level0.width * level0.height * 4 * bytesPerChannel;
1870
+ this.lastBloomDiagnostics = {
1871
+ quality: options.quality,
1872
+ mipCount,
1873
+ targetCount: options.quality === "performance" ? 2 : plan.mips.length * 2 + 1,
1874
+ targetBytes: (options.quality === "performance" ? pingPongBytes : plan.targetBytes + accumulatorBytes + pingPongBytes),
1875
+ compositeGain: options.intensity,
1876
+ threshold: options.threshold,
1877
+ intensity: options.intensity,
1878
+ softKnee: options.softKnee,
1879
+ shoulder: options.shoulder,
1880
+ halfFloat: hdr || plan.halfFloat,
1881
+ };
1882
+ }
1883
+ /**
1884
+ * PART U: every live GPU allocation with bytes + lane owner — registry
1885
+ * render targets (B1 shadow maps arrive labeled, B4 captures arrive as
1886
+ * `-mirror-target`/`-scene-color-target`) plus the raw-handle residents the
1887
+ * registry set cannot see: the A1 bloom pyramid (two targets per mip plus
1888
+ * two level-0 accumulators), the legacy bloom ping-pong pair, the A1/A3
1889
+ * lookup textures, and the motion-blur/taa history textures. The
1890
+ * depth-readback scratch pair is intentionally absent: it is allocated and
1891
+ * deleted inside one synchronous call, so it is never live at a diagnostics
1892
+ * boundary. A5 volumetric light, C4 decals, and the G1 SDF atlas own no GPU
1893
+ * target (forward uniforms + CPU kernel, CPU geometry, CPU atlas data), so
1894
+ * no entry is emitted for them; a target appearing under their owner would
1895
+ * be the signal that the lane grew one.
1896
+ */
1897
+ describeGpuTargetInventory(liveRenderTargets) {
1898
+ const entries = liveRenderTargets.map((target) => ({
1899
+ label: target.label,
1900
+ kind: "render-target",
1901
+ bytes: target.colorTexture.byteLength + (target.depthTexture?.byteLength ?? 0),
1902
+ owner: resolveGpuTargetOwner(target.label)
1903
+ }));
1904
+ const pyramid = this.bloomPyramidResources;
1905
+ if (pyramid) {
1906
+ const bytesPerPixel = pyramid.hdr ? 8 : 4;
1907
+ pyramid.plan.mips.forEach((mip, index) => {
1908
+ for (const side of ["a", "b"]) {
1909
+ entries.push({
1910
+ label: `bloom-pyramid-mip${index}${side}`,
1911
+ kind: "pyramid-mip",
1912
+ bytes: mip.width * mip.height * bytesPerPixel,
1913
+ owner: "a1-bloom"
1914
+ });
1915
+ }
1916
+ });
1917
+ const level0 = pyramid.plan.mips[0];
1918
+ if (level0) {
1919
+ for (const side of ["a", "b"]) {
1920
+ entries.push({
1921
+ label: `bloom-pyramid-accumulator-${side}`,
1922
+ kind: "pyramid-accumulator",
1923
+ bytes: level0.width * level0.height * bytesPerPixel,
1924
+ owner: "a1-bloom"
1925
+ });
1926
+ }
1927
+ }
1928
+ }
1929
+ const pingPong = this.bloomPingPongResources;
1930
+ if (pingPong) {
1931
+ const bytesPerPixel = pingPong.hdr ? 8 : 4;
1932
+ for (const side of ["a", "b"]) {
1933
+ entries.push({
1934
+ label: `bloom-ping-pong-${side}`,
1935
+ kind: "ping-pong",
1936
+ bytes: pingPong.width * pingPong.height * bytesPerPixel,
1937
+ owner: "a1-bloom"
1938
+ });
1939
+ }
1940
+ }
1941
+ if (this.bloomBrightLutTexture) {
1942
+ entries.push({
1943
+ label: "bloom-bright-lut",
1944
+ kind: "lut",
1945
+ bytes: BLOOM_BRIGHT_LUT_WIDTH * BLOOM_BRIGHT_LUT_HEIGHT * 4,
1946
+ owner: "a1-bloom"
1947
+ });
1948
+ }
1949
+ if (this.bloomCompositeLutTexture) {
1950
+ entries.push({
1951
+ label: "bloom-composite-lut",
1952
+ kind: "lut",
1953
+ bytes: BLOOM_COMPOSITE_LUT_SIZE * BLOOM_COMPOSITE_LUT_SIZE * 4,
1954
+ owner: "a1-bloom"
1955
+ });
1956
+ }
1957
+ if (this.outlineBlendLutTexture) {
1958
+ entries.push({ label: "outline-blend-lut", kind: "lut", bytes: OUTLINE_BLEND_LUT_WIDTH * 4, owner: "post" });
1959
+ }
1960
+ if (this.motionBlurVelocityTexture && this.motionBlurVelocitySize) {
1961
+ entries.push({
1962
+ label: "motion-blur-velocity",
1963
+ kind: "history",
1964
+ bytes: this.motionBlurVelocitySize.width * this.motionBlurVelocitySize.height * 8,
1965
+ owner: "post"
1966
+ });
1967
+ }
1968
+ if (this.taaHistoryTexture && this.taaHistorySize) {
1969
+ entries.push({
1970
+ label: "taa-history",
1971
+ kind: "history",
1972
+ bytes: this.taaHistorySize.width * this.taaHistorySize.height * 4,
1973
+ owner: "post"
1974
+ });
1975
+ }
1976
+ return entries;
1977
+ }
1978
+ disposeBloomPyramidResources() {
1979
+ if (!this.bloomPyramidResources)
1980
+ return;
1981
+ for (const texture of this.bloomPyramidResources.textures)
1982
+ this.gl.deleteTexture(texture);
1983
+ for (const framebuffer of this.bloomPyramidResources.framebuffers)
1984
+ this.gl.deleteFramebuffer(framebuffer);
1985
+ this.gl.deleteTexture(this.bloomPyramidResources.accumulatorTextureA);
1986
+ this.gl.deleteFramebuffer(this.bloomPyramidResources.accumulatorFramebufferA);
1987
+ this.gl.deleteTexture(this.bloomPyramidResources.accumulatorTextureB);
1988
+ this.gl.deleteFramebuffer(this.bloomPyramidResources.accumulatorFramebufferB);
1989
+ this.bloomPyramidResources = null;
1990
+ }
1991
+ /**
1992
+ * Mip-chain targets for the balanced/cinematic bloom pyramid. Each level is a
1993
+ * single texture+framebuffer at the planned size with linear filtering so the
1994
+ * downsample and accumulate passes can sample across levels. Half-float backs
1995
+ * the chain when the source is HDR or the cinematic preset requests it.
1996
+ */
1997
+ ensureBloomPyramidResources(plan, hdr) {
1998
+ const current = this.bloomPyramidResources;
1999
+ if (current && current.plan.quality === plan.quality && current.hdr === (hdr || plan.halfFloat) &&
2000
+ current.plan.mips.length === plan.mips.length &&
2001
+ current.plan.mips.every((mip, index) => mip.width === plan.mips[index].width && mip.height === plan.mips[index].height)) {
2002
+ return current;
2003
+ }
2004
+ this.disposeBloomPyramidResources();
2005
+ const textureUnit0 = this.captureTextureUnit0();
2006
+ const previousFramebuffer = this.gl.getParameter(this.gl.FRAMEBUFFER_BINDING);
2007
+ const textures = [];
2008
+ const framebuffers = [];
2009
+ const useHalfFloat = hdr || plan.halfFloat;
2010
+ const allocateTarget = (width, height, label) => {
2011
+ const texture = this.gl.createTexture();
2012
+ const framebuffer = this.gl.createFramebuffer();
2013
+ if (!texture || !framebuffer) {
2014
+ if (texture)
2015
+ this.gl.deleteTexture(texture);
2016
+ if (framebuffer)
2017
+ this.gl.deleteFramebuffer(framebuffer);
2018
+ throw new RenderDeviceError(`Failed to allocate WebGL2 bloom pyramid ${label}`, "WEBGL_ALLOCATION_FAILED", { width, height });
2019
+ }
2020
+ textures.push(texture);
2021
+ framebuffers.push(framebuffer);
2022
+ this.gl.bindTexture(this.gl.TEXTURE_2D, texture);
2023
+ this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_MIN_FILTER, this.gl.LINEAR);
2024
+ this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_MAG_FILTER, this.gl.LINEAR);
2025
+ this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_WRAP_S, this.gl.CLAMP_TO_EDGE);
2026
+ this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_WRAP_T, this.gl.CLAMP_TO_EDGE);
2027
+ this.gl.texImage2D(this.gl.TEXTURE_2D, 0, useHalfFloat ? this.gl.RGBA16F : this.gl.RGBA8, width, height, 0, this.gl.RGBA, useHalfFloat ? this.gl.HALF_FLOAT : this.gl.UNSIGNED_BYTE, null);
2028
+ this.gl.bindFramebuffer(this.gl.FRAMEBUFFER, framebuffer);
2029
+ this.gl.framebufferTexture2D(this.gl.FRAMEBUFFER, this.gl.COLOR_ATTACHMENT0, this.gl.TEXTURE_2D, texture, 0);
2030
+ const status = this.gl.checkFramebufferStatus(this.gl.FRAMEBUFFER);
2031
+ if (status !== this.gl.FRAMEBUFFER_COMPLETE) {
2032
+ throw new RenderDeviceError("WebGL2 bloom pyramid framebuffer status is invalid", "FRAMEBUFFER_INVALID", { width, height, status });
2033
+ }
2034
+ return { texture, framebuffer };
2035
+ };
2036
+ try {
2037
+ // Two ping-pong targets per mip (separable blur needs distinct read/write
2038
+ // targets at the same size), plus two level-0-sized accumulators: the
2039
+ // weighted sum ping-pongs between them so no pass ever samples the
2040
+ // texture of its own bound framebuffer (feedback loop).
2041
+ for (const mip of plan.mips) {
2042
+ allocateTarget(mip.width, mip.height, "mip");
2043
+ allocateTarget(mip.width, mip.height, "mip");
2044
+ }
2045
+ const level0 = plan.mips[0];
2046
+ const accumulatorA = allocateTarget(level0.width, level0.height, "accumulator-a");
2047
+ const accumulatorB = allocateTarget(level0.width, level0.height, "accumulator-b");
2048
+ const finalResources = {
2049
+ plan,
2050
+ hdr: useHalfFloat,
2051
+ textures,
2052
+ framebuffers,
2053
+ accumulatorTextureA: accumulatorA.texture,
2054
+ accumulatorFramebufferA: accumulatorA.framebuffer,
2055
+ accumulatorTextureB: accumulatorB.texture,
2056
+ accumulatorFramebufferB: accumulatorB.framebuffer
2057
+ };
2058
+ this.bloomPyramidResources = finalResources;
2059
+ return finalResources;
2060
+ }
2061
+ catch (error) {
2062
+ for (const texture of textures)
2063
+ this.gl.deleteTexture(texture);
2064
+ for (const framebuffer of framebuffers)
2065
+ this.gl.deleteFramebuffer(framebuffer);
2066
+ throw error;
2067
+ }
2068
+ finally {
2069
+ this.gl.bindFramebuffer(this.gl.FRAMEBUFFER, previousFramebuffer);
2070
+ this.restoreTextureUnit0(textureUnit0);
2071
+ this.stateCache.invalidate();
2072
+ }
2073
+ }
1651
2074
  captureTextureUnit0() {
1652
2075
  const activeTexture = this.gl.getParameter(this.gl.ACTIVE_TEXTURE);
1653
2076
  this.gl.activeTexture(this.gl.TEXTURE0);
@@ -1856,6 +2279,7 @@ uniform sampler2D u_source;
1856
2279
  uniform sampler2D u_brightLut;
1857
2280
  uniform int u_hdr;
1858
2281
  uniform float u_threshold;
2282
+ uniform float u_softKnee;
1859
2283
  out vec4 outColor;
1860
2284
 
1861
2285
  uvec4 byteTexel(sampler2D source, ivec2 coordinate) {
@@ -1867,7 +2291,12 @@ void main() {
1867
2291
  if (u_hdr == 1) {
1868
2292
  vec4 source = texelFetch(u_source, pixel, 0);
1869
2293
  float luma = dot(source.rgb, vec3(0.2126, 0.7152, 0.0722));
1870
- outColor = luma >= u_threshold ? source : vec4(0.0);
2294
+ float kneeLow = max(u_threshold - u_softKnee, 0.0);
2295
+ float kneeHigh = min(u_threshold + u_softKnee, 1.0);
2296
+ float weight = u_softKnee <= 0.0
2297
+ ? (luma >= u_threshold ? 1.0 : 0.0)
2298
+ : smoothstep(kneeLow, kneeHigh, luma);
2299
+ outColor = source * weight;
1871
2300
  return;
1872
2301
  }
1873
2302
  uvec4 source = byteTexel(u_source, pixel);
@@ -1985,6 +2414,43 @@ void main() {
1985
2414
  `, "webgl2-bloom-composite");
1986
2415
  return this.bloomCompositeProgram;
1987
2416
  }
2417
+ ensureBloomDownsampleProgram() {
2418
+ if (this.bloomDownsampleProgram)
2419
+ return this.bloomDownsampleProgram;
2420
+ this.bloomDownsampleProgram = this.createFullscreenProgram(`#version 300 es
2421
+ precision highp float;
2422
+ uniform sampler2D u_source;
2423
+ uniform vec2 u_texelSize;
2424
+ out vec4 outColor;
2425
+ void main() {
2426
+ vec2 uv = (gl_FragCoord.xy - 0.5) * u_texelSize;
2427
+ vec2 e = u_texelSize * 0.5;
2428
+ vec4 sum = texture(u_source, uv - e) + texture(u_source, uv + vec2(e.x, -e.y))
2429
+ + texture(u_source, uv + vec2(-e.x, e.y)) + texture(u_source, uv + e);
2430
+ outColor = sum * 0.25;
2431
+ }
2432
+ `, "webgl2-bloom-downsample");
2433
+ return this.bloomDownsampleProgram;
2434
+ }
2435
+ ensureBloomAccumulateProgram() {
2436
+ if (this.bloomAccumulateProgram)
2437
+ return this.bloomAccumulateProgram;
2438
+ this.bloomAccumulateProgram = this.createFullscreenProgram(`#version 300 es
2439
+ precision highp float;
2440
+ uniform sampler2D u_base;
2441
+ uniform sampler2D u_bloom;
2442
+ uniform float u_weight;
2443
+ out vec4 outColor;
2444
+ void main() {
2445
+ ivec2 pixel = ivec2(gl_FragCoord.xy);
2446
+ vec4 base = texelFetch(u_base, pixel, 0);
2447
+ vec2 uv = (vec2(pixel) + 0.5) / vec2(textureSize(u_base, 0));
2448
+ vec3 bloom = texture(u_bloom, uv).rgb;
2449
+ outColor = vec4(base.rgb + bloom * u_weight, base.a);
2450
+ }
2451
+ `, "webgl2-bloom-accumulate");
2452
+ return this.bloomAccumulateProgram;
2453
+ }
1988
2454
  ensureOutlineProgram() {
1989
2455
  if (this.outlineProgram)
1990
2456
  return this.outlineProgram;
@@ -2127,13 +2593,24 @@ uniform sampler2D u_depth;
2127
2593
  uniform ivec2 u_size;
2128
2594
  uniform float u_intensity;
2129
2595
  uniform int u_maxDistance;
2596
+ uniform float u_depthNear;
2597
+ uniform float u_depthFar;
2130
2598
  out vec4 outColor;
2131
2599
 
2600
+ // Raw GL depth is nonlinear (0.1/1000 defaults park the play area past 0.97),
2601
+ // so every depth-gated comparison below runs on linearized depth. The CPU
2602
+ // byte kernel keeps fixture-unit semantics; the divergence is documented at
2603
+ // normalizeLdrDepthRange.
2604
+ float a3dSsrLinearDepth(float depth) {
2605
+ float viewZ = u_depthNear * u_depthFar / max(u_depthFar - depth * (u_depthFar - u_depthNear), 0.0001);
2606
+ return clamp((viewZ - u_depthNear) / max(u_depthFar - u_depthNear, 0.0001), 0.0, 1.0);
2607
+ }
2608
+
2132
2609
  void main() {
2133
2610
  ivec2 pixel = ivec2(gl_FragCoord.xy);
2134
2611
  vec4 target = texelFetch(u_source, pixel, 0);
2135
- float depth = texelFetch(u_depth, pixel, 0).r;
2136
- int rayDistance = max(1, int(round((1.0 - depth) * float(u_maxDistance))));
2612
+ float linearDepth = a3dSsrLinearDepth(texelFetch(u_depth, pixel, 0).r);
2613
+ int rayDistance = max(1, int(round((1.0 - linearDepth) * float(u_maxDistance))));
2137
2614
  int direction = pixel.x < u_size.x / 2 ? 1 : -1;
2138
2615
  ivec2 samplePixel = ivec2(
2139
2616
  clamp(pixel.x + direction * rayDistance, 0, u_size.x - 1),
@@ -2141,11 +2618,11 @@ void main() {
2141
2618
  );
2142
2619
  vec3 reflected = texelFetch(u_source, samplePixel, 0).rgb;
2143
2620
  float sourceLuma = (reflected.r + reflected.g + reflected.b) / 3.0;
2144
- if (sourceLuma < 0.18 || depth > 0.92) {
2621
+ if (sourceLuma < 0.18 || linearDepth > 0.995) {
2145
2622
  outColor = target;
2146
2623
  return;
2147
2624
  }
2148
- float boost = sourceLuma * u_intensity * (1.0 - depth);
2625
+ float boost = sourceLuma * u_intensity * (1.0 - linearDepth);
2149
2626
  outColor = vec4(clamp(target.rgb + reflected * boost, 0.0, 1.0), target.a);
2150
2627
  }
2151
2628
  `, "webgl2-ssr");
@@ -2163,13 +2640,26 @@ uniform ivec2 u_size;
2163
2640
  uniform float u_focusDepth;
2164
2641
  uniform float u_focusRange;
2165
2642
  uniform int u_maxRadius;
2643
+ uniform float u_depthNear;
2644
+ uniform float u_depthFar;
2166
2645
  out vec4 outColor;
2167
2646
 
2647
+ // Same linearization contract as the SSR program, except focus is authored
2648
+ // directly as a linear-distance fraction (0 = near plane, 1 = far plane):
2649
+ // buffer-unit focus values are unusable once depth is linearized, because the
2650
+ // projection curve parks the whole play area inside a sliver of buffer units.
2651
+ // The CPU byte kernel keeps buffer-unit semantics; the divergence is
2652
+ // documented at normalizeLdrDepthRange.
2653
+ float a3dDofLinearDepth(float depth) {
2654
+ float viewZ = u_depthNear * u_depthFar / max(u_depthFar - depth * (u_depthFar - u_depthNear), 0.0001);
2655
+ return clamp((viewZ - u_depthNear) / max(u_depthFar - u_depthNear, 0.0001), 0.0, 1.0);
2656
+ }
2657
+
2168
2658
  void main() {
2169
2659
  ivec2 pixel = ivec2(gl_FragCoord.xy);
2170
2660
  vec4 source = texelFetch(u_source, pixel, 0);
2171
- float depth = texelFetch(u_depth, pixel, 0).r;
2172
- float normalizedBlur = max(0.0, abs(depth - u_focusDepth) - u_focusRange)
2661
+ float linearDepth = a3dDofLinearDepth(texelFetch(u_depth, pixel, 0).r);
2662
+ float normalizedBlur = max(0.0, abs(linearDepth - u_focusDepth) - u_focusRange)
2173
2663
  / max(u_focusRange, 0.001) * float(u_maxRadius);
2174
2664
  int radius = min(u_maxRadius, int(round(normalizedBlur)));
2175
2665
  if (radius == 0) {
@@ -3248,7 +3738,22 @@ function normalizeNativeBloomOptions(options) {
3248
3738
  if (!Number.isInteger(radius) || radius < 0 || radius > 16) {
3249
3739
  throw new RenderDeviceError("Bloom radius must be an integer in [0, 16].", "INVALID_POSTPROCESS_OPTIONS", { radius });
3250
3740
  }
3251
- return { threshold, intensity, radius };
3741
+ const softKnee = bloomNumberOption(options, "softKnee", 0);
3742
+ if (!(softKnee >= 0) || softKnee > 0.5) {
3743
+ throw new RenderDeviceError("Bloom softKnee must be finite and in [0, 0.5].", "INVALID_POSTPROCESS_OPTIONS", { softKnee });
3744
+ }
3745
+ const shoulder = bloomNumberOption(options, "shoulder", 0);
3746
+ if (!(shoulder >= 0) || shoulder > 1) {
3747
+ throw new RenderDeviceError("Bloom shoulder must be finite and in [0, 1].", "INVALID_POSTPROCESS_OPTIONS", { shoulder });
3748
+ }
3749
+ let quality;
3750
+ try {
3751
+ quality = normalizeBloomQualityPreset(options.quality);
3752
+ }
3753
+ catch {
3754
+ throw new RenderDeviceError("Bloom quality must be one of performance|balanced|cinematic.", "INVALID_POSTPROCESS_OPTIONS", { quality: options.quality });
3755
+ }
3756
+ return { threshold, intensity, radius, quality, softKnee, shoulder };
3252
3757
  }
3253
3758
  function normalizeNativeOutlineOptions(options) {
3254
3759
  const width = outlineNumberOption(options, "width", 1);
@@ -3293,6 +3798,20 @@ function normalizeNativeSsaoOptions(options) {
3293
3798
  }
3294
3799
  return { radius, intensity, bias };
3295
3800
  }
3801
+ /**
3802
+ * Camera depth range for linearizing sampleable GL depth in the native
3803
+ * SSR/depth-of-field programs (muse3jsparity-PRD A3). Missing or invalid
3804
+ * ranges fall back to the engine perspective defaults (0.1/1000) rather than
3805
+ * failing the frame: the range is a calibration hint, and every engine camera
3806
+ * builder defaults to exactly 0.1/1000. The CPU byte kernels intentionally
3807
+ * keep fixture-unit depth semantics (deterministic reference); the native
3808
+ * programs document their GL-depth contract in-shader.
3809
+ */
3810
+ function normalizeLdrDepthRange(range) {
3811
+ const near = range && Number.isFinite(range.near) && range.near > 0 ? range.near : 0.1;
3812
+ const far = range && Number.isFinite(range.far) && range.far > near ? range.far : 1000;
3813
+ return { near, far };
3814
+ }
3296
3815
  function normalizeNativeSsrOptions(options) {
3297
3816
  const intensity = ssrNumberOption(options, "intensity", 0.32);
3298
3817
  const maxDistance = ssrNumberOption(options, "maxDistance", 16);