@woosh/meep-engine 3.23.0 → 3.24.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 (522) hide show
  1. package/editor/entity_world_bounds.d.ts +9 -3
  2. package/editor/entity_world_bounds.d.ts.map +1 -1
  3. package/editor/entity_world_bounds.js +61 -4
  4. package/package.json +1 -1
  5. package/src/core/binary/allocator/OffsetAllocator.d.ts +40 -2
  6. package/src/core/binary/allocator/OffsetAllocator.d.ts.map +1 -1
  7. package/src/core/binary/allocator/OffsetAllocator.js +124 -29
  8. package/src/core/collection/map/u32_index.d.ts +83 -0
  9. package/src/core/collection/map/u32_index.d.ts.map +1 -0
  10. package/src/core/collection/map/u32_index.js +247 -0
  11. package/src/engine/asset/loaders/GLTFSceneBundleAssetLoader.d.ts +2 -2
  12. package/src/engine/asset/loaders/GLTFSceneBundleAssetLoader.js +2 -2
  13. package/src/engine/asset/loaders/USDSceneBundleAssetLoader.d.ts +1 -2
  14. package/src/engine/asset/loaders/USDSceneBundleAssetLoader.d.ts.map +1 -1
  15. package/src/engine/asset/loaders/USDSceneBundleAssetLoader.js +4 -12
  16. package/src/engine/ecs/gpu/GPUStateAuthority.d.ts +55 -0
  17. package/src/engine/ecs/gpu/GPUStateAuthority.d.ts.map +1 -0
  18. package/src/engine/ecs/gpu/GPUStateAuthority.js +72 -0
  19. package/src/engine/ecs/gpu/GPUStateAuthorityFlags.d.ts +40 -0
  20. package/src/engine/ecs/gpu/GPUStateAuthorityFlags.d.ts.map +1 -0
  21. package/src/engine/ecs/gpu/GPUStateAuthorityFlags.js +79 -0
  22. package/src/engine/ecs/gpu/gpu_authority_assert_cpu.d.ts +18 -0
  23. package/src/engine/ecs/gpu/gpu_authority_assert_cpu.d.ts.map +1 -0
  24. package/src/engine/ecs/gpu/gpu_authority_assert_cpu.js +27 -0
  25. package/src/engine/ecs/gpu/gpu_authority_declare.d.ts +23 -0
  26. package/src/engine/ecs/gpu/gpu_authority_declare.d.ts.map +1 -0
  27. package/src/engine/ecs/gpu/gpu_authority_declare.js +39 -0
  28. package/src/engine/ecs/gpu/gpu_authority_grant.d.ts +15 -0
  29. package/src/engine/ecs/gpu/gpu_authority_grant.d.ts.map +1 -0
  30. package/src/engine/ecs/gpu/gpu_authority_grant.js +38 -0
  31. package/src/engine/ecs/gpu/gpu_authority_has.d.ts +18 -0
  32. package/src/engine/ecs/gpu/gpu_authority_has.d.ts.map +1 -0
  33. package/src/engine/ecs/gpu/gpu_authority_has.js +28 -0
  34. package/src/engine/ecs/gpu/gpu_authority_revoke.d.ts +24 -0
  35. package/src/engine/ecs/gpu/gpu_authority_revoke.d.ts.map +1 -0
  36. package/src/engine/ecs/gpu/gpu_authority_revoke.js +49 -0
  37. package/src/engine/ecs/ik/IKProblem.d.ts +14 -0
  38. package/src/engine/ecs/ik/IKProblem.d.ts.map +1 -1
  39. package/src/engine/ecs/ik/IKProblem.js +16 -0
  40. package/src/engine/ecs/ik/InverseKinematicsSystem.d.ts.map +1 -1
  41. package/src/engine/ecs/ik/InverseKinematicsSystem.js +19 -0
  42. package/src/engine/ecs/ik/OneBoneSurfaceAlignmentSolver.js +2 -2
  43. package/src/engine/ecs/ik/TwoBoneInverseKinematicsSolver.js +2 -2
  44. package/src/engine/ecs/ik/ik_bone_chain.d.ts +11 -2
  45. package/src/engine/ecs/ik/ik_bone_chain.d.ts.map +1 -1
  46. package/src/engine/ecs/ik/ik_bone_chain.js +47 -2
  47. package/src/engine/ecs/ik/ik_write_local_rotation.d.ts.map +1 -1
  48. package/src/engine/ecs/ik/ik_write_local_rotation.js +6 -0
  49. package/src/engine/ecs/speaker/VoiceSystem.d.ts.map +1 -1
  50. package/src/engine/ecs/speaker/VoiceSystem.js +6 -0
  51. package/src/engine/ecs/transform/T64WorldCache.d.ts +50 -0
  52. package/src/engine/ecs/transform/T64WorldCache.d.ts.map +1 -0
  53. package/src/engine/ecs/transform/T64WorldCache.js +139 -0
  54. package/src/engine/ecs/transform/t64_evaluate_world.d.ts +31 -0
  55. package/src/engine/ecs/transform/t64_evaluate_world.d.ts.map +1 -0
  56. package/src/engine/ecs/transform/t64_evaluate_world.js +126 -0
  57. package/src/engine/ecs/transform-attachment/TransformAttachmentSystem.d.ts +8 -0
  58. package/src/engine/ecs/transform-attachment/TransformAttachmentSystem.d.ts.map +1 -1
  59. package/src/engine/ecs/transform-attachment/TransformAttachmentSystem.js +59 -30
  60. package/src/engine/graphics/ecs/highlight/system/ShadedGeometryHighlightSystem.d.ts.map +1 -1
  61. package/src/engine/graphics/ecs/highlight/system/ShadedGeometryHighlightSystem.js +4 -11
  62. package/src/engine/graphics/ecs/mesh-v2/SHADED_GEOMETRY_EVENT_CHANGE.d.ts +14 -0
  63. package/src/engine/graphics/ecs/mesh-v2/SHADED_GEOMETRY_EVENT_CHANGE.d.ts.map +1 -0
  64. package/src/engine/graphics/ecs/mesh-v2/SHADED_GEOMETRY_EVENT_CHANGE.js +13 -0
  65. package/src/engine/graphics/ecs/mesh-v2/ShadedGeometry.d.ts +2 -14
  66. package/src/engine/graphics/ecs/mesh-v2/ShadedGeometry.d.ts.map +1 -1
  67. package/src/engine/graphics/ecs/mesh-v2/ShadedGeometry.js +11 -21
  68. package/src/engine/graphics/ecs/mesh-v2/ShadedGeometryFlags.d.ts +1 -0
  69. package/src/engine/graphics/ecs/mesh-v2/ShadedGeometryFlags.js +7 -0
  70. package/src/engine/graphics/ecs/mesh-v2/aggregate/SGMeshHighlightSystem.d.ts +5 -6
  71. package/src/engine/graphics/ecs/mesh-v2/aggregate/SGMeshHighlightSystem.d.ts.map +1 -1
  72. package/src/engine/graphics/ecs/mesh-v2/aggregate/SGMeshHighlightSystem.js +13 -11
  73. package/src/engine/graphics/ecs/mesh-v2/shaded_geometry_announce_change.d.ts +14 -0
  74. package/src/engine/graphics/ecs/mesh-v2/shaded_geometry_announce_change.d.ts.map +1 -0
  75. package/src/engine/graphics/ecs/mesh-v2/shaded_geometry_announce_change.js +21 -0
  76. package/src/engine/graphics/ecs/particles/ParticleEffect.d.ts +1 -1
  77. package/src/engine/graphics/ecs/particles/ParticleEffect.js +1 -1
  78. package/src/engine/graphics/sh3/path_tracer/populate_path_traced_scene_from_ecd.d.ts +1 -1
  79. package/src/engine/graphics/sh3/path_tracer/populate_path_traced_scene_from_ecd.js +1 -1
  80. package/src/engine/graphics3/AnimationGraphSystem.js +3 -3
  81. package/src/engine/graphics3/AnimationSystem.js +2 -2
  82. package/src/engine/graphics3/DebugDrawSystem.d.ts.map +1 -1
  83. package/src/engine/graphics3/DebugDrawSystem.js +2 -4
  84. package/src/engine/graphics3/GPUParticleEmitterSystem.d.ts +34 -27
  85. package/src/engine/graphics3/GPUParticleEmitterSystem.d.ts.map +1 -1
  86. package/src/engine/graphics3/GPUParticleEmitterSystem.js +185 -85
  87. package/src/engine/graphics3/HighlightOutlineSystem.d.ts +4 -3
  88. package/src/engine/graphics3/HighlightOutlineSystem.d.ts.map +1 -1
  89. package/src/engine/graphics3/HighlightOutlineSystem.js +7 -9
  90. package/src/engine/graphics3/LightSystem.d.ts +7 -5
  91. package/src/engine/graphics3/LightSystem.d.ts.map +1 -1
  92. package/src/engine/graphics3/LightSystem.js +36 -22
  93. package/src/engine/graphics3/MeshSystem.d.ts +43 -39
  94. package/src/engine/graphics3/MeshSystem.d.ts.map +1 -1
  95. package/src/engine/graphics3/MeshSystem.js +324 -331
  96. package/src/engine/graphics3/PathDisplaySystem.d.ts.map +1 -1
  97. package/src/engine/graphics3/PathDisplaySystem.js +2 -4
  98. package/src/engine/graphics3/PickingQuery.d.ts +15 -21
  99. package/src/engine/graphics3/PickingQuery.d.ts.map +1 -1
  100. package/src/engine/graphics3/PickingQuery.js +21 -25
  101. package/src/engine/graphics3/PickingSystem.d.ts +60 -31
  102. package/src/engine/graphics3/PickingSystem.d.ts.map +1 -1
  103. package/src/engine/graphics3/PickingSystem.js +416 -273
  104. package/src/engine/graphics3/ShadedGeometrySystem.d.ts +22 -12
  105. package/src/engine/graphics3/ShadedGeometrySystem.d.ts.map +1 -1
  106. package/src/engine/graphics3/ShadedGeometrySystem.js +309 -174
  107. package/src/engine/graphics3/TerrainSystem.d.ts +19 -11
  108. package/src/engine/graphics3/TerrainSystem.d.ts.map +1 -1
  109. package/src/engine/graphics3/TerrainSystem.js +102 -53
  110. package/src/engine/graphics3/TooltipComponentSystem.d.ts.map +1 -1
  111. package/src/engine/graphics3/TooltipComponentSystem.js +2 -14
  112. package/src/engine/graphics3/Trail3DSystem.d.ts.map +1 -1
  113. package/src/engine/graphics3/Trail3DSystem.js +2 -4
  114. package/src/engine/graphics3/animation/ClipListPlayer.d.ts +4 -4
  115. package/src/engine/graphics3/animation/ClipListPlayer.d.ts.map +1 -1
  116. package/src/engine/graphics3/animation/ClipListPlayer.js +2 -2
  117. package/src/engine/graphics3/highlight/pack_highlight_table.d.ts +9 -11
  118. package/src/engine/graphics3/highlight/pack_highlight_table.d.ts.map +1 -1
  119. package/src/engine/graphics3/highlight/pack_highlight_table.js +11 -18
  120. package/src/engine/graphics3/pose/query_entity_node_world_pose.d.ts +4 -3
  121. package/src/engine/graphics3/pose/query_entity_node_world_pose.d.ts.map +1 -1
  122. package/src/engine/graphics3/pose/query_entity_node_world_pose.js +75 -74
  123. package/src/engine/graphics3/prefab/Prefab.d.ts +130 -0
  124. package/src/engine/graphics3/prefab/Prefab.d.ts.map +1 -0
  125. package/src/engine/graphics3/prefab/Prefab.js +162 -0
  126. package/src/engine/graphics3/prefab/PrefabInstance.d.ts +72 -0
  127. package/src/engine/graphics3/prefab/PrefabInstance.d.ts.map +1 -0
  128. package/src/engine/graphics3/prefab/PrefabInstance.js +80 -0
  129. package/src/engine/graphics3/prefab/prefab_compile.d.ts +23 -0
  130. package/src/engine/graphics3/prefab/prefab_compile.d.ts.map +1 -0
  131. package/src/engine/graphics3/prefab/prefab_compile.js +334 -0
  132. package/src/engine/graphics3/prefab/prefab_instantiate.d.ts +46 -0
  133. package/src/engine/graphics3/prefab/prefab_instantiate.d.ts.map +1 -0
  134. package/src/engine/graphics3/prefab/prefab_instantiate.js +230 -0
  135. package/src/engine/graphics3/prefab/prefab_normalize_skin_frames.d.ts +70 -0
  136. package/src/engine/graphics3/prefab/prefab_normalize_skin_frames.d.ts.map +1 -0
  137. package/src/engine/graphics3/prefab/prefab_normalize_skin_frames.js +210 -0
  138. package/src/engine/graphics3/prefab/prefab_place.d.ts +60 -0
  139. package/src/engine/graphics3/prefab/prefab_place.d.ts.map +1 -0
  140. package/src/engine/graphics3/prefab/prefab_place.js +130 -0
  141. package/src/engine/graphics3/prefab/prefab_skin_clip_scale_conflicts.d.ts +60 -0
  142. package/src/engine/graphics3/prefab/prefab_skin_clip_scale_conflicts.d.ts.map +1 -0
  143. package/src/engine/graphics3/prefab/prefab_skin_clip_scale_conflicts.js +128 -0
  144. package/src/engine/graphics3/prefab/prefab_skin_frame.d.ts +40 -0
  145. package/src/engine/graphics3/prefab/prefab_skin_frame.d.ts.map +1 -0
  146. package/src/engine/graphics3/prefab/prefab_skin_frame.js +116 -0
  147. package/src/engine/graphics3/preview/make_model_preview_scene.d.ts +16 -14
  148. package/src/engine/graphics3/preview/make_model_preview_scene.d.ts.map +1 -1
  149. package/src/engine/graphics3/preview/make_model_preview_scene.js +126 -154
  150. package/src/engine/graphics3/preview/make_model_thumbnail.js +1 -1
  151. package/src/engine/graphics3/register_instance_animation.d.ts +6 -6
  152. package/src/engine/graphics3/register_instance_animation.d.ts.map +1 -1
  153. package/src/engine/graphics3/register_instance_animation.js +4 -4
  154. package/src/engine/graphics3/shade_bundle_bounds.d.ts +2 -6
  155. package/src/engine/graphics3/shade_bundle_bounds.d.ts.map +1 -1
  156. package/src/engine/graphics3/shade_bundle_bounds.js +47 -55
  157. package/src/engine/graphics3/terrain/pack_terrain_row_table.d.ts +11 -18
  158. package/src/engine/graphics3/terrain/pack_terrain_row_table.d.ts.map +1 -1
  159. package/src/engine/graphics3/terrain/pack_terrain_row_table.js +48 -53
  160. package/src/engine/physics/cloth/build/cloth_proxy_from_joints.d.ts +17 -2
  161. package/src/engine/physics/cloth/build/cloth_proxy_from_joints.d.ts.map +1 -1
  162. package/src/engine/physics/cloth/build/cloth_proxy_from_joints.js +284 -256
  163. package/src/engine/physics/cloth/ecs/ClothInstance.d.ts +13 -15
  164. package/src/engine/physics/cloth/ecs/ClothInstance.d.ts.map +1 -1
  165. package/src/engine/physics/cloth/ecs/ClothInstance.js +12 -14
  166. package/src/engine/physics/cloth/ecs/ClothRig.d.ts +7 -8
  167. package/src/engine/physics/cloth/ecs/ClothRig.d.ts.map +1 -1
  168. package/src/engine/physics/cloth/ecs/ClothRig.js +7 -8
  169. package/src/engine/physics/cloth/ecs/ClothSystem.d.ts +5 -4
  170. package/src/engine/physics/cloth/ecs/ClothSystem.d.ts.map +1 -1
  171. package/src/engine/physics/cloth/ecs/ClothSystem.js +11 -12
  172. package/src/engine/physics/cloth/ecs/cloth_seed_rig.d.ts +19 -23
  173. package/src/engine/physics/cloth/ecs/cloth_seed_rig.d.ts.map +1 -1
  174. package/src/engine/physics/cloth/ecs/cloth_seed_rig.js +201 -199
  175. package/src/engine/physics/cloth/ecs/cloth_seed_subtree.d.ts.map +1 -1
  176. package/src/engine/physics/cloth/ecs/cloth_seed_subtree.js +8 -0
  177. package/src/engine/physics/cloth/ecs/cloth_write_back_rig.d.ts +18 -34
  178. package/src/engine/physics/cloth/ecs/cloth_write_back_rig.d.ts.map +1 -1
  179. package/src/engine/physics/cloth/ecs/cloth_write_back_rig.js +58 -115
  180. package/src/engine/physics/cloth/playground/README.md +11 -11
  181. package/src/engine/physics/cloth/playground/garment_build.d.ts +0 -1
  182. package/src/engine/physics/cloth/playground/garment_build.d.ts.map +1 -1
  183. package/src/engine/physics/cloth/playground/garment_build.js +64 -58
  184. package/src/engine/physics/cloth/playground/garment_main.js +59 -33
  185. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
  186. package/src/shade/RENDERER_CONTRACT.md +85 -53
  187. package/src/shade/device/ShadeGPUCommandContext.d.ts +23 -0
  188. package/src/shade/device/ShadeGPUCommandContext.d.ts.map +1 -1
  189. package/src/shade/device/ShadeGPUCommandContext.js +36 -0
  190. package/src/shade/playground/add_random_meshes.d.ts +4 -4
  191. package/src/shade/playground/add_random_meshes.d.ts.map +1 -1
  192. package/src/shade/playground/add_random_meshes.js +20 -16
  193. package/src/shade/playground/avboit/main.d.ts +1 -0
  194. package/src/shade/playground/avboit/main.d.ts.map +1 -1
  195. package/src/shade/playground/avboit/main.js +916 -875
  196. package/src/shade/playground/basis_textures/main.d.ts.map +1 -1
  197. package/src/shade/playground/basis_textures/main.js +22 -8
  198. package/src/shade/playground/basis_textures/texture_inventory.d.ts +2 -2
  199. package/src/shade/playground/basis_textures/texture_inventory.d.ts.map +1 -1
  200. package/src/shade/playground/basis_textures/texture_inventory.js +6 -7
  201. package/src/shade/playground/ground_seam/main.d.ts.map +1 -1
  202. package/src/shade/playground/ground_seam/main.js +13 -4
  203. package/src/shade/playground/ground_seam/make_ground.d.ts +13 -4
  204. package/src/shade/playground/ground_seam/make_ground.d.ts.map +1 -1
  205. package/src/shade/playground/ground_seam/make_ground.js +21 -16
  206. package/src/shade/playground/particle_ecs/bonfire_editor.js +3 -3
  207. package/src/shade/playground/particle_system/main.js +11 -10
  208. package/src/shade/playground/particle_system/particle_prototype.d.ts +15 -10
  209. package/src/shade/playground/particle_system/particle_prototype.d.ts.map +1 -1
  210. package/src/shade/playground/particle_system/particle_prototype.js +56 -15
  211. package/src/shade/playground/particle_system/particle_scene.d.ts +68 -28
  212. package/src/shade/playground/particle_system/particle_scene.d.ts.map +1 -1
  213. package/src/shade/playground/particle_system/particle_scene.js +149 -53
  214. package/src/shade/playground/readback_crossover/index.html +41 -0
  215. package/src/shade/playground/readback_crossover/main.d.ts +2 -0
  216. package/src/shade/playground/readback_crossover/main.d.ts.map +1 -0
  217. package/src/shade/playground/readback_crossover/main.js +372 -0
  218. package/src/shade/playground/skinned_blas_refit/README.md +11 -7
  219. package/src/shade/playground/skinned_blas_refit/add_floor.d.ts +13 -44
  220. package/src/shade/playground/skinned_blas_refit/add_floor.d.ts.map +1 -1
  221. package/src/shade/playground/skinned_blas_refit/add_floor.js +19 -59
  222. package/src/shade/playground/skinned_blas_refit/main.d.ts.map +1 -1
  223. package/src/shade/playground/skinned_blas_refit/main.js +67 -58
  224. package/src/shade/playground/skinned_blas_refit/place_character.d.ts +40 -54
  225. package/src/shade/playground/skinned_blas_refit/place_character.d.ts.map +1 -1
  226. package/src/shade/playground/skinned_blas_refit/place_character.js +47 -74
  227. package/src/shade/playground/skinned_blas_refit/sweep_views.d.ts +3 -3
  228. package/src/shade/playground/skinned_blas_refit/sweep_views.d.ts.map +1 -1
  229. package/src/shade/playground/skinned_blas_refit/sweep_views.js +4 -3
  230. package/src/shade/playground/skinned_blas_refit/verify_clone_leaves.d.ts +3 -3
  231. package/src/shade/playground/skinned_blas_refit/verify_clone_leaves.d.ts.map +1 -1
  232. package/src/shade/playground/skinned_blas_refit/verify_clone_leaves.js +11 -4
  233. package/src/shade/playground/skinned_blas_refit/verify_instance_bounds.d.ts.map +1 -1
  234. package/src/shade/playground/skinned_blas_refit/verify_instance_bounds.js +38 -9
  235. package/src/shade/playground/skinned_blas_refit/verify_skinned_blas_refit.d.ts +3 -3
  236. package/src/shade/playground/skinned_blas_refit/verify_skinned_blas_refit.d.ts.map +1 -1
  237. package/src/shade/playground/skinned_blas_refit/verify_skinned_blas_refit.js +9 -6
  238. package/src/shade/playground/skinned_blas_refit/verify_traversal_reachability.d.ts +3 -3
  239. package/src/shade/playground/skinned_blas_refit/verify_traversal_reachability.d.ts.map +1 -1
  240. package/src/shade/playground/skinned_blas_refit/verify_traversal_reachability.js +3 -3
  241. package/src/shade/playground/skinned_mesh_soup/README.md +6 -6
  242. package/src/shade/playground/skinned_mesh_soup/main.d.ts.map +1 -1
  243. package/src/shade/playground/skinned_mesh_soup/main.js +44 -102
  244. package/src/shade/playground/skinned_mesh_soup/verify_clone_vertices.d.ts +5 -5
  245. package/src/shade/playground/skinned_mesh_soup/verify_clone_vertices.d.ts.map +1 -1
  246. package/src/shade/playground/skinned_mesh_soup/verify_clone_vertices.js +42 -33
  247. package/src/shade/playground/sponza_path_trace/main.d.ts +1 -0
  248. package/src/shade/playground/sponza_path_trace/main.d.ts.map +1 -1
  249. package/src/shade/playground/sponza_path_trace/main.js +393 -363
  250. package/src/shade/playground/ssr_reprojection/main.js +11 -9
  251. package/src/shade/playground/ssr_reprojection/scene.d.ts +15 -4
  252. package/src/shade/playground/ssr_reprojection/scene.d.ts.map +1 -1
  253. package/src/shade/playground/ssr_reprojection/scene.js +32 -11
  254. package/src/shade/playground/ssr_variance/main.js +1 -1
  255. package/src/shade/playground/ssr_variance/scene.d.ts +10 -4
  256. package/src/shade/playground/ssr_variance/scene.d.ts.map +1 -1
  257. package/src/shade/playground/ssr_variance/scene.js +39 -15
  258. package/src/shade/playground/vgeo_viewer/main.js +6 -2
  259. package/src/shade/playground/volumetrics_froxel/main.d.ts.map +1 -1
  260. package/src/shade/playground/volumetrics_froxel/main.js +936 -922
  261. package/src/shade/renderer/GraphicsContext.d.ts +7 -0
  262. package/src/shade/renderer/GraphicsContext.d.ts.map +1 -1
  263. package/src/shade/renderer/GraphicsContext.js +11 -0
  264. package/src/shade/renderer/Renderer.d.ts +3 -2
  265. package/src/shade/renderer/Renderer.d.ts.map +1 -1
  266. package/src/shade/renderer/Renderer.js +3 -2
  267. package/src/shade/renderer/animation/GPUAnimationManager.d.ts +39 -47
  268. package/src/shade/renderer/animation/GPUAnimationManager.d.ts.map +1 -1
  269. package/src/shade/renderer/animation/GPUAnimationManager.js +319 -256
  270. package/src/shade/renderer/animation/ShadeAnimationChannel.d.ts +26 -22
  271. package/src/shade/renderer/animation/ShadeAnimationChannel.d.ts.map +1 -1
  272. package/src/shade/renderer/animation/ShadeAnimationChannel.js +28 -23
  273. package/src/shade/renderer/animation/ShadeAnimationClip.d.ts +14 -6
  274. package/src/shade/renderer/animation/ShadeAnimationClip.d.ts.map +1 -1
  275. package/src/shade/renderer/animation/ShadeAnimationClip.js +20 -8
  276. package/src/shade/renderer/animation/Skin.d.ts +19 -19
  277. package/src/shade/renderer/animation/Skin.d.ts.map +1 -1
  278. package/src/shade/renderer/animation/Skin.js +15 -13
  279. package/src/shade/renderer/animation/pose/pose_evaluate_local.d.ts +6 -5
  280. package/src/shade/renderer/animation/pose/pose_evaluate_local.d.ts.map +1 -1
  281. package/src/shade/renderer/animation/pose/pose_evaluate_local.js +9 -9
  282. package/src/shade/renderer/animation/skin_clip_scale_conflicts.d.ts +5 -59
  283. package/src/shade/renderer/animation/skin_clip_scale_conflicts.d.ts.map +1 -1
  284. package/src/shade/renderer/animation/skin_clip_scale_conflicts.js +8 -132
  285. package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.d.ts +65 -62
  286. package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.d.ts.map +1 -1
  287. package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.js +148 -194
  288. package/src/shade/renderer/animation/skinning/SKINNING_BINDING_STRUCT.d.ts.map +1 -1
  289. package/src/shade/renderer/animation/skinning/SKINNING_BINDING_STRUCT.js +4 -7
  290. package/src/shade/renderer/animation/skinning/chunk_skin_blend_mesh_local.d.ts +2 -2
  291. package/src/shade/renderer/animation/skinning/chunk_skin_blend_mesh_local.js +2 -2
  292. package/src/shade/renderer/buffer/GPUBufferReadbackAllocator.d.ts +74 -0
  293. package/src/shade/renderer/buffer/GPUBufferReadbackAllocator.d.ts.map +1 -0
  294. package/src/shade/renderer/buffer/GPUBufferReadbackAllocator.js +240 -0
  295. package/src/shade/renderer/buffer/table/GPUDatabase.d.ts +14 -0
  296. package/src/shade/renderer/buffer/table/GPUDatabase.d.ts.map +1 -1
  297. package/src/shade/renderer/buffer/table/GPUDatabase.js +64 -6
  298. package/src/shade/renderer/buffer/table/GPUDatabaseReadback.d.ts +190 -0
  299. package/src/shade/renderer/buffer/table/GPUDatabaseReadback.d.ts.map +1 -0
  300. package/src/shade/renderer/buffer/table/GPUDatabaseReadback.js +1323 -0
  301. package/src/shade/renderer/buffer/table/GPUPageMetadata.d.ts +10 -0
  302. package/src/shade/renderer/buffer/table/GPUPageMetadata.d.ts.map +1 -1
  303. package/src/shade/renderer/buffer/table/GPUPageMetadata.js +12 -0
  304. package/src/shade/renderer/buffer/table/GPUReadbackStagingRing.d.ts +96 -0
  305. package/src/shade/renderer/buffer/table/GPUReadbackStagingRing.d.ts.map +1 -0
  306. package/src/shade/renderer/buffer/table/GPUReadbackStatus.d.ts +15 -0
  307. package/src/shade/renderer/buffer/table/GPUReadbackStatus.d.ts.map +1 -0
  308. package/src/shade/renderer/buffer/table/GPUReadbackStatus.js +34 -0
  309. package/src/shade/renderer/buffer/table/GPUTypedTable.d.ts +75 -7
  310. package/src/shade/renderer/buffer/table/GPUTypedTable.d.ts.map +1 -1
  311. package/src/shade/renderer/buffer/table/GPUTypedTable.js +518 -135
  312. package/src/shade/renderer/buffer/table/GPU_TABLE_GATHER_DESCRIPTOR_WORDS.d.ts +19 -0
  313. package/src/shade/renderer/buffer/table/GPU_TABLE_GATHER_DESCRIPTOR_WORDS.d.ts.map +1 -0
  314. package/src/shade/renderer/buffer/table/GPU_TABLE_GATHER_DESCRIPTOR_WORDS.js +18 -0
  315. package/src/shade/renderer/buffer/table/WordViews.d.ts +39 -0
  316. package/src/shade/renderer/buffer/table/WordViews.d.ts.map +1 -0
  317. package/src/shade/renderer/buffer/table/WordViews.js +62 -0
  318. package/src/shade/renderer/buffer/table/gpu_table_gather_shader.d.ts +27 -0
  319. package/src/shade/renderer/buffer/table/gpu_table_gather_shader.d.ts.map +1 -0
  320. package/src/shade/renderer/buffer/table/gpu_table_gather_shader.js +117 -0
  321. package/src/shade/renderer/buffer/table/serde/generate_record_writer.d.ts +121 -0
  322. package/src/shade/renderer/buffer/table/serde/generate_record_writer.d.ts.map +1 -0
  323. package/src/shade/renderer/buffer/table/serde/generate_record_writer.js +395 -0
  324. package/src/shade/renderer/buffer/table/single/GPUSingleTypeTable.d.ts.map +1 -1
  325. package/src/shade/renderer/buffer/table/single/GPUSingleTypeTable.js +70 -20
  326. package/src/shade/renderer/dynamic/GPUDynamicMeshResidency.js +1 -1
  327. package/src/shade/renderer/geometry/bvh/GPUGeometryBVHManager.d.ts.map +1 -1
  328. package/src/shade/renderer/geometry/bvh/GPUGeometryBVHManager.js +6 -5
  329. package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.d.ts +3 -3
  330. package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.d.ts.map +1 -1
  331. package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.js +15 -11
  332. package/src/shade/renderer/global_illumination/brick4/cpu/brick4_bake_for_scene.d.ts +1 -1
  333. package/src/shade/renderer/global_illumination/brick4/cpu/brick4_bake_for_scene.js +4 -4
  334. package/src/shade/renderer/global_illumination/brick4/cpu/brick4_generate_tree_from_scene.d.ts +1 -3
  335. package/src/shade/renderer/global_illumination/brick4/cpu/brick4_generate_tree_from_scene.d.ts.map +1 -1
  336. package/src/shade/renderer/global_illumination/brick4/cpu/brick4_generate_tree_from_scene.js +5 -4
  337. package/src/shade/renderer/global_illumination/brick4/gpu/bake/brick4_bake_basic.js +1 -1
  338. package/src/shade/renderer/global_illumination/lpv/bake/GPULightProbeVolumeRenderer.d.ts.map +1 -1
  339. package/src/shade/renderer/global_illumination/lpv/bake/GPULightProbeVolumeRenderer.js +1 -4
  340. package/src/shade/renderer/global_illumination/lpv/lpv_visualise_probes.d.ts +8 -3
  341. package/src/shade/renderer/global_illumination/lpv/lpv_visualise_probes.d.ts.map +1 -1
  342. package/src/shade/renderer/global_illumination/lpv/lpv_visualise_probes.js +19 -14
  343. package/src/shade/renderer/global_illumination/lpv/placement/graph_generate_probe_locations.d.ts.map +1 -1
  344. package/src/shade/renderer/global_illumination/lpv/placement/graph_generate_probe_locations.js +9 -1
  345. package/src/shade/renderer/global_illumination/lpv/placement/software/lpv_generate_probe_locations2.d.ts +3 -3
  346. package/src/shade/renderer/global_illumination/lpv/placement/software/lpv_generate_probe_locations2.d.ts.map +1 -1
  347. package/src/shade/renderer/global_illumination/lpv/placement/software/lpv_generate_probe_locations2.js +12 -5
  348. package/src/shade/renderer/global_illumination/probe/octahedral/GPUProbeAtlas.js +1 -1
  349. package/src/shade/renderer/light/GPULightCollection.d.ts +29 -0
  350. package/src/shade/renderer/light/GPULightCollection.d.ts.map +1 -1
  351. package/src/shade/renderer/light/GPULightCollection.js +444 -329
  352. package/src/shade/renderer/light/LIGHT_DATABASE_SPEC.d.ts.map +1 -1
  353. package/src/shade/renderer/light/LIGHT_DATABASE_SPEC.js +7 -1
  354. package/src/shade/renderer/light/LightCollection.d.ts +29 -1
  355. package/src/shade/renderer/light/LightCollection.d.ts.map +1 -1
  356. package/src/shade/renderer/light/LightCollection.js +50 -1
  357. package/src/shade/renderer/light/make_sunlight.js +2 -2
  358. package/src/shade/renderer/light/model/Light.d.ts +29 -2
  359. package/src/shade/renderer/light/model/Light.d.ts.map +1 -1
  360. package/src/shade/renderer/light/model/Light.js +30 -2
  361. package/src/shade/renderer/light/model/io/light_record_directional.d.ts +3 -1
  362. package/src/shade/renderer/light/model/io/light_record_directional.d.ts.map +1 -1
  363. package/src/shade/renderer/light/model/io/light_record_directional.js +8 -5
  364. package/src/shade/renderer/light/model/io/light_record_point.d.ts +3 -1
  365. package/src/shade/renderer/light/model/io/light_record_point.d.ts.map +1 -1
  366. package/src/shade/renderer/light/model/io/light_record_point.js +5 -2
  367. package/src/shade/renderer/light/model/io/light_record_spot.d.ts +4 -1
  368. package/src/shade/renderer/light/model/io/light_record_spot.d.ts.map +1 -1
  369. package/src/shade/renderer/light/model/io/light_record_spot.js +10 -6
  370. package/src/shade/renderer/light/place_light.d.ts +16 -0
  371. package/src/shade/renderer/light/place_light.d.ts.map +1 -0
  372. package/src/shade/renderer/light/place_light.js +36 -0
  373. package/src/shade/renderer/light/shader_refresh_light_poses.d.ts +44 -0
  374. package/src/shade/renderer/light/shader_refresh_light_poses.d.ts.map +1 -0
  375. package/src/shade/renderer/light/shader_refresh_light_poses.js +154 -0
  376. package/src/shade/renderer/lightmap/GPULightMap.js +1 -1
  377. package/src/shade/renderer/lightmap/bake/raster/graph_draw_lightmap_viz_buffer.d.ts.map +1 -1
  378. package/src/shade/renderer/lightmap/bake/raster/graph_draw_lightmap_viz_buffer.js +12 -14
  379. package/src/shade/renderer/loader/SceneBundle.d.ts +53 -28
  380. package/src/shade/renderer/loader/SceneBundle.d.ts.map +1 -1
  381. package/src/shade/renderer/loader/SceneBundle.js +111 -56
  382. package/src/shade/renderer/loader/SceneNode.d.ts +81 -0
  383. package/src/shade/renderer/loader/SceneNode.d.ts.map +1 -0
  384. package/src/shade/renderer/loader/SceneNode.js +114 -0
  385. package/src/shade/renderer/loader/gltf/load_gltf.d.ts +3 -2
  386. package/src/shade/renderer/loader/gltf/load_gltf.d.ts.map +1 -1
  387. package/src/shade/renderer/loader/gltf/load_gltf.js +110 -142
  388. package/src/shade/renderer/loader/gltf/tiny-gltf.d.ts +1 -1
  389. package/src/shade/renderer/loader/usd/UsdExtensionRegistry.d.ts +4 -4
  390. package/src/shade/renderer/loader/usd/UsdExtensionRegistry.d.ts.map +1 -1
  391. package/src/shade/renderer/loader/usd/UsdExtensionRegistry.js +2 -2
  392. package/src/shade/renderer/loader/usd/load_usd.d.ts +3 -2
  393. package/src/shade/renderer/loader/usd/load_usd.d.ts.map +1 -1
  394. package/src/shade/renderer/loader/usd/load_usd.js +4 -5
  395. package/src/shade/renderer/loader/usd/usd_build_scene.d.ts +3 -3
  396. package/src/shade/renderer/loader/usd/usd_build_scene.d.ts.map +1 -1
  397. package/src/shade/renderer/loader/usd/usd_build_scene.js +47 -55
  398. package/src/shade/renderer/material/GPUMaterialManager.js +1 -1
  399. package/src/shade/renderer/material/resident/GPUResidentMaterialContext.d.ts +5 -4
  400. package/src/shade/renderer/material/resident/GPUResidentMaterialContext.d.ts.map +1 -1
  401. package/src/shade/renderer/material/resident/GPUResidentMaterialContext.js +8 -15
  402. package/src/shade/renderer/object_property/shader_refresh_all_mesh_bounds.d.ts +15 -13
  403. package/src/shade/renderer/object_property/shader_refresh_all_mesh_bounds.d.ts.map +1 -1
  404. package/src/shade/renderer/object_property/shader_refresh_all_mesh_bounds.js +40 -21
  405. package/src/shade/renderer/particles/DESIGN.md +53 -50
  406. package/src/shade/renderer/particles/GPUParticleSystem.d.ts +31 -17
  407. package/src/shade/renderer/particles/GPUParticleSystem.d.ts.map +1 -1
  408. package/src/shade/renderer/particles/GPUParticleSystem.js +54 -91
  409. package/src/shade/renderer/particles/runtime/EmitterRegistry.d.ts +12 -11
  410. package/src/shade/renderer/particles/runtime/EmitterRegistry.d.ts.map +1 -1
  411. package/src/shade/renderer/particles/runtime/EmitterRegistry.js +12 -11
  412. package/src/shade/renderer/particles/runtime/GPUParticleEmitterContext.d.ts +13 -19
  413. package/src/shade/renderer/particles/runtime/GPUParticleEmitterContext.d.ts.map +1 -1
  414. package/src/shade/renderer/particles/runtime/GPUParticleEmitterContext.js +19 -25
  415. package/src/shade/renderer/particles/runtime/ParticleEmitter.d.ts +34 -24
  416. package/src/shade/renderer/particles/runtime/ParticleEmitter.d.ts.map +1 -1
  417. package/src/shade/renderer/particles/runtime/ParticleEmitter.js +53 -40
  418. package/src/shade/renderer/path_tracer/accumulating/AccumulatingPathTracer.js +1 -1
  419. package/src/shade/renderer/path_tracer/graph_path_trace_scene.js +1 -1
  420. package/src/shade/renderer/postprocess/nss/NSS.d.ts +1 -1
  421. package/src/shade/renderer/rasterize/expand/bucket/mesh/graph_meshes_classify_buckets.d.ts.map +1 -1
  422. package/src/shade/renderer/rasterize/expand/bucket/mesh/graph_meshes_classify_buckets.js +2 -1
  423. package/src/shade/renderer/rasterize/expand/bucket/mesh/graph_scene_meshes_cull_and_classify_buckets.d.ts.map +1 -1
  424. package/src/shade/renderer/rasterize/expand/bucket/mesh/graph_scene_meshes_cull_and_classify_buckets.js +5 -2
  425. package/src/shade/renderer/rasterize/fast/graph_rasterize_scene_fast.js +1 -1
  426. package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.js +1 -1
  427. package/src/shade/renderer/rasterize/native/graph_rasterize_meshes_alpha_tested.js +1 -1
  428. package/src/shade/renderer/rasterize/native/oit/graph_rasterize_meshes_transparent_oit.js +1 -1
  429. package/src/shade/renderer/rasterize/standard/graph_rasterize_scene.js +1 -1
  430. package/src/shade/renderer/scene/DynamicMesh.d.ts +13 -4
  431. package/src/shade/renderer/scene/DynamicMesh.d.ts.map +1 -1
  432. package/src/shade/renderer/scene/DynamicMesh.js +14 -4
  433. package/src/shade/renderer/scene/GPUInstancesAccelerationStructure.d.ts +38 -18
  434. package/src/shade/renderer/scene/GPUInstancesAccelerationStructure.d.ts.map +1 -1
  435. package/src/shade/renderer/scene/GPUInstancesAccelerationStructure.js +112 -60
  436. package/src/shade/renderer/scene/GPUSceneContext.d.ts +55 -48
  437. package/src/shade/renderer/scene/GPUSceneContext.d.ts.map +1 -1
  438. package/src/shade/renderer/scene/GPUSceneContext.js +594 -928
  439. package/src/shade/renderer/scene/NODE3D_STRUCT.d.ts +5 -5
  440. package/src/shade/renderer/scene/NODE3D_STRUCT.js +5 -5
  441. package/src/shade/renderer/scene/Node3D.d.ts +27 -8
  442. package/src/shade/renderer/scene/Node3D.d.ts.map +1 -1
  443. package/src/shade/renderer/scene/Node3DDirtyList.d.ts +59 -0
  444. package/src/shade/renderer/scene/Node3DDirtyList.d.ts.map +1 -0
  445. package/src/shade/renderer/scene/Scene.d.ts +18 -60
  446. package/src/shade/renderer/scene/Scene.d.ts.map +1 -1
  447. package/src/shade/renderer/scene/Scene.js +53 -146
  448. package/src/shade/renderer/scene/SkinnedMesh.d.ts +10 -93
  449. package/src/shade/renderer/scene/SkinnedMesh.d.ts.map +1 -1
  450. package/src/shade/renderer/scene/bvh/StaticSceneBVH.d.ts +24 -3
  451. package/src/shade/renderer/scene/bvh/StaticSceneBVH.d.ts.map +1 -1
  452. package/src/shade/renderer/scene/bvh/StaticSceneBVH.js +53 -13
  453. package/src/shade/renderer/scene/hierarchy/graph_scene_update_transform_hierarchy.d.ts +5 -6
  454. package/src/shade/renderer/scene/hierarchy/graph_scene_update_transform_hierarchy.d.ts.map +1 -1
  455. package/src/shade/renderer/scene/hierarchy/graph_scene_update_transform_hierarchy.js +5 -6
  456. package/src/shade/renderer/scene/optimization/scene_optimize.d.ts +10 -2
  457. package/src/shade/renderer/scene/optimization/scene_optimize.d.ts.map +1 -1
  458. package/src/shade/renderer/scene/optimization/scene_optimize.js +266 -230
  459. package/src/shade/renderer/scene/rows/GPUEntityBoundsReadback.d.ts +53 -0
  460. package/src/shade/renderer/scene/rows/GPUEntityBoundsReadback.d.ts.map +1 -0
  461. package/src/shade/renderer/scene/rows/GPUEntityBoundsReadback.js +144 -0
  462. package/src/shade/renderer/scene/rows/GPUSceneRows.d.ts +227 -0
  463. package/src/shade/renderer/scene/rows/GPUSceneRows.d.ts.map +1 -0
  464. package/src/shade/renderer/scene/rows/GPUSceneRows.js +1136 -0
  465. package/src/shade/renderer/scene/rows/place_primitive.d.ts +48 -0
  466. package/src/shade/renderer/scene/rows/place_primitive.d.ts.map +1 -0
  467. package/src/shade/renderer/scene/rows/place_primitive.js +98 -0
  468. package/src/shade/renderer/scene/serialization/deserialize_scene.d.ts +10 -8
  469. package/src/shade/renderer/scene/serialization/deserialize_scene.d.ts.map +1 -1
  470. package/src/shade/renderer/scene/serialization/deserialize_scene.js +24 -27
  471. package/src/shade/renderer/scene/serialization/serialize_scene.d.ts +9 -2
  472. package/src/shade/renderer/scene/serialization/serialize_scene.d.ts.map +1 -1
  473. package/src/shade/renderer/scene/serialization/serialize_scene.js +25 -4
  474. package/src/shade/renderer/scene/verify_gpu_tlas_build.js +2 -2
  475. package/src/shade/renderer/shader/chunk/light/DIRECTIONAL_LIGHT_STRUCT.d.ts.map +1 -1
  476. package/src/shade/renderer/shader/chunk/light/DIRECTIONAL_LIGHT_STRUCT.js +5 -0
  477. package/src/shade/renderer/shader/chunk/light/POINT_LIGHT_STRUCT.d.ts.map +1 -1
  478. package/src/shade/renderer/shader/chunk/light/POINT_LIGHT_STRUCT.js +5 -0
  479. package/src/shade/renderer/shader/chunk/light/SPOT_LIGHT_STRUCT.d.ts.map +1 -1
  480. package/src/shade/renderer/shader/chunk/light/SPOT_LIGHT_STRUCT.js +5 -0
  481. package/src/shade/renderer/shadow/map/DirectionalLightShadowmap.d.ts +39 -0
  482. package/src/shade/renderer/shadow/map/DirectionalLightShadowmap.d.ts.map +1 -1
  483. package/src/shade/renderer/shadow/map/DirectionalLightShadowmap.js +112 -64
  484. package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.d.ts +7 -0
  485. package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.d.ts.map +1 -1
  486. package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.js +1541 -1352
  487. package/src/shade/renderer/shadow/map/PointLightShadowmap.js +1 -1
  488. package/src/shade/renderer/shadow/map/SpotLightShadowmap.js +1 -1
  489. package/src/shade/renderer/shadow/map/TetrahedronPointLightShadowmap.js +1 -1
  490. package/src/shade/renderer/shadow/map/csm/CSM_CASTER_RANGE_STRUCT.d.ts +29 -0
  491. package/src/shade/renderer/shadow/map/csm/CSM_CASTER_RANGE_STRUCT.d.ts.map +1 -0
  492. package/src/shade/renderer/shadow/map/csm/CSM_CASTER_RANGE_STRUCT.js +43 -0
  493. package/src/shade/renderer/shadow/map/csm/SHADOWMAP_CSM_CASTER_RANGE_MARGIN_FRACTION.d.ts +13 -0
  494. package/src/shade/renderer/shadow/map/csm/SHADOWMAP_CSM_CASTER_RANGE_MARGIN_FRACTION.d.ts.map +1 -0
  495. package/src/shade/renderer/shadow/map/csm/SHADOWMAP_CSM_CASTER_RANGE_MARGIN_FRACTION.js +12 -0
  496. package/src/shade/renderer/shadow/map/csm/shader/shader_csm_caster_range.d.ts +49 -0
  497. package/src/shade/renderer/shadow/map/csm/shader/shader_csm_caster_range.d.ts.map +1 -0
  498. package/src/shade/renderer/shadow/map/csm/shader/shader_csm_caster_range.js +194 -0
  499. package/src/shade/renderer/shadow/map/csm_debug_draw_preview.js +1 -1
  500. package/src/shade/renderer/shadow/map/shadowmap_update_score.js +1 -1
  501. package/src/shade/renderer/shadow/ray/RTXShadows.js +1 -1
  502. package/src/shade/renderer/shadow/ray/staged/trace/graph_trace_rays.js +1 -1
  503. package/src/shade/renderer/shadow/sdf/cascade/CascadedSceneSDF.d.ts.map +1 -1
  504. package/src/shade/renderer/shadow/sdf/cascade/CascadedSceneSDF.js +3 -1
  505. package/src/shade/renderer/texture/bindless/GPUBindlessTextureManager.js +8 -8
  506. package/src/shade/renderer/volumetrics/GPUViewVolumetrics.d.ts.map +1 -1
  507. package/src/shade/renderer/volumetrics/GPUViewVolumetrics.js +4 -3
  508. package/src/engine/graphics3/instantiate_scene_bundle.js +0 -164
  509. package/src/engine/graphics3/shade_node_to_entity_composition.js +0 -88
  510. package/src/shade/renderer/animation/compute_skin_world_bounds.js +0 -146
  511. package/src/shade/renderer/animation/compute_skinned_mesh_clip_bounding_sphere.js +0 -531
  512. package/src/shade/renderer/animation/pose/pose_evaluate_world.js +0 -76
  513. package/src/shade/renderer/animation/skin_bind_transform.js +0 -33
  514. package/src/shade/renderer/animation/skin_frame_defect.js +0 -132
  515. package/src/shade/renderer/animation/skin_joint_matrix.js +0 -46
  516. package/src/shade/renderer/animation/skin_normalize_mesh_frame.js +0 -216
  517. package/src/shade/renderer/scene/InstanceBatch.js +0 -235
  518. package/src/shade/renderer/scene/Mesh.js +0 -168
  519. package/src/shade/renderer/scene/Node3D.js +0 -263
  520. package/src/shade/renderer/scene/SceneNodeBinding.js +0 -56
  521. package/src/shade/renderer/scene/SkinnedMesh.js +0 -170
  522. package/src/shade/renderer/scene/TransformAuthority.js +0 -33
