@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
@@ -0,0 +1,273 @@
1
+ import { assert } from "../../core/assert.js";
2
+ import { BVH } from "../../core/bvh2/bvh3/BVH.js";
3
+ import {
4
+ aabb3_ray_segment_entry_distance
5
+ } from "../../core/geom/3d/aabb/aabb3_ray_segment_entry_distance.js";
6
+ import { BVHQueryIntersectsRay } from "../../core/bvh2/bvh3/query/BVHQueryIntersectsRay.js";
7
+ import { bvh_query_leaves_generic } from "../../core/bvh2/bvh3/query/bvh_query_leaves_generic.js";
8
+ import { System } from "../ecs/System.js";
9
+ import { Transform } from "../ecs/transform/Transform.js";
10
+ import { Pickable } from "./Pickable.js";
11
+ import { PickingResult } from "./PickingResult.js";
12
+
13
+ /**
14
+ * @type {Float32Array}
15
+ */
16
+ const SCRATCH_BOUNDS = new Float32Array(6);
17
+
18
+ /**
19
+ * Answers "what is under this ray" for entities that asked to be pickable.
20
+ *
21
+ * **Asynchronous and batched from the first line, on purpose (I-9).** The backend here is a CPU
22
+ * bounding-volume hierarchy and could answer synchronously; the API does not let it, because the
23
+ * backend this is meant to grow into reads entity ids back off the GPU's visibility buffer, and that
24
+ * answer is inherently a frame late and arrives for a whole batch at once. A synchronous entry point
25
+ * would have to be broken to get there, and every caller broken with it.
26
+ *
27
+ * **Bounding boxes, not triangles.** A hit means the ray entered the entity's world bounding box.
28
+ * That is the precision this can offer for free — Shade maintains those boxes as part of drawing —
29
+ * and going finer means keeping CPU-side triangles for every pickable entity, which is the
30
+ * duplication {@link Pickable} exists to keep small. Terrain picking, which is where the game's
31
+ * precision actually matters, does not come through here at all: it is an exact raycast against the
32
+ * terrain's own representation and is untouched by any of this.
33
+ *
34
+ * The index is refreshed **on query rather than per frame**. Nothing pays for picking on a frame where
35
+ * nobody picks, and there is no window in which the index disagrees with the scene, so no class of
36
+ * bug where a pick lands on where something used to be.
37
+ */
38
+ export class PickingSystem extends System {
39
+ /**
40
+ * @type {MeshSystem}
41
+ */
42
+ #meshes;
43
+
44
+ /**
45
+ * @type {BVH}
46
+ */
47
+ #bvh = new BVH();
48
+
49
+ /**
50
+ * The BVH leaf standing for each pickable entity.
51
+ *
52
+ * @type {Map<number, number>}
53
+ */
54
+ #leaves = new Map();
55
+
56
+ /**
57
+ * Entities that have opted in but have nothing in the scene yet — a model still loading, most
58
+ * often. They hold no leaf, and every query looks again, which is what lets one appear without
59
+ * anything having to notice the moment it did.
60
+ *
61
+ * @type {Set<number>}
62
+ */
63
+ #pending = new Set();
64
+
65
+ /**
66
+ * @param {MeshSystem} meshes what an entity looks like, which is where its bounds come from
67
+ */
68
+ constructor(meshes) {
69
+ super();
70
+
71
+ assert.defined(meshes, 'meshes');
72
+
73
+ this.#meshes = meshes;
74
+
75
+ this.dependencies = [Pickable, Transform];
76
+ }
77
+
78
+ async startup(entityManager) {
79
+ this.entityManager = entityManager;
80
+ }
81
+
82
+ async shutdown(entityManager) {
83
+ for (const entity of Array.from(this.#leaves.keys())) {
84
+ this.#drop(entity);
85
+ }
86
+
87
+ this.#pending.clear();
88
+ }
89
+
90
+ /**
91
+ * @param {Pickable} pickable
92
+ * @param {Transform} transform
93
+ * @param {number} entity
94
+ */
95
+ link(pickable, transform, entity) {
96
+ // no bounds are taken here: the model may not have arrived, and the first query is early
97
+ // enough to find out
98
+ this.#pending.add(entity);
99
+ }
100
+
101
+ /**
102
+ * @param {Pickable} pickable
103
+ * @param {Transform} transform
104
+ * @param {number} entity
105
+ */
106
+ unlink(pickable, transform, entity) {
107
+ this.#drop(entity);
108
+ }
109
+
110
+ /**
111
+ * How many entities the index currently stands for.
112
+ *
113
+ * The index is built on query, so this is zero until the first {@link pick} — and stays behind by
114
+ * however many pickable entities are still waiting on their models.
115
+ *
116
+ * @returns {number}
117
+ */
118
+ get indexed_count() {
119
+ return this.#leaves.size;
120
+ }
121
+
122
+ /**
123
+ * What each of these rays hits first.
124
+ *
125
+ * One result per query, in the order the queries were given. A ray that hits nothing still gets a
126
+ * result — `entity` is {@link PickingResult.NOTHING} — so the two arrays line up by position and a
127
+ * caller never has to search for the answer to its own question.
128
+ *
129
+ * @param {PickingQuery[]} queries
130
+ * @returns {Promise<PickingResult[]>}
131
+ */
132
+ async pick(queries) {
133
+ assert.isArray(queries, 'queries');
134
+
135
+ this.#refresh();
136
+
137
+ const results = [];
138
+
139
+ for (let i = 0; i < queries.length; i++) {
140
+ results.push(this.#pick_one(queries[i]));
141
+ }
142
+
143
+ return results;
144
+ }
145
+
146
+ /**
147
+ * @param {PickingQuery} query
148
+ * @returns {PickingResult}
149
+ */
150
+ #pick_one(query) {
151
+ const result = new PickingResult();
152
+
153
+ const bvh = this.#bvh;
154
+
155
+ const origin = query.origin;
156
+ const direction = query.direction;
157
+
158
+ const origin_x = origin.x;
159
+ const origin_y = origin.y;
160
+ const origin_z = origin.z;
161
+
162
+ const hits = [];
163
+
164
+ const hit_count = bvh_query_leaves_generic(
165
+ hits, 0,
166
+ bvh, bvh.root,
167
+ BVHQueryIntersectsRay.from([
168
+ origin_x, origin_y, origin_z,
169
+ direction.x, direction.y, direction.z
170
+ ])
171
+ );
172
+
173
+ // reciprocals once for the whole batch of candidates; the entry-distance test wants them, and
174
+ // a division component that is zero deliberately produces an infinity it handles
175
+ const inv_x = 1 / direction.x;
176
+ const inv_y = 1 / direction.y;
177
+ const inv_z = 1 / direction.z;
178
+
179
+ let best_distance = query.max_distance;
180
+ let best_entity = PickingResult.NOTHING;
181
+
182
+ for (let i = 0; i < hit_count; i++) {
183
+ const leaf = hits[i];
184
+
185
+ bvh.node_get_aabb(leaf, SCRATCH_BOUNDS);
186
+
187
+ const distance = aabb3_ray_segment_entry_distance(
188
+ SCRATCH_BOUNDS[0], SCRATCH_BOUNDS[1], SCRATCH_BOUNDS[2],
189
+ SCRATCH_BOUNDS[3], SCRATCH_BOUNDS[4], SCRATCH_BOUNDS[5],
190
+ origin_x, origin_y, origin_z,
191
+ inv_x, inv_y, inv_z,
192
+ 0, query.max_distance
193
+ );
194
+
195
+ if (distance >= best_distance) {
196
+ // further than something already found, or a miss the broadphase let through
197
+ continue;
198
+ }
199
+
200
+ best_distance = distance;
201
+ best_entity = bvh.node_get_user_data(leaf);
202
+ }
203
+
204
+ if (best_entity === PickingResult.NOTHING) {
205
+ return result;
206
+ }
207
+
208
+ result.entity = best_entity;
209
+ result.distance = best_distance;
210
+
211
+ result.position.set(
212
+ origin_x + direction.x * best_distance,
213
+ origin_y + direction.y * best_distance,
214
+ origin_z + direction.z * best_distance
215
+ );
216
+
217
+ return result;
218
+ }
219
+
220
+ /**
221
+ * Bring every leaf in line with where its entity now is, and give a leaf to any entity whose
222
+ * model has arrived since the last look.
223
+ */
224
+ #refresh() {
225
+ const meshes = this.#meshes;
226
+
227
+ for (const [entity, leaf] of this.#leaves) {
228
+ if (meshes.compute_world_bounds(SCRATCH_BOUNDS, entity)) {
229
+ this.#bvh.node_move_aabb(leaf, SCRATCH_BOUNDS);
230
+
231
+ continue;
232
+ }
233
+
234
+ // the model went away under it — the entity is still pickable, so it goes back to
235
+ // waiting rather than losing its opt-in
236
+ this.#drop(entity);
237
+ this.#pending.add(entity);
238
+ }
239
+
240
+ for (const entity of Array.from(this.#pending)) {
241
+ if (!meshes.compute_world_bounds(SCRATCH_BOUNDS, entity)) {
242
+ continue;
243
+ }
244
+
245
+ const leaf = this.#bvh.allocate_node();
246
+
247
+ this.#bvh.node_set_aabb(leaf, SCRATCH_BOUNDS);
248
+ this.#bvh.node_set_user_data(leaf, entity);
249
+ this.#bvh.insert_leaf(leaf);
250
+
251
+ this.#leaves.set(entity, leaf);
252
+ this.#pending.delete(entity);
253
+ }
254
+ }
255
+
256
+ /**
257
+ * @param {number} entity
258
+ */
259
+ #drop(entity) {
260
+ this.#pending.delete(entity);
261
+
262
+ const leaf = this.#leaves.get(entity);
263
+
264
+ if (leaf === undefined) {
265
+ return;
266
+ }
267
+
268
+ this.#bvh.remove_leaf(leaf);
269
+ this.#bvh.release_node(leaf);
270
+
271
+ this.#leaves.delete(entity);
272
+ }
273
+ }
@@ -1,67 +1,10 @@
1
1
  /**
2
- * Answers "what is under this ray" for entities that asked to be pickable.
2
+ * @deprecated Renamed to {@link PickingSystem}. The trailing `3` marked the 2.x 3.x renderer transition;
3
+ * the 2.x name it disambiguated against is gone, so the suffix no longer distinguishes anything.
3
4
  *
4
- * **Asynchronous and batched from the first line, on purpose (I-9).** The backend here is a CPU
5
- * bounding-volume hierarchy and could answer synchronously; the API does not let it, because the
6
- * backend this is meant to grow into reads entity ids back off the GPU's visibility buffer, and that
7
- * answer is inherently a frame late and arrives for a whole batch at once. A synchronous entry point
8
- * would have to be broken to get there, and every caller broken with it.
9
- *
10
- * **Bounding boxes, not triangles.** A hit means the ray entered the entity's world bounding box.
11
- * That is the precision this can offer for free — Shade maintains those boxes as part of drawing —
12
- * and going finer means keeping CPU-side triangles for every pickable entity, which is the
13
- * duplication {@link Pickable} exists to keep small. Terrain picking, which is where the game's
14
- * precision actually matters, does not come through here at all: it is an exact raycast against the
15
- * terrain's own representation and is untouched by any of this.
16
- *
17
- * The index is refreshed **on query rather than per frame**. Nothing pays for picking on a frame where
18
- * nobody picks, and there is no window in which the index disagrees with the scene, so no class of
19
- * bug where a pick lands on where something used to be.
5
+ * Kept as a re-export rather than removed: this is a library, and an import path is as much a
6
+ * published interface as a class name.
20
7
  */
