@woosh/meep-engine 3.43.0 → 3.44.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 (287) hide show
  1. package/editor/prototypeEditorShell.d.ts.map +1 -1
  2. package/editor/prototypeEditorShell.js +4 -2
  3. package/package.json +1 -1
  4. package/src/engine/Clock.d.ts +15 -0
  5. package/src/engine/Clock.d.ts.map +1 -1
  6. package/src/engine/Clock.js +29 -5
  7. package/src/engine/Engine.d.ts.map +1 -1
  8. package/src/engine/Engine.js +11 -19
  9. package/src/engine/graphics/ecs/mesh-v2/MeshSkin.d.ts +57 -0
  10. package/src/engine/graphics/ecs/mesh-v2/MeshSkin.d.ts.map +1 -0
  11. package/src/engine/graphics/ecs/mesh-v2/MeshSkin.js +84 -0
  12. package/src/engine/graphics3/AnimationGraphSystem.d.ts +23 -13
  13. package/src/engine/graphics3/AnimationGraphSystem.d.ts.map +1 -1
  14. package/src/engine/graphics3/AnimationGraphSystem.js +61 -64
  15. package/src/engine/graphics3/AnimationSystem.d.ts +24 -15
  16. package/src/engine/graphics3/AnimationSystem.d.ts.map +1 -1
  17. package/src/engine/graphics3/AnimationSystem.js +67 -61
  18. package/src/engine/graphics3/MeshSkinSystem.d.ts +56 -0
  19. package/src/engine/graphics3/MeshSkinSystem.d.ts.map +1 -0
  20. package/src/engine/graphics3/MeshSkinSystem.js +317 -0
  21. package/src/engine/graphics3/MeshSystem.d.ts +15 -35
  22. package/src/engine/graphics3/MeshSystem.d.ts.map +1 -1
  23. package/src/engine/graphics3/MeshSystem.js +21 -298
  24. package/src/engine/graphics3/RowChains.d.ts +76 -0
  25. package/src/engine/graphics3/RowChains.d.ts.map +1 -0
  26. package/src/engine/graphics3/RowChains.js +347 -0
  27. package/src/engine/graphics3/ShadedGeometrySystem.d.ts +6 -0
  28. package/src/engine/graphics3/ShadedGeometrySystem.d.ts.map +1 -1
  29. package/src/engine/graphics3/ShadedGeometrySystem.js +329 -309
  30. package/src/engine/graphics3/animation/AnimationClips.d.ts +56 -0
  31. package/src/engine/graphics3/animation/AnimationClips.d.ts.map +1 -0
  32. package/src/engine/graphics3/animation/AnimationClips.js +79 -0
  33. package/src/engine/graphics3/animation/ClipListPlayer.d.ts +13 -14
  34. package/src/engine/graphics3/animation/ClipListPlayer.d.ts.map +1 -1
  35. package/src/engine/graphics3/animation/ClipListPlayer.js +262 -263
  36. package/src/engine/graphics3/animation/write_clip_playback.d.ts +3 -3
  37. package/src/engine/graphics3/animation/write_clip_playback.js +4 -4
  38. package/src/engine/graphics3/pose/query_entity_node_world_pose.d.ts +5 -0
  39. package/src/engine/graphics3/pose/query_entity_node_world_pose.d.ts.map +1 -1
  40. package/src/engine/graphics3/pose/query_entity_node_world_pose.js +80 -75
  41. package/src/engine/graphics3/prefab/PrefabInstance.d.ts +4 -24
  42. package/src/engine/graphics3/prefab/PrefabInstance.d.ts.map +1 -1
  43. package/src/engine/graphics3/prefab/PrefabInstance.js +60 -80
  44. package/src/engine/graphics3/prefab/prefab_instantiate.d.ts +16 -3
  45. package/src/engine/graphics3/prefab/prefab_instantiate.d.ts.map +1 -1
  46. package/src/engine/graphics3/prefab/prefab_instantiate.js +49 -12
  47. package/src/engine/graphics3/prefab/prefab_place.d.ts +31 -17
  48. package/src/engine/graphics3/prefab/prefab_place.d.ts.map +1 -1
  49. package/src/engine/graphics3/prefab/prefab_place.js +175 -130
  50. package/src/engine/graphics3/register_clips.d.ts +64 -0
  51. package/src/engine/graphics3/register_clips.d.ts.map +1 -0
  52. package/src/engine/graphics3/register_clips.js +114 -0
  53. package/src/engine/physics/cloth/MEASUREMENTS.md +795 -0
  54. package/src/engine/physics/cloth/PLAN.md +339 -9
  55. package/src/engine/physics/cloth/build/ClothProxy.d.ts +113 -61
  56. package/src/engine/physics/cloth/build/ClothProxy.d.ts.map +1 -1
  57. package/src/engine/physics/cloth/build/ClothProxy.js +142 -77
  58. package/src/engine/physics/cloth/build/cloth_bind_in_frame.d.ts +22 -0
  59. package/src/engine/physics/cloth/build/cloth_bind_in_frame.d.ts.map +1 -0
  60. package/src/engine/physics/cloth/build/cloth_bind_in_frame.js +75 -0
  61. package/src/engine/physics/cloth/build/cloth_proxy_from_joints.d.ts +43 -30
  62. package/src/engine/physics/cloth/build/cloth_proxy_from_joints.d.ts.map +1 -1
  63. package/src/engine/physics/cloth/build/cloth_proxy_from_joints.js +357 -284
  64. package/src/engine/physics/cloth/build/cloth_proxy_from_mesh.d.ts +62 -0
  65. package/src/engine/physics/cloth/build/cloth_proxy_from_mesh.d.ts.map +1 -0
  66. package/src/engine/physics/cloth/build/cloth_proxy_from_mesh.js +280 -0
  67. package/src/engine/physics/cloth/collider/cloth_collider_sdf.d.ts +1 -1
  68. package/src/engine/physics/cloth/collider/cloth_collider_sdf.js +1 -1
  69. package/src/engine/physics/cloth/ecs/Cloth.d.ts +17 -9
  70. package/src/engine/physics/cloth/ecs/Cloth.d.ts.map +1 -1
  71. package/src/engine/physics/cloth/ecs/Cloth.js +220 -212
  72. package/src/engine/physics/cloth/ecs/ClothDynamicsFlags.js +6 -0
  73. package/src/engine/physics/cloth/ecs/ClothHold.d.ts +91 -0
  74. package/src/engine/physics/cloth/ecs/ClothHold.d.ts.map +1 -0
  75. package/src/engine/physics/cloth/ecs/ClothHold.js +103 -0
  76. package/src/engine/physics/cloth/ecs/ClothInstance.d.ts +254 -48
  77. package/src/engine/physics/cloth/ecs/ClothInstance.d.ts.map +1 -1
  78. package/src/engine/physics/cloth/ecs/ClothInstance.js +277 -47
  79. package/src/engine/physics/cloth/ecs/ClothPin.d.ts +73 -0
  80. package/src/engine/physics/cloth/ecs/ClothPin.d.ts.map +1 -0
  81. package/src/engine/physics/cloth/ecs/ClothPin.js +92 -0
  82. package/src/engine/physics/cloth/ecs/ClothPinSerializationAdapter.d.ts +36 -0
  83. package/src/engine/physics/cloth/ecs/ClothPinSerializationAdapter.d.ts.map +1 -0
  84. package/src/engine/physics/cloth/ecs/ClothPinSerializationAdapter.js +61 -0
  85. package/src/engine/physics/cloth/ecs/ClothRig.d.ts +23 -17
  86. package/src/engine/physics/cloth/ecs/ClothRig.d.ts.map +1 -1
  87. package/src/engine/physics/cloth/ecs/ClothRig.js +29 -27
  88. package/src/engine/physics/cloth/ecs/ClothSystem.d.ts +12 -14
  89. package/src/engine/physics/cloth/ecs/ClothSystem.d.ts.map +1 -1
  90. package/src/engine/physics/cloth/ecs/ClothSystem.js +20 -15
  91. package/src/engine/physics/cloth/ecs/ClothWorld.d.ts +57 -36
  92. package/src/engine/physics/cloth/ecs/ClothWorld.d.ts.map +1 -1
  93. package/src/engine/physics/cloth/ecs/ClothWorld.js +816 -179
  94. package/src/engine/physics/cloth/ecs/WorkerClothSystem.d.ts +12 -13
  95. package/src/engine/physics/cloth/ecs/WorkerClothSystem.d.ts.map +1 -1
  96. package/src/engine/physics/cloth/ecs/WorkerClothSystem.js +20 -14
  97. package/src/engine/physics/cloth/ecs/cloth_build_rows.d.ts +63 -11
  98. package/src/engine/physics/cloth/ecs/cloth_build_rows.d.ts.map +1 -1
  99. package/src/engine/physics/cloth/ecs/cloth_build_rows.js +321 -84
  100. package/src/engine/physics/cloth/ecs/cloth_dynamics_map.d.ts +9 -7
  101. package/src/engine/physics/cloth/ecs/cloth_dynamics_map.d.ts.map +1 -1
  102. package/src/engine/physics/cloth/ecs/cloth_dynamics_map.js +9 -7
  103. package/src/engine/physics/cloth/ecs/cloth_gather_colliders.d.ts +3 -3
  104. package/src/engine/physics/cloth/ecs/cloth_gather_colliders.js +30 -30
  105. package/src/engine/physics/cloth/ecs/cloth_geodesic.d.ts +37 -0
  106. package/src/engine/physics/cloth/ecs/cloth_geodesic.d.ts.map +1 -0
  107. package/src/engine/physics/cloth/ecs/cloth_geodesic.js +142 -0
  108. package/src/engine/physics/cloth/ecs/cloth_holds.d.ts +97 -0
  109. package/src/engine/physics/cloth/ecs/cloth_holds.d.ts.map +1 -0
  110. package/src/engine/physics/cloth/ecs/cloth_holds.js +608 -0
  111. package/src/engine/physics/cloth/ecs/cloth_reconstruct_pose.d.ts +2 -2
  112. package/src/engine/physics/cloth/ecs/cloth_reconstruct_pose.d.ts.map +1 -1
  113. package/src/engine/physics/cloth/ecs/cloth_reconstruct_pose.js +160 -9
  114. package/src/engine/physics/cloth/ecs/cloth_seed_rig.d.ts +17 -22
  115. package/src/engine/physics/cloth/ecs/cloth_seed_rig.d.ts.map +1 -1
  116. package/src/engine/physics/cloth/ecs/cloth_seed_rig.js +55 -117
  117. package/src/engine/physics/cloth/ecs/cloth_seed_subtree.d.ts +21 -6
  118. package/src/engine/physics/cloth/ecs/cloth_seed_subtree.d.ts.map +1 -1
  119. package/src/engine/physics/cloth/ecs/cloth_seed_subtree.js +44 -15
  120. package/src/engine/physics/cloth/ecs/cloth_write_back.d.ts +5 -0
  121. package/src/engine/physics/cloth/ecs/cloth_write_back.d.ts.map +1 -1
  122. package/src/engine/physics/cloth/ecs/cloth_write_back.js +60 -16
  123. package/src/engine/physics/cloth/ecs/cloth_write_back_rig.d.ts.map +1 -1
  124. package/src/engine/physics/cloth/ecs/cloth_write_back_rig.js +65 -58
  125. package/src/engine/physics/cloth/playground/collide_main.js +1 -1
  126. package/src/engine/physics/cloth/playground/garment_build.d.ts.map +1 -1
  127. package/src/engine/physics/cloth/playground/garment_build.js +17 -5
  128. package/src/engine/physics/cloth/playground/garment_main.js +1 -1
  129. package/src/engine/physics/cloth/playground/rig_build.d.ts.map +1 -1
  130. package/src/engine/physics/cloth/playground/rig_build.js +302 -296
  131. package/src/engine/physics/cloth/solver/ClothState.d.ts +45 -7
  132. package/src/engine/physics/cloth/solver/ClothState.d.ts.map +1 -1
  133. package/src/engine/physics/cloth/solver/ClothState.js +63 -7
  134. package/src/engine/physics/cloth/solver/cloth_contact_find.d.ts +6 -1
  135. package/src/engine/physics/cloth/solver/cloth_contact_find.d.ts.map +1 -1
  136. package/src/engine/physics/cloth/solver/cloth_contact_find.js +7 -2
  137. package/src/engine/physics/cloth/solver/cloth_hold_line.d.ts +114 -0
  138. package/src/engine/physics/cloth/solver/cloth_hold_line.d.ts.map +1 -0
  139. package/src/engine/physics/cloth/solver/cloth_hold_line.js +362 -0
  140. package/src/engine/physics/cloth/solver/cloth_self_find.d.ts +6 -2
  141. package/src/engine/physics/cloth/solver/cloth_self_find.d.ts.map +1 -1
  142. package/src/engine/physics/cloth/solver/cloth_self_find.js +13 -13
  143. package/src/engine/physics/cloth/solver/cloth_solver_constants.d.ts +24 -12
  144. package/src/engine/physics/cloth/solver/cloth_solver_constants.d.ts.map +1 -1
  145. package/src/engine/physics/cloth/solver/cloth_solver_constants.js +24 -12
  146. package/src/engine/physics/cloth/solver/cloth_step.d.ts +16 -0
  147. package/src/engine/physics/cloth/solver/cloth_step.d.ts.map +1 -1
  148. package/src/engine/physics/cloth/solver/cloth_step.js +183 -20
  149. package/src/engine/physics/cloth/solver/cloth_step_instance.d.ts +1 -0
  150. package/src/engine/physics/cloth/solver/cloth_step_instance.d.ts.map +1 -1
  151. package/src/engine/physics/cloth/solver/cloth_step_instance.js +10 -3
  152. package/src/engine/physics/cloth/solver/constraint/cloth_leash_row.d.ts +1 -1
  153. package/src/engine/physics/cloth/solver/constraint/cloth_leash_row.d.ts.map +1 -1
  154. package/src/engine/physics/cloth/solver/constraint/cloth_leash_row.js +353 -346
  155. package/src/engine/physics/cloth/solver/constraint/cloth_self_row.d.ts +7 -5
  156. package/src/engine/physics/cloth/solver/constraint/cloth_self_row.d.ts.map +1 -1
  157. package/src/engine/physics/cloth/solver/constraint/cloth_self_row.js +7 -5
  158. package/src/engine/physics/cloth/wind/cloth_sample_air.d.ts +9 -9
  159. package/src/engine/physics/cloth/wind/cloth_sample_air.d.ts.map +1 -1
  160. package/src/engine/physics/cloth/wind/cloth_sample_air.js +26 -26
  161. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
  162. package/src/engine/simulation/Ticker.d.ts +13 -0
  163. package/src/engine/simulation/Ticker.d.ts.map +1 -1
  164. package/src/engine/simulation/Ticker.js +43 -8
  165. package/src/shade/RENDERER_CONTRACT.md +8 -2
  166. package/src/shade/playground/mesh_row_ceiling/main.js +2 -1
  167. package/src/shade/playground/skinned_blas_refit/main.d.ts.map +1 -1
  168. package/src/shade/playground/skinned_blas_refit/main.js +11 -19
  169. package/src/shade/playground/skinned_blas_refit/place_character.d.ts +6 -3
  170. package/src/shade/playground/skinned_blas_refit/place_character.d.ts.map +1 -1
  171. package/src/shade/playground/skinned_blas_refit/place_character.js +90 -90
  172. package/src/shade/playground/skinned_mesh_soup/main.d.ts.map +1 -1
  173. package/src/shade/playground/skinned_mesh_soup/main.js +502 -509
  174. package/src/shade/playground/texture_encode/README.md +129 -109
  175. package/src/shade/playground/texture_encode/main.js +1430 -1430
  176. package/src/shade/renderer/animation/GPUAnimationManager.d.ts +45 -14
  177. package/src/shade/renderer/animation/GPUAnimationManager.d.ts.map +1 -1
  178. package/src/shade/renderer/animation/GPUAnimationManager.js +316 -64
  179. package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.d.ts +5 -0
  180. package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.d.ts.map +1 -1
  181. package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.js +11 -1
  182. package/src/shade/renderer/geometry/BoxGeometry.d.ts +1 -11
  183. package/src/shade/renderer/geometry/BoxGeometry.d.ts.map +1 -1
  184. package/src/shade/renderer/geometry/BoxGeometry.js +6 -13
  185. package/src/shade/renderer/geometry/CapsuleGeometry.d.ts +19 -0
  186. package/src/shade/renderer/geometry/CapsuleGeometry.d.ts.map +1 -0
  187. package/src/shade/renderer/geometry/CapsuleGeometry.js +24 -0
  188. package/src/shade/renderer/geometry/ConeGeometry.d.ts +20 -0
  189. package/src/shade/renderer/geometry/ConeGeometry.d.ts.map +1 -0
  190. package/src/shade/renderer/geometry/ConeGeometry.js +33 -0
  191. package/src/shade/renderer/geometry/CylinderGeometry.d.ts +21 -0
  192. package/src/shade/renderer/geometry/CylinderGeometry.d.ts.map +1 -0
  193. package/src/shade/renderer/geometry/CylinderGeometry.js +35 -0
  194. package/src/shade/renderer/geometry/PlaneGeometry.d.ts +17 -0
  195. package/src/shade/renderer/geometry/PlaneGeometry.d.ts.map +1 -0
  196. package/src/shade/renderer/geometry/PlaneGeometry.js +22 -0
  197. package/src/shade/renderer/geometry/TorusGeometry.d.ts +18 -0
  198. package/src/shade/renderer/geometry/TorusGeometry.d.ts.map +1 -0
  199. package/src/shade/renderer/geometry/TorusGeometry.js +23 -0
  200. package/src/shade/renderer/geometry/UVSphereGeometry.d.ts +21 -0
  201. package/src/shade/renderer/geometry/UVSphereGeometry.d.ts.map +1 -0
  202. package/src/shade/renderer/geometry/UVSphereGeometry.js +34 -0
  203. package/src/shade/renderer/geometry/primitives/make_capsule_geometry.d.ts +19 -0
  204. package/src/shade/renderer/geometry/primitives/make_capsule_geometry.d.ts.map +1 -0
  205. package/src/shade/renderer/geometry/primitives/make_capsule_geometry.js +205 -0
  206. package/src/shade/renderer/geometry/primitives/make_cone_geometry.d.ts +21 -0
  207. package/src/shade/renderer/geometry/primitives/make_cone_geometry.d.ts.map +1 -0
  208. package/src/shade/renderer/geometry/primitives/make_cone_geometry.js +36 -0
  209. package/src/shade/renderer/geometry/primitives/make_cylinder_geometry.d.ts +1 -1
  210. package/src/shade/renderer/geometry/primitives/make_cylinder_geometry.d.ts.map +1 -1
  211. package/src/shade/renderer/geometry/primitives/make_cylinder_geometry.js +44 -9
  212. package/src/shade/renderer/geometry/primitives/make_uv_sphere_geometry.d.ts +20 -0
  213. package/src/shade/renderer/geometry/primitives/make_uv_sphere_geometry.d.ts.map +1 -0
  214. package/src/shade/renderer/geometry/primitives/make_uv_sphere_geometry.js +190 -0
  215. package/src/shade/renderer/geometry/virtual/runtime/graph_vgeo_expand_instances_to_meshlets.d.ts.map +1 -1
  216. package/src/shade/renderer/geometry/virtual/runtime/graph_vgeo_expand_instances_to_meshlets.js +7 -2
  217. package/src/shade/renderer/gpu_primitive/prefix_sum/v1/graph_prefix_scan_csdldf.d.ts +26 -8
  218. package/src/shade/renderer/gpu_primitive/prefix_sum/v1/graph_prefix_scan_csdldf.d.ts.map +1 -1
  219. package/src/shade/renderer/gpu_primitive/prefix_sum/v1/graph_prefix_scan_csdldf.js +56 -39
  220. package/src/shade/renderer/gpu_primitive/prefix_sum/v1/shader_prefix_scan_csdldf.d.ts +7 -0
  221. package/src/shade/renderer/gpu_primitive/prefix_sum/v1/shader_prefix_scan_csdldf.d.ts.map +1 -1
  222. package/src/shade/renderer/gpu_primitive/prefix_sum/v1/shader_prefix_scan_csdldf.js +46 -4
  223. package/src/shade/renderer/gpu_primitive/prefix_sum/v1/test_prefix_sum.d.ts.map +1 -1
  224. package/src/shade/renderer/gpu_primitive/prefix_sum/v1/test_prefix_sum.js +4 -2
  225. package/src/shade/renderer/gpu_primitive/sort/defs.d.ts +2 -2
  226. package/src/shade/renderer/gpu_primitive/sort/defs.js +79 -79
  227. package/src/shade/renderer/gpu_primitive/sort/graph_radix_sort.d.ts +1 -1
  228. package/src/shade/renderer/gpu_primitive/sort/graph_radix_sort.d.ts.map +1 -1
  229. package/src/shade/renderer/gpu_primitive/sort/graph_radix_sort.js +7 -3
  230. package/src/shade/renderer/particles/GPUParticleSystem.js +1 -1
  231. package/src/shade/renderer/particles/coherence/graph_particle_bucket.d.ts +4 -3
  232. package/src/shade/renderer/particles/coherence/graph_particle_bucket.d.ts.map +1 -1
  233. package/src/shade/renderer/particles/coherence/graph_particle_bucket.js +200 -194
  234. package/src/shade/renderer/particles/graph_particles.d.ts.map +1 -1
  235. package/src/shade/renderer/particles/graph_particles.js +6 -2
  236. package/src/shade/renderer/particles/warmup/graph_particle_warmup.d.ts.map +1 -1
  237. package/src/shade/renderer/particles/warmup/graph_particle_warmup.js +334 -329
  238. package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.d.ts.map +1 -1
  239. package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.js +7 -2
  240. package/src/shade/renderer/rasterize/expand/mesh/graph_expand_meshes_to_meshlets.d.ts.map +1 -1
  241. package/src/shade/renderer/rasterize/expand/mesh/graph_expand_meshes_to_meshlets.js +16 -4
  242. package/src/shade/renderer/texture/COMPRESSED_TEXTURE_PLAN_2026_09_01.md +2444 -2345
  243. package/src/shade/renderer/texture/encode/chunk_astc_encode_block_4x4_rgb.d.ts.map +1 -1
  244. package/src/shade/renderer/texture/encode/chunk_astc_encode_block_4x4_rgb.js +312 -310
  245. package/src/shade/renderer/texture/encode/chunk_bc1_encode_block.d.ts +3 -3
  246. package/src/shade/renderer/texture/encode/chunk_bc1_encode_block.d.ts.map +1 -1
  247. package/src/shade/renderer/texture/encode/chunk_bc1_encode_block.js +383 -375
  248. package/src/shade/renderer/texture/encode/chunk_bc6h_encode_block_mode11.d.ts.map +1 -1
  249. package/src/shade/renderer/texture/encode/chunk_bc6h_encode_block_mode11.js +349 -346
  250. package/src/shade/renderer/texture/encode/chunk_bc7_encode_block.d.ts +58 -0
  251. package/src/shade/renderer/texture/encode/chunk_bc7_encode_block.d.ts.map +1 -0
  252. package/src/shade/renderer/texture/encode/chunk_bc7_encode_block.js +536 -0
  253. package/src/shade/renderer/texture/encode/chunk_bc7_encode_block_mode6.d.ts +21 -7
  254. package/src/shade/renderer/texture/encode/chunk_bc7_encode_block_mode6.d.ts.map +1 -1
  255. package/src/shade/renderer/texture/encode/chunk_bc7_encode_block_mode6.js +291 -327
  256. package/src/shade/renderer/texture/encode/chunk_bc7_pack_mode1.d.ts +25 -0
  257. package/src/shade/renderer/texture/encode/chunk_bc7_pack_mode1.d.ts.map +1 -0
  258. package/src/shade/renderer/texture/encode/chunk_bc7_pack_mode1.js +99 -0
  259. package/src/shade/renderer/texture/encode/chunk_bc7_pack_mode6.d.ts +5 -3
  260. package/src/shade/renderer/texture/encode/chunk_bc7_pack_mode6.d.ts.map +1 -1
  261. package/src/shade/renderer/texture/encode/chunk_bc7_pack_mode6.js +47 -71
  262. package/src/shade/renderer/texture/encode/chunk_bc7_partition_2.d.ts +10 -0
  263. package/src/shade/renderer/texture/encode/chunk_bc7_partition_2.d.ts.map +1 -0
  264. package/src/shade/renderer/texture/encode/chunk_bc7_partition_2.js +50 -0
  265. package/src/shade/renderer/texture/encode/shader_texture_encode_bc7.d.ts +4 -5
  266. package/src/shade/renderer/texture/encode/shader_texture_encode_bc7.d.ts.map +1 -1
  267. package/src/shade/renderer/texture/encode/shader_texture_encode_bc7.js +7 -8
  268. package/src/shade/renderer/water/chunk_water_transport.d.ts.map +1 -1
  269. package/src/shade/renderer/water/chunk_water_transport.js +7 -5
  270. package/src/shade/renderer/water/medium/GPUWaterBodies.d.ts.map +1 -1
  271. package/src/shade/renderer/water/medium/GPUWaterBodies.js +8 -2
  272. package/src/shade/renderer/water/optics/chunk_water_receiver_downwelling.d.ts +3 -2
  273. package/src/shade/renderer/water/optics/chunk_water_receiver_downwelling.d.ts.map +1 -1
  274. package/src/shade/renderer/water/optics/chunk_water_receiver_downwelling.js +3 -2
  275. package/src/shade/renderer/water/shader_water.d.ts.map +1 -1
  276. package/src/shade/renderer/water/shader_water.js +3 -1
  277. package/src/shade/renderer/water/surface/GPUWaterSurface.d.ts.map +1 -1
  278. package/src/shade/renderer/water/surface/GPUWaterSurface.js +3 -1
  279. package/src/shade/renderer/water/surface/graph_water_tessellation.d.ts.map +1 -1
  280. package/src/shade/renderer/water/surface/graph_water_tessellation.js +11 -4
  281. package/src/shade/renderer/water/surface/particles/GPUWaterParticles.d.ts.map +1 -1
  282. package/src/shade/renderer/water/surface/particles/GPUWaterParticles.js +37 -20
  283. package/src/shade/wgsl/validate_wgsl_source.d.ts.map +1 -1
  284. package/src/shade/wgsl/validate_wgsl_source.js +74 -3
  285. package/src/engine/graphics3/register_instance_animation.d.ts +0 -114
  286. package/src/engine/graphics3/register_instance_animation.d.ts.map +0 -1
  287. package/src/engine/graphics3/register_instance_animation.js +0 -201
