@woosh/meep-engine 3.11.3 → 3.13.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 (596) hide show
  1. package/README.md +14 -18
  2. package/editor/SelectionVisualizer.js +127 -127
  3. package/editor/entity_world_bounds.js +27 -27
  4. package/editor/particles/rebuildParticleEmitter.js +31 -31
  5. package/editor/process/SymbolicDisplayProcess.js +1 -1
  6. package/editor/process/symbolic/CameraSymbolicDisplay.js +146 -146
  7. package/editor/process/symbolic/LightSymbolicDisplay.js +172 -172
  8. package/editor/prototypeEditorShell.js +156 -156
  9. package/editor/selection/editor_pick.js +130 -130
  10. package/editor/selection/screen_rect_frustum.js +119 -119
  11. package/editor/tools/v2/TransformControls.js +971 -971
  12. package/package.json +1 -1
  13. package/src/engine/Engine.d.ts +3 -3
  14. package/src/engine/Engine.d.ts.map +1 -1
  15. package/src/engine/Engine.js +726 -726
  16. package/src/engine/EngineHarness.d.ts +1 -1
  17. package/src/engine/EngineHarness.js +590 -590
  18. package/src/engine/ecs/HIERARCHY_REVIEW.md +717 -717
  19. package/src/engine/ecs/terrain/ecs/BuildLightTexture.d.ts +1 -1
  20. package/src/engine/ecs/terrain/ecs/BuildLightTexture.js +27 -27
  21. package/src/engine/ecs/terrain/ecs/Terrain.d.ts +1 -5
  22. package/src/engine/ecs/terrain/ecs/Terrain.d.ts.map +1 -1
  23. package/src/engine/ecs/terrain/ecs/Terrain.js +790 -790
  24. package/src/engine/ecs/terrain/util/loadVisibleTerrainTiles.js +129 -129
  25. package/src/engine/graphics/ecs/camera/camera_find_active.d.ts +1 -1
  26. package/src/engine/graphics/ecs/camera/camera_find_active.js +28 -28
  27. package/src/engine/graphics/ecs/mesh-v2/ShadedGeometry.d.ts +1 -1
  28. package/src/engine/graphics/ecs/mesh-v2/ShadedGeometry.js +428 -428
  29. package/src/engine/graphics/ecs/water/Water.d.ts +1 -1
  30. package/src/engine/graphics/ecs/water/Water.js +104 -104
  31. package/src/engine/graphics/particles/particular/engine/emitter/ParticleEmitter.d.ts +1 -1
  32. package/src/engine/graphics/particles/particular/engine/emitter/ParticleEmitter.js +1 -1
  33. package/src/engine/graphics3/AnimationGraphSystem.d.ts +65 -0
  34. package/src/engine/graphics3/AnimationGraphSystem.d.ts.map +1 -0
  35. package/src/engine/graphics3/AnimationGraphSystem.js +329 -0
  36. package/src/engine/graphics3/AnimationGraphSystem3.d.ts +6 -61
  37. package/src/engine/graphics3/AnimationGraphSystem3.d.ts.map +1 -1
  38. package/src/engine/graphics3/AnimationGraphSystem3.js +6 -325
  39. package/src/engine/graphics3/AnimationSystem.d.ts +76 -0
  40. package/src/engine/graphics3/AnimationSystem.d.ts.map +1 -0
  41. package/src/engine/graphics3/AnimationSystem.js +352 -0
  42. package/src/engine/graphics3/AnimationSystem3.d.ts +6 -72
  43. package/src/engine/graphics3/AnimationSystem3.d.ts.map +1 -1
  44. package/src/engine/graphics3/AnimationSystem3.js +6 -348
  45. package/src/engine/graphics3/CameraSystem.d.ts +49 -0
  46. package/src/engine/graphics3/CameraSystem.d.ts.map +1 -0
  47. package/src/engine/graphics3/CameraSystem.js +170 -0
  48. package/src/engine/graphics3/CameraSystem3.d.ts +6 -45
  49. package/src/engine/graphics3/CameraSystem3.d.ts.map +1 -1
  50. package/src/engine/graphics3/CameraSystem3.js +6 -166
  51. package/src/engine/graphics3/DebugDrawSystem.d.ts +72 -0
  52. package/src/engine/graphics3/DebugDrawSystem.d.ts.map +1 -0
  53. package/src/engine/graphics3/DebugDrawSystem.js +205 -0
  54. package/src/engine/graphics3/DebugDrawSystem3.d.ts +6 -68
  55. package/src/engine/graphics3/DebugDrawSystem3.d.ts.map +1 -1
  56. package/src/engine/graphics3/DebugDrawSystem3.js +6 -201
  57. package/src/engine/graphics3/DecalSystem.d.ts +81 -0
  58. package/src/engine/graphics3/DecalSystem.d.ts.map +1 -0
  59. package/src/engine/graphics3/DecalSystem.js +441 -0
  60. package/src/engine/graphics3/DecalSystem3.d.ts +6 -77
  61. package/src/engine/graphics3/DecalSystem3.d.ts.map +1 -1
  62. package/src/engine/graphics3/DecalSystem3.js +6 -437
  63. package/src/engine/graphics3/FogOfWarSystem.d.ts +74 -0
  64. package/src/engine/graphics3/FogOfWarSystem.d.ts.map +1 -0
  65. package/src/engine/graphics3/FogOfWarSystem.js +265 -0
  66. package/src/engine/graphics3/FogOfWarSystem3.d.ts +6 -70
  67. package/src/engine/graphics3/FogOfWarSystem3.d.ts.map +1 -1
  68. package/src/engine/graphics3/FogOfWarSystem3.js +6 -261
  69. package/src/engine/graphics3/GraphicsEngine.d.ts +340 -0
  70. package/src/engine/graphics3/GraphicsEngine.d.ts.map +1 -0
  71. package/src/engine/graphics3/GraphicsEngine.js +790 -0
  72. package/src/engine/graphics3/GraphicsEngine3.d.ts +6 -336
  73. package/src/engine/graphics3/GraphicsEngine3.d.ts.map +1 -1
  74. package/src/engine/graphics3/GraphicsEngine3.js +6 -786
  75. package/src/engine/graphics3/HighlightSystem.d.ts +82 -0
  76. package/src/engine/graphics3/HighlightSystem.d.ts.map +1 -0
  77. package/src/engine/graphics3/HighlightSystem.js +241 -0
  78. package/src/engine/graphics3/HighlightSystem3.d.ts +6 -78
  79. package/src/engine/graphics3/HighlightSystem3.d.ts.map +1 -1
  80. package/src/engine/graphics3/HighlightSystem3.js +6 -237
  81. package/src/engine/graphics3/LightSystem.d.ts +40 -0
  82. package/src/engine/graphics3/LightSystem.d.ts.map +1 -0
  83. package/src/engine/graphics3/LightSystem.js +211 -0
  84. package/src/engine/graphics3/LightSystem3.d.ts +6 -36
  85. package/src/engine/graphics3/LightSystem3.d.ts.map +1 -1
  86. package/src/engine/graphics3/LightSystem3.js +6 -207
  87. package/src/engine/graphics3/MeshSystem.d.ts +106 -0
  88. package/src/engine/graphics3/MeshSystem.d.ts.map +1 -0
  89. package/src/engine/graphics3/MeshSystem.js +647 -0
  90. package/src/engine/graphics3/MeshSystem3.d.ts +6 -102
  91. package/src/engine/graphics3/MeshSystem3.d.ts.map +1 -1
  92. package/src/engine/graphics3/MeshSystem3.js +6 -642
  93. package/src/engine/graphics3/ParticipatingMedia.d.ts +2 -2
  94. package/src/engine/graphics3/ParticipatingMedia.js +203 -203
  95. package/src/engine/graphics3/ParticipatingMediaSystem.d.ts +87 -0
  96. package/src/engine/graphics3/ParticipatingMediaSystem.d.ts.map +1 -0
  97. package/src/engine/graphics3/ParticipatingMediaSystem.js +184 -0
  98. package/src/engine/graphics3/ParticipatingMediaSystem3.d.ts +6 -83
  99. package/src/engine/graphics3/ParticipatingMediaSystem3.d.ts.map +1 -1
  100. package/src/engine/graphics3/ParticipatingMediaSystem3.js +6 -180
  101. package/src/engine/graphics3/ParticleEmitterSystem.d.ts +76 -0
  102. package/src/engine/graphics3/ParticleEmitterSystem.d.ts.map +1 -0
  103. package/src/engine/graphics3/ParticleEmitterSystem.js +289 -0
  104. package/src/engine/graphics3/ParticleEmitterSystem3.d.ts +6 -72
  105. package/src/engine/graphics3/ParticleEmitterSystem3.d.ts.map +1 -1
  106. package/src/engine/graphics3/ParticleEmitterSystem3.js +6 -285
  107. package/src/engine/graphics3/PathDisplaySystem.d.ts +70 -0
  108. package/src/engine/graphics3/PathDisplaySystem.d.ts.map +1 -0
  109. package/src/engine/graphics3/PathDisplaySystem.js +309 -0
  110. package/src/engine/graphics3/PathDisplaySystem3.d.ts +6 -66
  111. package/src/engine/graphics3/PathDisplaySystem3.d.ts.map +1 -1
  112. package/src/engine/graphics3/PathDisplaySystem3.js +6 -305
  113. package/src/engine/graphics3/Pickable.d.ts +1 -1
  114. package/src/engine/graphics3/Pickable.js +65 -65
  115. package/src/engine/graphics3/PickingQuery.d.ts +1 -1
  116. package/src/engine/graphics3/PickingQuery.js +48 -48
  117. package/src/engine/graphics3/PickingSystem.d.ts +67 -0
  118. package/src/engine/graphics3/PickingSystem.d.ts.map +1 -0
  119. package/src/engine/graphics3/PickingSystem.js +273 -0
  120. package/src/engine/graphics3/PickingSystem3.d.ts +6 -63
  121. package/src/engine/graphics3/PickingSystem3.d.ts.map +1 -1
  122. package/src/engine/graphics3/PickingSystem3.js +6 -269
  123. package/src/engine/graphics3/ShadedGeometrySystem.d.ts +47 -0
  124. package/src/engine/graphics3/ShadedGeometrySystem.d.ts.map +1 -0
  125. package/src/engine/graphics3/ShadedGeometrySystem.js +169 -0
  126. package/src/engine/graphics3/ShadedGeometrySystem3.d.ts +6 -43
  127. package/src/engine/graphics3/ShadedGeometrySystem3.d.ts.map +1 -1
  128. package/src/engine/graphics3/ShadedGeometrySystem3.js +6 -165
  129. package/src/engine/graphics3/TerrainSystem.d.ts +80 -0
  130. package/src/engine/graphics3/TerrainSystem.d.ts.map +1 -0
  131. package/src/engine/graphics3/TerrainSystem.js +566 -0
  132. package/src/engine/graphics3/TerrainSystem3.d.ts +6 -76
  133. package/src/engine/graphics3/TerrainSystem3.d.ts.map +1 -1
  134. package/src/engine/graphics3/TerrainSystem3.js +6 -562
  135. package/src/engine/graphics3/TooltipComponentSystem.d.ts +65 -0
  136. package/src/engine/graphics3/TooltipComponentSystem.d.ts.map +1 -0
  137. package/src/engine/graphics3/TooltipComponentSystem.js +328 -0
  138. package/src/engine/graphics3/TooltipComponentSystem3.d.ts +6 -61
  139. package/src/engine/graphics3/TooltipComponentSystem3.d.ts.map +1 -1
  140. package/src/engine/graphics3/TooltipComponentSystem3.js +6 -324
  141. package/src/engine/graphics3/Trail3DSystem.d.ts +73 -0
  142. package/src/engine/graphics3/Trail3DSystem.d.ts.map +1 -0
  143. package/src/engine/graphics3/Trail3DSystem.js +221 -0
  144. package/src/engine/graphics3/Trail3DSystem3.d.ts +6 -69
  145. package/src/engine/graphics3/Trail3DSystem3.d.ts.map +1 -1
  146. package/src/engine/graphics3/Trail3DSystem3.js +6 -217
  147. package/src/engine/graphics3/VolumetricLightMap.d.ts +2 -2
  148. package/src/engine/graphics3/VolumetricLightMap.js +2 -2
  149. package/src/engine/graphics3/VolumetricLightMapSystem.d.ts +98 -0
  150. package/src/engine/graphics3/VolumetricLightMapSystem.d.ts.map +1 -0
  151. package/src/engine/graphics3/VolumetricLightMapSystem.js +261 -0
  152. package/src/engine/graphics3/VolumetricLightMapSystem3.d.ts +6 -94
  153. package/src/engine/graphics3/VolumetricLightMapSystem3.d.ts.map +1 -1
  154. package/src/engine/graphics3/VolumetricLightMapSystem3.js +10 -261
  155. package/src/engine/graphics3/WaterSystem.d.ts +59 -0
  156. package/src/engine/graphics3/WaterSystem.d.ts.map +1 -0
  157. package/src/engine/graphics3/WaterSystem.js +293 -0
  158. package/src/engine/graphics3/WaterSystem3.d.ts +6 -55
  159. package/src/engine/graphics3/WaterSystem3.d.ts.map +1 -1
  160. package/src/engine/graphics3/WaterSystem3.js +6 -289
  161. package/src/engine/graphics3/animation/AnimationGraphController.d.ts +1 -1
  162. package/src/engine/graphics3/animation/AnimationGraphController.js +518 -518
  163. package/src/engine/graphics3/animation/ClipListPlayer.d.ts +1 -1
  164. package/src/engine/graphics3/animation/ClipListPlayer.js +263 -263
  165. package/src/engine/graphics3/animation/ClipPlayback.d.ts +2 -2
  166. package/src/engine/graphics3/animation/ClipPlayback.js +84 -84
  167. package/src/engine/graphics3/decal/GPUDecalRenderer.js +3 -3
  168. package/src/engine/graphics3/decal/graph_build_decal_clusters.d.ts.map +1 -1
  169. package/src/engine/graphics3/decal/graph_build_decal_clusters.js +6 -8
  170. package/src/engine/graphics3/decal/shader_cluster_assign_decals.d.ts +0 -7
  171. package/src/engine/graphics3/decal/shader_cluster_assign_decals.d.ts.map +1 -1
  172. package/src/engine/graphics3/decal/shader_cluster_assign_decals.js +1 -1
  173. package/src/engine/graphics3/decal/shader_cull_decals_frustum.d.ts +0 -4
  174. package/src/engine/graphics3/decal/shader_cull_decals_frustum.d.ts.map +1 -1
  175. package/src/engine/graphics3/decal/shader_cull_decals_frustum.js +1 -1
  176. package/src/engine/graphics3/decal/shader_decal_composite.d.ts.map +1 -1
  177. package/src/engine/graphics3/decal/shader_decal_composite.js +4 -2
  178. package/src/engine/graphics3/highlight/GPUHighlightRenderer.d.ts.map +1 -1
  179. package/src/engine/graphics3/highlight/GPUHighlightRenderer.js +2 -3
  180. package/src/engine/graphics3/highlight/pack_highlight_table.d.ts +2 -2
  181. package/src/engine/graphics3/highlight/pack_highlight_table.d.ts.map +1 -1
  182. package/src/engine/graphics3/highlight/pack_highlight_table.js +74 -74
  183. package/src/engine/graphics3/highlight/shader_highlight_outline.js +150 -150
  184. package/src/engine/graphics3/pose/query_entity_node_world_pose.d.ts +1 -1
  185. package/src/engine/graphics3/pose/query_entity_node_world_pose.js +101 -101
  186. package/src/engine/graphics3/preview/make_model_thumbnail.d.ts +3 -3
  187. package/src/engine/graphics3/preview/make_model_thumbnail.d.ts.map +1 -1
  188. package/src/engine/graphics3/preview/make_model_thumbnail.js +48 -48
  189. package/src/engine/graphics3/shade_camera_projection_ray.d.ts +1 -1
  190. package/src/engine/graphics3/shade_camera_projection_ray.js +77 -77
  191. package/src/engine/graphics3/shade_node_to_entity_composition.d.ts +1 -1
  192. package/src/engine/graphics3/shade_node_to_entity_composition.js +84 -84
  193. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
  194. package/src/shade/RENDERER_CONTRACT.md +2 -1
  195. package/src/shade/descriptor/pipeline/compute/ComputePipelineDescriptor.d.ts +18 -0
  196. package/src/shade/descriptor/pipeline/compute/ComputePipelineDescriptor.d.ts.map +1 -1
  197. package/src/shade/descriptor/pipeline/compute/ComputePipelineDescriptor.js +73 -0
  198. package/src/shade/device/PASS_ENCODER_PROPOSAL_2026_08_31.md +750 -0
  199. package/src/shade/device/ShadeGPUCommandContext.d.ts +10 -16
  200. package/src/shade/device/ShadeGPUCommandContext.d.ts.map +1 -1
  201. package/src/shade/device/ShadeGPUCommandContext.js +801 -994
  202. package/src/shade/device/pass/ShadeGPUComputePassEncoder.d.ts +107 -0
  203. package/src/shade/device/pass/ShadeGPUComputePassEncoder.d.ts.map +1 -0
  204. package/src/shade/device/pass/ShadeGPUComputePassEncoder.js +222 -0
  205. package/src/shade/device/pass/ShadeGPURenderPassEncoder.d.ts +168 -0
  206. package/src/shade/device/pass/ShadeGPURenderPassEncoder.d.ts.map +1 -0
  207. package/src/shade/device/pass/ShadeGPURenderPassEncoder.js +317 -0
  208. package/src/shade/device/timing/GPUTimerArray.d.ts +4 -9
  209. package/src/shade/device/timing/GPUTimerArray.d.ts.map +1 -1
  210. package/src/shade/device/timing/GPUTimerArray.js +261 -289
  211. package/src/shade/device/timing/GPU_PROFILER_PROPOSAL_2026_08_28.md +20 -2
  212. package/src/shade/device/timing/ShadeGPUContextProfiler.d.ts +59 -0
  213. package/src/shade/device/timing/ShadeGPUContextProfiler.d.ts.map +1 -0
  214. package/src/shade/device/timing/ShadeGPUContextProfiler.js +182 -0
  215. package/src/shade/device/timing/profile/GPUProfileSession.d.ts +4 -4
  216. package/src/shade/device/timing/profile/GPUProfileSession.js +4 -4
  217. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_leaf_triangles.d.ts.map +1 -1
  218. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_leaf_triangles.js +3 -2
  219. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_points.d.ts.map +1 -1
  220. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_points.js +3 -2
  221. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_visibility.d.ts.map +1 -1
  222. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_visibility.js +135 -134
  223. package/src/shade/playground/skinned_blas_refit/verify_leaf_triangles.js +202 -202
  224. package/src/shade/playground/skinned_blas_refit/verify_traversal_reachability.js +249 -249
  225. package/src/shade/renderer/Renderer.d.ts +0 -6
  226. package/src/shade/renderer/Renderer.d.ts.map +1 -1
  227. package/src/shade/renderer/Renderer.js +0 -29
  228. package/src/shade/renderer/STATIC_GRAPHICS_ENGINE_ASSETS.js +1 -1
  229. package/src/shade/renderer/animation/GPUAnimationManager.d.ts.map +1 -1
  230. package/src/shade/renderer/animation/GPUAnimationManager.js +1 -3
  231. package/src/shade/renderer/animation/pose/PosePlayback.d.ts +2 -1
  232. package/src/shade/renderer/animation/pose/PosePlayback.d.ts.map +1 -1
  233. package/src/shade/renderer/animation/pose/PosePlayback.js +2 -1
  234. package/src/shade/renderer/animation/shader_animation_apply.d.ts.map +1 -1
  235. package/src/shade/renderer/animation/shader_animation_apply.js +128 -129
  236. package/src/shade/renderer/animation/shader_animation_pose_resolve.d.ts.map +1 -1
  237. package/src/shade/renderer/animation/shader_animation_pose_resolve.js +176 -177
  238. package/src/shade/renderer/animation/shader_animation_tick.d.ts.map +1 -1
  239. package/src/shade/renderer/animation/shader_animation_tick.js +4 -2
  240. package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.d.ts.map +1 -1
  241. package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.js +8 -18
  242. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_geometry_sphere_derive.d.ts.map +1 -1
  243. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_geometry_sphere_derive.js +3 -2
  244. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_reduce.d.ts.map +1 -1
  245. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_reduce.js +4 -2
  246. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_scatter.d.ts +1 -1
  247. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_scatter.d.ts.map +1 -1
  248. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_scatter.js +24 -10
  249. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_skinned_mesh_bounds_refresh.d.ts.map +1 -1
  250. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_skinned_mesh_bounds_refresh.js +3 -2
  251. package/src/shade/renderer/animation/skinning/shader_meshlet_apply_skinning.d.ts.map +1 -1
  252. package/src/shade/renderer/animation/skinning/shader_meshlet_apply_skinning.js +5 -2
  253. package/src/shade/renderer/animation/skinning/shader_skin_matrix_prep.d.ts.map +1 -1
  254. package/src/shade/renderer/animation/skinning/shader_skin_matrix_prep.js +104 -105
  255. package/src/shade/renderer/atmosphere/shader_multiscatter_lut.d.ts.map +1 -1
  256. package/src/shade/renderer/atmosphere/shader_multiscatter_lut.js +0 -1
  257. package/src/shade/renderer/atmosphere/shader_transmittance_lut.js +3 -3
  258. package/src/shade/renderer/buffer/graph_inspect_gpu_buffer.js +136 -136
  259. package/src/shade/renderer/buffer/table/GPUDatabase.d.ts.map +1 -1
  260. package/src/shade/renderer/buffer/table/GPUDatabase.js +16 -22
  261. package/src/shade/renderer/buffer/table/gpu_table_element_upload_shader.d.ts.map +1 -1
  262. package/src/shade/renderer/buffer/table/gpu_table_element_upload_shader.js +7 -2
  263. package/src/shade/renderer/buffer/table/single/GPUSingleTypeTable.d.ts.map +1 -1
  264. package/src/shade/renderer/buffer/table/single/GPUSingleTypeTable.js +11 -5
  265. package/src/shade/renderer/buffer/util/shader_buffer_copy_storage_to_storage.d.ts.map +1 -1
  266. package/src/shade/renderer/buffer/util/shader_buffer_copy_storage_to_storage.js +43 -42
  267. package/src/shade/renderer/buffer/util/shader_buffer_intra_copy_regions.d.ts.map +1 -1
  268. package/src/shade/renderer/buffer/util/shader_buffer_intra_copy_regions.js +83 -84
  269. package/src/shade/renderer/deferred/shader_tonemap_HDR.d.ts.map +1 -1
  270. package/src/shade/renderer/deferred/shader_tonemap_HDR.js +4 -1
  271. package/src/shade/renderer/dynamic/GPUDynamicMeshResidency.d.ts +2 -2
  272. package/src/shade/renderer/dynamic/GPUDynamicMeshResidency.d.ts.map +1 -1
  273. package/src/shade/renderer/dynamic/GPUDynamicMeshResidency.js +167 -167
  274. package/src/shade/renderer/dynamic/shader_dynamic_mesh.d.ts.map +1 -1
  275. package/src/shade/renderer/dynamic/shader_dynamic_mesh.js +177 -170
  276. package/src/shade/renderer/extension/RENDER_EXTENSION_DESIGN.md +918 -918
  277. package/src/shade/renderer/fow/GPUFogOfWarRenderer.js +3 -3
  278. package/src/shade/renderer/fow/shader_fog_of_war.d.ts.map +1 -1
  279. package/src/shade/renderer/fow/shader_fog_of_war.js +3 -1
  280. package/src/shade/renderer/geometry/bvh/record_blas_refit.js +102 -102
  281. package/src/shade/renderer/geometry/bvh/shader_blas_refit_leaf_bounds.d.ts.map +1 -1
  282. package/src/shade/renderer/geometry/bvh/shader_blas_refit_leaf_bounds.js +5 -2
  283. package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.d.ts.map +1 -1
  284. package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.js +3 -11
  285. package/src/shade/renderer/geometry/meshlet/shader_meshlet_metadata_address_patch.d.ts +1 -1
  286. package/src/shade/renderer/geometry/meshlet/shader_meshlet_metadata_address_patch.d.ts.map +1 -1
  287. package/src/shade/renderer/geometry/meshlet/shader_meshlet_metadata_address_patch.js +6 -4
  288. package/src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.d.ts.map +1 -1
  289. package/src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.js +5 -10
  290. package/src/shade/renderer/geometry/sdf/shader_build_sdf.js +129 -129
  291. package/src/shade/renderer/geometry/sdf/shader_sdf_visualize.d.ts.map +1 -1
  292. package/src/shade/renderer/geometry/sdf/shader_sdf_visualize.js +5 -3
  293. package/src/shade/renderer/global_illumination/brick4/gpu/bake/shader_brick4_bake_probes.d.ts.map +1 -1
  294. package/src/shade/renderer/global_illumination/brick4/gpu/bake/shader_brick4_bake_probes.js +4 -1
  295. package/src/shade/renderer/global_illumination/brick4/gpu/bake/shader_brick4_bake_resolve_probes.d.ts.map +1 -1
  296. package/src/shade/renderer/global_illumination/brick4/gpu/bake/shader_brick4_bake_resolve_probes.js +3 -1
  297. package/src/shade/renderer/global_illumination/clipmap/shader_update_clipmap_cascade.d.ts.map +1 -1
  298. package/src/shade/renderer/global_illumination/clipmap/shader_update_clipmap_cascade.js +114 -112
  299. package/src/shade/renderer/global_illumination/lpv/placement/graph_generate_probe_locations.js +367 -367
  300. package/src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_lpv_store_sh.d.ts.map +1 -1
  301. package/src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_lpv_store_sh.js +4 -1
  302. package/src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_lvp_atlas_to_sh.d.ts.map +1 -1
  303. package/src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_lvp_atlas_to_sh.js +9 -6
  304. package/src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_reduce_atlas_to_sh.d.ts.map +1 -1
  305. package/src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_reduce_atlas_to_sh.js +4 -1
  306. package/src/shade/renderer/global_illumination/sharc/SpatialHashRadianceCache.d.ts.map +1 -1
  307. package/src/shade/renderer/global_illumination/sharc/SpatialHashRadianceCache.js +6 -8
  308. package/src/shade/renderer/global_illumination/sharc/shader/shader_sharc_evict.d.ts.map +1 -1
  309. package/src/shade/renderer/global_illumination/sharc/shader/shader_sharc_evict.js +3 -1
  310. package/src/shade/renderer/global_illumination/sharc/shader/shader_sharc_update.d.ts.map +1 -1
  311. package/src/shade/renderer/global_illumination/sharc/shader/shader_sharc_update.js +3 -1
  312. package/src/shade/renderer/gpu_primitive/bvh/GPU_BVH_BUILD_PLAN.md +1115 -1115
  313. package/src/shade/renderer/gpu_primitive/bvh/PHASE1_HANDOVER.md +3 -3
  314. package/src/shade/renderer/gpu_primitive/bvh/graph_bvh_build_lbvh.js +10 -10
  315. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_emit_hierarchy.d.ts.map +1 -1
  316. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_emit_hierarchy.js +4 -2
  317. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_morton.d.ts.map +1 -1
  318. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_morton.js +87 -83
  319. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_refit.d.ts.map +1 -1
  320. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_refit.js +4 -2
  321. package/src/shade/renderer/gpu_primitive/bvh/verify_gpu_bvh_build.d.ts +2 -2
  322. package/src/shade/renderer/gpu_primitive/bvh/verify_gpu_bvh_build.d.ts.map +1 -1
  323. package/src/shade/renderer/gpu_primitive/bvh/verify_gpu_bvh_build.js +43 -8
  324. package/src/shade/renderer/gpu_primitive/sort/graph_radix_sort.d.ts.map +1 -1
  325. package/src/shade/renderer/gpu_primitive/sort/graph_radix_sort.js +4 -5
  326. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_histogram.d.ts.map +1 -1
  327. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_histogram.js +88 -85
  328. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_scatter.d.ts.map +1 -1
  329. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_scatter.js +194 -192
  330. package/src/shade/renderer/hiz/HierarchicalZBuffer.d.ts.map +1 -1
  331. package/src/shade/renderer/hiz/HierarchicalZBuffer.js +33 -69
  332. package/src/shade/renderer/hiz/shader_hzb_reduce_any.d.ts.map +1 -1
  333. package/src/shade/renderer/hiz/shader_hzb_reduce_any.js +6 -1
  334. package/src/shade/renderer/hiz/shader_hzb_reduce_mip0_clip.d.ts.map +1 -1
  335. package/src/shade/renderer/hiz/shader_hzb_reduce_mip0_clip.js +23 -7
  336. package/src/shade/renderer/light/cluster/cull/graph_cull_lights.d.ts.map +1 -1
  337. package/src/shade/renderer/light/cluster/cull/graph_cull_lights.js +191 -198
  338. package/src/shade/renderer/light/cluster/cull/shader_cull_lights_frustum.d.ts +0 -6
  339. package/src/shade/renderer/light/cluster/cull/shader_cull_lights_frustum.d.ts.map +1 -1
  340. package/src/shade/renderer/light/cluster/cull/shader_cull_lights_frustum.js +120 -120
  341. package/src/shade/renderer/light/cluster/cull/shader_cull_lights_hzb.d.ts +0 -4
  342. package/src/shade/renderer/light/cluster/cull/shader_cull_lights_hzb.d.ts.map +1 -1
  343. package/src/shade/renderer/light/cluster/cull/shader_cull_lights_hzb.js +112 -112
  344. package/src/shade/renderer/light/cluster/graph_assign_clsuters.d.ts.map +1 -1
  345. package/src/shade/renderer/light/cluster/graph_assign_clsuters.js +4 -7
  346. package/src/shade/renderer/light/cluster/shader_cluster_assign_lights.d.ts +0 -6
  347. package/src/shade/renderer/light/cluster/shader_cluster_assign_lights.d.ts.map +1 -1
  348. package/src/shade/renderer/light/cluster/shader_cluster_assign_lights.js +1 -1
  349. package/src/shade/renderer/light/environment/execute_filter_environment_map.d.ts.map +1 -1
  350. package/src/shade/renderer/light/environment/execute_filter_environment_map.js +1 -2
  351. package/src/shade/renderer/light/environment/shader_convolve_reflection_map.d.ts.map +1 -1
  352. package/src/shade/renderer/light/environment/shader_convolve_reflection_map.js +6 -1
  353. package/src/shade/renderer/lightmap/bake/raster/graph_draw_lightmap_viz_buffer.d.ts.map +1 -1
  354. package/src/shade/renderer/lightmap/bake/raster/graph_draw_lightmap_viz_buffer.js +234 -219
  355. package/src/shade/renderer/lightmap/bake/raster/shader_lightmap_to_viz_buffer.js +222 -222
  356. package/src/shade/renderer/lightmap/bake/shader_lightmap_denoise_sh.js +191 -191
  357. package/src/shade/renderer/lightmap/bake/tile/shader_lightmap_accummulate_tile.d.ts.map +1 -1
  358. package/src/shade/renderer/lightmap/bake/tile/shader_lightmap_accummulate_tile.js +85 -82
  359. package/src/shade/renderer/lightmap/bake/tile/shader_lightmap_tile_composit.js +81 -81
  360. package/src/shade/renderer/material/GPUMaterialContext.js +380 -380
  361. package/src/shade/renderer/material/standard/fragment_gbuffer_vt.js +169 -169
  362. package/src/shade/renderer/object_property/shader_object_property_process.d.ts.map +1 -1
  363. package/src/shade/renderer/object_property/shader_object_property_process.js +83 -84
  364. package/src/shade/renderer/object_property/shader_refresh_all_mesh_bounds.d.ts.map +1 -1
  365. package/src/shade/renderer/object_property/shader_refresh_all_mesh_bounds.js +57 -58
  366. package/src/shade/renderer/particles/graph_particles.d.ts.map +1 -1
  367. package/src/shade/renderer/particles/graph_particles.js +5 -3
  368. package/src/shade/renderer/particles/prototypeParticleSystem.js +5 -7
  369. package/src/shade/renderer/particles/shaders/shader_particle_emit.d.ts.map +1 -1
  370. package/src/shade/renderer/particles/shaders/shader_particle_emit.js +27 -13
  371. package/src/shade/renderer/particles/shaders/shader_particle_finalize.d.ts.map +1 -1
  372. package/src/shade/renderer/particles/shaders/shader_particle_finalize.js +4 -4
  373. package/src/shade/renderer/particles/shaders/shader_particle_render.d.ts.map +1 -1
  374. package/src/shade/renderer/particles/shaders/shader_particle_render.js +190 -183
  375. package/src/shade/renderer/particles/shaders/shader_particle_simulate.d.ts.map +1 -1
  376. package/src/shade/renderer/particles/shaders/shader_particle_simulate.js +18 -7
  377. package/src/shade/renderer/particles/sort/shader_particle_sort.d.ts.map +1 -1
  378. package/src/shade/renderer/particles/sort/shader_particle_sort.js +47 -21
  379. package/src/shade/renderer/path_tracer/accumulating/AccumulatingPathTracer.d.ts.map +1 -1
  380. package/src/shade/renderer/path_tracer/accumulating/AccumulatingPathTracer.js +7 -10
  381. package/src/shade/renderer/path_tracer/accumulating/shader_accumulating_path_tracer.d.ts.map +1 -1
  382. package/src/shade/renderer/path_tracer/accumulating/shader_accumulating_path_tracer.js +4 -1
  383. package/src/shade/renderer/path_tracer/graph_path_trace_scene.js +184 -184
  384. package/src/shade/renderer/postprocess/bloom/shader_bloom_mix.d.ts.map +1 -1
  385. package/src/shade/renderer/postprocess/bloom/shader_bloom_mix.js +3 -1
  386. package/src/shade/renderer/postprocess/cas/shader_ffx_rcas.d.ts.map +1 -1
  387. package/src/shade/renderer/postprocess/cas/shader_ffx_rcas.js +4 -2
  388. package/src/shade/renderer/postprocess/denoise/fragment_shader_denoise_ao.js +147 -147
  389. package/src/shade/renderer/postprocess/denoise/graph_atorus_denoise_luma.d.ts.map +1 -1
  390. package/src/shade/renderer/postprocess/denoise/graph_atorus_denoise_luma.js +19 -17
  391. package/src/shade/renderer/postprocess/dof/gather/graph_postprocess_dof2.d.ts.map +1 -1
  392. package/src/shade/renderer/postprocess/dof/gather/graph_postprocess_dof2.js +1 -2
  393. package/src/shade/renderer/postprocess/dof/gather/shader_dof2_gather_far.d.ts.map +1 -1
  394. package/src/shade/renderer/postprocess/dof/gather/shader_dof2_gather_far.js +4 -1
  395. package/src/shade/renderer/postprocess/dof/gather/shader_dof2_gather_near.d.ts.map +1 -1
  396. package/src/shade/renderer/postprocess/dof/gather/shader_dof2_gather_near.js +4 -1
  397. package/src/shade/renderer/postprocess/dof/gather/shader_dof2_recombine.d.ts.map +1 -1
  398. package/src/shade/renderer/postprocess/dof/gather/shader_dof2_recombine.js +4 -1
  399. package/src/shade/renderer/postprocess/dof/gather/shader_dof2_setup.d.ts.map +1 -1
  400. package/src/shade/renderer/postprocess/dof/gather/shader_dof2_setup.js +4 -1
  401. package/src/shade/renderer/postprocess/dof/raymarch/graph_postprocess_dof.d.ts.map +1 -1
  402. package/src/shade/renderer/postprocess/dof/raymarch/graph_postprocess_dof.js +5 -8
  403. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_composite.d.ts.map +1 -1
  404. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_composite.js +4 -1
  405. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_prefilter.d.ts.map +1 -1
  406. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_prefilter.js +4 -1
  407. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_raymarch.d.ts.map +1 -1
  408. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_raymarch.js +4 -1
  409. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_raymarch_compute.d.ts.map +1 -1
  410. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_raymarch_compute.js +4 -2
  411. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_slice_compute.d.ts.map +1 -1
  412. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_slice_compute.js +4 -2
  413. package/src/shade/renderer/postprocess/dof/shader_dof_autofocus.d.ts.map +1 -1
  414. package/src/shade/renderer/postprocess/dof/shader_dof_autofocus.js +4 -1
  415. package/src/shade/renderer/postprocess/eye/GPUCameraExposureManager.d.ts.map +1 -1
  416. package/src/shade/renderer/postprocess/eye/GPUCameraExposureManager.js +8 -11
  417. package/src/shade/renderer/postprocess/eye/shader_autoexposure_adapt.d.ts.map +1 -1
  418. package/src/shade/renderer/postprocess/eye/shader_autoexposure_adapt.js +5 -1
  419. package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao.d.ts.map +1 -1
  420. package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao.js +11 -8
  421. package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao_with_irradiance.d.ts.map +1 -1
  422. package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao_with_irradiance.js +7 -8
  423. package/src/shade/renderer/postprocess/motion_blur/shader_motion_blur_reconstruct.d.ts.map +1 -1
  424. package/src/shade/renderer/postprocess/motion_blur/shader_motion_blur_reconstruct.js +3 -1
  425. package/src/shade/renderer/postprocess/nss/NSS.d.ts +1 -1
  426. package/src/shade/renderer/postprocess/nss/shader_nss_concat.d.ts.map +1 -1
  427. package/src/shade/renderer/postprocess/nss/shader_nss_concat.js +3 -2
  428. package/src/shade/renderer/postprocess/nss/shader_nss_conv_layer.d.ts.map +1 -1
  429. package/src/shade/renderer/postprocess/nss/shader_nss_conv_layer.js +225 -226
  430. package/src/shade/renderer/postprocess/nss/shader_nss_extract_feedback.d.ts.map +1 -1
  431. package/src/shade/renderer/postprocess/nss/shader_nss_extract_feedback.js +49 -50
  432. package/src/shade/renderer/postprocess/nss/shader_nss_postprocess.d.ts.map +1 -1
  433. package/src/shade/renderer/postprocess/nss/shader_nss_postprocess.js +291 -292
  434. package/src/shade/renderer/postprocess/nss/shader_nss_preprocess.d.ts.map +1 -1
  435. package/src/shade/renderer/postprocess/nss/shader_nss_preprocess.js +230 -231
  436. package/src/shade/renderer/postprocess/ssr/depth_max_shader.d.ts.map +1 -1
  437. package/src/shade/renderer/postprocess/ssr/depth_max_shader.js +70 -68
  438. package/src/shade/renderer/postprocess/ssr/reproject/shader_ffx_denoiser_reflections_reproject.d.ts +16 -2
  439. package/src/shade/renderer/postprocess/ssr/reproject/shader_ffx_denoiser_reflections_reproject.d.ts.map +1 -1
  440. package/src/shade/renderer/postprocess/ssr/reproject/shader_ffx_denoiser_reflections_reproject.js +12 -12
  441. package/src/shade/renderer/postprocess/ssr/resolve/ssr_resolve_shader_IBL.d.ts.map +1 -1
  442. package/src/shade/renderer/postprocess/ssr/resolve/ssr_resolve_shader_IBL.js +3 -1
  443. package/src/shade/renderer/postprocess/ssr/resolve/ssr_resolve_shader_LPV.d.ts.map +1 -1
  444. package/src/shade/renderer/postprocess/ssr/resolve/ssr_resolve_shader_LPV.js +4 -1
  445. package/src/shade/renderer/postprocess/ssr/shader_downsample_encoded_normal.d.ts.map +1 -1
  446. package/src/shade/renderer/postprocess/ssr/shader_downsample_encoded_normal.js +103 -101
  447. package/src/shade/renderer/postprocess/ssr/ssr_spatial_denoise_shader.d.ts.map +1 -1
  448. package/src/shade/renderer/postprocess/ssr/ssr_spatial_denoise_shader.js +4 -2
  449. package/src/shade/renderer/postprocess/ssr/ssr_trace_shader.d.ts.map +1 -1
  450. package/src/shade/renderer/postprocess/ssr/ssr_trace_shader.js +3 -1
  451. package/src/shade/renderer/postprocess/taa/shader_taa.d.ts.map +1 -1
  452. package/src/shade/renderer/postprocess/taa/shader_taa.js +4 -1
  453. package/src/shade/renderer/postprocess/upscale-dither/fragment_shader_upscale_dither.js +5 -5
  454. package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.d.ts.map +1 -1
  455. package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.js +339 -341
  456. package/src/shade/renderer/rasterize/bucket/shader_count_meshlets_by_material.d.ts.map +1 -1
  457. package/src/shade/renderer/rasterize/bucket/shader_count_meshlets_by_material.js +68 -69
  458. package/src/shade/renderer/rasterize/bucket/shader_make_meshlet_indirect_draw_commands_by_material.d.ts.map +1 -1
  459. package/src/shade/renderer/rasterize/bucket/shader_make_meshlet_indirect_draw_commands_by_material.js +59 -60
  460. package/src/shade/renderer/rasterize/bucket/shader_read_out_bucket.d.ts.map +1 -1
  461. package/src/shade/renderer/rasterize/bucket/shader_read_out_bucket.js +0 -1
  462. package/src/shade/renderer/rasterize/bucket/shader_sort_meshlets_by_material.d.ts.map +1 -1
  463. package/src/shade/renderer/rasterize/bucket/shader_sort_meshlets_by_material.js +64 -65
  464. package/src/shade/renderer/rasterize/compute/graph_mesh_frustum_cull.d.ts.map +1 -1
  465. package/src/shade/renderer/rasterize/compute/graph_mesh_frustum_cull.js +168 -169
  466. package/src/shade/renderer/rasterize/compute/graph_mesh_sphere_cull.d.ts.map +1 -1
  467. package/src/shade/renderer/rasterize/compute/graph_mesh_sphere_cull.js +160 -161
  468. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_mesh_filter_2way.d.ts.map +1 -1
  469. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_mesh_filter_2way.js +6 -2
  470. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_meshlet_filter_1way_full.d.ts.map +1 -1
  471. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_meshlet_filter_1way_full.js +4 -2
  472. package/src/shade/renderer/rasterize/expand/bucket/mesh/shader_instances_classify_bucket.d.ts.map +1 -1
  473. package/src/shade/renderer/rasterize/expand/bucket/mesh/shader_instances_classify_bucket.js +139 -140
  474. package/src/shade/renderer/rasterize/expand/bucket/mesh/shader_instances_count_by_rasterization_bucket.d.ts.map +1 -1
  475. package/src/shade/renderer/rasterize/expand/bucket/mesh/shader_instances_count_by_rasterization_bucket.js +91 -92
  476. package/src/shade/renderer/rasterize/expand/bucket/mesh/shader_instances_rasterization_bucket_sort.d.ts.map +1 -1
  477. package/src/shade/renderer/rasterize/expand/bucket/mesh/shader_instances_rasterization_bucket_sort.js +88 -89
  478. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_count_by_rasterization_bucket.d.ts.map +1 -1
  479. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_count_by_rasterization_bucket.js +90 -91
  480. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_extract_bucket.d.ts.map +1 -1
  481. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_extract_bucket.js +5 -2
  482. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_rasterization_bucket_sort.d.ts.map +1 -1
  483. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_rasterization_bucket_sort.js +89 -90
  484. package/src/shade/renderer/rasterize/expand/graph_mesh_filter_one_way.d.ts.map +1 -1
  485. package/src/shade/renderer/rasterize/expand/graph_mesh_filter_one_way.js +169 -170
  486. package/src/shade/renderer/rasterize/expand/mesh/shader_mesh_expand_to_meshlets_prefix.d.ts.map +1 -1
  487. package/src/shade/renderer/rasterize/expand/mesh/shader_mesh_expand_to_meshlets_prefix.js +89 -90
  488. package/src/shade/renderer/rasterize/expand/mesh/shader_meshes_to_meshlet_counts.d.ts.map +1 -1
  489. package/src/shade/renderer/rasterize/expand/mesh/shader_meshes_to_meshlet_counts.js +61 -62
  490. package/src/shade/renderer/rasterize/expand/pass1/filter_meshlets.2-way.compute.d.ts.map +1 -1
  491. package/src/shade/renderer/rasterize/expand/pass1/filter_meshlets.2-way.compute.js +153 -154
  492. package/src/shade/renderer/rasterize/native/depth/shadow_rasterization_alpha_tested_pass_descriptor.js +144 -144
  493. package/src/shade/renderer/rasterize/native/depth/shadow_rasterization_pass_descriptor.js +88 -88
  494. package/src/shade/renderer/rasterize/native/oit/graph_rasterize_meshes_transparent_oit.js +722 -722
  495. package/src/shade/renderer/rasterize/native/oit/shader_oit_generate_moments.js +217 -217
  496. package/src/shade/renderer/rasterize/native/oit/shader_oit_resolve_moments.js +179 -179
  497. package/src/shade/renderer/rasterize/native/oit/shader_oit_resolve_moments_ibl.js +178 -178
  498. package/src/shade/renderer/rasterize/native/viz/viz_rasterization_alpha_tested_pass_descriptor.js +194 -194
  499. package/src/shade/renderer/rasterize/native/viz/viz_rasterization_opaque_pass_descriptor.js +76 -76
  500. package/src/shade/renderer/rasterize/standard/graph_rasterize_partial_opaque.d.ts.map +1 -1
  501. package/src/shade/renderer/rasterize/standard/graph_rasterize_partial_opaque.js +1 -9
  502. package/src/shade/renderer/rasterize/standard/graph_rasterize_remaining_opaque.d.ts.map +1 -1
  503. package/src/shade/renderer/rasterize/standard/graph_rasterize_remaining_opaque.js +1 -6
  504. package/src/shade/renderer/restir/di/graph_restir_di.d.ts.map +1 -1
  505. package/src/shade/renderer/restir/di/graph_restir_di.js +2 -3
  506. package/src/shade/renderer/restir/di/graph_restir_di_denoise.d.ts.map +1 -1
  507. package/src/shade/renderer/restir/di/graph_restir_di_denoise.js +1 -2
  508. package/src/shade/renderer/restir/di/shader_restir_di_denoise.d.ts.map +1 -1
  509. package/src/shade/renderer/restir/di/shader_restir_di_denoise.js +5 -3
  510. package/src/shade/renderer/restir/di/shader_restir_di_resample.d.ts.map +1 -1
  511. package/src/shade/renderer/restir/di/shader_restir_di_resample.js +4 -3
  512. package/src/shade/renderer/restir/di/shader_restir_di_resolve.d.ts.map +1 -1
  513. package/src/shade/renderer/restir/di/shader_restir_di_resolve.js +4 -3
  514. package/src/shade/renderer/restir/di/shader_restir_di_spatial.d.ts.map +1 -1
  515. package/src/shade/renderer/restir/di/shader_restir_di_spatial.js +116 -117
  516. package/src/shade/renderer/scene/GPUInstancesAccelerationStructure.d.ts.map +1 -1
  517. package/src/shade/renderer/scene/GPUInstancesAccelerationStructure.js +3 -7
  518. package/src/shade/renderer/scene/hierarchy/graph_scene_update_transform_hierarchy_naive.js +123 -123
  519. package/src/shade/renderer/scene/hierarchy/shader_nodes_record_input_positions.d.ts.map +1 -1
  520. package/src/shade/renderer/scene/hierarchy/shader_nodes_record_input_positions.js +64 -65
  521. package/src/shade/renderer/scene/hierarchy/shader_nodes_update_transform_hierarchy.d.ts.map +1 -1
  522. package/src/shade/renderer/scene/hierarchy/shader_nodes_update_transform_hierarchy.js +372 -373
  523. package/src/shade/renderer/scene/hierarchy/shader_nodes_update_transform_hierarchy_naive.d.ts.map +1 -1
  524. package/src/shade/renderer/scene/hierarchy/shader_nodes_update_transform_hierarchy_naive.js +111 -112
  525. package/src/shade/renderer/scene/shader_bvh_extract_instance_leaves.d.ts.map +1 -1
  526. package/src/shade/renderer/scene/shader_bvh_extract_instance_leaves.js +147 -145
  527. package/src/shade/renderer/shader/ComputeShader.d.ts +26 -5
  528. package/src/shade/renderer/shader/ComputeShader.d.ts.map +1 -1
  529. package/src/shade/renderer/shader/ComputeShader.js +347 -296
  530. package/src/shade/renderer/shader/ImageShader.js +217 -217
  531. package/src/shade/renderer/shader/ShaderDescriptor.d.ts +5 -0
  532. package/src/shade/renderer/shader/ShaderDescriptor.d.ts.map +1 -1
  533. package/src/shade/renderer/shader/ShaderDescriptor.js +20 -0
  534. package/src/shade/renderer/shader/pass/RenderPassDescriptor.d.ts +2 -2
  535. package/src/shade/renderer/shader/pass/RenderPassDescriptor.d.ts.map +1 -1
  536. package/src/shade/renderer/shader/pass/RenderPassDescriptor.js +189 -189
  537. package/src/shade/renderer/shader/resource/ShaderResourceSetDescriptor.d.ts.map +1 -1
  538. package/src/shade/renderer/shader/resource/ShaderResourceSetDescriptor.js +3 -1
  539. package/src/shade/renderer/shader/util/compute_infer_workgroup_size_from_source.d.ts +47 -0
  540. package/src/shade/renderer/shader/util/compute_infer_workgroup_size_from_source.d.ts.map +1 -0
  541. package/src/shade/renderer/shader/util/compute_infer_workgroup_size_from_source.js +448 -0
  542. package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.d.ts.map +1 -1
  543. package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.js +14 -18
  544. package/src/shade/renderer/shadow/map/csm/graph_csm_setup_cascades.js +3 -3
  545. package/src/shade/renderer/shadow/map/shader/shader_shadowmap_remap_cube_to_octahedral.d.ts.map +1 -1
  546. package/src/shade/renderer/shadow/map/shader/shader_shadowmap_remap_cube_to_octahedral.js +5 -1
  547. package/src/shade/renderer/shadow/ray/shader_shadow_upscale.d.ts.map +1 -1
  548. package/src/shade/renderer/shadow/ray/shader_shadow_upscale.js +3 -1
  549. package/src/shade/renderer/shadow/ray/staged/gen/graph_gen_rays.js +73 -73
  550. package/src/shade/renderer/shadow/ray/staged/gen/shader_generate_rays.d.ts.map +1 -1
  551. package/src/shade/renderer/shadow/ray/staged/gen/shader_generate_rays.js +151 -148
  552. package/src/shade/renderer/shadow/ray/staged/trace/graph_trace_rays.d.ts.map +1 -1
  553. package/src/shade/renderer/shadow/ray/staged/trace/graph_trace_rays.js +6 -4
  554. package/src/shade/renderer/shadow/ray/staged/trace/shader_trace_rays.d.ts.map +1 -1
  555. package/src/shade/renderer/shadow/ray/staged/trace/shader_trace_rays.js +18 -4
  556. package/src/shade/renderer/shadow/sdf/cascade/CascadedSceneSDF.d.ts.map +1 -1
  557. package/src/shade/renderer/shadow/sdf/cascade/CascadedSceneSDF.js +11 -12
  558. package/src/shade/renderer/shadow/sdf/cascade/shader_build_scene_sdf_f32.d.ts.map +1 -1
  559. package/src/shade/renderer/shadow/sdf/cascade/shader_build_scene_sdf_f32.js +6 -2
  560. package/src/shade/renderer/shadow/sdf/cascade/shader_scene_sdf_debug_viz.d.ts.map +1 -1
  561. package/src/shade/renderer/shadow/sdf/cascade/shader_scene_sdf_debug_viz.js +129 -127
  562. package/src/shade/renderer/shadow/sdf/graph_draw_sdf_shadows.d.ts.map +1 -1
  563. package/src/shade/renderer/shadow/sdf/graph_draw_sdf_shadows.js +5 -3
  564. package/src/shade/renderer/texture/virtual/VirtualTextureManager.d.ts.map +1 -1
  565. package/src/shade/renderer/texture/virtual/VirtualTextureManager.js +2 -5
  566. package/src/shade/renderer/texture/virtual/build_shader_vt_feedback.d.ts.map +1 -1
  567. package/src/shade/renderer/texture/virtual/build_shader_vt_feedback.js +3 -2
  568. package/src/shade/renderer/volumetrics/GPUViewVolumetrics.js +1 -1
  569. package/src/shade/renderer/volumetrics/graph_build_volumetrics.d.ts.map +1 -1
  570. package/src/shade/renderer/volumetrics/graph_build_volumetrics.js +14 -19
  571. package/src/shade/renderer/volumetrics/shader_volumetrics_build_lighting.d.ts +3 -2
  572. package/src/shade/renderer/volumetrics/shader_volumetrics_build_lighting.d.ts.map +1 -1
  573. package/src/shade/renderer/volumetrics/shader_volumetrics_build_lighting.js +3 -2
  574. package/src/shade/renderer/volumetrics/taa/shader_volumetrics_taa.d.ts +0 -2
  575. package/src/shade/renderer/volumetrics/taa/shader_volumetrics_taa.d.ts.map +1 -1
  576. package/src/shade/renderer/volumetrics/taa/shader_volumetrics_taa.js +17 -6
  577. package/src/shade/renderer/water/shader_water.js +246 -246
  578. package/src/shade/vitest.setup.mjs +1 -1
  579. package/src/shade/wgsl/emulator/ComputeShaderEmulator.js +291 -291
  580. package/src/shade/wgsl/validate_wgsl_source.d.ts.map +1 -1
  581. package/src/shade/wgsl/validate_wgsl_source.js +8 -3
  582. package/src/view/minimap/Minimap.d.ts +2 -2
  583. package/src/view/minimap/Minimap.d.ts.map +1 -1
  584. package/src/view/minimap/Minimap.js +225 -225
  585. package/src/view/minimap/dom/MinimapCameraView.d.ts +3 -3
  586. package/src/view/minimap/dom/MinimapCameraView.d.ts.map +1 -1
  587. package/src/view/minimap/dom/MinimapCameraView.js +206 -206
  588. package/src/shade/device/timing/profile/make_profiling_pass_encoder.d.ts +0 -21
  589. package/src/shade/device/timing/profile/make_profiling_pass_encoder.d.ts.map +0 -1
  590. package/src/shade/device/timing/profile/make_profiling_pass_encoder.js +0 -114
  591. package/src/shade/device/timing/profile/parse_workgroup_size.d.ts +0 -20
  592. package/src/shade/device/timing/profile/parse_workgroup_size.d.ts.map +0 -1
  593. package/src/shade/device/timing/profile/parse_workgroup_size.js +0 -43
  594. package/src/shade/renderer/shadow/map/csm/shader/shader_setup_cascades.d.ts +0 -3
  595. package/src/shade/renderer/shadow/map/csm/shader/shader_setup_cascades.d.ts.map +0 -1
  596. package/src/shade/renderer/shadow/map/csm/shader/shader_setup_cascades.js +0 -20