21
- export class PickingSystem3 extends System<any> {
22
- /**
23
- * @param {MeshSystem3} meshes what an entity looks like, which is where its bounds come from
24
- */
25
- constructor(meshes: MeshSystem3);
26
- dependencies: (typeof Transform | typeof Pickable)[];
27
- startup(entityManager: any): Promise<void>;
28
- shutdown(entityManager: any): Promise<void>;
29
- /**
30
- * @param {Pickable} pickable
31
- * @param {Transform} transform
32
- * @param {number} entity
33
- */
34
- link(pickable: Pickable, transform: Transform, entity: number): void;
35
- /**
36
- * @param {Pickable} pickable
37
- * @param {Transform} transform
38
- * @param {number} entity
39
- */
40
- unlink(pickable: Pickable, transform: Transform, entity: number): void;
41
- /**
42
- * How many entities the index currently stands for.
43
- *
44
- * The index is built on query, so this is zero until the first {@link pick} — and stays behind by
45
- * however many pickable entities are still waiting on their models.
46
- *
47
- * @returns {number}
48
- */
49
- get indexed_count(): number;
50
- /**
51
- * What each of these rays hits first.
52
- *
53
- * One result per query, in the order the queries were given. A ray that hits nothing still gets a
54
- * result — `entity` is {@link PickingResult.NOTHING} — so the two arrays line up by position and a
55
- * caller never has to search for the answer to its own question.
56
- *
57
- * @param {PickingQuery[]} queries
58
- * @returns {Promise<PickingResult[]>}
59
- */
60
- pick(queries: PickingQuery[]): Promise<PickingResult[]>;
61
- #private;
62
- }
63
- import { System } from "../ecs/System.js";
64
- import { Transform } from "../ecs/transform/Transform.js";
65
- import { Pickable } from "./Pickable.js";
66
- import { PickingResult } from "./PickingResult.js";
8
+ export const PickingSystem3: typeof PickingSystem;
9
+ import { PickingSystem } from "./PickingSystem.js";
67
10
  //# sourceMappingURL=PickingSystem3.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"PickingSystem3.d.ts","sourceRoot":"","sources":["../../../../src/engine/graphics3/PickingSystem3.js"],"names":[],"mappings":"AAiBA;;;;;;;;;;;;;;;;;;;GAmBG;AACH;IA2BI;;OAEG;IACH,iCAQC;IADG,qDAAyC;IAG7C,2CAEC;IAED,4CAMC;IAED;;;;OAIG;IACH,eAJW,QAAQ,aACR,SAAS,UACT,MAAM,QAMhB;IAED;;;;OAIG;IACH,iBAJW,QAAQ,aACR,SAAS,UACT,MAAM,QAIhB;IAED;;;;;;;OAOG;IACH,4BAEC;IAED;;;;;;;;;OASG;IACH,cAHW,cAAc,GACZ,QAAQ,aAAa,EAAE,CAAC,CAcpC;;CAiIJ;uBAzQsB,kBAAkB;0BACf,+BAA+B;yBAChC,eAAe;8BACV,oBAAoB"}
