@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
@@ -26,13 +26,14 @@ import {
26
26
  MESHLET_METADATA_STRUCT
27
27
  } from "../../geometry/meshlet/encoding/MESHLET_METADATA_STRUCT.js";
28
28
  import { GPUBLASRefitBatch } from "../../geometry/bvh/GPUBLASRefitBatch.js";
29
+ import { row_of_entity } from "../../scene/rows/GPUSceneRows.js";
29
30
 
30
31
  /**
31
32
  * @typedef {import("../../../device/ShadeGPUCommandContext.js").ShadeGPUCommandContext} ShadeGPUCommandContext
32
33
  * @typedef {import("../../geometry/GPUGeometryManager.js").GPUGeometryManager} GPUGeometryManager
33
34
  * @typedef {import("../../scene/GPUSceneContext.js").GPUSceneContext} GPUSceneContext
34
- * @typedef {import("../../scene/Mesh.js").Mesh} Mesh
35
- * @typedef {import("../../scene/SkinnedMesh.js").SkinnedMesh} SkinnedMesh
35
+ * @typedef {import("../../geometry/MeshletGeometry.js").MeshletGeometry} MeshletGeometry
36
+ * @typedef {import("../../geometry/GPUGeometryMetadata.js").GPUGeometryMetadata} GPUGeometryMetadata
36
37
  * @typedef {import("../GPUAnimationManager.js").GPUAnimationManager} GPUAnimationManager
37
38
  */
38
39
 
@@ -84,16 +85,21 @@ const MESHLET_STRIDE_BYTES = MESHLET_METADATA_STRUCT.aligned_size;
84
85
  * Per-scene container for the skinning subsystem's state. Owned by
85
86
  * {@link GPUSceneContext}; receives the scene's
86
87
  * {@link GPUGeometryManager} so it can allocate per-instance geometry
87
- * clones for {@link SkinnedMesh} instances and route the skinning
88
- * compute pass against those clones.
88
+ * clones for skinned entities and route the skinning compute pass
89
+ * against those clones.
90
+ *
91
+ * **Everything here is addressed by entity.** A skinned entity is one whose mesh row draws a
92
+ * per-instance clone of its geometry, and its mesh row is `entity + 1` — the same row its
93
+ * transform holds — so a binding never has to be told where its mesh went.
89
94
  *
90
95
  * Three responsibilities:
91
- * 1. Geometry-clone routing — `obtain_geometry_index(mesh)` returns
92
- * the clone id for SkinnedMesh, the source id for everyone else.
93
- * 2. Skinning binding bookkeeping — each SkinnedMesh with a `skin_id`
96
+ * 1. Geometry clones — {@link obtain_clone} makes an entity's per-instance copy of its source
97
+ * geometry when its mesh row is written, and {@link release_clone} gives it back when the
98
+ * row goes.
99
+ * 2. Skinning binding bookkeeping — each entity bound to a `skin_id`
94
100
  * produces one binding record linking its clone's vertex region
95
101
  * back to the source's data and to the skin's matrix range.
96
- * 3. Per-frame dispatch — `update(cmd_ctx, animation_manager)`
102
+ * 3. Per-frame dispatch — `update(cmd_ctx)`
97
103
  * uploads any new bindings and dispatches the skinning compute
98
104
  * pass that deforms the cloned vertex regions in place.
99
105
  *
