@woosh/meep-engine 3.11.3 → 3.12.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 (401) 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/graph_build_decal_clusters.d.ts.map +1 -1
  168. package/src/engine/graphics3/decal/graph_build_decal_clusters.js +6 -8
  169. package/src/engine/graphics3/decal/shader_cluster_assign_decals.d.ts +0 -7
  170. package/src/engine/graphics3/decal/shader_cluster_assign_decals.d.ts.map +1 -1
  171. package/src/engine/graphics3/decal/shader_cluster_assign_decals.js +1 -1
  172. package/src/engine/graphics3/decal/shader_cull_decals_frustum.d.ts +0 -4
  173. package/src/engine/graphics3/decal/shader_cull_decals_frustum.d.ts.map +1 -1
  174. package/src/engine/graphics3/decal/shader_cull_decals_frustum.js +1 -1
  175. package/src/engine/graphics3/highlight/pack_highlight_table.d.ts +2 -2
  176. package/src/engine/graphics3/highlight/pack_highlight_table.d.ts.map +1 -1
  177. package/src/engine/graphics3/highlight/pack_highlight_table.js +74 -74
  178. package/src/engine/graphics3/pose/query_entity_node_world_pose.d.ts +1 -1
  179. package/src/engine/graphics3/pose/query_entity_node_world_pose.js +101 -101
  180. package/src/engine/graphics3/preview/make_model_thumbnail.d.ts +3 -3
  181. package/src/engine/graphics3/preview/make_model_thumbnail.d.ts.map +1 -1
  182. package/src/engine/graphics3/preview/make_model_thumbnail.js +48 -48
  183. package/src/engine/graphics3/shade_camera_projection_ray.d.ts +1 -1
  184. package/src/engine/graphics3/shade_camera_projection_ray.js +77 -77
  185. package/src/engine/graphics3/shade_node_to_entity_composition.d.ts +1 -1
  186. package/src/engine/graphics3/shade_node_to_entity_composition.js +84 -84
  187. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_leaf_triangles.d.ts.map +1 -1
  188. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_leaf_triangles.js +0 -1
  189. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_points.d.ts.map +1 -1
  190. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_points.js +0 -1
  191. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_visibility.d.ts.map +1 -1
  192. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_visibility.js +133 -134
  193. package/src/shade/playground/skinned_blas_refit/verify_leaf_triangles.js +202 -202
  194. package/src/shade/playground/skinned_blas_refit/verify_traversal_reachability.js +249 -249
  195. package/src/shade/renderer/STATIC_GRAPHICS_ENGINE_ASSETS.js +1 -1
  196. package/src/shade/renderer/animation/pose/PosePlayback.d.ts +2 -1
  197. package/src/shade/renderer/animation/pose/PosePlayback.d.ts.map +1 -1
  198. package/src/shade/renderer/animation/pose/PosePlayback.js +2 -1
  199. package/src/shade/renderer/animation/shader_animation_apply.d.ts.map +1 -1
  200. package/src/shade/renderer/animation/shader_animation_apply.js +128 -129
  201. package/src/shade/renderer/animation/shader_animation_pose_resolve.d.ts.map +1 -1
  202. package/src/shade/renderer/animation/shader_animation_pose_resolve.js +176 -177
  203. package/src/shade/renderer/animation/shader_animation_tick.d.ts.map +1 -1
  204. package/src/shade/renderer/animation/shader_animation_tick.js +125 -126
  205. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_geometry_sphere_derive.d.ts.map +1 -1
  206. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_geometry_sphere_derive.js +98 -99
  207. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_reduce.d.ts.map +1 -1
  208. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_reduce.js +212 -213
  209. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_scatter.d.ts.map +1 -1
  210. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_scatter.js +120 -121
  211. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_skinned_mesh_bounds_refresh.d.ts.map +1 -1
  212. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_skinned_mesh_bounds_refresh.js +75 -76
  213. package/src/shade/renderer/animation/skinning/shader_meshlet_apply_skinning.d.ts.map +1 -1
  214. package/src/shade/renderer/animation/skinning/shader_meshlet_apply_skinning.js +371 -372
  215. package/src/shade/renderer/animation/skinning/shader_skin_matrix_prep.d.ts.map +1 -1
  216. package/src/shade/renderer/animation/skinning/shader_skin_matrix_prep.js +104 -105
  217. package/src/shade/renderer/atmosphere/shader_multiscatter_lut.d.ts.map +1 -1
  218. package/src/shade/renderer/atmosphere/shader_multiscatter_lut.js +0 -1
  219. package/src/shade/renderer/buffer/graph_inspect_gpu_buffer.js +136 -136
  220. package/src/shade/renderer/buffer/table/GPUDatabase.d.ts.map +1 -1
  221. package/src/shade/renderer/buffer/table/GPUDatabase.js +2 -3
  222. package/src/shade/renderer/buffer/table/single/GPUSingleTypeTable.js +319 -319
  223. package/src/shade/renderer/buffer/util/shader_buffer_copy_storage_to_storage.d.ts.map +1 -1
  224. package/src/shade/renderer/buffer/util/shader_buffer_copy_storage_to_storage.js +41 -42
  225. package/src/shade/renderer/buffer/util/shader_buffer_intra_copy_regions.d.ts.map +1 -1
  226. package/src/shade/renderer/buffer/util/shader_buffer_intra_copy_regions.js +83 -84
  227. package/src/shade/renderer/dynamic/shader_dynamic_mesh.d.ts.map +1 -1
  228. package/src/shade/renderer/dynamic/shader_dynamic_mesh.js +177 -170
  229. package/src/shade/renderer/extension/RENDER_EXTENSION_DESIGN.md +918 -918
  230. package/src/shade/renderer/geometry/bvh/record_blas_refit.js +4 -4
  231. package/src/shade/renderer/geometry/bvh/shader_blas_refit_leaf_bounds.d.ts.map +1 -1
  232. package/src/shade/renderer/geometry/bvh/shader_blas_refit_leaf_bounds.js +121 -122
  233. package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.js +774 -774
  234. package/src/shade/renderer/geometry/meshlet/shader_meshlet_metadata_address_patch.d.ts +1 -1
  235. package/src/shade/renderer/geometry/meshlet/shader_meshlet_metadata_address_patch.d.ts.map +1 -1
  236. package/src/shade/renderer/geometry/meshlet/shader_meshlet_metadata_address_patch.js +69 -70
  237. package/src/shade/renderer/global_illumination/lpv/placement/graph_generate_probe_locations.js +367 -367
  238. package/src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_lvp_atlas_to_sh.js +184 -184
  239. package/src/shade/renderer/gpu_primitive/bvh/GPU_BVH_BUILD_PLAN.md +1115 -1115
  240. package/src/shade/renderer/gpu_primitive/bvh/graph_bvh_build_lbvh.js +217 -217
  241. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_emit_hierarchy.d.ts.map +1 -1
  242. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_emit_hierarchy.js +142 -143
  243. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_morton.d.ts.map +1 -1
  244. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_morton.js +0 -1
  245. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_refit.d.ts.map +1 -1
  246. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_refit.js +140 -141
  247. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_histogram.d.ts.map +1 -1
  248. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_histogram.js +0 -1
  249. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_scatter.d.ts.map +1 -1
  250. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_scatter.js +0 -1
  251. package/src/shade/renderer/light/cluster/cull/graph_cull_lights.d.ts.map +1 -1
  252. package/src/shade/renderer/light/cluster/cull/graph_cull_lights.js +191 -198
  253. package/src/shade/renderer/light/cluster/cull/shader_cull_lights_frustum.d.ts +0 -6
  254. package/src/shade/renderer/light/cluster/cull/shader_cull_lights_frustum.d.ts.map +1 -1
  255. package/src/shade/renderer/light/cluster/cull/shader_cull_lights_frustum.js +120 -120
  256. package/src/shade/renderer/light/cluster/cull/shader_cull_lights_hzb.d.ts +0 -4
  257. package/src/shade/renderer/light/cluster/cull/shader_cull_lights_hzb.d.ts.map +1 -1
  258. package/src/shade/renderer/light/cluster/cull/shader_cull_lights_hzb.js +112 -112
  259. package/src/shade/renderer/light/cluster/graph_assign_clsuters.d.ts.map +1 -1
  260. package/src/shade/renderer/light/cluster/graph_assign_clsuters.js +4 -7
  261. package/src/shade/renderer/light/cluster/shader_cluster_assign_lights.d.ts +0 -6
  262. package/src/shade/renderer/light/cluster/shader_cluster_assign_lights.d.ts.map +1 -1
  263. package/src/shade/renderer/light/cluster/shader_cluster_assign_lights.js +1 -1
  264. package/src/shade/renderer/lightmap/bake/raster/shader_lightmap_to_viz_buffer.js +222 -222
  265. package/src/shade/renderer/lightmap/bake/tile/shader_lightmap_tile_composit.js +81 -81
  266. package/src/shade/renderer/material/GPUMaterialContext.js +380 -380
  267. package/src/shade/renderer/material/standard/fragment_gbuffer_vt.js +169 -169
  268. package/src/shade/renderer/object_property/shader_object_property_process.d.ts.map +1 -1
  269. package/src/shade/renderer/object_property/shader_object_property_process.js +83 -84
  270. package/src/shade/renderer/object_property/shader_refresh_all_mesh_bounds.d.ts.map +1 -1
  271. package/src/shade/renderer/object_property/shader_refresh_all_mesh_bounds.js +57 -58
  272. package/src/shade/renderer/particles/prototypeParticleSystem.js +2 -3
  273. package/src/shade/renderer/particles/shaders/shader_particle_emit.d.ts.map +1 -1
  274. package/src/shade/renderer/particles/shaders/shader_particle_emit.js +117 -118
  275. package/src/shade/renderer/particles/shaders/shader_particle_finalize.d.ts.map +1 -1
  276. package/src/shade/renderer/particles/shaders/shader_particle_finalize.js +77 -79
  277. package/src/shade/renderer/particles/shaders/shader_particle_render.d.ts.map +1 -1
  278. package/src/shade/renderer/particles/shaders/shader_particle_render.js +190 -183
  279. package/src/shade/renderer/particles/shaders/shader_particle_simulate.d.ts.map +1 -1
  280. package/src/shade/renderer/particles/shaders/shader_particle_simulate.js +99 -100
  281. package/src/shade/renderer/particles/sort/shader_particle_sort.d.ts.map +1 -1
  282. package/src/shade/renderer/particles/sort/shader_particle_sort.js +158 -161
  283. package/src/shade/renderer/path_tracer/graph_path_trace_scene.js +184 -184
  284. package/src/shade/renderer/postprocess/denoise/graph_atorus_denoise_luma.js +119 -119
  285. package/src/shade/renderer/postprocess/dof/raymarch/graph_postprocess_dof.js +3 -4
  286. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_raymarch_compute.d.ts.map +1 -1
  287. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_raymarch_compute.js +266 -267
  288. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_slice_compute.d.ts.map +1 -1
  289. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_slice_compute.js +270 -271
  290. package/src/shade/renderer/postprocess/nss/shader_nss_concat.d.ts.map +1 -1
  291. package/src/shade/renderer/postprocess/nss/shader_nss_concat.js +68 -69
  292. package/src/shade/renderer/postprocess/nss/shader_nss_conv_layer.d.ts.map +1 -1
  293. package/src/shade/renderer/postprocess/nss/shader_nss_conv_layer.js +225 -226
  294. package/src/shade/renderer/postprocess/nss/shader_nss_extract_feedback.d.ts.map +1 -1
  295. package/src/shade/renderer/postprocess/nss/shader_nss_extract_feedback.js +49 -50
  296. package/src/shade/renderer/postprocess/nss/shader_nss_postprocess.d.ts.map +1 -1
  297. package/src/shade/renderer/postprocess/nss/shader_nss_postprocess.js +291 -292
  298. package/src/shade/renderer/postprocess/nss/shader_nss_preprocess.d.ts.map +1 -1
  299. package/src/shade/renderer/postprocess/nss/shader_nss_preprocess.js +230 -231
  300. package/src/shade/renderer/postprocess/ssr/reproject/shader_ffx_denoiser_reflections_reproject.d.ts +16 -2
  301. package/src/shade/renderer/postprocess/ssr/reproject/shader_ffx_denoiser_reflections_reproject.d.ts.map +1 -1
  302. package/src/shade/renderer/postprocess/ssr/reproject/shader_ffx_denoiser_reflections_reproject.js +12 -12
  303. package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.js +2 -2
  304. package/src/shade/renderer/rasterize/bucket/shader_count_meshlets_by_material.d.ts.map +1 -1
  305. package/src/shade/renderer/rasterize/bucket/shader_count_meshlets_by_material.js +68 -69
  306. package/src/shade/renderer/rasterize/bucket/shader_make_meshlet_indirect_draw_commands_by_material.d.ts.map +1 -1
  307. package/src/shade/renderer/rasterize/bucket/shader_make_meshlet_indirect_draw_commands_by_material.js +59 -60
  308. package/src/shade/renderer/rasterize/bucket/shader_read_out_bucket.d.ts.map +1 -1
  309. package/src/shade/renderer/rasterize/bucket/shader_read_out_bucket.js +0 -1
  310. package/src/shade/renderer/rasterize/bucket/shader_sort_meshlets_by_material.d.ts.map +1 -1
  311. package/src/shade/renderer/rasterize/bucket/shader_sort_meshlets_by_material.js +64 -65
  312. package/src/shade/renderer/rasterize/compute/graph_mesh_frustum_cull.d.ts.map +1 -1
  313. package/src/shade/renderer/rasterize/compute/graph_mesh_frustum_cull.js +168 -169
  314. package/src/shade/renderer/rasterize/compute/graph_mesh_sphere_cull.d.ts.map +1 -1
  315. package/src/shade/renderer/rasterize/compute/graph_mesh_sphere_cull.js +160 -161
  316. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_mesh_filter_2way.d.ts.map +1 -1
  317. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_mesh_filter_2way.js +109 -110
  318. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_meshlet_filter_1way_full.d.ts.map +1 -1
  319. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_meshlet_filter_1way_full.js +115 -116
  320. package/src/shade/renderer/rasterize/expand/bucket/mesh/shader_instances_classify_bucket.d.ts.map +1 -1
  321. package/src/shade/renderer/rasterize/expand/bucket/mesh/shader_instances_classify_bucket.js +139 -140
  322. package/src/shade/renderer/rasterize/expand/bucket/mesh/shader_instances_count_by_rasterization_bucket.d.ts.map +1 -1
  323. package/src/shade/renderer/rasterize/expand/bucket/mesh/shader_instances_count_by_rasterization_bucket.js +91 -92
  324. package/src/shade/renderer/rasterize/expand/bucket/mesh/shader_instances_rasterization_bucket_sort.d.ts.map +1 -1
  325. package/src/shade/renderer/rasterize/expand/bucket/mesh/shader_instances_rasterization_bucket_sort.js +88 -89
  326. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_count_by_rasterization_bucket.d.ts.map +1 -1
  327. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_count_by_rasterization_bucket.js +90 -91
  328. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_extract_bucket.d.ts.map +1 -1
  329. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_extract_bucket.js +65 -66
  330. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_rasterization_bucket_sort.d.ts.map +1 -1
  331. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_rasterization_bucket_sort.js +89 -90
  332. package/src/shade/renderer/rasterize/expand/graph_mesh_filter_one_way.d.ts.map +1 -1
  333. package/src/shade/renderer/rasterize/expand/graph_mesh_filter_one_way.js +169 -170
  334. package/src/shade/renderer/rasterize/expand/mesh/shader_mesh_expand_to_meshlets_prefix.d.ts.map +1 -1
  335. package/src/shade/renderer/rasterize/expand/mesh/shader_mesh_expand_to_meshlets_prefix.js +89 -90
  336. package/src/shade/renderer/rasterize/expand/mesh/shader_meshes_to_meshlet_counts.d.ts.map +1 -1
  337. package/src/shade/renderer/rasterize/expand/mesh/shader_meshes_to_meshlet_counts.js +61 -62
  338. package/src/shade/renderer/rasterize/expand/pass1/filter_meshlets.2-way.compute.d.ts.map +1 -1
  339. package/src/shade/renderer/rasterize/expand/pass1/filter_meshlets.2-way.compute.js +153 -154
  340. package/src/shade/renderer/rasterize/native/depth/shadow_rasterization_alpha_tested_pass_descriptor.js +144 -144
  341. package/src/shade/renderer/rasterize/native/depth/shadow_rasterization_pass_descriptor.js +88 -88
  342. package/src/shade/renderer/rasterize/native/oit/shader_oit_generate_moments.js +217 -217
  343. package/src/shade/renderer/rasterize/native/oit/shader_oit_resolve_moments.js +179 -179
  344. package/src/shade/renderer/rasterize/native/oit/shader_oit_resolve_moments_ibl.js +178 -178
  345. package/src/shade/renderer/rasterize/native/viz/viz_rasterization_alpha_tested_pass_descriptor.js +194 -194
  346. package/src/shade/renderer/rasterize/native/viz/viz_rasterization_opaque_pass_descriptor.js +76 -76
  347. package/src/shade/renderer/restir/di/shader_restir_di_denoise.d.ts.map +1 -1
  348. package/src/shade/renderer/restir/di/shader_restir_di_denoise.js +136 -137
  349. package/src/shade/renderer/restir/di/shader_restir_di_resample.d.ts.map +1 -1
  350. package/src/shade/renderer/restir/di/shader_restir_di_resample.js +129 -130
  351. package/src/shade/renderer/restir/di/shader_restir_di_resolve.d.ts.map +1 -1
  352. package/src/shade/renderer/restir/di/shader_restir_di_resolve.js +99 -100
  353. package/src/shade/renderer/restir/di/shader_restir_di_spatial.d.ts.map +1 -1
  354. package/src/shade/renderer/restir/di/shader_restir_di_spatial.js +116 -117
  355. package/src/shade/renderer/scene/GPUInstancesAccelerationStructure.js +383 -383
  356. package/src/shade/renderer/scene/hierarchy/graph_scene_update_transform_hierarchy_naive.js +123 -123
  357. package/src/shade/renderer/scene/hierarchy/shader_nodes_record_input_positions.d.ts.map +1 -1
  358. package/src/shade/renderer/scene/hierarchy/shader_nodes_record_input_positions.js +64 -65
  359. package/src/shade/renderer/scene/hierarchy/shader_nodes_update_transform_hierarchy.d.ts.map +1 -1
  360. package/src/shade/renderer/scene/hierarchy/shader_nodes_update_transform_hierarchy.js +372 -373
  361. package/src/shade/renderer/scene/hierarchy/shader_nodes_update_transform_hierarchy_naive.d.ts.map +1 -1
  362. package/src/shade/renderer/scene/hierarchy/shader_nodes_update_transform_hierarchy_naive.js +111 -112
  363. package/src/shade/renderer/scene/shader_bvh_extract_instance_leaves.d.ts.map +1 -1
  364. package/src/shade/renderer/scene/shader_bvh_extract_instance_leaves.js +0 -1
  365. package/src/shade/renderer/shader/ComputeShader.d.ts +24 -3
  366. package/src/shade/renderer/shader/ComputeShader.d.ts.map +1 -1
  367. package/src/shade/renderer/shader/ComputeShader.js +350 -296
  368. package/src/shade/renderer/shader/ImageShader.js +217 -217
  369. package/src/shade/renderer/shader/ShaderDescriptor.d.ts +5 -0
  370. package/src/shade/renderer/shader/ShaderDescriptor.d.ts.map +1 -1
  371. package/src/shade/renderer/shader/ShaderDescriptor.js +20 -0
  372. package/src/shade/renderer/shader/util/compute_infer_workgroup_size_from_source.d.ts +47 -0
  373. package/src/shade/renderer/shader/util/compute_infer_workgroup_size_from_source.d.ts.map +1 -0
  374. package/src/shade/renderer/shader/util/compute_infer_workgroup_size_from_source.js +448 -0
  375. package/src/shade/renderer/shadow/map/csm/graph_csm_setup_cascades.js +3 -3
  376. package/src/shade/renderer/shadow/ray/staged/gen/graph_gen_rays.js +3 -3
  377. package/src/shade/renderer/shadow/ray/staged/trace/graph_trace_rays.js +2 -2
  378. package/src/shade/renderer/shadow/sdf/cascade/CascadedSceneSDF.js +4 -4
  379. package/src/shade/renderer/texture/virtual/build_shader_vt_feedback.d.ts.map +1 -1
  380. package/src/shade/renderer/texture/virtual/build_shader_vt_feedback.js +231 -232
  381. package/src/shade/renderer/volumetrics/GPUViewVolumetrics.js +1 -1
  382. package/src/shade/renderer/volumetrics/graph_build_volumetrics.d.ts.map +1 -1
  383. package/src/shade/renderer/volumetrics/graph_build_volumetrics.js +12 -15
  384. package/src/shade/renderer/volumetrics/shader_volumetrics_build_lighting.d.ts +3 -2
  385. package/src/shade/renderer/volumetrics/shader_volumetrics_build_lighting.d.ts.map +1 -1
  386. package/src/shade/renderer/volumetrics/shader_volumetrics_build_lighting.js +3 -2
  387. package/src/shade/renderer/volumetrics/taa/shader_volumetrics_taa.d.ts +0 -2
  388. package/src/shade/renderer/volumetrics/taa/shader_volumetrics_taa.d.ts.map +1 -1
  389. package/src/shade/renderer/volumetrics/taa/shader_volumetrics_taa.js +17 -6
  390. package/src/shade/renderer/water/shader_water.js +246 -246
  391. package/src/shade/vitest.setup.mjs +1 -1
  392. package/src/shade/wgsl/emulator/ComputeShaderEmulator.js +291 -291
  393. package/src/view/minimap/Minimap.d.ts +2 -2
  394. package/src/view/minimap/Minimap.d.ts.map +1 -1
  395. package/src/view/minimap/Minimap.js +225 -225
  396. package/src/view/minimap/dom/MinimapCameraView.d.ts +3 -3
  397. package/src/view/minimap/dom/MinimapCameraView.d.ts.map +1 -1
  398. package/src/view/minimap/dom/MinimapCameraView.js +206 -206
  399. package/src/shade/renderer/shadow/map/csm/shader/shader_setup_cascades.d.ts +0 -3
  400. package/src/shade/renderer/shadow/map/csm/shader/shader_setup_cascades.d.ts.map +0 -1
  401. package/src/shade/renderer/shadow/map/csm/shader/shader_setup_cascades.js +0 -20