@@ -1,790 +1,10 @@
1
- import { assert } from "../../core/assert.js";
2
- import Signal from "../../core/events/signal/Signal.js";
3
- import Vector1 from "../../core/geom/Vector1.js";
4
- import { Vector2 } from "../../core/geom/Vector2.js";
5
- import { max2 } from "../../core/math/max2.js";
6
- import { TextureDescriptor } from "../../shade/descriptor/texture/TextureDescriptor.js";
7
- import { PerspectiveCamera } from "../../shade/renderer/camera/PerspectiveCamera.js";
8
- import { DynamicResolutionScaling } from "../../shade/renderer/DynamicResolutionScaling.js";
9
- import { Renderer } from "../../shade/renderer/Renderer.js";
10
- import { Scene } from "../../shade/renderer/scene/Scene.js";
11
- import { Sampler2D } from "../graphics/texture/sampler/Sampler2D.js";
12
- import EmptyView from "../../view/elements/EmptyView.js";
13
- import { make_default_environment } from "./make_default_environment.js";
14
- import { shade_camera_projection_ray } from "./shade_camera_projection_ray.js";
15
- import { ShadeCameraAdapter } from "./ShadeCameraAdapter.js";
1
+ import { GraphicsEngine } from "./GraphicsEngine.js";
16
2
 