@@ -3,30 +3,37 @@
3
3
  * @typedef {import("./PrefabInstance.js").PrefabInstance} PrefabInstance
4
4
  * @typedef {import("../../ecs/EntityComponentDataset.js").EntityComponentDataset} EntityComponentDataset
5
5
  * @typedef {import("../../../shade/renderer/scene/GPUSceneContext.js").GPUSceneContext} GPUSceneContext
6
- * @typedef {import("../register_instance_animation.js").InstanceAnimationRegistration} InstanceAnimationRegistration
6
+ */
7
+ /**
8
+ * One skinned primitive's registration: the mesh entity, and the skin id the animation manager
9
+ * issued for its `MeshSkin`.
10
+ *
11
+ * @typedef {{entity: number, skin_id: number}} PlacedSkin
7
12
  */
8
13
  /**
9
14
  * Put a model into a scene that has no systems: a playground, a preview, a tool.
10
15
  *
11
- * A game does this in two systems — `MeshSystem` spawns the prefab under the entity that wears
12
- * it, and `ShadedGeometrySystem` takes a mesh row for every primitive as its component appears.
13
- * A scene bound to a bare dataset has neither, so this does the same by hand, in one call: a root
14
- * entity carrying `placement`, the prefab spawned under it, a `transforms` row acquired for every
15
- * entity of the instance, a `meshes` row attached for every primitive (over a clone of its geometry
16
- * where the primitive is skinned), and the instance's skins and clips registered with the
17
- * animation manager — unless told otherwise.
16
+ * A game does this in three systems — `MeshSystem` spawns the prefab under the entity that wears
17
+ * it, `ShadedGeometrySystem` takes a mesh row for every primitive as its component appears, and
18
+ * `MeshSkinSystem` registers every `MeshSkin` and binds its mesh. A scene bound to a bare dataset
19
+ * has none of them, so this does the same by hand, in one call: a root entity carrying
20
+ * `placement`, the prefab spawned under it, a `transforms` row acquired for every entity of the
21
+ * instance, a `meshes` row attached for every primitive (over a clone of its geometry where the
22
+ * primitive is skinned), and each skinned primitive's skin registered with the animation manager —
23
+ * unless told otherwise. The rows are not marked when anything moves; a playground that moves a
24
+ * placed model marks what it moved.
18
25
  *
19
26
  * @param {GPUSceneContext} scene_context the scene's context — its rows are where the instance goes
20
27
  * @param {EntityComponentDataset} dataset the dataset the scene is bound to
21
28
  * @param {Prefab} prefab the model, compiled once
22
29
  * @param {Transform64} placement where the model's root goes; copied
23
30
  * @param {object} [options]
24
- * @param {boolean} [options.register_animation] whether the instance's skins and clips are
25
- * registered; off leaves a skinned primitive's clone undeformed
31
+ * @param {boolean} [options.register_animation] whether the instance's skins are registered;
32
+ * off leaves a skinned primitive's clone undeformed
26
33
  * @param {boolean} [options.skinned] whether skinned primitives take a row at all; a preview that
27
34
  * registers no skin has nothing to pose them with and leaves them out
28
- * @returns {{root: number, instance: PrefabInstance, animation: InstanceAnimationRegistration|null, drawn: number}}
29
- * `drawn` is how many primitives took a row
35
+ * @returns {{root: number, instance: PrefabInstance, skins: PlacedSkin[]|null, drawn: number}}
36
+ * `skins` is null when nothing was registered; `drawn` is how many primitives took a row
30
37
  */