@@ -1,203 +1,203 @@
1
- import { assert } from "../../core/assert.js";
2
- import { combine_hash } from "../../core/collection/array/combine_hash.js";
3
- import { rgb_to_luminance } from "../../core/color/rgb_to_luminance.js";
4
- import { computeHashFloat } from "../../core/primitives/numbers/computeHashFloat.js";
5
- import {
6
- VOLUMETRIC_PARTICLE_SPEC_FOG,
7
- VolumetricsParticleSpec
8
- } from "../../shade/renderer/volumetrics/ParticipatingMediaVolume.js";
9
-
10
- /**
11
- * Particles per cubic metre of dense fog, which is what a medium is until it is told otherwise.
12
- * @type {number}
13
- */
14
- const DEFAULT_DENSITY = 3e7;
15
-
16
- /**
17
- * @type {number}
18
- */
19
- const DEFAULT_FADE_DISTANCE = 0.1;
20
-
21
- /**
22
- * A box of fog, smoke, dust or cloud that an entity carries around.
23
- *
24
- * **What is in here is the medium; the {@link Transform} beside it is the box.** Shade's
25
- * {@link ParticipatingMediaVolume} is a unit cube centred on the origin, posed by a transform — so
26
- * position, size and orientation are already an ECS concept and there is nothing to restate. Which
27
- * is also why this component does nothing on its own: {@link ParticipatingMediaSystem3} links it
28
- * against a `Transform` and only that pair becomes a volume.
29
- *
30
- * **Three numbers, in two different currencies.** {@link particle_spec} is what a single particle
31
- * does to light — a Mie solution, physical and reusable — and {@link density} is how many of them
32
- * there are per cubic metre. The pair is what makes smoke and fog different things rather than the
33
- * same fog at two strengths. Authoring in raw density means knowing the cross-sections, so
34
- * {@link target_extinction} exists to author the other way round: say how much light the medium
35
- * should swallow and let the particle decide the count.
36
- *
37
- * @see ParticipatingMediaSystem3 what turns this into something the renderer draws
38
- * @see ParticipatingMediaVolume the renderer's own object
39
- */
40
- export class ParticipatingMedia {
41
-
42
- /**
43
- * Particles per cubic metre.
44
- *
45
- * Physically a count, so the numbers are large — the default is dense fog — and the useful range
46
- * depends entirely on {@link particle_spec}: a cloud droplet blocks far more light than a haze
47
- * particle, so the same count of them is a very different medium.
48
- *
49
- * @type {number}
50
- */
51
- density = DEFAULT_DENSITY;
52
-
53
- /**
54
- * What one particle of this medium does to light.
55
- *
56
- * Defaults to fog. The generated `MIE_PARTICLES_STANDARD_PRECOMPUTED` library is where the
57
- * physically meaningful values live — `VolumetricsParticleSpec.fromMeep` converts an entry of it
58
- * into one of these.
59
- *
60
- * @type {VolumetricsParticleSpec}
61
- */
62
- particle_spec = VolumetricsParticleSpec.fromJSON(VOLUMETRIC_PARTICLE_SPEC_FOG);
63
-
64
- /**
65
- * How far in from the box's faces the medium fades out, in metres.
66
- *
67
- * **World-space, and deliberately not scaled by the transform**, so a 0.5 here is half a metre
68
- * of softness whether the volume is a metre across or a hundred. Zero gives the box hard edges,
69
- * which is visible as a straight line across the screen wherever the box crosses the view.
70
- *
71
- * @type {number}
72
- */
73
- fade_distance = DEFAULT_FADE_DISTANCE;
74
-
75
- /**
76
- * The medium's extinction per metre, which is {@link density} expressed in what it does rather
77
- * than in how many particles it took.
78
- *
79
- * The point of it is that it is comparable across particles: a smoke volume and a fog volume set
80
- * to the same target extinction swallow the same amount of light, while the same *density* in
81
- * both would differ by orders of magnitude.
82
- *
83
- * **Derived, not stored** — writing it sets {@link density}, and changing `particle_spec`
84
- * afterwards therefore changes what reading it back gives. The density is what survives a save.
85
- *
86
- * @returns {number}
87
- */
88
- get target_extinction() {
89
- return this.density * rgb_to_luminance(...this.particle_spec.extinction);
90
- }
91
-
92
- /**
93
- * @param {number} value
94
- */
95
- set target_extinction(value) {
96
- assert.isNumber(value, 'target_extinction');
97
- assert.isFinite(value, 'target_extinction');
98
-
99
- const density = value / rgb_to_luminance(...this.particle_spec.extinction);
100
-
101
- /*
102
- Catches the one way this goes wrong: a particle spec that extinguishes nothing. A default-
103
- constructed `VolumetricsParticleSpec` has zero cross-sections, and asking such a medium to
104
- reach any extinction at all needs infinitely many of its particles. Rejecting it here names
105
- the mistake; letting it through puts an `Infinity` in the GPU table, where it becomes a
106
- screenful of NaN several passes later.
107
- */
108
- assert.isFinite(density, 'the density this target_extinction implies (the particle spec extinguishes nothing)');
109
-
110
- this.density = density;
111
- }
112
-
113
- /**
114
- * @param {*} json
115
- * @returns {ParticipatingMedia}
116
- */
117
- static fromJSON(json) {
118
- const r = new ParticipatingMedia();
119
-
120
- r.fromJSON(json);
121
-
122
- return r;
123
- }
124
-
125
- toJSON() {
126
- const spec = this.particle_spec;
127
-
128
- return {
129
- density: this.density,
130
- fade_distance: this.fade_distance,
131
- particle_spec: {
132
- scattering: spec.scattering.slice(),
133
- extinction: spec.extinction.slice(),
134
- radius: spec.radius,
135
- g: spec.g
136
- }
137
- };
138
- }
139
-
140
- /**
141
- * @param {number} [density]
142
- * @param {number} [fade_distance]
143
- * @param {object} [particle_spec] omitted resets the medium to fog rather than leaving whatever
144
- * the component already held — a load has to determine the whole component, or an instance being
145
- * reused would carry the previous level's particle into the next one
146
- */
147
- fromJSON({
148
- density = DEFAULT_DENSITY,
149
- fade_distance = DEFAULT_FADE_DISTANCE,
150
- particle_spec
151
- }) {
152
- assert.isNumber(density, 'density');
153
- assert.isFinite(density, 'density');
154
- assert.greaterThanOrEqual(density, 0, 'density must not be negative');
155
-
156
- assert.isNumber(fade_distance, 'fade_distance');
157
- assert.isFinite(fade_distance, 'fade_distance');
158
- assert.greaterThanOrEqual(fade_distance, 0, 'fade_distance must not be negative');
159
-
160
- this.density = density;
161
- this.fade_distance = fade_distance;
162
-
163
- if (particle_spec === undefined) {
164
- this.particle_spec.copy(VOLUMETRIC_PARTICLE_SPEC_FOG);
165
- } else {
166
- this.particle_spec.fromJSON(particle_spec);
167
- }
168
- }
169
-
170
- /**
171
- * **The cross-sections and the radius are left out of this on purpose.** They run to 1e-16 and
172
- * 1e-6, and {@link computeHashFloat} collapses anything that small to zero, so mixing them in
173
- * would cost a multiply and buy no dispersion at all. A hash is allowed to collide;
174
- * {@link equals} is the exact one.
175
- *
176
- * @returns {number}
177
- */
178
- hash() {
179
- const spec = this.particle_spec;
180
-
181
- return combine_hash(
182
- computeHashFloat(this.density),
183
- computeHashFloat(this.fade_distance),
184
- computeHashFloat(spec.g)
185
- );
186
- }
187
-
188
- /**
189
- * @param {ParticipatingMedia} other
190
- * @returns {boolean}
191
- */
192
- equals(other) {
193
- return this.density === other.density
194
- && this.fade_distance === other.fade_distance
195
- && this.particle_spec.equals(other.particle_spec);
196
- }
197
- }
198
-
199
- /**
200
- * @readonly
201
- * @type {string}
202
- */
203
- ParticipatingMedia.typeName = "ParticipatingMedia";
1
+ import { assert } from "../../core/assert.js";
2
+ import { combine_hash } from "../../core/collection/array/combine_hash.js";
3
+ import { rgb_to_luminance } from "../../core/color/rgb_to_luminance.js";
4
+ import { computeHashFloat } from "../../core/primitives/numbers/computeHashFloat.js";
5
+ import {
6
+ VOLUMETRIC_PARTICLE_SPEC_FOG,
7
+ VolumetricsParticleSpec
8
+ } from "../../shade/renderer/volumetrics/ParticipatingMediaVolume.js";
9
+
10
+ /**
11
+ * Particles per cubic metre of dense fog, which is what a medium is until it is told otherwise.
12
+ * @type {number}
13
+ */
14
+ const DEFAULT_DENSITY = 3e7;
15
+
16
+ /**
17
+ * @type {number}
18
+ */
19
+ const DEFAULT_FADE_DISTANCE = 0.1;
20
+
21
+ /**
22
+ * A box of fog, smoke, dust or cloud that an entity carries around.
23
+ *
24
+ * **What is in here is the medium; the {@link Transform} beside it is the box.** Shade's
25
+ * {@link ParticipatingMediaVolume} is a unit cube centred on the origin, posed by a transform — so
26
+ * position, size and orientation are already an ECS concept and there is nothing to restate. Which
27
+ * is also why this component does nothing on its own: {@link ParticipatingMediaSystem} links it
28
+ * against a `Transform` and only that pair becomes a volume.
29
+ *
30
+ * **Three numbers, in two different currencies.** {@link particle_spec} is what a single particle
31
+ * does to light — a Mie solution, physical and reusable — and {@link density} is how many of them
32
+ * there are per cubic metre. The pair is what makes smoke and fog different things rather than the
33
+ * same fog at two strengths. Authoring in raw density means knowing the cross-sections, so
34
+ * {@link target_extinction} exists to author the other way round: say how much light the medium
35
+ * should swallow and let the particle decide the count.
36
+ *
37
+ * @see ParticipatingMediaSystem what turns this into something the renderer draws
38
+ * @see ParticipatingMediaVolume the renderer's own object
39
+ */
40
+ export class ParticipatingMedia {
41
+
42
+ /**
43
+ * Particles per cubic metre.
44
+ *
45
+ * Physically a count, so the numbers are large — the default is dense fog — and the useful range
46
+ * depends entirely on {@link particle_spec}: a cloud droplet blocks far more light than a haze
47
+ * particle, so the same count of them is a very different medium.
48
+ *
49
+ * @type {number}
50
+ */
51
+ density = DEFAULT_DENSITY;
52
+
53
+ /**
54
+ * What one particle of this medium does to light.
55
+ *
56
+ * Defaults to fog. The generated `MIE_PARTICLES_STANDARD_PRECOMPUTED` library is where the
57
+ * physically meaningful values live — `VolumetricsParticleSpec.fromMeep` converts an entry of it
58
+ * into one of these.
59
+ *
60
+ * @type {VolumetricsParticleSpec}
61
+ */
62
+ particle_spec = VolumetricsParticleSpec.fromJSON(VOLUMETRIC_PARTICLE_SPEC_FOG);
63
+
64
+ /**
65
+ * How far in from the box's faces the medium fades out, in metres.
66
+ *
67
+ * **World-space, and deliberately not scaled by the transform**, so a 0.5 here is half a metre
68
+ * of softness whether the volume is a metre across or a hundred. Zero gives the box hard edges,
69
+ * which is visible as a straight line across the screen wherever the box crosses the view.
70
+ *
71
+ * @type {number}
72
+ */
73
+ fade_distance = DEFAULT_FADE_DISTANCE;
74
+
75
+ /**
76
+ * The medium's extinction per metre, which is {@link density} expressed in what it does rather
77
+ * than in how many particles it took.
78
+ *
79
+ * The point of it is that it is comparable across particles: a smoke volume and a fog volume set
80
+ * to the same target extinction swallow the same amount of light, while the same *density* in
81
+ * both would differ by orders of magnitude.
82
+ *
83
+ * **Derived, not stored** — writing it sets {@link density}, and changing `particle_spec`
84
+ * afterwards therefore changes what reading it back gives. The density is what survives a save.
85
+ *
86
+ * @returns {number}
87
+ */
88
+ get target_extinction() {
89
+ return this.density * rgb_to_luminance(...this.particle_spec.extinction);
90
+ }
91
+
92
+ /**
93
+ * @param {number} value
94
+ */
95
+ set target_extinction(value) {
96
+ assert.isNumber(value, 'target_extinction');
97
+ assert.isFinite(value, 'target_extinction');
98
+
99
+ const density = value / rgb_to_luminance(...this.particle_spec.extinction);
100
+
101
+ /*
102
+ Catches the one way this goes wrong: a particle spec that extinguishes nothing. A default-
103
+ constructed `VolumetricsParticleSpec` has zero cross-sections, and asking such a medium to
104
+ reach any extinction at all needs infinitely many of its particles. Rejecting it here names
105
+ the mistake; letting it through puts an `Infinity` in the GPU table, where it becomes a
106
+ screenful of NaN several passes later.
107
+ */
108
+ assert.isFinite(density, 'the density this target_extinction implies (the particle spec extinguishes nothing)');
109
+
110
+ this.density = density;
111
+ }
112
+
113
+ /**
114
+ * @param {*} json
115
+ * @returns {ParticipatingMedia}
116
+ */
117
+ static fromJSON(json) {
118
+ const r = new ParticipatingMedia();
119
+
120
+ r.fromJSON(json);
121
+
122
+ return r;
123
+ }
124
+
125
+ toJSON() {
126
+ const spec = this.particle_spec;
127
+
128
+ return {
129
+ density: this.density,
130
+ fade_distance: this.fade_distance,
131
+ particle_spec: {
132
+ scattering: spec.scattering.slice(),
133
+ extinction: spec.extinction.slice(),
134
+ radius: spec.radius,
135
+ g: spec.g
136
+ }
137
+ };
138
+ }
139
+
140
+ /**
141
+ * @param {number} [density]
142
+ * @param {number} [fade_distance]
143
+ * @param {object} [particle_spec] omitted resets the medium to fog rather than leaving whatever
144
+ * the component already held — a load has to determine the whole component, or an instance being
145
+ * reused would carry the previous level's particle into the next one
146
+ */
147
+ fromJSON({
148
+ density = DEFAULT_DENSITY,
149
+ fade_distance = DEFAULT_FADE_DISTANCE,
150
+ particle_spec
151
+ }) {
152
+ assert.isNumber(density, 'density');
153
+ assert.isFinite(density, 'density');
154
+ assert.greaterThanOrEqual(density, 0, 'density must not be negative');
155
+
156
+ assert.isNumber(fade_distance, 'fade_distance');
157
+ assert.isFinite(fade_distance, 'fade_distance');
158
+ assert.greaterThanOrEqual(fade_distance, 0, 'fade_distance must not be negative');
159
+
160
+ this.density = density;
161
+ this.fade_distance = fade_distance;
162
+
163
+ if (particle_spec === undefined) {
164
+ this.particle_spec.copy(VOLUMETRIC_PARTICLE_SPEC_FOG);
165
+ } else {
166
+ this.particle_spec.fromJSON(particle_spec);
167
+ }
168
+ }
169
+
170
+ /**
171
+ * **The cross-sections and the radius are left out of this on purpose.** They run to 1e-16 and
172
+ * 1e-6, and {@link computeHashFloat} collapses anything that small to zero, so mixing them in
173
+ * would cost a multiply and buy no dispersion at all. A hash is allowed to collide;
174
+ * {@link equals} is the exact one.
175
+ *
176
+ * @returns {number}
177
+ */
178
+ hash() {
179
+ const spec = this.particle_spec;
180
+
181
+ return combine_hash(
182
+ computeHashFloat(this.density),
183
+ computeHashFloat(this.fade_distance),
184
+ computeHashFloat(spec.g)
185
+ );
186
+ }
187
+
188
+ /**
189
+ * @param {ParticipatingMedia} other
190
+ * @returns {boolean}
191
+ */
192
+ equals(other) {
193
+ return this.density === other.density
194
+ && this.fade_distance === other.fade_distance
195
+ && this.particle_spec.equals(other.particle_spec);
196
+ }
197
+ }
198
+
199
+ /**
200
+ * @readonly
201
+ * @type {string}
202
+ */
203
+ ParticipatingMedia.typeName = "ParticipatingMedia";
@@ -0,0 +1,87 @@
1
+ /**
2
+ * Copy what the component and its transform say onto the volume Shade will render.
3
+ *
4
+ * The particle spec is **copied, not referenced**: two entities are routinely built from the same
5
+ * blueprint and would otherwise share one spec, so tuning one volume's particle would silently
6
+ * retune the other's.
7
+ *
8
+ * @param {ParticipatingMediaVolume} volume Shade's
9
+ * @param {ParticipatingMedia} component meep's
10
+ * @param {Transform} transform where the box is
11
+ */
12
+ export function participating_media_volume_write(volume: ParticipatingMediaVolume, component: ParticipatingMedia, transform: Transform): void;
13
+ /**
14
+ * Whether the volume already says what the component and transform say.
15
+ *
16
+ * True on all but a handful of frames, which is the point of asking: a `false` here costs the whole
17
+ * scene's volumetrics table a trip to the GPU.
18
+ *
19
+ * **The transform is compared by its matrix rather than by `Transform.equals`**, because the matrix
20
+ * is the entire transform the GPU is given — the volume's position, rotation and scale are never
21
+ * read on their own. That makes this exactly the question worth asking, "would the upload differ",
22
+ * and it catches a transform posed by writing its matrix, which comparing position, rotation and
23
+ * scale would not.
24
+ *
25
+ * @param {ParticipatingMediaVolume} volume
26
+ * @param {ParticipatingMedia} component
27
+ * @param {Transform} transform
28
+ * @returns {boolean}
29
+ */
30
+ export function participating_media_volume_is_current(volume: ParticipatingMediaVolume, component: ParticipatingMedia, transform: Transform): boolean;
31
+ /**
32
+ * Mirrors fog, smoke and cloud entities into Shade's volumetrics.
33
+ *
34
+ * The same shape as {@link LightSystem}: the ECS says what exists and where, and this keeps the
35
+ * renderer's own objects in step. A {@link ParticipatingMediaVolume} is a unit cube posed by a
36
+ * transform, so an entity's `Transform` is the volume — position, size and orientation with no
37
+ * translation step in between.
38
+ *
39
+ * **The transform is taken as world-space, with no hierarchy applied**, which is what the volume
40
+ * model can express: a volume is an oriented box in the scene and Shade has no parent chain to walk
41
+ * for it. Parenting a fog volume to a moving entity therefore leaves the fog where the child's own
42
+ * transform puts it. The lights are placed the same way, for the same reason.
43
+ *
44
+ * **Changes are polled once a frame rather than subscribed to.** A `Transform` announces itself and
45
+ * nothing else here does — a density tuned by an editor slider, a particle spec swapped wholesale
46
+ * for a different Mie solution — so subscribing would cover one field in three and the other two
47
+ * would still have to be polled. Two paths that have to agree, where one does the whole job. It
48
+ * costs about two dozen float comparisons per volume per frame and a scene holds volumes in the
49
+ * tens, so the comparison is cheaper than the signal plumbing it replaces. The price is latency: a
50
+ * change is visible within a frame rather than instantly.
51
+ *
52
+ * **Nothing is uploaded unless something actually changed.** The GPU table is repacked whole
53
+ * whenever {@link SceneVolumetrics.version} moves, so an unconditional copy every frame would
54
+ * re-upload every volume in the scene forever. The comparison is what decides, and on almost every
55
+ * frame it decides nothing has to happen.
56
+ *
57
+ * @see ParticipatingMedia the component
58
+ * @see SceneVolumetrics what the volumes are handed to
59
+ */
60
+ export class ParticipatingMediaSystem extends System<any> {
61
+ /**
62
+ * @param {GraphicsEngine} graphics
63
+ * @param {Scene} scene
64
+ */
65
+ constructor(graphics: GraphicsEngine, scene: Scene);
66
+ dependencies: (typeof Transform | typeof ParticipatingMedia)[];
67
+ startup(entityManager: any): Promise<void>;
68
+ shutdown(entityManager: any): Promise<void>;
69
+ /**
70
+ * @param {ParticipatingMedia} component
71
+ * @param {Transform} transform
72
+ * @param {number} entity
73
+ */
74
+ link(component: ParticipatingMedia, transform: Transform, entity: number): void;
75
+ /**
76
+ * @param {ParticipatingMedia} component
77
+ * @param {Transform} transform
78
+ * @param {number} entity
79
+ */
80
+ unlink(component: ParticipatingMedia, transform: Transform, entity: number): void;
81
+ #private;
82
+ }
83
+ import { ParticipatingMediaVolume } from "../../shade/renderer/volumetrics/ParticipatingMediaVolume.js";
84
+ import { ParticipatingMedia } from "./ParticipatingMedia.js";
85
+ import { Transform } from "../ecs/transform/Transform.js";
86
+ import { System } from "../ecs/System.js";
87
+ //# sourceMappingURL=ParticipatingMediaSystem.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ParticipatingMediaSystem.d.ts","sourceRoot":"","sources":["../../../../src/engine/graphics3/ParticipatingMediaSystem.js"],"names":[],"mappings":"AA6IA;;;;;;;;;;GAUG;AACH,yDAJW,wBAAwB,aACxB,kBAAkB,aAClB,SAAS,QASnB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,8DALW,wBAAwB,aACxB,kBAAkB,aAClB,SAAS,GACP,OAAO,CAOnB;AAhLD;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH;IAmBI;;;OAGG;IACH,oDASC;IA9BD,+DAA+C;IAgC/C,2CAIC;IAED,4CAIC;IAED;;;;OAIG;IACH,gBAJW,kBAAkB,aAClB,SAAS,UACT,MAAM,QAUhB;IAED;;;;OAIG;IACH,kBAJW,kBAAkB,aAClB,SAAS,UACT,MAAM,QAIhB;;CAmCJ;yCAzIwC,8DAA8D;mCAGpE,yBAAyB;0BADlC,+BAA+B;uBADlC,kBAAkB"}