@@ -1,273 +1,416 @@
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 { Transform64 } from "../ecs/transform/Transform64.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, Transform64];
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 {Transform64} 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 {Transform64} 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
+ import { assert } from "../../core/assert.js";
2
+ import { m4_invert } from "../../core/geom/3d/mat4/m4_invert.js";
3
+ import { BufferResourceDescriptor } from "../../shade/device/graph/BufferResourceDescriptor.js";
4
+ import { graph_read_buffer } from "../../shade/renderer/buffer/graph_read_buffer.js";
5
+ import { FramePhase } from "../../shade/renderer/extension/FramePhase.js";
6
+ import { RenderExtension } from "../../shade/renderer/extension/RenderExtension.js";
7
+ import { ViewTextures } from "../../shade/renderer/extension/ViewTextures.js";
8
+ import { VIZ_BUFFER_INVALID_MESH_VALUE } from "../../shade/renderer/rasterize/native/viz/VIZ_BUFFER_INVALID_MESH_VALUE.js";
9
+ import { entity_of_row } from "../../shade/renderer/scene/rows/GPUSceneRows.js";
10
+ import { ParentEntity } from "../ecs/parent/ParentEntity.js";
11
+ import { System } from "../ecs/System.js";
12
+ import { Pickable } from "./Pickable.js";
13
+ import { PickingResult } from "./PickingResult.js";
14
+
15
+ /**
16
+ * Bytes one texel's copy occupies in the readback: WebGPU rounds `bytesPerRow` up to 256, and
17
+ * each query copies two texels — the mesh row and the depth — one row each.
18
+ *
19
+ * @type {number}
20
+ */
21
+ const TEXEL_STRIDE = 256;
22
+
23
+ /**
24
+ * @type {number}
25
+ */
26
+ const QUERY_STRIDE = TEXEL_STRIDE * 2;
27
+
28
+ /**
29
+ * Answers "what is under this pixel" for entities that asked to be pickable.
30
+ *
31
+ * **Off the visibility buffer.** The rasterizer writes every pixel's `meshes` row — an entity's
32
+ * row, one on — and its depth; a pick copies those two texels out of the frame that drew them and
33
+ * resolves the row to the entity that drew it, then up its parents to the one that opted in. What
34
+ * was drawn is what is picked: at triangle precision, under skinning, with nothing kept on the CPU
35
+ * for it — no bounds, no tree, no per-frame refresh.
36
+ *
37
+ * **Asynchronous and batched, of necessity.** The texels are copied by the frame after the query
38
+ * was asked and read back when the device has finished it, so an answer is a frame or two late and
39
+ * arrives for the whole batch at once. A result is a promise for that reason, and nothing this
40
+ * tick can come to depend on it.
41
+ *
42
+ * Terrain picking, which is where the game's precision matters, does not come through here at all:
43
+ * it is an exact raycast against the terrain's own representation and is untouched by any of this.
44
+ */
45
+ export class PickingSystem extends System {
46
+ /**
47
+ * @type {GraphicsEngine}
48
+ */
49
+ #graphics;
50
+
51
+ /**
52
+ * @type {PickingExtension|null}
53
+ */
54
+ #extension = null;
55
+
56
+ /**
57
+ * Entities that have opted in.
58
+ *
59
+ * @type {Set<number>}
60
+ */
61
+ #pickable = new Set();
62
+
63
+ /**
64
+ * Queries asked since the last frame took a batch, with the promise each batch answers.
65
+ *
66
+ * @type {{queries: PickingQuery[], resolve: function(PickingResult[]): void, reject: function(Error): void}[]}
67
+ */
68
+ #waiting = [];
69
+
70
+ /**
71
+ * @param {GraphicsEngine} graphics whose frames draw the view the picks read
72
+ */
73
+ constructor(graphics) {
74
+ super();
75
+
76
+ assert.defined(graphics, 'graphics');
77
+
78
+ this.#graphics = graphics;
79
+
80
+ this.dependencies = [Pickable];
81
+ }
82
+
83
+ async startup(entityManager) {
84
+ this.entityManager = entityManager;
85
+
86
+ this.#extension = this.#graphics.add_extension(new PickingExtension(this));
87
+ }
88
+
89
+ async shutdown(entityManager) {
90
+ if (this.#extension !== null) {
91
+ this.#graphics.remove_extension(this.#extension);
92
+ this.#extension = null;
93
+ }
94
+
95
+ this.#pickable.clear();
96
+
97
+ // nothing will draw a frame for them
98
+ for (const batch of this.#waiting.splice(0)) {
99
+ batch.reject(new Error('the picking system shut down before a frame answered'));
100
+ }
101
+ }
102
+
103
+ /**
104
+ * @param {Pickable} pickable
105
+ * @param {number} entity
106
+ */
107
+ link(pickable, entity) {
108
+ this.#pickable.add(entity);
109
+ }
110
+
111
+ /**
112
+ * @param {Pickable} pickable
113
+ * @param {number} entity
114
+ */
115
+ unlink(pickable, entity) {
116
+ this.#pickable.delete(entity);
117
+ }
118
+
119
+ /**
120
+ * How many entities have opted in.
121
+ *
122
+ * @returns {number}
123
+ */
124
+ get pickable_count() {
125
+ return this.#pickable.size;
126
+ }
127
+
128
+ /**
129
+ * Batches asked and not yet answered by a frame.
130
+ *
131
+ * @returns {number}
132
+ */
133
+ get waiting_count() {
134
+ return this.#waiting.length;
135
+ }
136
+
137
+ /**
138
+ * What is drawn under each of these pixels.
139
+ *
140
+ * One result per query, in the order the queries were given. A pixel over nothing pickable
141
+ * still gets a result — `entity` is {@link PickingResult.NOTHING} — so the two arrays line up
142
+ * by position and a caller never has to search for the answer to its own question.
143
+ *
144
+ * Answered by the next frame that draws the view, when the device has finished it.
145
+ *
146
+ * @param {PickingQuery[]} queries
147
+ * @returns {Promise<PickingResult[]>}
148
+ */
149
+ pick(queries) {
150
+ assert.isArray(queries, 'queries');
151
+
152
+ if (queries.length === 0) {
153
+ return Promise.resolve([]);
154
+ }
155
+
156
+ return new Promise((resolve, reject) => {
157
+ this.#waiting.push({ queries: queries.slice(), resolve, reject });
158
+ });
159
+ }
160
+
161
+ /**
162
+ * Take everything asked since the last frame, to be answered by this one.
163
+ *
164
+ * @returns {{queries: PickingQuery[], resolve: function(PickingResult[]): void, reject: function(Error): void}[]}
165
+ */
166
+ take_waiting() {
167
+ return this.#waiting.splice(0);
168
+ }
169
+
170
+ /**
171
+ * The entity a drawn mesh row picks: the one that drew it, or the nearest of its ancestors,
172
+ * that opted in.
173
+ *
174
+ * @param {number} row a `meshes` row, as the visibility buffer holds it
175
+ * @returns {number} the entity, or {@link PickingResult.NOTHING}
176
+ */
177
+ resolve_row(row) {
178
+ if (row >= VIZ_BUFFER_INVALID_MESH_VALUE) {
179
+ return PickingResult.NOTHING;
180
+ }
181
+
182
+ const dataset = this.entityManager.dataset;
183
+ const pickable = this.#pickable;
184
+
185
+ let entity = entity_of_row(row);
186
+
187
+ while (entity >= 0 && dataset.entityExists(entity)) {
188
+ if (pickable.has(entity)) {
189
+ return entity;
190
+ }
191
+
192
+ const parent = dataset.getComponent(entity, ParentEntity);
193
+
194
+ entity = parent === undefined || parent === null ? -1 : parent.entity;
195
+ }
196
+
197
+ return PickingResult.NOTHING;
198
+ }
199
+ }
200
+
201
+ /**
202
+ * Copies the queried texels out of the frame that drew them, after the G-buffer is written and
203
+ * before anything overwrites the visibility buffer, and answers the batch when they land.
204
+ */
205
+ export class PickingExtension extends RenderExtension {
206
+ name = "picking";
207
+ phase = FramePhase.AfterGBuffer;
208
+
209
+ /**
210
+ * @type {PickingSystem}
211
+ */
212
+ #system;
213
+
214
+ /**
215
+ * @param {PickingSystem} system
216
+ */
217
+ constructor(system) {
218
+ super();
219
+
220
+ this.#system = system;
221
+ }
222
+
223
+ /**
224
+ * @param {import("../../shade/renderer/extension/FrameContext.js").FrameContext} frame
225
+ */
226
+ record(frame) {
227
+ const batches = this.#system.take_waiting();
228
+
229
+ if (batches.length === 0) {
230
+ return;
231
+ }
232
+
233
+ // the view's own resolution: what the visibility buffer is sized to, whatever the frame's
234
+ // target at this phase is
235
+ const resolution = frame.view.resolution;
236
+ const width = resolution[0];
237
+ const height = resolution[1];
238
+
239
+ // what the frame projected with, kept for when the answer comes: the frame's camera has
240
+ // moved on by then
241
+ const view_projection = new Float32Array(frame.view.camera.view_projection_matrix);
242
+ const camera = frame.view.camera.camera.transform;
243
+ const eye = [camera.translation_x, camera.translation_y, camera.translation_z];
244
+
245
+ /** @type {PickingQuery[]} every query of every batch, in order */
246
+ const queries = [];
247
+
248
+ for (const batch of batches) {
249
+ for (const query of batch.queries) {
250
+ queries.push(query);
251
+ }
252
+ }
253
+
254
+ const textures = frame.get(ViewTextures);
255
+ const graph = frame.graph;
256
+
257
+ // A transient pool buffer carries what its last tenant left: a query off the view has to
258
+ // read as nothing rather than as whatever that was, so the buffer is cleared before the
259
+ // copies land in it.
260
+ const cleared = {};
261
+ const clear = graph.add("Picking / clear texels", cleared, (d, resources, context) => {
262
+ context.encoder.clearBuffer(resources.get(d.target));
263
+ });
264
+
265
+ cleared.target = clear.create("picking/texels", BufferResourceDescriptor.from(
266
+ queries.length * QUERY_STRIDE,
267
+ GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC
268
+ ));
269
+
270
+ const data = {};
271
+ const pass = graph.add("Picking / copy texels", data, (data, resources, context) => {
272
+ const mesh = resources.get(data.mesh).gpu_texture;
273
+ const depth = resources.get(data.depth).gpu_texture;
274
+ const target = resources.get(data.target);
275
+ const encoder = context.encoder;
276
+
277
+ for (let i = 0; i < queries.length; i++) {
278
+ const query = queries[i];
279
+
280
+ if (!on_view(query)) {
281
+ // off the view: nothing is copied, and the texel reads as nothing
282
+ continue;
283
+ }
284
+
285
+ const origin = { x: texel(query.u, width), y: texel(query.v, height) };
286
+ const offset = i * QUERY_STRIDE;
287
+
288
+ encoder.copyTextureToBuffer(
289
+ { texture: mesh, origin },
290
+ { buffer: target, offset, bytesPerRow: TEXEL_STRIDE },
291
+ [1, 1, 1]
292
+ );
293
+
294
+ encoder.copyTextureToBuffer(
295
+ { texture: depth, origin, aspect: "depth-only" },
296
+ { buffer: target, offset: offset + TEXEL_STRIDE, bytesPerRow: TEXEL_STRIDE },
297
+ [1, 1, 1]
298
+ );
299
+ }
300
+ });
301
+
302
+ data.mesh = pass.read(textures.visibility_mesh);
303
+ data.depth = pass.read(textures.depth);
304
+ data.target = pass.write(cleared.target);
305
+
306
+ const system = this.#system;
307
+
308
+ graph_read_buffer({ graph, buffer: data.target })
309
+ .then(ref => {
310
+ try {
311
+ const words = new Uint32Array(ref.getValue());
312
+ const floats = new Float32Array(words.buffer);
313
+
314
+ let index = 0;
315
+
316
+ for (const batch of batches) {
317
+ const results = [];
318
+
319
+ for (let i = 0; i < batch.queries.length; i++, index++) {
320
+ const query = batch.queries[i];
321
+ const result = new PickingResult();
322
+
323
+ results.push(result);
324
+
325
+ if (!on_view(query)) {
326
+ continue;
327
+ }
328
+
329
+ const base = index * QUERY_STRIDE / 4;
330
+ const entity = system.resolve_row(words[base]);
331
+
332
+ if (entity === PickingResult.NOTHING) {
333
+ continue;
334
+ }
335
+
336
+ result.entity = entity;
337
+
338
+ unproject(
339
+ result.position, view_projection,
340
+ texel(query.u, width), texel(query.v, height), width, height,
341
+ floats[base + TEXEL_STRIDE / 4]
342
+ );
343
+
344
+ result.distance = Math.hypot(
345
+ result.position.x - eye[0],
346
+ result.position.y - eye[1],
347
+ result.position.z - eye[2]
348
+ );
349
+ }
350
+
351
+ batch.resolve(results);
352
+ }
353
+ } finally {
354
+ ref.release();
355
+ }
356
+ })
357
+ .catch(error => {
358
+ for (const batch of batches) {
359
+ batch.reject(error instanceof Error ? error : new Error('the picking readback failed'));
360
+ }
361
+ });
362
+ }
363
+ }
364
+
365
+ /**
366
+ * @param {PickingQuery} query
367
+ * @returns {boolean} whether the point is on the view at all
368
+ */
369
+ function on_view(query) {
370
+ return query.u >= 0 && query.u < 1 && query.v >= 0 && query.v < 1;
371
+ }
372
+
373
+ /**
374
+ * The texel a fraction of the view falls in.
375
+ *
376
+ * @param {number} fraction in [0, 1)
377
+ * @param {number} extent texels
378
+ * @returns {number}
379
+ */
380
+ function texel(fraction, extent) {
381
+ return Math.min(extent - 1, Math.floor(fraction * extent));
382
+ }
383
+
384
+ const SCRATCH_INVERSE = new Float32Array(16);
385
+
386
+ /**
387
+ * The world point a pixel's depth stands for, through the inverse of what the frame projected
388
+ * with. Depth is what the buffer holds — reverse-Z, `1` at the near plane — and WebGPU's clip z
389
+ * is that same `[0, 1]`, so it goes straight in.
390
+ *
391
+ * @param {Vector3} target
392
+ * @param {Float32Array} view_projection
393
+ * @param {number} x pixel
394
+ * @param {number} y pixel
395
+ * @param {number} width
396
+ * @param {number} height
397
+ * @param {number} depth
398
+ */
399
+ function unproject(target, view_projection, x, y, width, height, depth) {
400
+ const m = SCRATCH_INVERSE;
401
+
402
+ m4_invert(m, view_projection);
403
+
404
+ // the pixel's centre, in NDC: x to the right, y up
405
+ const nx = ((x + 0.5) / width) * 2 - 1;
406
+ const ny = 1 - ((y + 0.5) / height) * 2;
407
+ const nz = depth;
408
+
409
+ // column-major: column c is m[c * 4 .. c * 4 + 3]
410
+ const wx = m[0] * nx + m[4] * ny + m[8] * nz + m[12];
411
+ const wy = m[1] * nx + m[5] * ny + m[9] * nz + m[13];
412
+ const wz = m[2] * nx + m[6] * ny + m[10] * nz + m[14];
413
+ const ww = m[3] * nx + m[7] * ny + m[11] * nz + m[15];
414
+
415
+ target.set(wx / ww, wy / ww, wz / ww);
416
+ }