31
38
  export function prefab_place(scene_context: GPUSceneContext, dataset: EntityComponentDataset, prefab: Prefab, placement: Transform64, { register_animation, skinned }?: {
32
39
  register_animation?: boolean;
@@ -34,27 +41,34 @@ export function prefab_place(scene_context: GPUSceneContext, dataset: EntityComp
34
41
  }): {
35
42
  root: number;
36
43
  instance: PrefabInstance;
37
- animation: InstanceAnimationRegistration | null;
44
+ skins: PlacedSkin[] | null;
38
45
  drawn: number;
39
46
  };
40
47
  /**
41
- * Take a placed model out again: its rows given back, its animation unregistered, its entities
48
+ * Take a placed model out again: its rows given back, its skins unregistered, its entities
42
49
  * removed — the root included, since {@link prefab_place} made it.
43
50
  *
44
51
  * @param {GPUSceneContext} scene_context
45
52
  * @param {EntityComponentDataset} dataset
46
- * @param {{root: number, instance: PrefabInstance, animation: InstanceAnimationRegistration|null}} placed
53
+ * @param {{root: number, instance: PrefabInstance, skins: PlacedSkin[]|null}} placed
47
54
  * what {@link prefab_place} answered
48
55
  */
49
56
  export function prefab_unplace(scene_context: GPUSceneContext, dataset: EntityComponentDataset, placed: {
50
57
  root: number;
51
58
  instance: PrefabInstance;
52
- animation: InstanceAnimationRegistration | null;
59
+ skins: PlacedSkin[] | null;
53
60
  }): void;
54
61
  export type Prefab = import("./Prefab.js").Prefab;
55
62
  export type PrefabInstance = import("./PrefabInstance.js").PrefabInstance;
56
63
  export type EntityComponentDataset = import("../../ecs/EntityComponentDataset.js").EntityComponentDataset;
57
64
  export type GPUSceneContext = import("../../../shade/renderer/scene/GPUSceneContext.js").GPUSceneContext;
58
- export type InstanceAnimationRegistration = import("../register_instance_animation.js").InstanceAnimationRegistration;
65
+ /**
66
+ * One skinned primitive's registration: the mesh entity, and the skin id the animation manager
67
+ * issued for its `MeshSkin`.
68
+ */
69
+ export type PlacedSkin = {
70
+ entity: number;
71
+ skin_id: number;
72
+ };
59
73
  import { Transform64 } from "../../ecs/transform/Transform64.js";
60
74
  //# sourceMappingURL=prefab_place.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"prefab_place.d.ts","sourceRoot":"","sources":["../../../../../src/engine/graphics3/prefab/prefab_place.js"],"names":[],"mappings":"AAOA;;;;;;GAMG;AAEH;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,4CAZW,eAAe,WACf,sBAAsB,UACtB,MAAM,aACN,WAAW;IAEO,kBAAkB,GAApC,OAAO;IAEW,OAAO,GAAzB,OAAO;IAEL;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,cAAc,CAAC;IAAC,SAAS,EAAE,6BAA6B,GAAC,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAC,CAyDlH;AAED;;;;;;;;GAQG;AACH,8CALW,eAAe,WACf,sBAAsB,UACtB;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,cAAc,CAAC;IAAC,SAAS,EAAE,6BAA6B,GAAC,IAAI,CAAA;CAAC,QA6BjG;qBAzHY,OAAO,aAAa,EAAE,MAAM;6BAC5B,OAAO,qBAAqB,EAAE,cAAc;qCAC5C,OAAO,qCAAqC,EAAE,sBAAsB;8BACpE,OAAO,kDAAkD,EAAE,eAAe;4CAC1E,OAAO,mCAAmC,EAAE,6BAA6B;4BAX1D,oCAAoC"}
1
+ {"version":3,"file":"prefab_place.d.ts","sourceRoot":"","sources":["../../../../../src/engine/graphics3/prefab/prefab_place.js"],"names":[],"mappings":"AAOA;;;;;GAKG;AAEH;;;;;GAKG;AAEH;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,4CAZW,eAAe,WACf,sBAAsB,UACtB,MAAM,aACN,WAAW;IAEO,kBAAkB,GAApC,OAAO;IAEW,OAAO,GAAzB,OAAO;IAEL;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,cAAc,CAAC;IAAC,KAAK,EAAE,UAAU,EAAE,GAAC,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAC,CAyD7F;AAkCD;;;;;;;;GAQG;AACH,8CALW,eAAe,WACf,sBAAsB,UACtB;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,cAAc,CAAC;IAAC,KAAK,EAAE,UAAU,EAAE,GAAC,IAAI,CAAA;CAAC,QAkC5E;qBAtKY,OAAO,aAAa,EAAE,MAAM;6BAC5B,OAAO,qBAAqB,EAAE,cAAc;qCAC5C,OAAO,qCAAqC,EAAE,sBAAsB;8BACpE,OAAO,kDAAkD,EAAE,eAAe;;;;;yBAO1E;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAC;4BAjBlB,oCAAoC"}
@@ -1,130 +1,175 @@
1
- import { assert } from "../../../core/assert.js";
2
- import { Transform64 } from "../../ecs/transform/Transform64.js";
3
- import { ShadedGeometry } from "../../graphics/ecs/mesh-v2/ShadedGeometry.js";
4
- import { ShadedGeometryFlags } from "../../graphics/ecs/mesh-v2/ShadedGeometryFlags.js";
5
- import { register_instance_animation, unregister_instance_animation } from "../register_instance_animation.js";
6
- import { prefab_instance_destroy, prefab_instantiate } from "./prefab_instantiate.js";
7
-
8
- /**
9
- * @typedef {import("./Prefab.js").Prefab} Prefab
10
- * @typedef {import("./PrefabInstance.js").PrefabInstance} PrefabInstance
11
- * @typedef {import("../../ecs/EntityComponentDataset.js").EntityComponentDataset} EntityComponentDataset
12
- * @typedef {import("../../../shade/renderer/scene/GPUSceneContext.js").GPUSceneContext} GPUSceneContext
13
- * @typedef {import("../register_instance_animation.js").InstanceAnimationRegistration} InstanceAnimationRegistration
14
- */
15
-
16
- /**
17
- * Put a model into a scene that has no systems: a playground, a preview, a tool.
18
- *
19
- * A game does this in two systems — `MeshSystem` spawns the prefab under the entity that wears
20
- * it, and `ShadedGeometrySystem` takes a mesh row for every primitive as its component appears.
21
- * A scene bound to a bare dataset has neither, so this does the same by hand, in one call: a root
22
- * entity carrying `placement`, the prefab spawned under it, a `transforms` row acquired for every
23
- * entity of the instance, a `meshes` row attached for every primitive (over a clone of its geometry
24
- * where the primitive is skinned), and the instance's skins and clips registered with the
25
- * animation manager — unless told otherwise.
26
- *
27
- * @param {GPUSceneContext} scene_context the scene's context — its rows are where the instance goes
28
- * @param {EntityComponentDataset} dataset the dataset the scene is bound to
29
- * @param {Prefab} prefab the model, compiled once
30
- * @param {Transform64} placement where the model's root goes; copied
31
- * @param {object} [options]
32
- * @param {boolean} [options.register_animation] whether the instance's skins and clips are
33
- * registered; off leaves a skinned primitive's clone undeformed
34
- * @param {boolean} [options.skinned] whether skinned primitives take a row at all; a preview that
35
- * registers no skin has nothing to pose them with and leaves them out
36
- * @returns {{root: number, instance: PrefabInstance, animation: InstanceAnimationRegistration|null, drawn: number}}
37
- * `drawn` is how many primitives took a row
38
- */
39
- export function prefab_place(scene_context, dataset, prefab, placement, { register_animation = true, skinned = true } = {}) {
40
- assert.defined(scene_context, 'scene_context');
41
- assert.defined(dataset, 'dataset');
42
- assert.equal(dataset.isEntityComponentDataset, true, 'dataset.isEntityComponentDataset !== true');
43
- assert.defined(prefab, 'prefab');
44
- assert.equal(prefab.isPrefab, true, 'prefab.isPrefab !== true');
45
- assert.defined(placement, 'placement');
46
- assert.isBoolean(register_animation, 'register_animation');
47
- assert.isBoolean(skinned, 'skinned');
48
-
49
- // a fresh dataset knows no component types; the prefab registers its own, and the root is
50
- // placed before the prefab is spawned
51
- dataset.registerManyComponentTypes([Transform64]);
52
-
53
- const root = dataset.createEntity();
54
- const transform = new Transform64();
55
-
56
- transform.copy(placement);
57
- transform.updateMatrix();
58
-
59
- dataset.addComponentToEntity(root, transform);
60
-
61
- const instance = prefab_instantiate(prefab, dataset, root);
62
-
63
- const rows = scene_context.rows;
64
- const entities = instance.entities;
65
-
66
- for (let i = 0; i < entities.length; i++) {
67
- rows.acquire(entities[i]);
68
- }
69
-
70
- const mesh_entities = instance.mesh_entities;
71
-
72
- let drawn = 0;
73
-
74
- for (let i = 0; i < mesh_entities.length; i++) {
75
- const entity = mesh_entities[i];
76
- const geometry = dataset.getComponent(entity, ShadedGeometry);
77
- const is_skinned = geometry.getFlag(ShadedGeometryFlags.Skinned);
78
-
79
- if (is_skinned && !skinned) {
80
- continue;
81
- }
82
-
83
- rows.attach_mesh(entity, geometry.geometry, geometry.material, is_skinned);
84
-
85
- drawn++;
86
- }
87
-
88
- const animation = register_animation
89
- ? register_instance_animation(scene_context, instance)
90
- : null;
91
-
92
- return { root, instance, animation, drawn };
93
- }
94
-
95
- /**
96
- * Take a placed model out again: its rows given back, its animation unregistered, its entities
97
- * removed — the root included, since {@link prefab_place} made it.
98
- *
99
- * @param {GPUSceneContext} scene_context
100
- * @param {EntityComponentDataset} dataset
101
- * @param {{root: number, instance: PrefabInstance, animation: InstanceAnimationRegistration|null}} placed
102
- * what {@link prefab_place} answered
103
- */
104
- export function prefab_unplace(scene_context, dataset, placed) {
105
- assert.defined(scene_context, 'scene_context');
106
- assert.defined(dataset, 'dataset');
107
- assert.defined(placed, 'placed');
108
-
109
- if (placed.animation !== null) {
110
- unregister_instance_animation(placed.animation);
111
- }
112
-
113
- const rows = scene_context.rows;
114
- const instance = placed.instance;
115
- const mesh_entities = instance.mesh_entities;
116
-
117
- for (let i = 0; i < mesh_entities.length; i++) {
118
- // safe on a skinned primitive that took no row
119
- rows.detach_mesh(mesh_entities[i]);
120
- }
121
-
122
- const entities = instance.entities;
123
-
124
- for (let i = 0; i < entities.length; i++) {
125
- rows.release(entities[i]);
126
- }
127
-
128
- prefab_instance_destroy(dataset, instance);
129
- dataset.removeEntity(placed.root);
130
- }
1
+ import { assert } from "../../../core/assert.js";
2
+ import { Transform64 } from "../../ecs/transform/Transform64.js";
3
+ import { ShadedGeometry } from "../../graphics/ecs/mesh-v2/ShadedGeometry.js";
4
+ import { ShadedGeometryFlags } from "../../graphics/ecs/mesh-v2/ShadedGeometryFlags.js";
5
+ import { MeshSkin } from "../../graphics/ecs/mesh-v2/MeshSkin.js";
6
+ import { prefab_instance_destroy, prefab_instantiate } from "./prefab_instantiate.js";
7
+
8
+ /**
9
+ * @typedef {import("./Prefab.js").Prefab} Prefab
10
+ * @typedef {import("./PrefabInstance.js").PrefabInstance} PrefabInstance
11
+ * @typedef {import("../../ecs/EntityComponentDataset.js").EntityComponentDataset} EntityComponentDataset
12
+ * @typedef {import("../../../shade/renderer/scene/GPUSceneContext.js").GPUSceneContext} GPUSceneContext
13
+ */
14
+
15
+ /**
16
+ * One skinned primitive's registration: the mesh entity, and the skin id the animation manager
17
+ * issued for its `MeshSkin`.
18
+ *
19
+ * @typedef {{entity: number, skin_id: number}} PlacedSkin
20
+ */
21
+
22
+ /**
23
+ * Put a model into a scene that has no systems: a playground, a preview, a tool.
24
+ *
25
+ * A game does this in three systems — `MeshSystem` spawns the prefab under the entity that wears
26
+ * it, `ShadedGeometrySystem` takes a mesh row for every primitive as its component appears, and
27
+ * `MeshSkinSystem` registers every `MeshSkin` and binds its mesh. A scene bound to a bare dataset
28
+ * has none of them, so this does the same by hand, in one call: a root entity carrying
29
+ * `placement`, the prefab spawned under it, a `transforms` row acquired for every entity of the
30
+ * instance, a `meshes` row attached for every primitive (over a clone of its geometry where the
31
+ * primitive is skinned), and each skinned primitive's skin registered with the animation manager —
32
+ * unless told otherwise. The rows are not marked when anything moves; a playground that moves a
33
+ * placed model marks what it moved.
34
+ *
35
+ * @param {GPUSceneContext} scene_context the scene's context — its rows are where the instance goes
36
+ * @param {EntityComponentDataset} dataset the dataset the scene is bound to
37
+ * @param {Prefab} prefab the model, compiled once
38
+ * @param {Transform64} placement where the model's root goes; copied
39
+ * @param {object} [options]
40
+ * @param {boolean} [options.register_animation] whether the instance's skins are registered;
41
+ * off leaves a skinned primitive's clone undeformed
42
+ * @param {boolean} [options.skinned] whether skinned primitives take a row at all; a preview that
43
+ * registers no skin has nothing to pose them with and leaves them out
44
+ * @returns {{root: number, instance: PrefabInstance, skins: PlacedSkin[]|null, drawn: number}}
45
+ * `skins` is null when nothing was registered; `drawn` is how many primitives took a row
46
+ */
47
+ export function prefab_place(scene_context, dataset, prefab, placement, { register_animation = true, skinned = true } = {}) {
48
+ assert.defined(scene_context, 'scene_context');
49
+ assert.defined(dataset, 'dataset');
50
+ assert.equal(dataset.isEntityComponentDataset, true, 'dataset.isEntityComponentDataset !== true');
51
+ assert.defined(prefab, 'prefab');
52
+ assert.equal(prefab.isPrefab, true, 'prefab.isPrefab !== true');
53
+ assert.defined(placement, 'placement');
54
+ assert.isBoolean(register_animation, 'register_animation');
55
+ assert.isBoolean(skinned, 'skinned');
56
+
57
+ // a fresh dataset knows no component types; the prefab registers its own, and the root is
58
+ // placed before the prefab is spawned
59
+ dataset.registerManyComponentTypes([Transform64]);
60
+
61
+ const root = dataset.createEntity();
62
+ const transform = new Transform64();
63
+
64
+ transform.copy(placement);
65
+ transform.updateMatrix();
66
+
67
+ dataset.addComponentToEntity(root, transform);
68
+
69
+ const instance = prefab_instantiate(prefab, dataset, root);
70
+
71
+ const rows = scene_context.rows;
72
+ const entities = instance.entities;
73
+
74
+ for (let i = 0; i < entities.length; i++) {
75
+ rows.acquire(entities[i]);
76
+ }
77
+
78
+ const mesh_entities = instance.mesh_entities;
79
+
80
+ let drawn = 0;
81
+
82
+ for (let i = 0; i < mesh_entities.length; i++) {
83
+ const entity = mesh_entities[i];
84
+ const geometry = dataset.getComponent(entity, ShadedGeometry);
85
+ const is_skinned = geometry.getFlag(ShadedGeometryFlags.Skinned);
86
+
87
+ if (is_skinned && !skinned) {
88
+ continue;
89
+ }
90
+
91
+ rows.attach_mesh(entity, geometry.geometry, geometry.material, is_skinned);
92
+
93
+ drawn++;
94
+ }
95
+
96
+ const skins = register_animation
97
+ ? register_skins(scene_context, dataset, mesh_entities)
98
+ : null;
99
+
100
+ return { root, instance, skins, drawn };
101
+ }
102
+
103
+ /**
104
+ * Register the skin of every primitive that carries one, and bind the primitive to it — what
105
+ * `MeshSkinSystem` does for a game. Meshes of one skeleton bound the same way share a skin.
106
+ *
107
+ * @param {GPUSceneContext} scene_context
108
+ * @param {EntityComponentDataset} dataset
109
+ * @param {Int32Array} mesh_entities
110
+ * @returns {PlacedSkin[]}
111
+ */
112
+ function register_skins(scene_context, dataset, mesh_entities) {
113
+ const manager = scene_context.animation_manager;
114
+
115
+ const skins = [];
116
+
117
+ for (let i = 0; i < mesh_entities.length; i++) {
118
+ const entity = mesh_entities[i];
119
+ const skin = dataset.getComponent(entity, MeshSkin);
120
+
121
+ if (skin === undefined) {
122
+ continue;
123
+ }
124
+
125
+ const skin_id = manager.register_skin(skin.joints, skin.inverse_bind_matrices);
126
+
127
+ manager.bind_skin_mesh(entity, skin_id);
128
+
129
+ skins.push({ entity, skin_id });
130
+ }
131
+
132
+ return skins;
133
+ }
134
+
135
+ /**
136
+ * Take a placed model out again: its rows given back, its skins unregistered, its entities
137
+ * removed — the root included, since {@link prefab_place} made it.
138
+ *
139
+ * @param {GPUSceneContext} scene_context
140
+ * @param {EntityComponentDataset} dataset
141
+ * @param {{root: number, instance: PrefabInstance, skins: PlacedSkin[]|null}} placed
142
+ * what {@link prefab_place} answered
143
+ */
144
+ export function prefab_unplace(scene_context, dataset, placed) {
145
+ assert.defined(scene_context, 'scene_context');
146
+ assert.defined(dataset, 'dataset');
147
+ assert.defined(placed, 'placed');
148
+
149
+ if (placed.skins !== null) {
150
+ const manager = scene_context.animation_manager;
151
+
152
+ for (const { entity, skin_id } of placed.skins) {
153
+ manager.unbind_skin_mesh(entity);
154
+ manager.unregister_skin(skin_id);
155
+ }
156
+ }
157
+
158
+ const rows = scene_context.rows;
159
+ const instance = placed.instance;
160
+ const mesh_entities = instance.mesh_entities;
161
+
162
+ for (let i = 0; i < mesh_entities.length; i++) {
163
+ // safe on a skinned primitive that took no row
164
+ rows.detach_mesh(mesh_entities[i]);
165
+ }
166
+
167
+ const entities = instance.entities;
168
+
169
+ for (let i = 0; i < entities.length; i++) {
170
+ rows.release(entities[i]);
171
+ }
172
+
173
+ prefab_instance_destroy(dataset, instance);
174
+ dataset.removeEntity(placed.root);
175
+ }
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Make some of an entity's clips playable — the ones a driver actually plays, and no others.
3
+ *
4
+ * **Registering a clip is not free of consequence, which is why this takes a set.** The pose
5
+ * accumulator marks a joint dirty for every bound clip that writes to it, whatever its weight, so a
6
+ * bound clip at weight zero resolves the joints only it drives to zero rather than leaving them at
7
+ * rest. A driver therefore registers what it can play and re-registers when that changes; a clip no
8
+ * driver claims is never bound and so moves nothing.
9
+ *
10
+ * Each index is registered once however many times it is named. Two states of one graph can play
11
+ * the same clip, and two registrations of one clip are two rows the accumulator would add together.
12
+ *
13
+ * @param {GPUSceneContext} context
14
+ * @param {ShadeAnimationClip[]} clips an entity's `AnimationClips`; their channels target entities
15
+ * @param {ArrayLike<number>} slots indices into `clips`; duplicates are ignored
16
+ * @returns {ClipRegistration}
17
+ */
18
+ export function register_clips(context: GPUSceneContext, clips: ShadeAnimationClip[], slots: ArrayLike<number>): ClipRegistration;
19
+ /**
20
+ * Give back everything {@link register_clips} took out, for a manager that is still the one that
21
+ * issued it. A restart takes the GPU scene context with it, and the ids it issued mean nothing to the
22
+ * one that replaces it, so a caller holding a registration from another context forgets it rather
23
+ * than handing it back here.
24
+ *
25
+ * @param {ClipRegistration} registration
26
+ */
27
+ export function unregister_clips(registration: ClipRegistration): void;
28
+ /**
29
+ * @typedef {import("../../shade/renderer/scene/GPUSceneContext.js").GPUSceneContext} GPUSceneContext
30
+ * @typedef {import("../../shade/renderer/animation/ShadeAnimationClip.js").ShadeAnimationClip} ShadeAnimationClip
31
+ */
32
+ /**
33
+ * The id a clip has when nobody registered it.
34
+ * @type {number}
35
+ */
36
+ export const CLIP_NOT_REGISTERED: number;
37
+ /**
38
+ * Which of an entity's clips a driver has playable, by their place in its `AnimationClips`.
39
+ *
40
+ * `ids[i]` is the manager's id for `clips[i]`, or {@link CLIP_NOT_REGISTERED} where this driver
41
+ * does not play that clip. Indexed by the clip's place rather than packed, because that is how
42
+ * both drivers already address a clip — the graph resolves a name to a slot, the clip list does the
43
+ * same — and a packed array would want a second table to say what each entry was.
44
+ */
45
+ export class ClipRegistration {
46
+ /**
47
+ * The GPU scene context these ids were issued by.
48
+ *
49
+ * Carried rather than inferred, because **an id may only be handed back to the manager that
50
+ * issued it**. A renderer restart builds a new context, and a holder comparing this against what
51
+ * `scene_context` answers now knows in one `===` whether giving the ids back is returning them or
52
+ * corrupting a stranger's table.
53
+ *
54
+ * @type {GPUSceneContext|null}
55
+ */
56
+ context: GPUSceneContext | null;
57
+ /**
58
+ * @type {Int32Array}
59
+ */
60
+ ids: Int32Array;
61
+ }
62
+ export type GPUSceneContext = import("../../shade/renderer/scene/GPUSceneContext.js").GPUSceneContext;
63
+ export type ShadeAnimationClip = import("../../shade/renderer/animation/ShadeAnimationClip.js").ShadeAnimationClip;
64
+ //# sourceMappingURL=register_clips.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register_clips.d.ts","sourceRoot":"","sources":["../../../../src/engine/graphics3/register_clips.js"],"names":[],"mappings":"AAwCA;;;;;;;;;;;;;;;;GAgBG;AACH,wCALW,eAAe,SACf,kBAAkB,EAAE,SACpB,UAAU,MAAM,CAAC,GACf,gBAAgB,CA6B5B;AAED;;;;;;;GAOG;AACH,+CAFW,gBAAgB,QAqB1B;AA/GD;;;GAGG;AAEH;;;GAGG;AACH,kCAFU,MAAM,CAEsB;AAEtC;;;;;;;GAOG;AACH;IACI;;;;;;;;;OASG;IACH,SAFU,eAAe,GAAC,IAAI,CAEf;IAEf;;OAEG;IACH,KAFU,UAAU,CAEI;CAC3B;8BAnCY,OAAO,+CAA+C,EAAE,eAAe;iCACvE,OAAO,sDAAsD,EAAE,kBAAkB"}
@@ -0,0 +1,114 @@
1
+ import { assert } from "../../core/assert.js";
2
+
3
+ /**
4
+ * @typedef {import("../../shade/renderer/scene/GPUSceneContext.js").GPUSceneContext} GPUSceneContext
5
+ * @typedef {import("../../shade/renderer/animation/ShadeAnimationClip.js").ShadeAnimationClip} ShadeAnimationClip
6
+ */
7
+
8
+ /**
9
+ * The id a clip has when nobody registered it.
10
+ * @type {number}
11
+ */
12
+ export const CLIP_NOT_REGISTERED = -1;
13
+
14
+ /**
15
+ * Which of an entity's clips a driver has playable, by their place in its `AnimationClips`.
16
+ *
17
+ * `ids[i]` is the manager's id for `clips[i]`, or {@link CLIP_NOT_REGISTERED} where this driver
18
+ * does not play that clip. Indexed by the clip's place rather than packed, because that is how
19
+ * both drivers already address a clip — the graph resolves a name to a slot, the clip list does the
20
+ * same — and a packed array would want a second table to say what each entry was.
21
+ */
22
+ export class ClipRegistration {
23
+ /**
24
+ * The GPU scene context these ids were issued by.
25
+ *
26
+ * Carried rather than inferred, because **an id may only be handed back to the manager that
27
+ * issued it**. A renderer restart builds a new context, and a holder comparing this against what
28
+ * `scene_context` answers now knows in one `===` whether giving the ids back is returning them or
29
+ * corrupting a stranger's table.
30
+ *
31
+ * @type {GPUSceneContext|null}
32
+ */
33
+ context = null;
34
+
35
+ /**
36
+ * @type {Int32Array}
37
+ */
38
+ ids = new Int32Array(0);
39
+ }
40
+
41
+ /**
42
+ * Make some of an entity's clips playable — the ones a driver actually plays, and no others.
43
+ *
44
+ * **Registering a clip is not free of consequence, which is why this takes a set.** The pose
45
+ * accumulator marks a joint dirty for every bound clip that writes to it, whatever its weight, so a
46
+ * bound clip at weight zero resolves the joints only it drives to zero rather than leaving them at
47
+ * rest. A driver therefore registers what it can play and re-registers when that changes; a clip no
48
+ * driver claims is never bound and so moves nothing.
49
+ *
50
+ * Each index is registered once however many times it is named. Two states of one graph can play
51
+ * the same clip, and two registrations of one clip are two rows the accumulator would add together.
52
+ *
53
+ * @param {GPUSceneContext} context
54
+ * @param {ShadeAnimationClip[]} clips an entity's `AnimationClips`; their channels target entities
55
+ * @param {ArrayLike<number>} slots indices into `clips`; duplicates are ignored
56
+ * @returns {ClipRegistration}
57
+ */
58
+ export function register_clips(context, clips, slots) {
59
+ assert.defined(context, 'context');
60
+ assert.isArray(clips, 'clips');
61
+ assert.defined(slots, 'slots');
62
+
63
+ const manager = context.animation_manager;
64
+
65
+ const r = new ClipRegistration();
66
+
67
+ r.context = context;
68
+ r.ids = new Int32Array(clips.length).fill(CLIP_NOT_REGISTERED);
69
+
70
+ for (let i = 0; i < slots.length; i++) {
71
+ const slot = slots[i];
72
+
73
+ assert.isNonNegativeInteger(slot, 'slot');
74
+ assert.lessThan(slot, clips.length, 'slot');
75
+
76
+ if (r.ids[slot] !== CLIP_NOT_REGISTERED) {
77
+ // named twice by one driver, which is one clip either way
78
+ continue;
79
+ }
80
+
81
+ r.ids[slot] = manager.register_clip(clips[slot]);
82
+ }
83
+
84
+ return r;
85
+ }
86
+
87
+ /**
88
+ * Give back everything {@link register_clips} took out, for a manager that is still the one that
89
+ * issued it. A restart takes the GPU scene context with it, and the ids it issued mean nothing to the
90
+ * one that replaces it, so a caller holding a registration from another context forgets it rather
91
+ * than handing it back here.
92
+ *
93
+ * @param {ClipRegistration} registration
94
+ */
95
+ export function unregister_clips(registration) {
96
+ assert.defined(registration, 'registration');
97
+ assert.defined(registration.context, 'registration.context');
98
+
99
+ const manager = registration.context.animation_manager;
100
+
101
+ const ids = registration.ids;
102
+
103
+ for (let i = 0; i < ids.length; i++) {
104
+ const id = ids[i];
105
+
106
+ if (id === CLIP_NOT_REGISTERED) {
107
+ continue;
108
+ }
109
+
110
+ manager.unregister_clip(id);
111
+ }
112
+
113
+ ids.fill(CLIP_NOT_REGISTERED);
114
+ }