1
+ {"version":3,"file":"PickingSystem3.d.ts","sourceRoot":"","sources":["../../../../src/engine/graphics3/PickingSystem3.js"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,kDAA4C;8BATd,oBAAoB"}
@@ -1,273 +1,10 @@
1
- import { assert } from "../../core/assert.js";
2
- import { BVH } from "../../core/bvh2/bvh3/BVH.js";
3
- import {
4
- aabb3_ray_segment_entry_distance
5
- } from "../../core/geom/3d/aabb/aabb3_ray_segment_entry_distance.js";
6
- import { BVHQueryIntersectsRay } from "../../core/bvh2/bvh3/query/BVHQueryIntersectsRay.js";
7
- import { bvh_query_leaves_generic } from "../../core/bvh2/bvh3/query/bvh_query_leaves_generic.js";
8
- import { System } from "../ecs/System.js";
9
- import { Transform } from "../ecs/transform/Transform.js";
10
- import { Pickable } from "./Pickable.js";
11
- import { PickingResult } from "./PickingResult.js";
1
+ import { PickingSystem } from "./PickingSystem.js";
12
2
 
13
3
  /**
14
- * @type {Float32Array}
15
- */
16
- const SCRATCH_BOUNDS = new Float32Array(6);
17
-
18
- /**
19
- * Answers "what is under this ray" for entities that asked to be pickable.
20
- *
21
- * **Asynchronous and batched from the first line, on purpose (I-9).** The backend here is a CPU
22
- * bounding-volume hierarchy and could answer synchronously; the API does not let it, because the
23
- * backend this is meant to grow into reads entity ids back off the GPU's visibility buffer, and that
24
- * answer is inherently a frame late and arrives for a whole batch at once. A synchronous entry point
25
- * would have to be broken to get there, and every caller broken with it.
4
+ * @deprecated Renamed to {@link PickingSystem}. 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.
26
6
  *
27
- * **Bounding boxes, not triangles.** A hit means the ray entered the entity's world bounding box.
28
- * That is the precision this can offer for free — Shade maintains those boxes as part of drawing —
29
- * and going finer means keeping CPU-side triangles for every pickable entity, which is the
30
- * duplication {@link Pickable} exists to keep small. Terrain picking, which is where the game's
31
- * precision actually matters, does not come through here at all: it is an exact raycast against the
32
- * terrain's own representation and is untouched by any of this.
33
- *
34
- * The index is refreshed **on query rather than per frame**. Nothing pays for picking on a frame where
35
- * nobody picks, and there is no window in which the index disagrees with the scene, so no class of
36
- * bug where a pick lands on where something used to be.
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.
37
9
  */
38
- export class PickingSystem3 extends System {
39
- /**
40
- * @type {MeshSystem3}
41
- */
42
- #meshes;
43
-
44
- /**
45
- * @type {BVH}
46
- */
47
- #bvh = new BVH();
48
-
49
- /**
50
- * The BVH leaf standing for each pickable entity.
51
- *
52
- * @type {Map<number, number>}
53
- */
54
- #leaves = new Map();
55
-
56
- /**
57
- * Entities that have opted in but have nothing in the scene yet — a model still loading, most
58
- * often. They hold no leaf, and every query looks again, which is what lets one appear without
59
- * anything having to notice the moment it did.
60
- *
61
- * @type {Set<number>}
62
- */
63
- #pending = new Set();
64
-
65
- /**
66
- * @param {MeshSystem3} meshes what an entity looks like, which is where its bounds come from
67
- */
68
- constructor(meshes) {
69
- super();
70
-
71
- assert.defined(meshes, 'meshes');
72
-
73
- this.#meshes = meshes;
74
-
75
- this.dependencies = [Pickable, Transform];
76
- }
77
-
78
- async startup(entityManager) {
79
- this.entityManager = entityManager;
80
- }
81
-
82
- async shutdown(entityManager) {
83
- for (const entity of Array.from(this.#leaves.keys())) {
84
- this.#drop(entity);
85
- }
86
-
87
- this.#pending.clear();
88
- }
89
-
90
- /**
91
- * @param {Pickable} pickable
92
- * @param {Transform} transform
93
- * @param {number} entity
94
- */
95
- link(pickable, transform, entity) {
96
- // no bounds are taken here: the model may not have arrived, and the first query is early
97
- // enough to find out
98
- this.#pending.add(entity);
99
- }
100
-
101
- /**
102
- * @param {Pickable} pickable
103
- * @param {Transform} transform
104
- * @param {number} entity
105
- */
106
- unlink(pickable, transform, entity) {
107
- this.#drop(entity);
108
- }
109
-
110
- /**
111
- * How many entities the index currently stands for.
112
- *
113
- * The index is built on query, so this is zero until the first {@link pick} — and stays behind by
114
- * however many pickable entities are still waiting on their models.
115
- *
116
- * @returns {number}
117
- */
118
- get indexed_count() {
119
- return this.#leaves.size;
120
- }
121
-
122
- /**
123
- * What each of these rays hits first.
124
- *
125
- * One result per query, in the order the queries were given. A ray that hits nothing still gets a
126
- * result — `entity` is {@link PickingResult.NOTHING} — so the two arrays line up by position and a
127
- * caller never has to search for the answer to its own question.
128
- *
129
- * @param {PickingQuery[]} queries
130
- * @returns {Promise<PickingResult[]>}
131
- */
132
- async pick(queries) {
133
- assert.isArray(queries, 'queries');
134
-
135
- this.#refresh();
136
-
137
- const results = [];
138
-
139
- for (let i = 0; i < queries.length; i++) {
140
- results.push(this.#pick_one(queries[i]));
141
- }
142
-
143
- return results;
144
- }
145
-
146
- /**
147
- * @param {PickingQuery} query
148
- * @returns {PickingResult}
149
- */
150
- #pick_one(query) {
151
- const result = new PickingResult();
152
-
153
- const bvh = this.#bvh;
154
-
155
- const origin = query.origin;
156
- const direction = query.direction;
157
-
158
- const origin_x = origin.x;
159
- const origin_y = origin.y;
160
- const origin_z = origin.z;
161
-
162
- const hits = [];
163
-
164
- const hit_count = bvh_query_leaves_generic(
165
- hits, 0,
166
- bvh, bvh.root,
167
- BVHQueryIntersectsRay.from([
168
- origin_x, origin_y, origin_z,
169
- direction.x, direction.y, direction.z
170
- ])
171
- );
172
-
173
- // reciprocals once for the whole batch of candidates; the entry-distance test wants them, and
174
- // a division component that is zero deliberately produces an infinity it handles
175
- const inv_x = 1 / direction.x;
176
- const inv_y = 1 / direction.y;
177
- const inv_z = 1 / direction.z;
178
-
179
- let best_distance = query.max_distance;
180
- let best_entity = PickingResult.NOTHING;
181
-
182
- for (let i = 0; i < hit_count; i++) {
183
- const leaf = hits[i];
184
-
185
- bvh.node_get_aabb(leaf, SCRATCH_BOUNDS);
186
-
187
- const distance = aabb3_ray_segment_entry_distance(
188
- SCRATCH_BOUNDS[0], SCRATCH_BOUNDS[1], SCRATCH_BOUNDS[2],
189
- SCRATCH_BOUNDS[3], SCRATCH_BOUNDS[4], SCRATCH_BOUNDS[5],
190
- origin_x, origin_y, origin_z,
191
- inv_x, inv_y, inv_z,
192
- 0, query.max_distance
193
- );
194
-
195
- if (distance >= best_distance) {
196
- // further than something already found, or a miss the broadphase let through
197
- continue;
198
- }
199
-
200
- best_distance = distance;
201
- best_entity = bvh.node_get_user_data(leaf);
202
- }
203
-
204
- if (best_entity === PickingResult.NOTHING) {
205
- return result;
206
- }
207
-
208
- result.entity = best_entity;
209
- result.distance = best_distance;
210
-
211
- result.position.set(
212
- origin_x + direction.x * best_distance,
213
- origin_y + direction.y * best_distance,
214
- origin_z + direction.z * best_distance
215
- );
216
-
217
- return result;
218
- }
219
-
220
- /**
221
- * Bring every leaf in line with where its entity now is, and give a leaf to any entity whose
222
- * model has arrived since the last look.
223
- */
224
- #refresh() {
225
- const meshes = this.#meshes;
226
-
227
- for (const [entity, leaf] of this.#leaves) {
228
- if (meshes.compute_world_bounds(SCRATCH_BOUNDS, entity)) {
229
- this.#bvh.node_move_aabb(leaf, SCRATCH_BOUNDS);
230
-
231
- continue;
232
- }
233
-
234
- // the model went away under it — the entity is still pickable, so it goes back to
235
- // waiting rather than losing its opt-in
236
- this.#drop(entity);
237
- this.#pending.add(entity);
238
- }
239
-
240
- for (const entity of Array.from(this.#pending)) {
241
- if (!meshes.compute_world_bounds(SCRATCH_BOUNDS, entity)) {
242
- continue;
243
- }
244
-
245
- const leaf = this.#bvh.allocate_node();
246
-
247
- this.#bvh.node_set_aabb(leaf, SCRATCH_BOUNDS);
248
- this.#bvh.node_set_user_data(leaf, entity);
249
- this.#bvh.insert_leaf(leaf);
250
-
251
- this.#leaves.set(entity, leaf);
252
- this.#pending.delete(entity);
253
- }
254
- }
255
-
256
- /**
257
- * @param {number} entity
258
- */
259
- #drop(entity) {
260
- this.#pending.delete(entity);
261
-
262
- const leaf = this.#leaves.get(entity);
263
-
264
- if (leaf === undefined) {
265
- return;
266
- }
267
-
268
- this.#bvh.remove_leaf(leaf);
269
- this.#bvh.release_node(leaf);
270
-
271
- this.#leaves.delete(entity);
272
- }
273
- }
10
+ export const PickingSystem3 = PickingSystem;
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Puts one primitive into Shade's scene, and keeps it where the entity says.
3
+ *
4
+ * **The component and the row are the same shape, which is the whole reason this system is short.**
5
+ * `ShadedGeometry` is a geometry, a material and a flat transform — *"not a hierarchical data
6
+ * structure"*, in its own docblock — and Shade's `Mesh` is a `Node3D` carrying a `MeshletGeometry`
7
+ * and a `ShadeMaterial`. §4.3 asks for exactly that mapping, 1:1, and there is nothing else to do.
8
+ *
9
+ * **What it is not is a model.** A model file is many primitives arranged in a hierarchy, and in an
10
+ * ECS a hierarchy is entities — one per node, parented through `EntityNode`, each carrying its own
11
+ * `ShadedGeometry` where it draws (D47). `SGMesh` is the layer that expands a loaded file into
12
+ * those entities; this system never sees the file, only the primitives that came out of it, and
13
+ * cannot tell them from primitives some tool built by hand.
14
+ *
15
+ * **The payload is the renderer's own.** Under three the same component holds a `BufferGeometry`
16
+ * and a three `Material`, and `ShadedGeometrySystem` reads those; here it holds Shade's pair. One
17
+ * renderer runs at a time and each system reads what its own renderer draws — the same bargain the
18
+ * v1 component made with `Mesh.mesh`, and not a neutral geometry format, which would be a redesign
19
+ * rather than a transition.
20
+ */
21
+ export class ShadedGeometrySystem extends System<any> {
22
+ /**
23
+ * @param {GraphicsEngine} graphics
24
+ * @param {Scene} scene
25
+ */
26
+ constructor(graphics: GraphicsEngine, scene: Scene);
27
+ dependencies: (typeof Transform | typeof ShadedGeometry)[];
28
+ startup(entityManager: any): Promise<void>;
29
+ shutdown(entityManager: any): Promise<void>;
30
+ /**
31
+ * @param {ShadedGeometry} geometry
32
+ * @param {Transform} transform
33
+ * @param {number} entity
34
+ */
35
+ link(geometry: ShadedGeometry, transform: Transform, entity: number): void;
36
+ /**
37
+ * @param {ShadedGeometry} geometry
38
+ * @param {Transform} transform
39
+ * @param {number} entity
40
+ */
41
+ unlink(geometry: ShadedGeometry, transform: Transform, entity: number): void;
42
+ #private;
43
+ }
44
+ import { System } from "../ecs/System.js";
45
+ import { Transform } from "../ecs/transform/Transform.js";
46
+ import { ShadedGeometry } from "../graphics/ecs/mesh-v2/ShadedGeometry.js";
47
+ //# sourceMappingURL=ShadedGeometrySystem.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ShadedGeometrySystem.d.ts","sourceRoot":"","sources":["../../../../src/engine/graphics3/ShadedGeometrySystem.js"],"names":[],"mappings":"AASA;;;;;;;;;;;;;;;;;;;GAmBG;AACH;IAkBI;;;OAGG;IACH,oDAUC;IADG,2DAA+C;IAGnD,2CAEC;IAED,4CAIC;IAED;;;;OAIG;IACH,eAJW,cAAc,aACd,SAAS,UACT,MAAM,QA2ChB;IAED;;;;OAIG;IACH,iBAJW,cAAc,aACd,SAAS,UACT,MAAM,QAMhB;;CAsCJ;uBApKsB,kBAAkB;0BACf,+BAA+B;+BAE1B,2CAA2C"}