17
3
  /**
18
- * What an offscreen picture is drawn into. Not the canvas's presentation format on purpose: a
19
- * caller reading pixels back wants a channel order it can name, and the presentation format is
20
- * whatever the platform prefers.
4
+ * @deprecated Renamed to {@link GraphicsEngine}. The trailing `3` marked the 2.x 3.x renderer transition;
5
+ * the 2.x name it disambiguated against is gone, so the suffix no longer distinguishes anything.
21
6
  *
22
- * @type {string}
7
+ * Kept as a re-export rather than removed: this is a library, and an import path is as much a
8
+ * published interface as a class name.
23
9
  */
24
- const OFFSCREEN_FORMAT = "rgba8unorm";
25
-
26
- /**
27
- * Frames an offscreen picture is drawn before it is read.
28
- *
29
- * More than one because the frame is temporal: anti-aliasing, and every effect that reads last
30
- * frame's depth, need a history to have been written before what they produce is the picture rather
31
- * than the first draft of it. Small because the history is dropped by the resize that precedes it,
32
- * so this is how long convergence takes from nothing rather than how long it takes to forget a
33
- * previous subject.
34
- *
35
- * @type {number}
36
- */
37
- const OFFSCREEN_FRAMES = 8;
38
-
39
- /**
40
- * The frame rate dynamic resolution scaling holds, in frames per second.
41
- *
42
- * Thirty, by the sponsor's decision (D39). It is a **floor**, not a target the game aims to sit at:
43
- * the controller is silent while frames are cheaper than 33 ms, and everything it does happens on
44
- * hardware that cannot hold that. Raising it would mean trading resolution away on machines that
45
- * were coping.
46
- *
47
- * @type {number}
48
- */
49
- const TARGET_FRAME_RATE = 30;
50
-
51
- /**
52
- * The renderer meep 3 talks to: Shade behind the shape `GraphicsEngine` presented.
53
- *
54
- * It implements the **bootstrap seam** and nothing else — `{viewport, domElement, camera,
55
- * on.{preRender, postRender, contextLost, contextRestored, contextFailed}, needDraw, autoDraw,
56
- * start(), stop(), render(), updateSize()}` — because that is what `Engine` needs in order to boot,
57
- * and because the facade is deliberately not allowed to grow past §4.2 (D14).
58
- *
59
- * **Three things have been let through since, each by name.** {@link add_extension} /
60
- * {@link remove_extension} (E9), because an extension has to survive the restart that replaces the
61
- * renderer holding it, and
62
- * {@link scene_context} (E13, D29), because the managers a system needs — animation above all —
63
- * hang off Shade's per-scene GPU state and there is no other door to them. Both take or return
64
- * something the caller already owns; neither hands out the renderer.
65
- *
66
- * {@link renderer} is the third, and much the widest: it hands the renderer straight out, so
67
- * everything the other two are shaped to avoid is reachable through it. It is an escape hatch for
68
- * callers that have no other route, not a migration target — the old engine's 44
69
- * `.renderer`/`getRenderer()` call sites are each still a migration item.
70
- *
71
- * What is deliberately absent, and stays absent: `getRenderer()` (the old engine's accessor, and
72
- * the shape those call sites are being ported off), `layers` (CPU visibility dies with GPU
73
- * culling), `scene` (entities reach the scene through the mesh system, not through the facade),
74
- * and the three-shaped material manager.
75
- *
76
- * **Lifecycle differs from the old engine on purpose.** `GraphicsEngine` starts inside the `Engine`
77
- * constructor, which is why stopping an engine used to leave a restarted one with no renderer at
78
- * all. This one starts from `Engine.start()` and stops symmetrically, so `start → stop → start`
79
- * returns a working renderer (E1).
80
- */
81
- export class GraphicsEngine3 {
82
- /**
83
- * Duck-type the rest of the engine checks instead of `instanceof`, which is the convention
84
- * the legacy `CameraSystem` already used and `HeadsUpDisplaySystem` was moved onto in Phase 0.
85
- *
86
- * @returns {boolean}
87
- */
88
- get isGraphicsEngine() {
89
- return true;
90
- }
91
-
92
- /**
93
- * Shade's renderer. `null` before a successful {@link start} and again after {@link stop} —
94
- * the states a caller has to tolerate, which is why {@link render} checks rather than assumes.
95
- *
96
- * @type {Renderer|null}
97
- */
98
- #renderer = null;
99
-
100
- /**
101
- * Danger zone.
102
- * Be careful with what you do, with great Renderer comes great responsibility.
103
- * @returns {Renderer|null}
104
- */
105
- get renderer(){
106
- return this.#renderer;
107
- }
108
-
109
- /**
110
- * Trades internal resolution for frame time — see {@link dynamic_resolution}.
111
- *
112
- * @type {DynamicResolutionScaling}
113
- */
114
- #dynamic_resolution = new DynamicResolutionScaling();
115
-
116
- /**
117
- * When the previous frame was drawn, in the clock {@link performance} keeps. Seeded by
118
- * {@link start} so that the first frame after one has a real interval behind it rather than a
119
- * special case.
120
- *
121
- * @type {number}
122
- */
123
- #last_render_timestamp = 0;
124
-
125
- /**
126
- * Extensions registered through {@link add_extension}, in the order they were added — which is
127
- * not the order they record in: that is resolved from their own declarations, per phase, by the
128
- * registry the renderer holds.
129
- *
130
- * The engine holds them rather than the renderer because a renderer is replaced by every
131
- * restart while the systems that registered are not, and because a system has to be able to
132
- * register before a device exists.
133
- *
134
- * @type {RenderExtension[]}
135
- */
136
- #extensions = [];
137
-
138
- /**
139
- * The scene Shade draws.
140
- *
141
- * There is no getter, deliberately. The old engine handed its scene out and the editor wrote
142
- * into the graph directly — 14 call sites of coupling that §2.1 retires. Content reaches the
143
- * renderer through the system that owns it, which tells the facade *which* scene to draw and
144
- * keeps the graph to itself.
145
- *
146
- * @type {Scene}
147
- */
148
- #scene = new Scene();
149
-
150
- /**
151
- * @type {HTMLCanvasElement|null}
152
- */
153
- #canvas = null;
154
-
155
- /**
156
- * The camera the frame is drawn from. Owned here rather than handed in, because it is Shade's
157
- * and a caller building one would have to know that; what drives it is
158
- * {@link camera_sync_from_transform}, from whatever transform the active camera entity has.
159
- *
160
- * @type {PerspectiveCamera}
161
- */
162
- #camera = new PerspectiveCamera();
163
-
164
- constructor() {
165
- /**
166
- * The camera, in the shape the engine's existing consumers read it — `projectionMatrix` and
167
- * `matrixWorldInverse`, which is what `HeadsUpDisplaySystem` multiplies together. The real
168
- * Shade camera is on its `camera` property.
169
- *
170
- * @type {ShadeCameraAdapter}
171
- */
172
- this.camera = new ShadeCameraAdapter(this.#camera);
173
-
174
- this.on = {
175
- /**
176
- * **The camera-finalized phase.** Camera matrices are final and the frame has not been
177
- * submitted — which is what §2.1 already defines `preRender` to mean, so the old
178
- * engine's `visibilityConstructionStarted` / `visibilityConstructionEnded` do not
179
- * survive as signals of their own. Their subscribers — the legacy camera and light
180
- * systems, the editor's symbolic display — landed here when their systems were ported.
181
- *
182
- * @type {Signal}
183
- */
184
- preRender: new Signal(),
185
-
186
- /**
187
- * The frame has been submitted. Note that submitted is not finished — the GPU is still
188
- * working when this fires, on this renderer as on the last one.
189
- *
190
- * @type {Signal}
191
- */
192
- postRender: new Signal(),
193
-
194
- /**
195
- * The GPU device was lost. Nothing renders after this.
196
- *
197
- * @type {Signal}
198
- */
199
- contextLost: new Signal(),
200
-
201
- /**
202
- * **Never fires.** Kept because the contract has it and subscribers expect the shape,
203
- * but Shade does not recover a lost device (R6): everything the renderer built lived on
204
- * it, and a message plus a reload is the honest response. A subscriber here is waiting
205
- * for something that will not happen.
206
- *
207
- * @type {Signal<number>}
208
- */
209
- contextRestored: new Signal(),
210
-
211
- /**
212
- * There will be no rendering — no WebGPU, no adapter, or hardware below the floor.
213
- * Carries a {@link ShadeDeviceFailure}, whose `message` is written to be shown.
214
- *
215
- * @type {Signal<ShadeDeviceFailure>}
216
- */
217
- contextFailed: new Signal(),
218
- };
219
-
220
- /**
221
- * @type {Vector1}
222
- */
223
- this.pixelRatio = new Vector1(1);
224
-
225
- /**
226
- * Final render resolution in whole device pixels. Zero until the viewport has a size.
227
- *
228
- * @readonly
229
- * @type {Vector2}
230
- */
231
- this.output_resolution = new Vector2(0, 0);
232
-
233
- /**
234
- * The DOM element the canvas lives in. Created here rather than in {@link start} so that
235
- * layout can be wired before a device exists — and so a failed start still leaves something
236
- * to put a message in.
237
- *
238
- * @type {EmptyView}
239
- */
240
- this.viewport = new EmptyView();
241
- this.viewport.size.onChanged.add(this.updateSize, this);
242
-
243
- /**
244
- * @type {HTMLCanvasElement|null}
245
- */
246
- this.domElement = null;
247
-
248
- /**
249
- * Whether the next frame has anything new to show. With {@link autoDraw} off, this is what
250
- * gates rendering at all.
251
- *
252
- * @type {boolean}
253
- */
254
- this.needDraw = true;
255
-
256
- /**
257
- * Draw every tick regardless of {@link needDraw}. On-demand rendering — menus and the
258
- * editor that should not burn frames — is turning this off.
259
- *
260
- * @type {boolean}
261
- */
262
- this.autoDraw = true;
263
-
264
- /**
265
- * @type {number}
266
- */
267
- this.frameIndex = 0;
268
-
269
- /*
270
- Wired here rather than in `start`, because the closures read the field and the field is
271
- re-assigned on every start: a controller that captured one renderer would keep steering it
272
- after a context restart replaced it.
273
- */
274
- this.#dynamic_resolution.get_scale = () => this.#renderer.internal_resolution_scale;
275
- this.#dynamic_resolution.set_scale = v => {
276
- this.#renderer.internal_resolution_scale = v;
277
- };
278
-
279
- /*
280
- Stated rather than inherited. It happens to equal the controller's own default today, and
281
- that is not a reason to leave it unsaid: the game's target is the game's decision (D39), and
282
- a library default is free to move without anybody meaning the game to follow it.
283
- */
284
- this.#dynamic_resolution.target_frame_rate = TARGET_FRAME_RATE;
285
- }
286
-
287
- /**
288
- * Trades internal resolution for frame time, and is the only thing in this engine that does.
289
- *
290
- * Exposed so that it can be turned off or re-targeted — a measurement that wants a fixed
291
- * resolution, or a settings screen that offers the choice — and for no other reason: it drives
292
- * itself from {@link render}, and nothing has to call it.
293
- *
294
- * **It targets {@link TARGET_FRAME_RATE}**, which makes it a floor-holder rather than a
295
- * frame-rate governor: it does nothing at all until a frame costs more than 33 ms, and on
296
- * hardware that clears the budget it sits at full resolution and never engages.
297
- *
298
- * @returns {DynamicResolutionScaling}
299
- */
300
- get dynamic_resolution() {
301
- return this.#dynamic_resolution;
302
- }
303
-
304
- /**
305
- * Draw this scene from now on.
306
- *
307
- * The narrowest seam that works: the facade is told what to draw, rather than handing out a
308
- * graph for anyone to write into. Shade's own `render` takes the scene as an argument, so this
309
- * matches how the renderer underneath already thinks about it.
310
- *
311
- * @param {Scene} scene
312
- */
313
- set_scene(scene) {
314
- assert.defined(scene, 'scene');
315
- assert.equal(scene.isScene, true, 'scene.isScene !== true');
316
-
317
- this.#scene = scene;
318
-
319
- /*
320
- Shade lights with indirect by default and a scene without an environment renders unlit, so
321
- the engine supplies one rather than leaving every caller to. Turning global illumination off
322
- is the thing that takes a decision, not turning it on.
323
-
324
- A scene that arrives with an environment keeps it: the scene owns its lighting and this only
325
- fills in what is missing. Otherwise handing over a scene would silently discard the
326
- environment it was built with, and the fix would be to call things in a particular order.
327
- */
328
- if (scene.lights.environment === undefined) {
329
- scene.lights.environment = make_default_environment();
330
- }
331
- }
332
-
333
- /**
334
- * Set the scene's image-based-lighting source, replacing whatever it was lighting with.
335
- *
336
- * No prefiltering happens here, unlike the equivalent on the old engine: Shade convolves the map
337
- * into its irradiance and roughness mips on the GPU, notices when the texture it was given has
338
- * been swapped, and redoes that work itself. So this is an assignment and the renderer catches up
339
- * on the next frame — safe before startup as well as after.
340
- *
341
- * The texture must be **octahedral**, which is the projection Shade samples the environment with.
342
- * `load_environment_map` and `resample_equirectangular_to_octahedral` are the ways in; a cube or
343
- * equirectangular texture handed over directly would sample as garbage rather than fail.
344
- *
345
- * There is deliberately no `set_environment_texture` counterpart. On the old engine that meant
346
- * "and show it as the skybox too", and Shade has no background of its own to show it on — the
347
- * visible sky is its own piece of work rather than a second line here.
348
- *
349
- * @param {ShadeTexture} texture octahedral-encoded spherical radiance
350
- */
351
- set_environment_map(texture) {
352
- assert.defined(texture, 'texture');
353
- assert.equal(texture.isShadeTexture, true, 'texture.isShadeTexture !== true');
354
-
355
- this.#scene.lights.environment = texture;
356
-
357
- this.needDraw = true;
358
- }
359
-
360
- /**
361
- * Record work into the frame at a named point in it — §4.8's extensibility surface, and the
362
- * honest replacement for the old engine's `preRender` / `buffersRendered` / `postRender`
363
- * signals, each of which maps to a phase.
364
- *
365
- * The extension is handed a `FrameContext` when its phase comes round and records with the
366
- * `graph_*` helpers, exactly as the built-in passes do. Resource handles come from the frame's
367
- * records rather than from a renderer: the frame graph is what knows which resources a pass
368
- * touched, and work recorded around it cannot be ordered or aliased against the rest of the
369
- * frame.
370
- *
371
- * **Registering does not require a device.** Extensions are held here and applied to the
372
- * renderer when one exists, and again after a restart — a system registers at startup without
373
- * knowing where in the lifecycle it is.
374
- *
375
- * @param {RenderExtension} extension
376
- * @returns {RenderExtension} `extension`, for handing back to {@link remove_extension}
377
- */
378
- add_extension(extension) {
379
- assert.defined(extension, 'extension');
380
- assert.isFunction(extension.record, 'extension.record');
381
-
382
- this.#extensions.push(extension);
383
-
384
- if (this.#renderer !== null) {
385
- this.#renderer.add_extension(extension);
386
- }
387
-
388
- return extension;
389
- }
390
-
391
- /**
392
- * How many extensions are registered against a phase.
393
- *
394
- * Read-only, and here because a system that registers one otherwise has no way to say that it
395
- * did: the extension is private to the system that owns it, and "start → stop → start leaks
396
- * nothing" is a property a gate has to be able to state. It says how many, not what they are,
397
- * and hands out nothing.
398
- *
399
- * @param {FramePhase} phase
400
- * @returns {number}
401
- */
402
- extension_count(phase) {
403
- assert.isNonNegativeInteger(phase, 'phase');
404
-
405
- let count = 0;
406
-
407
- for (let i = 0; i < this.#extensions.length; i++) {
408
- if (this.#extensions[i].phase === phase) {
409
- count++;
410
- }
411
- }
412
-
413
- return count;
414
- }
415
-
416
- /**
417
- * Take an extension back out. Identity is the object, so the phase does not have to be
418
- * repeated.
419
- *
420
- * @param {RenderExtension} extension
421
- * @returns {boolean} whether it was registered
422
- */
423
- remove_extension(extension) {
424
- const index = this.#extensions.indexOf(extension);
425
-
426
- if (index === -1) {
427
- return false;
428
- }
429
-
430
- this.#extensions.splice(index, 1);
431
-
432
- if (this.#renderer !== null) {
433
- this.#renderer.remove_extension(extension);
434
- }
435
-
436
- return true;
437
- }
438
-
439
- /**
440
- * Shade's GPU-side state for a scene the caller already owns — and with it the managers that
441
- * hang off it, of which the animation manager is the one Phase 4 needs.
442
- *
443
- * **The one thing D14 lets through, and D29 is why** (E13). The alternative was a system
444
- * registering a frame pass that draws nothing, purely to be handed `context.view.scene` when
445
- * its phase came round — which would have made the animation system claim a moment in drawing
446
- * for work that is not drawing. A named method costs one line of surface and says what it is.
447
- *
448
- * **This still hands out no graph.** `scene` is an argument, not a getter: only the system that
449
- * owns a scene can ask about it, so the coupling §2.1 retires — the facade handing its graph to
450
- * anyone who asks — is not what this is. What comes back is the renderer's own bookkeeping for
451
- * that scene, which is Shade's to shape and no one else's.
452
- *
453
- * @param {Scene} scene
454
- * @returns {GPUSceneContext|null} `null` while there is no device — before a successful
455
- * {@link start} and again after {@link stop}. A restart builds a **new** context, so a caller
456
- * holding ids the old one issued has to notice the object changed and register again.
457
- */
458
- scene_context(scene) {
459
- assert.defined(scene, 'scene');
460
- assert.equal(scene.isScene, true, 'scene.isScene !== true');
461
-
462
- const renderer = this.#renderer;
463
-
464
- if (renderer === null) {
465
- return null;
466
- }
467
-
468
- return renderer.scenes.obtain(scene);
469
- }
470
-
471
- /**
472
- * Draw a scene of somebody else's into a texture of that size, and hand back its pixels.
473
- *
474
- * **Tooling only.** This is a GPU readback and I-4 forbids those on any gameplay-affecting path;
475
- * what it is here for is pictures of things — an asset library's icons, a thumbnail, a capture.
476
- *
477
- * **No renderer and no device leave the facade** (D14). What the caller brings is a scene and a
478
- * camera, both of which it built; what it gets back is a `Sampler2D`. The frame itself goes
479
- * through `Renderer.render_to_target` (D50), so the picture is drawn by the renderer that is
480
- * already running, with the geometry and the textures it already holds resident.
481
- *
482
- * **The renderer is resized for the call and put back afterwards.** Everything a frame is built
483
- * out of is sized from the output resolution, so a 64 x 64 picture means a 64 x 64 frame; the
484
- * temporal history that costs is dropped either way by the resize.
485
- *
486
- * @param {Scene} scene
487
- * @param {Camera} camera
488
- * @param {number} width texels
489
- * @param {number} height texels
490
- * @returns {Promise<Sampler2D>} RGBA, one byte a channel
491
- * @throws {Error} when there is no device — before a successful {@link start}, or after
492
- * {@link stop}
493
- */
494
- async render_to_sampler(scene, camera, width, height) {
495
- assert.defined(scene, 'scene');
496
- assert.defined(camera, 'camera');
497
- assert.isNonNegativeInteger(width, 'width');
498
- assert.isNonNegativeInteger(height, 'height');
499
- assert.greaterThan(width, 0, 'width');
500
- assert.greaterThan(height, 0, 'height');
501
-
502
- const renderer = this.#renderer;
503
-
504
- if (renderer === null) {
505
- throw new Error('cannot render without a device — start() has not run, or stop() has');
506
- }
507
-
508
- const target = renderer.graphics.textures.contextFromDescriptor(TextureDescriptor.from({
509
- label: "GraphicsEngine3/offscreen",
510
- size: [width, height, 1],
511
- format: OFFSCREEN_FORMAT,
512
- usage: GPUTextureUsage.RENDER_ATTACHMENT
513
- | GPUTextureUsage.TEXTURE_BINDING
514
- | GPUTextureUsage.COPY_SRC
515
- }));
516
-
517
- const pixel_ratio = renderer.pixel_ratio;
518
- const automatic_exposure = renderer.feature_automatic_exposure_enabled;
519
-
520
- try {
521
- renderer.pixel_ratio = 1;
522
- renderer.resize(width, height);
523
-
524
- /*
525
- A picture of one object against nothing has no scene to read an exposure off, and an
526
- adapting one would take the frames it adapts over — so a preview is drawn at the fixed
527
- exposure instead, which is what a studio light rig is for.
528
- */
529
- renderer.feature_automatic_exposure_enabled = false;
530
-
531
- for (let i = 0; i < OFFSCREEN_FRAMES; i++) {
532
- renderer.render_to_target(camera, scene, 1 / 60, target);
533
- }
534
-
535
- const data = await target.download();
536
-
537
- return new Sampler2D(data, 4, width, height);
538
- } finally {
539
- target.destroy();
540
-
541
- renderer.feature_automatic_exposure_enabled = automatic_exposure;
542
- renderer.pixel_ratio = pixel_ratio;
543
-
544
- this.updateSize();
545
- }
546
- }
547
-
548
- /**
549
- * Whether there is a device to render with.
550
- *
551
- * @returns {boolean}
552
- */
553
- get is_running() {
554
- return this.#renderer !== null;
555
- }
556
-
557
- /**
558
- * Stand a device up and attach its canvas to the viewport.
559
- *
560
- * Asynchronous because acquiring a WebGPU device is — there is no synchronous form of it — and
561
- * because failing to get one is a normal outcome that has to be reported rather than thrown
562
- * into a constructor. A failure raises `on.contextFailed` with a message written for a person
563
- * and rethrows, so a caller that wants to handle it can and one that does not still fails
564
- * loudly.
565
- *
566
- * @returns {Promise<void>}
567
- */
568
- async start() {
569
- if (this.#renderer !== null) {
570
- // already running; starting twice is a caller error rather than a no-op worth hiding
571
- throw new Error('GraphicsEngine3 is already started');
572
- }
573
-
574
- const canvas = document.createElement("canvas");
575
-
576
- canvas.classList.add("graphics-engine-render-canvas");
577
-
578
- const style = canvas.style;
579
-
580
- style.userSelect = style.webkitUserSelect = style.mozUserSelect = "none";
581
- // see https://www.w3.org/TR/pointerevents/#the-touch-action-css-property
582
- style.touchAction = "none";
583
-
584
- this.#canvas = canvas;
585
-
586
- const renderer = new Renderer();
587
-
588
- try {
589
- await renderer.initialize({ context: canvas.getContext('webgpu') });
590
- } catch (failure) {
591
- this.#canvas = null;
592
-
593
- this.on.contextFailed.send1(failure);
594
-
595
- throw failure;
596
- }
597
-
598
- renderer.onDeviceFailure.add(this.#handle_device_failure, this);
599
-
600
- // Extensions outlive the device: they are registered against the engine, not against a
601
- // renderer that a restart replaces. This is what makes a system able to register once, at
602
- // startup, without knowing whether a device exists yet.
603
- for (let i = 0; i < this.#extensions.length; i++) {
604
- renderer.add_extension(this.#extensions[i]);
605
- }
606
-
607
- this.#renderer = renderer;
608
- this.domElement = canvas;
609
-
610
- // Re-point the viewport, and the page with it. This is the wrinkle E1 named: `start` builds
611
- // a *new* canvas, so a restart would otherwise leave the dead one mounted and the live one
612
- // detached. `View.el` is read unguarded all over the view layer, so it is replaced rather
613
- // than cleared — it always holds an element.
614
- const previous = this.viewport.el;
615
-
616
- this.viewport.el = canvas;
617
-
618
- if (previous != null && previous.parentNode !== null) {
619
- previous.parentNode.replaceChild(canvas, previous);
620
- }
621
-
622
- this.updateSize();
623
-
624
- // so the first frame's interval is a real one rather than the whole of the boot
625
- this.#last_render_timestamp = performance.now();
626
- }
627
-
628
- /**
629
- * Tear the device down and let go of the canvas.
630
- *
631
- * Symmetric with {@link start}, and that symmetry is the point: the old engine started in a
632
- * constructor and could not be restarted.
633
- */
634
- stop() {
635
- const renderer = this.#renderer;
636
-
637
- if (renderer === null) {
638
- // never started, or stopped twice — nothing to undo
639
- return;
640
- }
641
-
642
- renderer.onDeviceFailure.remove(this.#handle_device_failure, this);
643
- renderer.destroy();
644
-
645
- this.#renderer = null;
646
- this.#canvas = null;
647
- this.domElement = null;
648
-
649
- // `viewport.el` is deliberately left pointing at the spent canvas rather than cleared: the
650
- // view layer reads it without checking, and the next `start` swaps it for a live one.
651
- }
652
-
653
- /**
654
- * @param {ShadeDeviceFailure} failure
655
- */
656
- #handle_device_failure(failure) {
657
- this.on.contextLost.dispatch(failure);
658
- }
659
-
660
- /**
661
- * A pointer position in viewport pixels, as a clip-space point.
662
- *
663
- * Unchanged from the old engine, down to writing into a caller's vector: it is arithmetic on the
664
- * viewport size and has nothing to do with which renderer is underneath.
665
- *
666
- * @param {Vector2|Vector3} input viewport pixels, origin top-left
667
- * @param {Vector2|Vector3} result written with −1…1, +Y up
668
- */
669
- normalizeViewportPoint(input, result) {
670
- const size = this.viewport.size;
671
-
672
- // shifted by half a pixel, so the value names the centre of the pixel rather than its corner
673
- result.x = ((input.x + 0.5) / size.x) * 2 - 1;
674
- result.y = -((input.y + 0.5) / size.y) * 2 + 1;
675
- }
676
-
677
- /**
678
- * A ray from the eye through a point on the viewport, in world space.
679
- *
680
- * Same name, same arguments, same meaning as on the old engine — and the same expectation that
681
- * `x` and `y` are **clip-space**, which {@link normalizeViewportPoint} is what produces. What is
682
- * behind it is Shade's camera rather than three's; see {@link shade_camera_projection_ray}.
683
- *
684
- * This is the only picking primitive the game actually needs. Every gameplay pick is a terrain
685
- * raycast — an exact query against the terrain's own representation, which no part of the renderer
686
- * is involved in — so a working ray is the whole of the renderer's contribution to it.
687
- *
688
- * @param {number} x clip space, −1…1
689
- * @param {number} y clip space, −1…1, +Y up
690
- * @param {Vector3} source written with the ray's origin
691
- * @param {Vector3} direction written with a unit direction
692
- */
693
- viewportProjectionRay(x, y, source, direction) {
694
- shade_camera_projection_ray(this.#camera, x, y, source, direction);
695
- }
696
-
697
- /**
698
- * Size the drawing buffer to the viewport.
699
- *
700
- * Shade's `resize` takes a **CSS** size and applies the device pixel ratio itself, which is the
701
- * opposite of what the old engine's renderer wanted — so what it is given here is the viewport
702
- * size scaled by the engine's own `pixelRatio` and nothing more. `output_resolution` is then
703
- * the device-pixel figure, for everything that has to land on the same texel grid.
704
- */
705
- updateSize() {
706
- const size = this.viewport.size;
707
- const pixel_ratio = this.pixelRatio.getValue();
708
-
709
- const css_width = max2(0, size.x * pixel_ratio);
710
- const css_height = max2(0, size.y * pixel_ratio);
711
-
712
- const renderer = this.#renderer;
713
-
714
- if (renderer !== null) {
715
- renderer.resize(css_width, css_height);
716
- }
717
-
718
- if (this.domElement !== null) {
719
- this.domElement.style.width = size.x + "px";
720
- this.domElement.style.height = size.y + "px";
721
- }
722
-
723
- const device_pixel_ratio = window.devicePixelRatio;
724
-
725
- // clamped to 1 for the same reason the old engine clamped it: a collapsed viewport still
726
- // allocates attachments, and a zero-sized one is not a legal target
727
- this.output_resolution.set(
728
- max2(1, Math.floor(css_width * device_pixel_ratio)),
729
- max2(1, Math.floor(css_height * device_pixel_ratio))
730
- );
731
- }
732
-
733
- /**
734
- * Draw a frame, if there is anything to draw it with.
735
- *
736
- * @param {number} [time_delta_seconds]
737
- * @returns {boolean} whether a frame was submitted
738
- */
739
- render(time_delta_seconds = 1 / 60) {
740
- const renderer = this.#renderer;
741
-
742
- if (renderer === null) {
743
- return false;
744
- }
745
-
746
- const viewport_size = this.viewport.size;
747
-
748
- if (viewport_size.x <= 0 || viewport_size.y <= 0) {
749
- /*
750
- There is no surface to draw into. Every boot passes through this — the renderer starts
751
- before the game view is laid out — and so does any collapsed or unmounted view.
752
- Drawing anyway is worse than drawing nothing: `output_resolution` and the renderer's
753
- own resolutions both floor at one texel, and a one-texel target is a size the frame's
754
- mip chains cannot be built from, so what a frame produces here is a run of invalid
755
- textures rather than a picture. `needDraw` is left set, so the next frame retries.
756
- */
757
- return false;
758
- }
759
-
760
- /*
761
- The **refresh** interval, measured here rather than taken from `time_delta_seconds`. What
762
- the controller steers by has to be how long a frame actually took, wall clock, including
763
- everything outside this call; the argument is the simulation's delta, which is clamped and
764
- is not the same quantity. Measuring between calls is also what makes this correct for any
765
- driver — the engine's animation frame, or a probe calling `render` directly.
766
- */
767
- const now = performance.now();
768
-
769
- this.#dynamic_resolution.notify_frame((now - this.#last_render_timestamp) / 1000);
770
-
771
- this.#last_render_timestamp = now;
772
-
773
- // Aspect follows the surface being drawn to, so it is refreshed here rather than left to
774
- // whoever last resized: a camera describing a viewport that has since changed shape is the
775
- // classic source of a stretched frame.
776
- this.#camera.aspect = renderer.aspect_ratio;
777
- this.#camera.update();
778
-
779
- this.on.preRender.dispatch();
780
-
781
- const submitted = renderer.render(this.#camera, this.#scene, time_delta_seconds);
782
-
783
- this.frameIndex++;
784
- this.needDraw = false;
785
-
786
- this.on.postRender.dispatch();
787
-
788
- return submitted;
789
- }
790
- }
10
+ export const GraphicsEngine3 = GraphicsEngine;