@@ -114,49 +120,34 @@ export class GPUMeshSkinningContext {
114
120
  #animation_manager;
115
121
 
116
122
  /**
117
- * Per-SkinnedMesh clone metadata, cached so repeated lookups
118
- * (binding-registration, geometry id resolution) hit the same
119
- * record rather than re-cloning the source. Persists across
120
- * scene rebuilds (unlike id_mapping).
123
+ * Each skinned entity's per-instance clone of its source geometry, and the source it was
124
+ * cloned from. Made by {@link obtain_clone} when the entity's mesh row is first written, and
125
+ * given back by {@link release_clone} when that row goes.
121
126
  *
122
- * @type {Map<SkinnedMesh, GPUGeometryMetadata>}
127
+ * @type {Map<number, {clone: GPUGeometryMetadata, source: MeshletGeometry}>}
123
128
  */
124
129
  #clones = new Map();
125
130
 
126
131
  /**
127
- * Per-mesh skin assignment. Populated by {@link bind}; consumed
128
- * by {@link #register_binding} when it stamps the GPU binding
129
- * record. A mesh present here has had a skinning binding
130
- * registered exactly once — re-binding the same mesh is a
131
- * no-op (the existing binding stands).
132
- *
133
- * Held here rather than on the {@link SkinnedMesh} so the public
134
- * mesh class doesn't carry GPU-side state; consumers who need
135
- * to look up "what skin is mesh X bound to?" can query via
136
- * {@link get_skin_id}.
132
+ * Which skin each entity is bound to. Populated by {@link bind}; consumed by
133
+ * {@link #register_binding} when it stamps the GPU binding record. Outlives the clone: an
134
+ * entity whose mesh row goes and comes back keeps its skin, and the binding is rebuilt from
135
+ * here when the new clone is made.
137
136
  *
138
- * @type {Map<SkinnedMesh, number>}
137
+ * @type {Map<number, number>}
139
138
  */
140
- #skin_id_by_mesh = new Map();
139
+ #skin_by_entity = new Map();
141
140
 
142
141
  /**
143
- * One CPU record per `(SkinnedMesh, clone)` binding registered via
142
+ * One CPU record per `(entity, clone)` binding registered via
144
143
  * {@link #register_binding}. Resolved into GPU bytes at upload
145
144
  * time — `skin_id` becomes `skin_matrix_offset` via
146
- * {@link GPUAnimationManager#get_skin_matrix_offset}, and `mesh`
147
- * becomes a meshes-table row via
148
- * {@link GPUSceneContext#mesh_row_of}. The mesh is held rather
149
- * than its row because the row is not stable: registration
150
- * happens before the scene has placed the mesh at all, and the
151
- * table reuses rows afterwards.
152
- *
153
- * Append-only in this MVP — removing a SkinnedMesh leaks its
154
- * binding (alongside its clone). Acceptable at the lifetime-
155
- * distinct-instance scale; phase-4 frees both together.
145
+ * {@link GPUAnimationManager#get_skin_matrix_offset}, and the
146
+ * entity is its own meshes-table row, `entity + 1`.
156
147
  *
157
148
  * @type {{
158
149
  * skin_id: number,
159
- * mesh: SkinnedMesh,
150
+ * entity: number,
160
151
  * source_meshlet_metadata_offset: number,
161
152
  * clone_meshlet_metadata_offset: number,
162
153
  * meshlet_count: number,
@@ -181,15 +172,6 @@ export class GPUMeshSkinningContext {
181
172
  */
182
173
  #bindings_dirty = false;
183
174
 
184
- /**
185
- * The scene context's {@link GPUSceneContext#mesh_rows_version} as of the last bindings upload.
186
- * The records hold meshes-table rows and that table reuses them, so a difference here means
187
- * every record's row has to be resolved again.
188
- *
189
- * @type {number}
190
- */
191
- #uploaded_mesh_rows_version = -1;
192
-
193
175
  /**
194
176
  * GPU mirror of {@link #bindings}, with `skin_id` resolved to
195
177
  * `skin_matrix_offset`. `null` until the first binding is
@@ -311,17 +293,8 @@ export class GPUMeshSkinningContext {
311
293
  #prev_position_offsets_cpu = new Uint32Array(0);
312
294
 
313
295
  /**
314
- * Back-reference to the owning {@link GPUSceneContext} so the
315
- * bindings-upload path can resolve a mesh to its meshes-table row
316
- * via {@link GPUSceneContext#mesh_row_of} without the caller
317
- * threading that lookup through every `bind()` call.
318
- *
319
- * Resolution cannot happen at registration time: `bind` and
320
- * `obtain_geometry_index` both run before `scene.build` has given
321
- * the mesh a row. Nor does resolving once suffice — the table
322
- * hands out the lowest free row, so a mesh that leaves and
323
- * re-enters the scene lands somewhere else, which is what
324
- * {@link GPUSceneContext#mesh_rows_version} is compared for.
296
+ * The owning {@link GPUSceneContext}, for the scene database the skinning pass reads the
297
+ * mesh rows and their transforms out of.
325
298
  *
326
299
  * @type {GPUSceneContext}
327
300
  */
@@ -405,70 +378,84 @@ export class GPUMeshSkinningContext {
405
378
  }
406
379
 
407
380
  /**
408
- * Geometry id to assign to this mesh's instance record. Idempotent.
381
+ * The per-instance clone of `geometry` an entity's mesh row draws. Made on the first call and
382
+ * returned on every later one. If the entity has already been bound to a skin via
383
+ * {@link bind}, the binding is registered here too, so a row written after its skin arrived
384
+ * is not stranded without a deformation pass.
409
385
  *
410
- * - For a {@link SkinnedMesh}: a per-instance clone of the source's
411
- * GPU geometry. The first time we see a given mesh, allocate a
412
- * clone; subsequent calls return the cached id. If the mesh has
413
- * already been bound to a skin via {@link bind}, the binding's
414
- * registration also runs here so scene.build's first sight of
415
- * a pre-bound mesh doesn't strand it without a deformation pass.
416
- * - For a regular {@link Mesh}: the source's id from the geometry
417
- * manager.
386
+ * Called by the scene rows when a skinned entity's mesh row is written — the geometry index
387
+ * the row carries is the clone's.
418
388
  *
419
- * @param {Mesh} mesh
420
- * @returns {number}
389
+ * @param {number} entity
390
+ * @param {MeshletGeometry} geometry the source
391
+ * @returns {GPUGeometryMetadata} the clone's record
421
392
  */
422
- obtain_geometry_index(mesh) {
423
- if (mesh.isSkinnedMesh === true) {
424
- const clone_metadata = this.#ensure_clone(mesh);
425
- // If the mesh has already been bound (bind() ran before
426
- // scene.build for this mesh), register its binding now.
427
- // No-op if not yet bound or if the binding has already
428
- // been registered in a previous call.
429
- this.#try_register_binding(mesh, clone_metadata);
430
- return clone_metadata.index;
393
+ obtain_clone(entity, geometry) {
394
+ assert.isNonNegativeInteger(entity, 'entity');
395
+ assert.defined(geometry, 'geometry');
396
+
397
+ let entry = this.#clones.get(entity);
398
+
399
+ if (entry === undefined) {
400
+ this.#geometries.add(geometry);
401
+
402
+ entry = { clone: this.#geometries.add_clone(geometry), source: geometry };
403
+
404
+ this.#clones.set(entity, entry);
405
+ } else {
406
+ assert.equal(entry.source, geometry, `entity ${entity} has a clone of a different geometry; release it before cloning another`);
431
407
  }
432
408
 
433
- this.#geometries.add(mesh.geometry);
434
- return this.#geometries.getAddress(mesh.geometry);
409
+ this.#try_register_binding(entity, entry);
410
+
411
+ return entry.clone;
435
412
  }
436
413
 
437
414
  /**
438
- * Bind a {@link SkinnedMesh} to a skin. The mesh's clone (if not
439
- * already allocated) is created on demand; a skinning-pass
440
- * binding record is registered so the deformation runs each
441
- * frame. The skin id is stored on the context (not on the mesh
442
- * — `SkinnedMesh` carries no GPU state).
415
+ * The clone an entity's mesh row draws, if it has one.
443
416
  *
444
- * Re-binding the same mesh with a different skin id is rejected
445
- * (single-binding model in this MVP — use {@link unbind} first if
446
- * you need to swap). Calling with the same skin id is a no-op.
417
+ * @param {number} entity
418
+ * @returns {GPUGeometryMetadata|undefined}
419
+ */
420
+ clone_of(entity) {
421
+ const entry = this.#clones.get(entity);
422
+
423
+ return entry === undefined ? undefined : entry.clone;
424
+ }
425
+
426
+ /**
427
+ * Bind an entity's mesh to a skin: a skinning-pass binding record is registered so the
428
+ * deformation runs each frame, as soon as the entity has a clone to deform — which it has
429
+ * once its mesh row is written, before or after this call.
447
430
  *
448
- * Tolerates being called before `scene.build` registers the mesh;
449
- * the binding upload happens during the next per-frame
450
- * {@link update}.
431
+ * Re-binding the same entity with a different skin id is rejected (one skin per mesh — use
432
+ * {@link unbind} first to swap). Calling with the same skin id is a no-op.
451
433
  *
452
- * @param {SkinnedMesh} mesh
434
+ * @param {number} entity
453
435
  * @param {number} skin_id
454
436
  */
455
- bind(mesh, skin_id) {
456
- assert.defined(mesh, 'mesh');
457
- assert.equal(mesh.isSkinnedMesh, true, 'mesh.isSkinnedMesh !== true');
437
+ bind(entity, skin_id) {
438
+ assert.isNonNegativeInteger(entity, 'entity');
458
439
  assert.isNonNegativeInteger(skin_id, 'skin_id');
459
440
 
460
- const existing = this.#skin_id_by_mesh.get(mesh);
441
+ const existing = this.#skin_by_entity.get(entity);
442
+
461
443
  if (existing !== undefined) {
462
444
  assert.equal(
463
445
  existing, skin_id,
464
- `SkinnedMesh '${mesh.name}' is already bound to skin ${existing}; unbind before rebinding`
446
+ `entity ${entity} is already bound to skin ${existing}; unbind before rebinding`
465
447
  );
448
+
466
449
  return;
467
450
  }
468
451
 
469
- this.#skin_id_by_mesh.set(mesh, skin_id);
470
- const clone_metadata = this.#ensure_clone(mesh);
471
- this.#try_register_binding(mesh, clone_metadata);
452
+ this.#skin_by_entity.set(entity, skin_id);
453
+
454
+ const entry = this.#clones.get(entity);
455
+
456
+ if (entry !== undefined) {
457
+ this.#try_register_binding(entity, entry);
458
+ }
472
459
  }
473
460
 
474
461
  /**
@@ -476,11 +463,11 @@ export class GPUMeshSkinningContext {
476
463
  * mesh hasn't been bound. Read-only accessor — bookkeeping lives
477
464
  * here, not on the mesh.
478
465
  *
479
- * @param {SkinnedMesh} mesh
466
+ * @param {number} entity
480
467
  * @returns {number|undefined}
481
468
  */
482
- get_skin_id(mesh) {
483
- return this.#skin_id_by_mesh.get(mesh);
469
+ get_skin_id(entity) {
470
+ return this.#skin_by_entity.get(entity);
484
471
  }
485
472
 
486
473
  /**
@@ -492,14 +479,14 @@ export class GPUMeshSkinningContext {
492
479
  *
493
480
  * No-op if the mesh isn't bound.
494
481
  *
495
- * @param {SkinnedMesh} mesh
482
+ * @param {number} entity
496
483
  */
497
- unbind(mesh) {
498
- if (!this.#skin_id_by_mesh.has(mesh)) return;
499
- this.#skin_id_by_mesh.delete(mesh);
484
+ unbind(entity) {
485
+ if (!this.#skin_by_entity.has(entity)) return;
486
+ this.#skin_by_entity.delete(entity);
500
487
 
501
488
  for (let i = this.#bindings.length - 1; i >= 0; i--) {
502
- if (this.#bindings[i].mesh === mesh) {
489
+ if (this.#bindings[i].entity === entity) {
503
490
  this.#drop_binding_at(i);
504
491
  break;
505
492
  }
@@ -519,7 +506,7 @@ export class GPUMeshSkinningContext {
519
506
  for (let i = this.#bindings.length - 1; i >= 0; i--) {
520
507
  const b = this.#bindings[i];
521
508
  if (b.skin_id === skin_id) {
522
- this.#skin_id_by_mesh.delete(b.mesh);
509
+ this.#skin_by_entity.delete(b.entity);
523
510
  this.#drop_binding_at(i);
524
511
  }
525
512
  }
@@ -614,95 +601,75 @@ export class GPUMeshSkinningContext {
614
601
  }
615
602
 
616
603
  /**
617
- * Give back everything a {@link SkinnedMesh} was holding on the GPU: its binding, its
604
+ * Give back everything a skinned entity was holding on the GPU: its binding, its
618
605
  * prev-position slice, and the per-instance geometry clone it rendered.
619
606
  *
620
- * **Called when the mesh leaves the scene, not when it unbinds.** A clone is named by the
621
- * meshes-table row of the instance that renders it, so it lives exactly as long as that
622
- * row does — {@link GPUSceneContext} calls this from the same place it gives the row
623
- * back. Unbinding is a different event: an unbound mesh keeps rendering its clone frozen
624
- * at the last pose the skinning pass wrote, and freeing there would hand a live renderer
625
- * a vertex region that has since gone to somebody else.
607
+ * **Called when the entity's mesh row goes, not when it unbinds.** A clone lives exactly as
608
+ * long as the row that draws it — the scene rows call this from the same place they give
609
+ * the row back. Unbinding is a different event: an unbound mesh keeps rendering its clone
610
+ * frozen at the last pose the skinning pass wrote, and freeing there would hand a live
611
+ * renderer a vertex region that has since gone to somebody else.
626
612
  *
627
613
  * The binding record goes first, and for its own reason: it names the clone's meshlet
628
614
  * rows, and the skinning pass would deform whatever took their place.
629
615
  *
630
- * **Which skin the mesh belongs to is not forgotten.** A mesh may leave the scene and
631
- * come back — the row it gets is not even the row it had — and the engine's answer to
632
- * that is {@link #try_register_binding}, which rebuilds the binding from
633
- * {@link #skin_id_by_mesh} the next time `scene.build` asks for the mesh's geometry id.
634
- * Releasing through {@link unbind} would drop that association too and hand the returning
635
- * mesh back undeformed. Forgetting the skin is what {@link unbind} is for, and it is a
636
- * different thing to want.
616
+ * **Which skin the entity belongs to is not forgotten.** A mesh row may go and come back,
617
+ * and the engine's answer to that is {@link #try_register_binding}, which rebuilds the
618
+ * binding from {@link #skin_by_entity} when the new clone is made. Releasing through
619
+ * {@link unbind} would drop that association too and hand the returning mesh back
620
+ * undeformed. Forgetting the skin is what {@link unbind} is for, and it is a different
621
+ * thing to want.
637
622
  *
638
- * The mesh does pay for a fresh clone on its way back in: a new vertex region, its copy
639
- * from source, and a new tree. That is the right trade while nothing removes a mesh from
640
- * the scene except an entity that is actually leaving — culling and LOD never do — and it
641
- * is what a clone cache keyed by source geometry would take away if that ever changes.
623
+ * The entity does pay for a fresh clone on its way back in: a new vertex region, its copy
624
+ * from source, and a new tree. That is the right trade while nothing takes a mesh row away
625
+ * except an entity that is actually leaving — culling and LOD never do — and it is what a
626
+ * clone cache keyed by source geometry would take away if that ever changes.
642
627
  *
643
- * No-op for a mesh that has no clone — a {@link SkinnedMesh} that never reached
644
- * `scene.build` or was released already.
628
+ * No-op for an entity that has no clone — one whose mesh row was never written, or was
629
+ * released already.
645
630
  *
646
- * @param {SkinnedMesh} mesh
631
+ * @param {number} entity
647
632
  */
648
- release_clone(mesh) {
649
- assert.defined(mesh, 'mesh');
633
+ release_clone(entity) {
634
+ assert.isNonNegativeInteger(entity, 'entity');
650
635
 
651
- const clone_metadata = this.#clones.get(mesh);
636
+ const entry = this.#clones.get(entity);
652
637
 
653
- if (clone_metadata === undefined) {
638
+ if (entry === undefined) {
654
639
  return;
655
640
  }
656
641
 
657
642
  for (let i = this.#bindings.length - 1; i >= 0; i--) {
658
- if (this.#bindings[i].mesh === mesh) {
643
+ if (this.#bindings[i].entity === entity) {
659
644
  this.#drop_binding_at(i);
660
645
  break;
661
646
  }
662
647
  }
663
648
 
664
- this.#clones.delete(mesh);
665
-
666
- this.#geometries.remove_clone(clone_metadata);
667
- }
649
+ this.#clones.delete(entity);
668
650
 
669
- /**
670
- * Lookup-or-create the per-mesh clone metadata. Cached so that
671
- * repeated lookups (binding-registration, geometry id resolution
672
- * via obtain_geometry_index) hit the same record without
673
- * re-cloning the source.
674
- *
675
- * @param {SkinnedMesh} mesh
676
- * @returns {GPUGeometryMetadata}
677
- */
678
- #ensure_clone(mesh) {
679
- let clone_metadata = this.#clones.get(mesh);
680
- if (clone_metadata === undefined) {
681
- clone_metadata = this.#geometries.add_clone(mesh.geometry);
682
- this.#clones.set(mesh, clone_metadata);
683
- }
684
- return clone_metadata;
651
+ this.#geometries.remove_clone(entry.clone);
685
652
  }
686
653
 
687
654
  /**
688
- * Register a binding for this mesh if conditions allow:
689
- * - the mesh has been bound to a skin via {@link bind}, AND
690
- * - we haven't already registered the binding for this mesh.
655
+ * Register a binding for this entity if conditions allow:
656
+ * - the entity has been bound to a skin via {@link bind}, AND
657
+ * - we haven't already registered the binding for it.
691
658
  *
692
- * @param {SkinnedMesh} mesh
693
- * @param {GPUGeometryMetadata} clone_metadata
659
+ * @param {number} entity
660
+ * @param {{clone: GPUGeometryMetadata, source: MeshletGeometry}} entry
694
661
  */
695
- #try_register_binding(mesh, clone_metadata) {
696
- const skin_id = this.#skin_id_by_mesh.get(mesh);
662
+ #try_register_binding(entity, entry) {
663
+ const skin_id = this.#skin_by_entity.get(entity);
697
664
  if (skin_id === undefined) return;
698
665
  // The binding's presence in #bindings is the source of truth
699
666
  // for "already registered". Cheap O(bindings) scan; bindings
700
667
  // are O(skinned-mesh-count).
701
668
  for (let i = 0; i < this.#bindings.length; i++) {
702
- if (this.#bindings[i].mesh === mesh) return;
669
+ if (this.#bindings[i].entity === entity) return;
703
670
  }
704
671
 
705
- this.#register_binding(mesh, clone_metadata, skin_id);
672
+ this.#register_binding(entity, entry, skin_id);
706
673
  }
707
674
 
708
675
  /**
@@ -720,10 +687,12 @@ export class GPUMeshSkinningContext {
720
687
  * `skin_matrix_offset` for the binding records.
721
688
  *
722
689
  * @param {ShadeGPUCommandContext} cmd_ctx
690
+ * @returns {boolean} whether a skinning pass ran — whether any bound row's vertices, and so
691
+ * its bounds, moved this frame
723
692
  */
724
693
  update(cmd_ctx) {
725
694
  if (this.#bindings.length === 0) {
726
- return;
695
+ return false;
727
696
  }
728
697
 
729
698
  // Flush any meshlet-clone work that hasn't been drained yet —
@@ -749,19 +718,11 @@ export class GPUMeshSkinningContext {
749
718
  // job; here we just need the meshlet pending-clone flush.
750
719
  this.#geometries.meshlets.update(cmd_ctx);
751
720
 
752
- // The binding record carries a meshes-table row, and that table reuses rows: a scene the
753
- // mesh left and re-entered puts it somewhere else, and every other binding's row can move
754
- // out from under it too. So the records are re-resolved whenever the table's membership has
755
- // changed since they were written, not only when a binding was added or dropped.
756
- const mesh_rows_version = this.#scene_context.mesh_rows_version;
757
-
758
- if (this.#bindings_dirty || this.#uploaded_mesh_rows_version !== mesh_rows_version) {
721
+ if (this.#bindings_dirty) {
722
+ // A binding's row is its entity's, and an entity's row never moves — so the records
723
+ // are written when the list changes and at no other time.
759
724
  this.#upload_bindings();
760
725
 
761
- this.#uploaded_mesh_rows_version = mesh_rows_version;
762
- }
763
-
764
- if (this.#bindings_dirty) {
765
726
  // None of these reads anything outside the binding list, so a scene edit that left
766
727
  // the list alone cannot have moved them.
767
728
  this.#upload_dispatch_lookup();
@@ -938,6 +899,9 @@ export class GPUMeshSkinningContext {
938
899
  // once, not a dispatch per clone: the command count is the same for one skinned mesh as
939
900
  // for three hundred, and each tree's climb overlaps the next's instead of waiting on it.
940
901
  this.#record_blas_refits(cmd_ctx);
902
+
903
+ // every bound mesh's clone was deformed this frame, so every bound row's bounds moved
904
+ return true;
941
905
  }
942
906
 
943
907
  /**
@@ -966,12 +930,14 @@ export class GPUMeshSkinningContext {
966
930
  }
967
931
 
968
932
  /**
969
- * @param {SkinnedMesh} mesh
970
- * @param {GPUGeometryMetadata} clone_metadata
933
+ * @param {number} entity
934
+ * @param {{clone: GPUGeometryMetadata, source: MeshletGeometry}} entry
971
935
  * @param {number} skin_id
972
936
  */
973
- #register_binding(mesh, clone_metadata, skin_id) {
974
- const source_metadata = this.#geometries.get_metadata(mesh.geometry);
937
+ #register_binding(entity, entry, skin_id) {
938
+ const clone_metadata = entry.clone;
939
+
940
+ const source_metadata = this.#geometries.get_metadata(entry.source);
975
941
  assert.defined(source_metadata, 'source_metadata');
976
942
 
977
943
  const meshlet_count = clone_metadata.meshlets.meshlet_count;
@@ -979,7 +945,7 @@ export class GPUMeshSkinningContext {
979
945
 
980
946
  const binding = {
981
947
  skin_id,
982
- mesh,
948
+ entity,
983
949
  source_meshlet_metadata_offset: source_metadata.meshlets.metadata.offset,
984
950
  clone_meshlet_metadata_offset,
985
951
  meshlet_count,
@@ -1170,20 +1136,8 @@ export class GPUMeshSkinningContext {
1170
1136
  for (let i = 0; i < binding_count; i++) {
1171
1137
  const b = this.#bindings[i];
1172
1138
 
1173
- // The meshes table is asked for the row rather than having it
1174
- // derived from the transforms row: every node earns a
1175
- // transforms row and only the geometry-bearing ones earn a
1176
- // mesh row, so the two tables run at different rates as soon
1177
- // as the scene holds a group, an anchor or a joint — which is
1178
- // every glTF. A bound mesh is in the scene: assertion catches
1179
- // both a SkinnedMesh scene.build has not seen yet and one that
1180
- // left the scene without being unbound, either of which would
1181
- // otherwise reach the shader as a garbage row.
1182
- const mesh_instance_index = this.#scene_context.mesh_row_of(b.mesh);
1183
- assert.isNonNegativeInteger(
1184
- mesh_instance_index,
1185
- `SkinnedMesh '${b.mesh.name}' (id=${b.mesh.id}) has no meshes-table row — scene.build must run before skinning bindings upload`
1186
- );
1139
+ // the entity is the row, in the meshes table as in the transforms table
1140
+ const mesh_instance_index = row_of_entity(b.entity);
1187
1141
 
1188
1142
  write_gpu_typed_buffer({
1189
1143
  skin_matrix_offset: this.#animation_manager.get_skin_matrix_offset(b.skin_id),
@@ -1 +1 @@
1
- {"version":3,"file":"SKINNING_BINDING_STRUCT.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/animation/skinning/SKINNING_BINDING_STRUCT.js"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;GAeG;AACH,mDA2DsB;6BA7EO,mCAAmC"}
1
+ {"version":3,"file":"SKINNING_BINDING_STRUCT.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/animation/skinning/SKINNING_BINDING_STRUCT.js"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;GAeG;AACH,mDAwDsB;6BA1EO,mCAAmC"}
@@ -66,13 +66,10 @@ export const SKINNING_BINDING_STRUCT = WebGPUStruct.from({
66
66
  clone_geometry_index: u32,
67
67
 
68
68
  /**
69
- * Row of the SkinnedMesh in the scene database's `meshes` table.
70
- * Resolved at upload time from `gpu_scene.mesh_row_of(mesh)`.
71
- * **Not derivable from the transforms row**: every node earns a
72
- * transforms row and only the geometry-bearing ones earn a mesh
73
- * row, so the two run at different rates in any scene holding a
74
- * group, an anchor or a joint. The bounds-refresh's final stage uses this
75
- * to call {@link chunk_update_object_property_mesh_instance_bounds}
69
+ * Row of the mesh entity in the scene database's `meshes` table:
70
+ * the entity, one on (`row_of_entity`), which is also its transforms
71
+ * row. Resolved at upload time. The bounds-refresh's final stage uses
72
+ * this to call {@link chunk_update_object_property_mesh_instance_bounds}
76
73
  * and write the post-deformation world-space mesh bounds.
77
74
  */
78
75
  mesh_instance_index: u32,
@@ -31,8 +31,8 @@
31
31
  * cancel against. Both shapes are legal glTF and both are in the wild.
32
32
  *
33
33
  * The condition that does hold is `mesh.global == the skin's bind transform`, and
34
- * {@link skin_normalize_mesh_frame} makes it true at `register_skin` for every asset rather than
35
- * leaving it to the exporter. The product is then the joint's displacement from bind, which is rigid
34
+ * `prefab_normalize_skin_frames` makes it true when a model is compiled, for every asset rather
35
+ * than leaving it to the exporter. The product is then the joint's displacement from bind, which is rigid
36
36
  * whenever the clip rotates and translates and does not scale. `SKINNING_FRAME_PLAN.md` is the
37
37
  * argument, and what a violation looks like on screen.
38
38
  */
@@ -39,8 +39,8 @@ import {
39
39
  * cancel against. Both shapes are legal glTF and both are in the wild.
40
40
  *
41
41
  * The condition that does hold is `mesh.global == the skin's bind transform`, and
42
- * {@link skin_normalize_mesh_frame} makes it true at `register_skin` for every asset rather than
43
- * leaving it to the exporter. The product is then the joint's displacement from bind, which is rigid
42
+ * `prefab_normalize_skin_frames` makes it true when a model is compiled, for every asset rather
43
+ * than leaving it to the exporter. The product is then the joint's displacement from bind, which is rigid
44
44
  * whenever the clip rotates and translates and does not scale. `SKINNING_FRAME_PLAN.md` is the
45
45
  * argument, and what a violation looks like on screen.
46
46
  */