@woosh/meep-engine 3.43.0 → 3.45.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 (466) hide show
  1. package/build/bundle-worker-terrain.js +1 -1
  2. package/editor/prototypeEditorShell.d.ts.map +1 -1
  3. package/editor/prototypeEditorShell.js +4 -2
  4. package/package.json +1 -1
  5. package/src/core/collection/array/array_sort_insertion_ascending.d.ts +19 -0
  6. package/src/core/collection/array/array_sort_insertion_ascending.d.ts.map +1 -0
  7. package/src/core/collection/array/array_sort_insertion_ascending.js +31 -0
  8. package/src/core/geom/3d/aabb/aabb3_array_round_outward_f32.d.ts +27 -0
  9. package/src/core/geom/3d/aabb/aabb3_array_round_outward_f32.d.ts.map +1 -0
  10. package/src/core/geom/3d/aabb/aabb3_array_round_outward_f32.js +39 -0
  11. package/src/core/geom/3d/aabb/aabb3_from_v3_array.d.ts.map +1 -1
  12. package/src/core/geom/3d/aabb/aabb3_from_v3_array.js +4 -1
  13. package/src/core/geom/3d/aabb/aabb3_transform_oriented.d.ts +2 -2
  14. package/src/core/geom/3d/aabb/aabb3_transform_oriented.d.ts.map +1 -1
  15. package/src/core/geom/3d/aabb/aabb3_transform_oriented.js +1 -1
  16. package/src/core/geom/3d/pose/pose3_apply_inverse_point_array.d.ts +21 -0
  17. package/src/core/geom/3d/pose/pose3_apply_inverse_point_array.d.ts.map +1 -0
  18. package/src/core/geom/3d/pose/pose3_apply_inverse_point_array.js +36 -0
  19. package/src/core/geom/3d/pose/pose3_apply_point_array.d.ts +25 -0
  20. package/src/core/geom/3d/pose/pose3_apply_point_array.d.ts.map +1 -0
  21. package/src/core/geom/3d/pose/pose3_apply_point_array.js +40 -0
  22. package/src/core/geom/3d/pose/pose3_compose_array.d.ts +28 -0
  23. package/src/core/geom/3d/pose/pose3_compose_array.d.ts.map +1 -0
  24. package/src/core/geom/3d/pose/pose3_compose_array.js +41 -0
  25. package/src/core/geom/3d/pose/pose3_to_local_array.d.ts +29 -0
  26. package/src/core/geom/3d/pose/pose3_to_local_array.d.ts.map +1 -0
  27. package/src/core/geom/3d/pose/pose3_to_local_array.js +42 -0
  28. package/src/core/geom/3d/quaternion/quat3_clamp_angle_array.d.ts +28 -0
  29. package/src/core/geom/3d/quaternion/quat3_clamp_angle_array.d.ts.map +1 -0
  30. package/src/core/geom/3d/quaternion/quat3_clamp_angle_array.js +66 -0
  31. package/src/core/geom/3d/quaternion/quat3_multiply_conjugate_left_array.d.ts +22 -0
  32. package/src/core/geom/3d/quaternion/quat3_multiply_conjugate_left_array.d.ts.map +1 -0
  33. package/src/core/geom/3d/quaternion/quat3_multiply_conjugate_left_array.js +30 -0
  34. package/src/core/geom/3d/quaternion/quat3_multiply_conjugate_right_array.d.ts +23 -0
  35. package/src/core/geom/3d/quaternion/quat3_multiply_conjugate_right_array.d.ts.map +1 -0
  36. package/src/core/geom/3d/quaternion/quat3_multiply_conjugate_right_array.js +31 -0
  37. package/src/core/geom/3d/triangle/tri3_compute_normal_area_weighted_array.d.ts +26 -0
  38. package/src/core/geom/3d/triangle/tri3_compute_normal_area_weighted_array.d.ts.map +1 -0
  39. package/src/core/geom/3d/triangle/tri3_compute_normal_area_weighted_array.js +46 -0
  40. package/src/core/geom/vec3/v3_distance_array.d.ts +11 -0
  41. package/src/core/geom/vec3/v3_distance_array.d.ts.map +1 -0
  42. package/src/core/geom/vec3/v3_distance_array.js +19 -0
  43. package/src/core/geom/vec3/v3_normalize_array_checked.d.ts +23 -0
  44. package/src/core/geom/vec3/v3_normalize_array_checked.d.ts.map +1 -0
  45. package/src/core/geom/vec3/v3_normalize_array_checked.js +49 -0
  46. package/src/core/geom/vec3/v3_reject_array.d.ts +15 -0
  47. package/src/core/geom/vec3/v3_reject_array.d.ts.map +1 -0
  48. package/src/core/geom/vec3/v3_reject_array.js +32 -0
  49. package/src/core/graph/csr/csr_build_incidence.d.ts +26 -0
  50. package/src/core/graph/csr/csr_build_incidence.d.ts.map +1 -0
  51. package/src/core/graph/csr/csr_build_incidence.js +71 -0
  52. package/src/core/graph/csr/csr_graph_color_greedy.d.ts +25 -0
  53. package/src/core/graph/csr/csr_graph_color_greedy.d.ts.map +1 -0
  54. package/src/core/graph/csr/csr_graph_color_greedy.js +83 -0
  55. package/src/core/graph/csr/csr_graph_validate_coloring.d.ts +15 -0
  56. package/src/core/graph/csr/csr_graph_validate_coloring.d.ts.map +1 -0
  57. package/src/core/graph/csr/csr_graph_validate_coloring.js +33 -0
  58. package/src/core/math/linalg/matrix_symmetric_3x3_solve_ldlt.d.ts +26 -0
  59. package/src/core/math/linalg/matrix_symmetric_3x3_solve_ldlt.d.ts.map +1 -0
  60. package/src/core/math/linalg/matrix_symmetric_3x3_solve_ldlt.js +71 -0
  61. package/src/core/math/max2_exact.d.ts +15 -0
  62. package/src/core/math/max2_exact.d.ts.map +1 -0
  63. package/src/core/math/max2_exact.js +30 -0
  64. package/src/core/math/min2_exact.d.ts +20 -0
  65. package/src/core/math/min2_exact.d.ts.map +1 -0
  66. package/src/core/math/min2_exact.js +35 -0
  67. package/src/engine/Clock.d.ts +15 -0
  68. package/src/engine/Clock.d.ts.map +1 -1
  69. package/src/engine/Clock.js +29 -5
  70. package/src/engine/Engine.d.ts.map +1 -1
  71. package/src/engine/Engine.js +11 -19
  72. package/src/engine/ecs/ik/IKGoalSystem.d.ts.map +1 -1
  73. package/src/engine/ecs/ik/IKGoalSystem.js +3 -19
  74. package/src/engine/ecs/parent/parent_entity_model_of.d.ts +17 -0
  75. package/src/engine/ecs/parent/parent_entity_model_of.d.ts.map +1 -0
  76. package/src/engine/ecs/parent/parent_entity_model_of.js +26 -0
  77. package/src/engine/ecs/transform/t64_read_pose_array.d.ts +15 -0
  78. package/src/engine/ecs/transform/t64_read_pose_array.d.ts.map +1 -0
  79. package/src/engine/ecs/transform/t64_read_pose_array.js +24 -0
  80. package/src/engine/graphics/ecs/mesh-v2/MeshSkin.d.ts +57 -0
  81. package/src/engine/graphics/ecs/mesh-v2/MeshSkin.d.ts.map +1 -0
  82. package/src/engine/graphics/ecs/mesh-v2/MeshSkin.js +84 -0
  83. package/src/engine/graphics/geometry/geometry_construct_triangle_normal_area_weighted.d.ts +2 -0
  84. package/src/engine/graphics/geometry/geometry_construct_triangle_normal_area_weighted.d.ts.map +1 -1
  85. package/src/engine/graphics/geometry/geometry_construct_triangle_normal_area_weighted.js +10 -21
  86. package/src/engine/graphics3/AnimationGraphSystem.d.ts +28 -13
  87. package/src/engine/graphics3/AnimationGraphSystem.d.ts.map +1 -1
  88. package/src/engine/graphics3/AnimationGraphSystem.js +107 -64
  89. package/src/engine/graphics3/AnimationSystem.d.ts +29 -15
  90. package/src/engine/graphics3/AnimationSystem.d.ts.map +1 -1
  91. package/src/engine/graphics3/AnimationSystem.js +112 -61
  92. package/src/engine/graphics3/MeshSkinSystem.d.ts +56 -0
  93. package/src/engine/graphics3/MeshSkinSystem.d.ts.map +1 -0
  94. package/src/engine/graphics3/MeshSkinSystem.js +317 -0
  95. package/src/engine/graphics3/MeshSystem.d.ts +15 -35
  96. package/src/engine/graphics3/MeshSystem.d.ts.map +1 -1
  97. package/src/engine/graphics3/MeshSystem.js +21 -298
  98. package/src/engine/graphics3/RowChains.d.ts +76 -0
  99. package/src/engine/graphics3/RowChains.d.ts.map +1 -0
  100. package/src/engine/graphics3/RowChains.js +347 -0
  101. package/src/engine/graphics3/ShadedGeometrySystem.d.ts +6 -0
  102. package/src/engine/graphics3/ShadedGeometrySystem.d.ts.map +1 -1
  103. package/src/engine/graphics3/ShadedGeometrySystem.js +329 -309
  104. package/src/engine/graphics3/animation/AnimationClips.d.ts +56 -0
  105. package/src/engine/graphics3/animation/AnimationClips.d.ts.map +1 -0
  106. package/src/engine/graphics3/animation/AnimationClips.js +79 -0
  107. package/src/engine/graphics3/animation/ClipListPlayer.d.ts +13 -14
  108. package/src/engine/graphics3/animation/ClipListPlayer.d.ts.map +1 -1
  109. package/src/engine/graphics3/animation/ClipListPlayer.js +262 -263
  110. package/src/engine/graphics3/animation/write_clip_playback.d.ts +3 -3
  111. package/src/engine/graphics3/animation/write_clip_playback.js +4 -4
  112. package/src/engine/graphics3/pose/query_entity_node_world_pose.d.ts +5 -0
  113. package/src/engine/graphics3/pose/query_entity_node_world_pose.d.ts.map +1 -1
  114. package/src/engine/graphics3/pose/query_entity_node_world_pose.js +80 -75
  115. package/src/engine/graphics3/prefab/PrefabInstance.d.ts +4 -24
  116. package/src/engine/graphics3/prefab/PrefabInstance.d.ts.map +1 -1
  117. package/src/engine/graphics3/prefab/PrefabInstance.js +60 -80
  118. package/src/engine/graphics3/prefab/prefab_instantiate.d.ts +16 -3
  119. package/src/engine/graphics3/prefab/prefab_instantiate.d.ts.map +1 -1
  120. package/src/engine/graphics3/prefab/prefab_instantiate.js +49 -12
  121. package/src/engine/graphics3/prefab/prefab_place.d.ts +31 -17
  122. package/src/engine/graphics3/prefab/prefab_place.d.ts.map +1 -1
  123. package/src/engine/graphics3/prefab/prefab_place.js +175 -130
  124. package/src/engine/graphics3/register_clips.d.ts +93 -0
  125. package/src/engine/graphics3/register_clips.d.ts.map +1 -0
  126. package/src/engine/graphics3/register_clips.js +166 -0
  127. package/src/engine/physics/broadphase/compute_fat_world_aabb.d.ts +9 -0
  128. package/src/engine/physics/broadphase/compute_fat_world_aabb.d.ts.map +1 -1
  129. package/src/engine/physics/broadphase/compute_fat_world_aabb.js +3 -1
  130. package/src/engine/physics/cloth/MEASUREMENTS.md +795 -0
  131. package/src/engine/physics/cloth/PLAN.md +349 -17
  132. package/src/engine/physics/cloth/build/ClothProxy.d.ts +113 -61
  133. package/src/engine/physics/cloth/build/ClothProxy.d.ts.map +1 -1
  134. package/src/engine/physics/cloth/build/ClothProxy.js +142 -77
  135. package/src/engine/physics/cloth/build/cloth_bind_in_frame.d.ts +44 -0
  136. package/src/engine/physics/cloth/build/cloth_bind_in_frame.d.ts.map +1 -0
  137. package/src/engine/physics/cloth/build/cloth_bind_in_frame.js +107 -0
  138. package/src/engine/physics/cloth/build/cloth_proxy_from_joints.d.ts +43 -30
  139. package/src/engine/physics/cloth/build/cloth_proxy_from_joints.d.ts.map +1 -1
  140. package/src/engine/physics/cloth/build/cloth_proxy_from_joints.js +371 -284
  141. package/src/engine/physics/cloth/build/cloth_proxy_from_mesh.d.ts +62 -0
  142. package/src/engine/physics/cloth/build/cloth_proxy_from_mesh.d.ts.map +1 -0
  143. package/src/engine/physics/cloth/build/cloth_proxy_from_mesh.js +275 -0
  144. package/src/engine/physics/cloth/collider/ClothColliderIndex.d.ts +7 -0
  145. package/src/engine/physics/cloth/collider/ClothColliderIndex.d.ts.map +1 -1
  146. package/src/engine/physics/cloth/collider/ClothColliderIndex.js +85 -67
  147. package/src/engine/physics/cloth/collider/cloth_collider_bounds.d.ts.map +1 -1
  148. package/src/engine/physics/cloth/collider/cloth_collider_bounds.js +19 -101
  149. package/src/engine/physics/cloth/collider/cloth_collider_pack.d.ts +2 -5
  150. package/src/engine/physics/cloth/collider/cloth_collider_pack.d.ts.map +1 -1
  151. package/src/engine/physics/cloth/collider/cloth_collider_pack.js +7 -15
  152. package/src/engine/physics/cloth/collider/cloth_collider_sdf.d.ts +1 -1
  153. package/src/engine/physics/cloth/collider/cloth_collider_sdf.d.ts.map +1 -1
  154. package/src/engine/physics/cloth/collider/cloth_collider_sdf.js +17 -62
  155. package/src/engine/physics/cloth/ecs/Cloth.d.ts +17 -9
  156. package/src/engine/physics/cloth/ecs/Cloth.d.ts.map +1 -1
  157. package/src/engine/physics/cloth/ecs/Cloth.js +220 -212
  158. package/src/engine/physics/cloth/ecs/ClothColliderFlags.d.ts +0 -1
  159. package/src/engine/physics/cloth/ecs/ClothColliderFlags.js +6 -19
  160. package/src/engine/physics/cloth/ecs/ClothColliderSystem.d.ts +1 -2
  161. package/src/engine/physics/cloth/ecs/ClothColliderSystem.d.ts.map +1 -1
  162. package/src/engine/physics/cloth/ecs/ClothColliderSystem.js +3 -12
  163. package/src/engine/physics/cloth/ecs/ClothDynamicsFlags.js +6 -0
  164. package/src/engine/physics/cloth/ecs/ClothHold.d.ts +91 -0
  165. package/src/engine/physics/cloth/ecs/ClothHold.d.ts.map +1 -0
  166. package/src/engine/physics/cloth/ecs/ClothHold.js +103 -0
  167. package/src/engine/physics/cloth/ecs/ClothInstance.d.ts +254 -48
  168. package/src/engine/physics/cloth/ecs/ClothInstance.d.ts.map +1 -1
  169. package/src/engine/physics/cloth/ecs/ClothInstance.js +277 -47
  170. package/src/engine/physics/cloth/ecs/ClothPin.d.ts +73 -0
  171. package/src/engine/physics/cloth/ecs/ClothPin.d.ts.map +1 -0
  172. package/src/engine/physics/cloth/ecs/ClothPin.js +92 -0
  173. package/src/engine/physics/cloth/ecs/ClothPinSerializationAdapter.d.ts +36 -0
  174. package/src/engine/physics/cloth/ecs/ClothPinSerializationAdapter.d.ts.map +1 -0
  175. package/src/engine/physics/cloth/ecs/ClothPinSerializationAdapter.js +61 -0
  176. package/src/engine/physics/cloth/ecs/ClothRig.d.ts +23 -17
  177. package/src/engine/physics/cloth/ecs/ClothRig.d.ts.map +1 -1
  178. package/src/engine/physics/cloth/ecs/ClothRig.js +29 -27
  179. package/src/engine/physics/cloth/ecs/ClothSystem.d.ts +12 -14
  180. package/src/engine/physics/cloth/ecs/ClothSystem.d.ts.map +1 -1
  181. package/src/engine/physics/cloth/ecs/ClothSystem.js +20 -15
  182. package/src/engine/physics/cloth/ecs/ClothWorld.d.ts +57 -36
  183. package/src/engine/physics/cloth/ecs/ClothWorld.d.ts.map +1 -1
  184. package/src/engine/physics/cloth/ecs/ClothWorld.js +754 -207
  185. package/src/engine/physics/cloth/ecs/WorkerClothSystem.d.ts +12 -13
  186. package/src/engine/physics/cloth/ecs/WorkerClothSystem.d.ts.map +1 -1
  187. package/src/engine/physics/cloth/ecs/WorkerClothSystem.js +20 -14
  188. package/src/engine/physics/cloth/ecs/cloth_build_rows.d.ts +63 -11
  189. package/src/engine/physics/cloth/ecs/cloth_build_rows.d.ts.map +1 -1
  190. package/src/engine/physics/cloth/ecs/cloth_build_rows.js +297 -101
  191. package/src/engine/physics/cloth/ecs/cloth_dynamics_map.d.ts +9 -7
  192. package/src/engine/physics/cloth/ecs/cloth_dynamics_map.d.ts.map +1 -1
  193. package/src/engine/physics/cloth/ecs/cloth_dynamics_map.js +12 -10
  194. package/src/engine/physics/cloth/ecs/cloth_gather_colliders.d.ts +3 -3
  195. package/src/engine/physics/cloth/ecs/cloth_gather_colliders.d.ts.map +1 -1
  196. package/src/engine/physics/cloth/ecs/cloth_gather_colliders.js +60 -120
  197. package/src/engine/physics/cloth/ecs/cloth_geodesic.d.ts +37 -0
  198. package/src/engine/physics/cloth/ecs/cloth_geodesic.d.ts.map +1 -0
  199. package/src/engine/physics/cloth/ecs/cloth_geodesic.js +135 -0
  200. package/src/engine/physics/cloth/ecs/cloth_holds.d.ts +97 -0
  201. package/src/engine/physics/cloth/ecs/cloth_holds.d.ts.map +1 -0
  202. package/src/engine/physics/cloth/ecs/cloth_holds.js +583 -0
  203. package/src/engine/physics/cloth/ecs/cloth_reconstruct_pose.d.ts +2 -2
  204. package/src/engine/physics/cloth/ecs/cloth_reconstruct_pose.d.ts.map +1 -1
  205. package/src/engine/physics/cloth/ecs/cloth_reconstruct_pose.js +168 -51
  206. package/src/engine/physics/cloth/ecs/cloth_seed_rig.d.ts +17 -22
  207. package/src/engine/physics/cloth/ecs/cloth_seed_rig.d.ts.map +1 -1
  208. package/src/engine/physics/cloth/ecs/cloth_seed_rig.js +55 -117
  209. package/src/engine/physics/cloth/ecs/cloth_seed_subtree.d.ts +21 -6
  210. package/src/engine/physics/cloth/ecs/cloth_seed_subtree.d.ts.map +1 -1
  211. package/src/engine/physics/cloth/ecs/cloth_seed_subtree.js +51 -42
  212. package/src/engine/physics/cloth/ecs/cloth_write_back.d.ts +5 -0
  213. package/src/engine/physics/cloth/ecs/cloth_write_back.d.ts.map +1 -1
  214. package/src/engine/physics/cloth/ecs/cloth_write_back.js +62 -50
  215. package/src/engine/physics/cloth/ecs/cloth_write_back_rig.d.ts.map +1 -1
  216. package/src/engine/physics/cloth/ecs/cloth_write_back_rig.js +65 -58
  217. package/src/engine/physics/cloth/playground/cloth_playground_build.d.ts.map +1 -1
  218. package/src/engine/physics/cloth/playground/cloth_playground_build.js +2 -3
  219. package/src/engine/physics/cloth/playground/collide_main.js +3 -29
  220. package/src/engine/physics/cloth/playground/garment_build.d.ts.map +1 -1
  221. package/src/engine/physics/cloth/playground/garment_build.js +17 -5
  222. package/src/engine/physics/cloth/playground/garment_main.js +5 -20
  223. package/src/engine/physics/cloth/playground/main.js +6 -48
  224. package/src/engine/physics/cloth/playground/rig_build.d.ts.map +1 -1
  225. package/src/engine/physics/cloth/playground/rig_build.js +302 -296
  226. package/src/engine/physics/cloth/playground/rig_main.js +947 -955
  227. package/src/engine/physics/cloth/playground/wind_main.js +8 -7
  228. package/src/engine/physics/cloth/solver/ClothState.d.ts +45 -7
  229. package/src/engine/physics/cloth/solver/ClothState.d.ts.map +1 -1
  230. package/src/engine/physics/cloth/solver/ClothState.js +79 -83
  231. package/src/engine/physics/cloth/solver/cloth_color_particles.d.ts +10 -8
  232. package/src/engine/physics/cloth/solver/cloth_color_particles.d.ts.map +1 -1
  233. package/src/engine/physics/cloth/solver/cloth_color_particles.js +30 -102
  234. package/src/engine/physics/cloth/solver/cloth_contact_find.d.ts +6 -1
  235. package/src/engine/physics/cloth/solver/cloth_contact_find.d.ts.map +1 -1
  236. package/src/engine/physics/cloth/solver/cloth_contact_find.js +9 -3
  237. package/src/engine/physics/cloth/solver/cloth_hold_line.d.ts +114 -0
  238. package/src/engine/physics/cloth/solver/cloth_hold_line.d.ts.map +1 -0
  239. package/src/engine/physics/cloth/solver/cloth_hold_line.js +350 -0
  240. package/src/engine/physics/cloth/solver/cloth_kinetic_energy.d.ts +21 -0
  241. package/src/engine/physics/cloth/solver/cloth_kinetic_energy.d.ts.map +1 -0
  242. package/src/engine/physics/cloth/solver/cloth_kinetic_energy.js +45 -0
  243. package/src/engine/physics/cloth/solver/cloth_particle_coupling.d.ts +32 -0
  244. package/src/engine/physics/cloth/solver/cloth_particle_coupling.d.ts.map +1 -0
  245. package/src/engine/physics/cloth/solver/cloth_particle_coupling.js +133 -0
  246. package/src/engine/physics/cloth/solver/cloth_particle_of_source.d.ts +16 -0
  247. package/src/engine/physics/cloth/solver/cloth_particle_of_source.d.ts.map +1 -0
  248. package/src/engine/physics/cloth/solver/cloth_particle_of_source.js +19 -0
  249. package/src/engine/physics/cloth/solver/cloth_self_find.d.ts +6 -2
  250. package/src/engine/physics/cloth/solver/cloth_self_find.d.ts.map +1 -1
  251. package/src/engine/physics/cloth/solver/cloth_self_find.js +19 -68
  252. package/src/engine/physics/cloth/solver/cloth_solve_vertex.d.ts.map +1 -1
  253. package/src/engine/physics/cloth/solver/cloth_solve_vertex.js +30 -65
  254. package/src/engine/physics/cloth/solver/cloth_solver_constants.d.ts +24 -12
  255. package/src/engine/physics/cloth/solver/cloth_solver_constants.d.ts.map +1 -1
  256. package/src/engine/physics/cloth/solver/cloth_solver_constants.js +24 -12
  257. package/src/engine/physics/cloth/solver/cloth_step.d.ts +16 -0
  258. package/src/engine/physics/cloth/solver/cloth_step.d.ts.map +1 -1
  259. package/src/engine/physics/cloth/solver/cloth_step.js +189 -48
  260. package/src/engine/physics/cloth/solver/cloth_step_instance.d.ts +1 -0
  261. package/src/engine/physics/cloth/solver/cloth_step_instance.d.ts.map +1 -1
  262. package/src/engine/physics/cloth/solver/cloth_step_instance.js +12 -6
  263. package/src/engine/physics/cloth/solver/cloth_stretch_residual.d.ts +21 -0
  264. package/src/engine/physics/cloth/solver/cloth_stretch_residual.d.ts.map +1 -0
  265. package/src/engine/physics/cloth/solver/cloth_stretch_residual.js +54 -0
  266. package/src/engine/physics/cloth/solver/cloth_vertex_accumulator.d.ts +15 -0
  267. package/src/engine/physics/cloth/solver/cloth_vertex_accumulator.d.ts.map +1 -1
  268. package/src/engine/physics/cloth/solver/cloth_vertex_accumulator.js +28 -0
  269. package/src/engine/physics/cloth/solver/cloth_worst_tether_ratio.d.ts +30 -0
  270. package/src/engine/physics/cloth/solver/cloth_worst_tether_ratio.d.ts.map +1 -0
  271. package/src/engine/physics/cloth/solver/cloth_worst_tether_ratio.js +56 -0
  272. package/src/engine/physics/cloth/solver/constraint/cloth_contact_row.d.ts.map +1 -1
  273. package/src/engine/physics/cloth/solver/constraint/cloth_contact_row.js +3 -17
  274. package/src/engine/physics/cloth/solver/constraint/cloth_leash_row.d.ts +1 -1
  275. package/src/engine/physics/cloth/solver/constraint/cloth_leash_row.d.ts.map +1 -1
  276. package/src/engine/physics/cloth/solver/constraint/cloth_leash_row.js +353 -346
  277. package/src/engine/physics/cloth/solver/constraint/cloth_self_row.d.ts +7 -5
  278. package/src/engine/physics/cloth/solver/constraint/cloth_self_row.d.ts.map +1 -1
  279. package/src/engine/physics/cloth/solver/constraint/cloth_self_row.js +7 -5
  280. package/src/engine/physics/cloth/wind/ClothFluidWind.d.ts +2 -1
  281. package/src/engine/physics/cloth/wind/ClothFluidWind.d.ts.map +1 -1
  282. package/src/engine/physics/cloth/wind/ClothFluidWind.js +7 -25
  283. package/src/engine/physics/cloth/wind/cloth_sample_air.d.ts +12 -10
  284. package/src/engine/physics/cloth/wind/cloth_sample_air.d.ts.map +1 -1
  285. package/src/engine/physics/cloth/wind/cloth_sample_air.js +60 -82
  286. package/src/engine/physics/ecs/ContactProbeSystem.d.ts.map +1 -1
  287. package/src/engine/physics/ecs/ContactProbeSystem.js +2 -18
  288. package/src/engine/physics/ecs/PhysicsSystem.d.ts.map +1 -1
  289. package/src/engine/physics/ecs/PhysicsSystem.js +9 -50
  290. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
  291. package/src/engine/physics/fluid/ecs/fluid_sample_domain_bounds.d.ts +24 -0
  292. package/src/engine/physics/fluid/ecs/fluid_sample_domain_bounds.d.ts.map +1 -0
  293. package/src/engine/physics/fluid/ecs/fluid_sample_domain_bounds.js +42 -0
  294. package/src/engine/physics/fluid/ecs/fluid_sample_velocity_world_mps.d.ts +25 -0
  295. package/src/engine/physics/fluid/ecs/fluid_sample_velocity_world_mps.d.ts.map +1 -0
  296. package/src/engine/physics/fluid/ecs/fluid_sample_velocity_world_mps.js +40 -0
  297. package/src/engine/physics/inverse_kinematics/frame_fabrik/frame_fabrik_solve.d.ts.map +1 -1
  298. package/src/engine/physics/inverse_kinematics/frame_fabrik/frame_fabrik_solve.js +40 -90
  299. package/src/engine/physics/narrowphase/capsule_contacts.d.ts.map +1 -1
  300. package/src/engine/physics/narrowphase/capsule_contacts.js +3 -5
  301. package/src/engine/physics/narrowphase/decomposition/mesh_enumerate_triangles.d.ts.map +1 -1
  302. package/src/engine/physics/narrowphase/decomposition/mesh_enumerate_triangles.js +2 -14
  303. package/src/engine/physics/narrowphase/hull_sphere_contact.d.ts.map +1 -1
  304. package/src/engine/physics/narrowphase/hull_sphere_contact.js +2 -5
  305. package/src/engine/physics/narrowphase/narrowphase_step.d.ts.map +1 -1
  306. package/src/engine/physics/narrowphase/narrowphase_step.js +13 -32
  307. package/src/engine/physics/narrowphase/sphere_box_contact.d.ts.map +1 -1
  308. package/src/engine/physics/narrowphase/sphere_box_contact.js +2 -5
  309. package/src/engine/simulation/Ticker.d.ts +13 -0
  310. package/src/engine/simulation/Ticker.d.ts.map +1 -1
  311. package/src/engine/simulation/Ticker.js +43 -8
  312. package/src/format/texture/basis/transcode/etc1s_to_astc.d.ts.map +1 -1
  313. package/src/format/texture/basis/transcode/etc1s_to_astc.js +2 -1
  314. package/src/shade/RENDERER_CONTRACT.md +8 -2
  315. package/src/shade/playground/image_decode_bench/main.js +2 -1
  316. package/src/shade/playground/mesh_row_ceiling/main.js +2 -1
  317. package/src/shade/playground/skinned_blas_refit/diff_traced_against_rasterized.d.ts.map +1 -1
  318. package/src/shade/playground/skinned_blas_refit/diff_traced_against_rasterized.js +2 -1
  319. package/src/shade/playground/skinned_blas_refit/main.d.ts.map +1 -1
  320. package/src/shade/playground/skinned_blas_refit/main.js +11 -19
  321. package/src/shade/playground/skinned_blas_refit/place_character.d.ts +6 -3
  322. package/src/shade/playground/skinned_blas_refit/place_character.d.ts.map +1 -1
  323. package/src/shade/playground/skinned_blas_refit/place_character.js +90 -90
  324. package/src/shade/playground/skinned_mesh_soup/main.d.ts.map +1 -1
  325. package/src/shade/playground/skinned_mesh_soup/main.js +502 -509
  326. package/src/shade/playground/skinned_mesh_soup/verify_clone_vertices.d.ts.map +1 -1
  327. package/src/shade/playground/skinned_mesh_soup/verify_clone_vertices.js +2 -1
  328. package/src/shade/playground/ssr_variance/statistics.d.ts.map +1 -1
  329. package/src/shade/playground/ssr_variance/statistics.js +2 -1
  330. package/src/shade/playground/texture_encode/README.md +129 -109
  331. package/src/shade/playground/texture_encode/main.d.ts.map +1 -1
  332. package/src/shade/playground/texture_encode/main.js +1431 -1430
  333. package/src/shade/playground/volumetrics_froxel/measure.d.ts.map +1 -1
  334. package/src/shade/playground/volumetrics_froxel/measure.js +2 -1
  335. package/src/shade/renderer/animation/GPUAnimationManager.d.ts +45 -14
  336. package/src/shade/renderer/animation/GPUAnimationManager.d.ts.map +1 -1
  337. package/src/shade/renderer/animation/GPUAnimationManager.js +316 -64
  338. package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.d.ts +5 -0
  339. package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.d.ts.map +1 -1
  340. package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.js +11 -1
  341. package/src/shade/renderer/buffer/table/gpu_database_check_links.d.ts.map +1 -1
  342. package/src/shade/renderer/buffer/table/gpu_database_check_links.js +2 -1
  343. package/src/shade/renderer/geometry/BoxGeometry.d.ts +1 -11
  344. package/src/shade/renderer/geometry/BoxGeometry.d.ts.map +1 -1
  345. package/src/shade/renderer/geometry/BoxGeometry.js +6 -13
  346. package/src/shade/renderer/geometry/CapsuleGeometry.d.ts +19 -0
  347. package/src/shade/renderer/geometry/CapsuleGeometry.d.ts.map +1 -0
  348. package/src/shade/renderer/geometry/CapsuleGeometry.js +24 -0
  349. package/src/shade/renderer/geometry/ConeGeometry.d.ts +20 -0
  350. package/src/shade/renderer/geometry/ConeGeometry.d.ts.map +1 -0
  351. package/src/shade/renderer/geometry/ConeGeometry.js +33 -0
  352. package/src/shade/renderer/geometry/CylinderGeometry.d.ts +21 -0
  353. package/src/shade/renderer/geometry/CylinderGeometry.d.ts.map +1 -0
  354. package/src/shade/renderer/geometry/CylinderGeometry.js +35 -0
  355. package/src/shade/renderer/geometry/PlaneGeometry.d.ts +17 -0
  356. package/src/shade/renderer/geometry/PlaneGeometry.d.ts.map +1 -0
  357. package/src/shade/renderer/geometry/PlaneGeometry.js +22 -0
  358. package/src/shade/renderer/geometry/TorusGeometry.d.ts +18 -0
  359. package/src/shade/renderer/geometry/TorusGeometry.d.ts.map +1 -0
  360. package/src/shade/renderer/geometry/TorusGeometry.js +23 -0
  361. package/src/shade/renderer/geometry/UVSphereGeometry.d.ts +21 -0
  362. package/src/shade/renderer/geometry/UVSphereGeometry.d.ts.map +1 -0
  363. package/src/shade/renderer/geometry/UVSphereGeometry.js +34 -0
  364. package/src/shade/renderer/geometry/primitives/make_capsule_geometry.d.ts +19 -0
  365. package/src/shade/renderer/geometry/primitives/make_capsule_geometry.d.ts.map +1 -0
  366. package/src/shade/renderer/geometry/primitives/make_capsule_geometry.js +205 -0
  367. package/src/shade/renderer/geometry/primitives/make_cone_geometry.d.ts +21 -0
  368. package/src/shade/renderer/geometry/primitives/make_cone_geometry.d.ts.map +1 -0
  369. package/src/shade/renderer/geometry/primitives/make_cone_geometry.js +36 -0
  370. package/src/shade/renderer/geometry/primitives/make_cylinder_geometry.d.ts +1 -1
  371. package/src/shade/renderer/geometry/primitives/make_cylinder_geometry.d.ts.map +1 -1
  372. package/src/shade/renderer/geometry/primitives/make_cylinder_geometry.js +44 -9
  373. package/src/shade/renderer/geometry/primitives/make_uv_sphere_geometry.d.ts +20 -0
  374. package/src/shade/renderer/geometry/primitives/make_uv_sphere_geometry.d.ts.map +1 -0
  375. package/src/shade/renderer/geometry/primitives/make_uv_sphere_geometry.js +190 -0
  376. package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_group_step.d.ts.map +1 -1
  377. package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_group_step.js +3 -2
  378. package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_leaf_frontier.d.ts.map +1 -1
  379. package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_leaf_frontier.js +2 -1
  380. package/src/shade/renderer/geometry/virtual/build/level/vgeo_partition_into_groups.d.ts.map +1 -1
  381. package/src/shade/renderer/geometry/virtual/build/level/vgeo_partition_into_groups.js +2 -1
  382. package/src/shade/renderer/geometry/virtual/build/level/vgeo_run_round.d.ts.map +1 -1
  383. package/src/shade/renderer/geometry/virtual/build/level/vgeo_run_round.js +2 -1
  384. package/src/shade/renderer/geometry/virtual/build/level/vgeo_try_repack.d.ts.map +1 -1
  385. package/src/shade/renderer/geometry/virtual/build/level/vgeo_try_repack.js +3 -2
  386. package/src/shade/renderer/geometry/virtual/build/partition/vgeo_graph_components.d.ts.map +1 -1
  387. package/src/shade/renderer/geometry/virtual/build/partition/vgeo_graph_components.js +2 -1
  388. package/src/shade/renderer/geometry/virtual/build/partition/vgeo_split_face_set_packed.d.ts.map +1 -1
  389. package/src/shade/renderer/geometry/virtual/build/partition/vgeo_split_face_set_packed.js +2 -1
  390. package/src/shade/renderer/geometry/virtual/format/vgeo_write_container.d.ts.map +1 -1
  391. package/src/shade/renderer/geometry/virtual/format/vgeo_write_container.js +3 -2
  392. package/src/shade/renderer/geometry/virtual/runtime/graph_vgeo_expand_instances_to_meshlets.d.ts.map +1 -1
  393. package/src/shade/renderer/geometry/virtual/runtime/graph_vgeo_expand_instances_to_meshlets.js +7 -2
  394. package/src/shade/renderer/gpu_primitive/prefix_sum/v1/graph_prefix_scan_csdldf.d.ts +26 -8
  395. package/src/shade/renderer/gpu_primitive/prefix_sum/v1/graph_prefix_scan_csdldf.d.ts.map +1 -1
  396. package/src/shade/renderer/gpu_primitive/prefix_sum/v1/graph_prefix_scan_csdldf.js +56 -39
  397. package/src/shade/renderer/gpu_primitive/prefix_sum/v1/shader_prefix_scan_csdldf.d.ts +7 -0
  398. package/src/shade/renderer/gpu_primitive/prefix_sum/v1/shader_prefix_scan_csdldf.d.ts.map +1 -1
  399. package/src/shade/renderer/gpu_primitive/prefix_sum/v1/shader_prefix_scan_csdldf.js +46 -4
  400. package/src/shade/renderer/gpu_primitive/prefix_sum/v1/test_prefix_sum.d.ts.map +1 -1
  401. package/src/shade/renderer/gpu_primitive/prefix_sum/v1/test_prefix_sum.js +4 -2
  402. package/src/shade/renderer/gpu_primitive/sort/defs.d.ts +2 -2
  403. package/src/shade/renderer/gpu_primitive/sort/defs.js +79 -79
  404. package/src/shade/renderer/gpu_primitive/sort/graph_radix_sort.d.ts +1 -1
  405. package/src/shade/renderer/gpu_primitive/sort/graph_radix_sort.d.ts.map +1 -1
  406. package/src/shade/renderer/gpu_primitive/sort/graph_radix_sort.js +7 -3
  407. package/src/shade/renderer/particles/GPUParticleSystem.js +1 -1
  408. package/src/shade/renderer/particles/coherence/graph_particle_bucket.d.ts +4 -3
  409. package/src/shade/renderer/particles/coherence/graph_particle_bucket.d.ts.map +1 -1
  410. package/src/shade/renderer/particles/coherence/graph_particle_bucket.js +200 -194
  411. package/src/shade/renderer/particles/graph_particles.d.ts.map +1 -1
  412. package/src/shade/renderer/particles/graph_particles.js +6 -2
  413. package/src/shade/renderer/particles/optimizer/dag/particle_vector_extract.d.ts.map +1 -1
  414. package/src/shade/renderer/particles/optimizer/dag/particle_vector_extract.js +3 -2
  415. package/src/shade/renderer/particles/warmup/graph_particle_warmup.d.ts.map +1 -1
  416. package/src/shade/renderer/particles/warmup/graph_particle_warmup.js +334 -329
  417. package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.d.ts.map +1 -1
  418. package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.js +7 -2
  419. package/src/shade/renderer/rasterize/expand/mesh/graph_expand_meshes_to_meshlets.d.ts.map +1 -1
  420. package/src/shade/renderer/rasterize/expand/mesh/graph_expand_meshes_to_meshlets.js +16 -4
  421. package/src/shade/renderer/texture/COMPRESSED_TEXTURE_PLAN_2026_09_01.md +2444 -2345
  422. package/src/shade/renderer/texture/encode/chunk_astc_encode_block_4x4_rgb.d.ts.map +1 -1
  423. package/src/shade/renderer/texture/encode/chunk_astc_encode_block_4x4_rgb.js +312 -310
  424. package/src/shade/renderer/texture/encode/chunk_bc1_encode_block.d.ts +3 -3
  425. package/src/shade/renderer/texture/encode/chunk_bc1_encode_block.d.ts.map +1 -1
  426. package/src/shade/renderer/texture/encode/chunk_bc1_encode_block.js +383 -375
  427. package/src/shade/renderer/texture/encode/chunk_bc6h_encode_block_mode11.d.ts.map +1 -1
  428. package/src/shade/renderer/texture/encode/chunk_bc6h_encode_block_mode11.js +349 -346
  429. package/src/shade/renderer/texture/encode/chunk_bc7_encode_block.d.ts +58 -0
  430. package/src/shade/renderer/texture/encode/chunk_bc7_encode_block.d.ts.map +1 -0
  431. package/src/shade/renderer/texture/encode/chunk_bc7_encode_block.js +536 -0
  432. package/src/shade/renderer/texture/encode/chunk_bc7_encode_block_mode6.d.ts +21 -7
  433. package/src/shade/renderer/texture/encode/chunk_bc7_encode_block_mode6.d.ts.map +1 -1
  434. package/src/shade/renderer/texture/encode/chunk_bc7_encode_block_mode6.js +291 -327
  435. package/src/shade/renderer/texture/encode/chunk_bc7_pack_mode1.d.ts +25 -0
  436. package/src/shade/renderer/texture/encode/chunk_bc7_pack_mode1.d.ts.map +1 -0
  437. package/src/shade/renderer/texture/encode/chunk_bc7_pack_mode1.js +99 -0
  438. package/src/shade/renderer/texture/encode/chunk_bc7_pack_mode6.d.ts +5 -3
  439. package/src/shade/renderer/texture/encode/chunk_bc7_pack_mode6.d.ts.map +1 -1
  440. package/src/shade/renderer/texture/encode/chunk_bc7_pack_mode6.js +47 -71
  441. package/src/shade/renderer/texture/encode/chunk_bc7_partition_2.d.ts +10 -0
  442. package/src/shade/renderer/texture/encode/chunk_bc7_partition_2.d.ts.map +1 -0
  443. package/src/shade/renderer/texture/encode/chunk_bc7_partition_2.js +50 -0
  444. package/src/shade/renderer/texture/encode/shader_texture_encode_bc7.d.ts +4 -5
  445. package/src/shade/renderer/texture/encode/shader_texture_encode_bc7.d.ts.map +1 -1
  446. package/src/shade/renderer/texture/encode/shader_texture_encode_bc7.js +7 -8
  447. package/src/shade/renderer/water/chunk_water_transport.d.ts.map +1 -1
  448. package/src/shade/renderer/water/chunk_water_transport.js +7 -5
  449. package/src/shade/renderer/water/medium/GPUWaterBodies.d.ts.map +1 -1
  450. package/src/shade/renderer/water/medium/GPUWaterBodies.js +8 -2
  451. package/src/shade/renderer/water/optics/chunk_water_receiver_downwelling.d.ts +3 -2
  452. package/src/shade/renderer/water/optics/chunk_water_receiver_downwelling.d.ts.map +1 -1
  453. package/src/shade/renderer/water/optics/chunk_water_receiver_downwelling.js +3 -2
  454. package/src/shade/renderer/water/shader_water.d.ts.map +1 -1
  455. package/src/shade/renderer/water/shader_water.js +3 -1
  456. package/src/shade/renderer/water/surface/GPUWaterSurface.d.ts.map +1 -1
  457. package/src/shade/renderer/water/surface/GPUWaterSurface.js +3 -1
  458. package/src/shade/renderer/water/surface/graph_water_tessellation.d.ts.map +1 -1
  459. package/src/shade/renderer/water/surface/graph_water_tessellation.js +11 -4
  460. package/src/shade/renderer/water/surface/particles/GPUWaterParticles.d.ts.map +1 -1
  461. package/src/shade/renderer/water/surface/particles/GPUWaterParticles.js +37 -20
  462. package/src/shade/wgsl/validate_wgsl_source.d.ts.map +1 -1
  463. package/src/shade/wgsl/validate_wgsl_source.js +74 -3
  464. package/src/engine/graphics3/register_instance_animation.d.ts +0 -114
  465. package/src/engine/graphics3/register_instance_animation.d.ts.map +0 -1
  466. package/src/engine/graphics3/register_instance_animation.js +0 -201
@@ -1,75 +1,80 @@
1
- import { assert } from "../../../core/assert.js";
2
- import { PosePlayback } from "../../../shade/renderer/animation/pose/PosePlayback.js";
3
- import { t64_evaluate_world } from "../../ecs/transform/t64_evaluate_world.js";
4
- import { MeshSystem } from "../MeshSystem.js";
5
- import { collect_entity_playbacks } from "./collect_entity_playbacks.js";
6
-
7
- /**
8
- * The clip set handed to the evaluator, rebuilt per call from the systems' own entries. Nothing in
9
- * here outlives the call — the query is on a per-frame path and allocates nothing.
10
- *
11
- * @type {PosePlayback[]}
12
- */
13
- const PLAYBACKS = [];
14
-
15
- /**
16
- * Where a named part of an entity's model is, in world space.
17
- *
18
- * This is the question gameplay asks of an animated model and the only sanctioned way to ask it:
19
- * where does this projectile leave from, where does that effect anchor, where does the floating UI
20
- * hang. **The answer is computed, never read back** — GPU readback is a frame late and asynchronous,
21
- * so an outcome that depended on it would depend on frame pacing, and determinism and replay would
22
- * go with it: no GPU readback on a gameplay-affecting path.
23
- *
24
- * The named node is an entity of the model's instance, and the pose is {@link t64_evaluate_world}
25
- * over its attachment chain and the clips the animation systems are driving: a pure function of
26
- * (hierarchy, clip set, time, weights), off the same clock the renderer is written from, which is
27
- * what keeps a socket on the mesh that is drawn — whether or not the GPU owns the joint's row.
28
- *
29
- * The result carries both its matrix and its components.
30
- *
31
- * @param {Transform64} result
32
- * @param {EntityManager} entity_manager
33
- * @param {number} entity
34
- * @param {string} node_name name the asset gave the node — a bone, a socket's bone, an effector
35
- * @returns {boolean} `false` when there is no such node to answer about: no mesh system is
36
- * registered, the model has not loaded yet, the entity has none, or the name is not in it. None of
37
- * the four is an error
38
- */
39
- export function query_entity_node_world_pose(result, entity_manager, entity, node_name) {
40
- assert.defined(result, 'result');
41
- assert.defined(entity_manager, 'entity_manager');
42
- assert.isNonNegativeInteger(entity, 'entity');
43
- assert.isString(node_name, 'node_name');
44
-
45
- const meshes = entity_manager.getSystem(MeshSystem);
46
-
47
- if (meshes === null) {
48
- // nothing draws models here, so nothing holds one to answer about
49
- return false;
50
- }
51
-
52
- const instance = meshes.instance_of(entity);
53
-
54
- if (instance === null) {
55
- return false;
56
- }
57
-
58
- const target = instance.entity_of(node_name);
59
-
60
- if (target === -1) {
61
- return false;
62
- }
63
-
64
- const playbacks = PLAYBACKS;
65
-
66
- playbacks.length = 0;
67
-
68
- collect_entity_playbacks(playbacks, entity_manager, entity);
69
-
70
- t64_evaluate_world(result, entity_manager.dataset, target, playbacks);
71
-
72
- playbacks.length = 0;
73
-
74
- return true;
75
- }
1
+ import { assert } from "../../../core/assert.js";
2
+ import { PosePlayback } from "../../../shade/renderer/animation/pose/PosePlayback.js";
3
+ import { t64_evaluate_world } from "../../ecs/transform/t64_evaluate_world.js";
4
+ import { MeshSystem } from "../MeshSystem.js";
5
+ import { collect_entity_playbacks } from "./collect_entity_playbacks.js";
6
+
7
+ /**
8
+ * The clip set handed to the evaluator, rebuilt per call from the systems' own entries. Nothing in
9
+ * here outlives the call — the query is on a per-frame path and allocates nothing.
10
+ *
11
+ * @type {PosePlayback[]}
12
+ */
13
+ const PLAYBACKS = [];
14
+
15
+ /**
16
+ * Where a named part of an entity's model is, in world space.
17
+ *
18
+ * This is the question gameplay asks of an animated model and the only sanctioned way to ask it:
19
+ * where does this projectile leave from, where does that effect anchor, where does the floating UI
20
+ * hang. **The answer is computed, never read back** — GPU readback is a frame late and asynchronous,
21
+ * so an outcome that depended on it would depend on frame pacing, and determinism and replay would
22
+ * go with it: no GPU readback on a gameplay-affecting path.
23
+ *
24
+ * The named node is an entity of the model's instance, and the pose is {@link t64_evaluate_world}
25
+ * over its attachment chain and the clips the animation systems are driving: a pure function of
26
+ * (hierarchy, clip set, time, weights), off the same clock the renderer is written from, which is
27
+ * what keeps a socket on the mesh that is drawn — whether or not the GPU owns the joint's row.
28
+ *
29
+ * **A name is only how a loaded model is asked.** For a joint the caller already holds — one of a
30
+ * rig built in code — there is nothing to look up: {@link collect_entity_playbacks} for the entity
31
+ * playing its clips, then {@link t64_evaluate_world} for the joint, which is all this does once the
32
+ * name is resolved.
33
+ *
34
+ * The result carries both its matrix and its components.
35
+ *
36
+ * @param {Transform64} result
37
+ * @param {EntityManager} entity_manager
38
+ * @param {number} entity
39
+ * @param {string} node_name name the asset gave the node — a bone, a socket's bone, an effector
40
+ * @returns {boolean} `false` when there is no such node to answer about: no mesh system is
41
+ * registered, the model has not loaded yet, the entity has none, or the name is not in it. None of
42
+ * the four is an error
43
+ */
44
+ export function query_entity_node_world_pose(result, entity_manager, entity, node_name) {
45
+ assert.defined(result, 'result');
46
+ assert.defined(entity_manager, 'entity_manager');
47
+ assert.isNonNegativeInteger(entity, 'entity');
48
+ assert.isString(node_name, 'node_name');
49
+
50
+ const meshes = entity_manager.getSystem(MeshSystem);
51
+
52
+ if (meshes === null) {
53
+ // nothing draws models here, so nothing holds one to answer about
54
+ return false;
55
+ }
56
+
57
+ const instance = meshes.instance_of(entity);
58
+
59
+ if (instance === null) {
60
+ return false;
61
+ }
62
+
63
+ const target = instance.entity_of(node_name);
64
+
65
+ if (target === -1) {
66
+ return false;
67
+ }
68
+
69
+ const playbacks = PLAYBACKS;
70
+
71
+ playbacks.length = 0;
72
+
73
+ collect_entity_playbacks(playbacks, entity_manager, entity);
74
+
75
+ t64_evaluate_world(result, entity_manager.dataset, target, playbacks);
76
+
77
+ playbacks.length = 0;
78
+
79
+ return true;
80
+ }
@@ -1,20 +1,15 @@
1
1
  /**
2
2
  * @typedef {import("./Prefab.js").Prefab} Prefab
3
- * @typedef {import("../../../shade/renderer/animation/Skin.js").Skin} Skin
4
- * @typedef {import("../../../shade/renderer/animation/ShadeAnimationClip.js").ShadeAnimationClip} ShadeAnimationClip
5
3
  */
6
4
  /**
7
- * One placement of a {@link Prefab}: the entities its nodes became, and the model's skins and
8
- * clips re-addressed to them.
5
+ * One placement of a {@link Prefab}: the entities its nodes became.
9
6
  *
10
7
  * `entities[i]` is the entity of node `i`; `entities[0]` is the root, the entity that placed the
11
8
  * model and was there before. Everything read-only about the model — geometry, materials,
12
9
  * inverse-bind matrices, curves — is the prefab's and shared; what is per-instance is the
13
- * addressing, which is why the skins and clips here are new objects over the same data.
14
- *
15
- * Handed out by `MeshSystem.instance_of` rather than copied, because a driver has to know *which*
16
- * instance it is bound to: a model swap builds a new one, and the object's identity is the only
17
- * signal that says so.
10
+ * addressing. Nothing the model needs in order to work is only here: a skin is a `MeshSkin` on each
11
+ * mesh entity it deforms, and the clips, re-addressed to this placement's entities, are an
12
+ * `AnimationClips` on the root — which is where a rig built in code puts both too.
18
13
  */
19
14
  export class PrefabInstance {
20
15
  /**
@@ -40,19 +35,6 @@ export class PrefabInstance {
40
35
  * @type {Int32Array}
41
36
  */
42
37
  mesh_entities: Int32Array;
43
- /**
44
- * The model's skins, with `joints` and `meshes` as entities of this instance.
45
- *
46
- * @type {Skin[]}
47
- */
48
- skins: Skin[];
49
- /**
50
- * The model's clips, with every channel targeting an entity of this instance. Their names and
51
- * durations are the model's; a driver resolves a clip by name to its index here.
52
- *
53
- * @type {ShadeAnimationClip[]}
54
- */
55
- clips: ShadeAnimationClip[];
56
38
  /**
57
39
  * The entity of the node the asset calls `name` — a bone, a socket's bone, an effector.
58
40
  *
@@ -67,6 +49,4 @@ export class PrefabInstance {
67
49
  readonly isPrefabInstance: boolean;
68
50
  }
69
51
  export type Prefab = import("./Prefab.js").Prefab;
70
- export type Skin = import("../../../shade/renderer/animation/Skin.js").Skin;
71
- export type ShadeAnimationClip = import("../../../shade/renderer/animation/ShadeAnimationClip.js").ShadeAnimationClip;
72
52
  //# sourceMappingURL=PrefabInstance.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"PrefabInstance.d.ts","sourceRoot":"","sources":["../../../../../src/engine/graphics3/prefab/PrefabInstance.js"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;;;;;;;;;;GAYG;AACH;IACI;;OAEG;IACH,QAFU,MAAM,CAEF;IAEd;;;;OAIG;IACH,MAFU,MAAM,CAEN;IAEV;;;;OAIG;IACH,UAFU,UAAU,CAES;IAE7B;;;;;OAKG;IACH,eAFU,UAAU,CAEc;IAElC;;;;OAIG;IACH,OAFU,IAAI,EAAE,CAEL;IAEX;;;;;OAKG;IACH,OAFU,kBAAkB,EAAE,CAEnB;IAEX;;;;;OAKG;IACH,gBAHW,MAAM,GACJ,MAAM,CAMlB;IAGL;;;OAGG;IACH,2BAFU,OAAO,CAEwB;CANxC;qBAxEY,OAAO,aAAa,EAAE,MAAM;mBAC5B,OAAO,2CAA2C,EAAE,IAAI;iCACxD,OAAO,yDAAyD,EAAE,kBAAkB"}
1
+ {"version":3,"file":"PrefabInstance.d.ts","sourceRoot":"","sources":["../../../../../src/engine/graphics3/prefab/PrefabInstance.js"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;;;;;;;GASG;AACH;IACI;;OAEG;IACH,QAFU,MAAM,CAEF;IAEd;;;;OAIG;IACH,MAFU,MAAM,CAEN;IAEV;;;;OAIG;IACH,UAFU,UAAU,CAES;IAE7B;;;;;OAKG;IACH,eAFU,UAAU,CAEc;IAElC;;;;;OAKG;IACH,gBAHW,MAAM,GACJ,MAAM,CAMlB;IAGL;;;OAGG;IACH,2BAFU,OAAO,CAEwB;CANxC;qBApDY,OAAO,aAAa,EAAE,MAAM"}
@@ -1,80 +1,60 @@
1
- /**
2
- * @typedef {import("./Prefab.js").Prefab} Prefab
3
- * @typedef {import("../../../shade/renderer/animation/Skin.js").Skin} Skin
4
- * @typedef {import("../../../shade/renderer/animation/ShadeAnimationClip.js").ShadeAnimationClip} ShadeAnimationClip
5
- */
6
-
7
- /**
8
- * One placement of a {@link Prefab}: the entities its nodes became, and the model's skins and
9
- * clips re-addressed to them.
10
- *
11
- * `entities[i]` is the entity of node `i`; `entities[0]` is the root, the entity that placed the
12
- * model and was there before. Everything read-only about the model — geometry, materials,
13
- * inverse-bind matrices, curves — is the prefab's and shared; what is per-instance is the
14
- * addressing, which is why the skins and clips here are new objects over the same data.
15
- *
16
- * Handed out by `MeshSystem.instance_of` rather than copied, because a driver has to know *which*
17
- * instance it is bound to: a model swap builds a new one, and the object's identity is the only
18
- * signal that says so.
19
- */
20
- export class PrefabInstance {
21
- /**
22
- * @type {Prefab}
23
- */
24
- prefab = null;
25
-
26
- /**
27
- * The entity that placed the model. Node 0 of the prefab.
28
- *
29
- * @type {number}
30
- */
31
- root = -1;
32
-
33
- /**
34
- * The entity of each node of the prefab, by node index.
35
- *
36
- * @type {Int32Array}
37
- */
38
- entities = new Int32Array(0);
39
-
40
- /**
41
- * The entities that draw — one per primitive of the prefab, in the prefab's primitive order.
42
- * Each holds the `meshes` row of the same index as its `transforms` row.
43
- *
44
- * @type {Int32Array}
45
- */
46
- mesh_entities = new Int32Array(0);
47
-
48
- /**
49
- * The model's skins, with `joints` and `meshes` as entities of this instance.
50
- *
51
- * @type {Skin[]}
52
- */
53
- skins = [];
54
-
55
- /**
56
- * The model's clips, with every channel targeting an entity of this instance. Their names and
57
- * durations are the model's; a driver resolves a clip by name to its index here.
58
- *
59
- * @type {ShadeAnimationClip[]}
60
- */
61
- clips = [];
62
-
63
- /**
64
- * The entity of the node the asset calls `name` — a bone, a socket's bone, an effector.
65
- *
66
- * @param {string} name
67
- * @returns {number} the entity, or -1 when the model has no such node
68
- */
69
- entity_of(name) {
70
- const index = this.prefab.index_of(name);
71
-
72
- return index === -1 ? -1 : this.entities[index];
73
- }
74
- }
75
-
76
- /**
77
- * @readonly
78
- * @type {boolean}
79
- */
80
- PrefabInstance.prototype.isPrefabInstance = true;
1
+ /**
2
+ * @typedef {import("./Prefab.js").Prefab} Prefab
3
+ */
4
+
5
+ /**
6
+ * One placement of a {@link Prefab}: the entities its nodes became.
7
+ *
8
+ * `entities[i]` is the entity of node `i`; `entities[0]` is the root, the entity that placed the
9
+ * model and was there before. Everything read-only about the model — geometry, materials,
10
+ * inverse-bind matrices, curves — is the prefab's and shared; what is per-instance is the
11
+ * addressing. Nothing the model needs in order to work is only here: a skin is a `MeshSkin` on each
12
+ * mesh entity it deforms, and the clips, re-addressed to this placement's entities, are an
13
+ * `AnimationClips` on the root — which is where a rig built in code puts both too.
14
+ */
15
+ export class PrefabInstance {
16
+ /**
17
+ * @type {Prefab}
18
+ */
19
+ prefab = null;
20
+
21
+ /**
22
+ * The entity that placed the model. Node 0 of the prefab.
23
+ *
24
+ * @type {number}
25
+ */
26
+ root = -1;
27
+
28
+ /**
29
+ * The entity of each node of the prefab, by node index.
30
+ *
31
+ * @type {Int32Array}
32
+ */
33
+ entities = new Int32Array(0);
34
+
35
+ /**
36
+ * The entities that draw — one per primitive of the prefab, in the prefab's primitive order.
37
+ * Each holds the `meshes` row of the same index as its `transforms` row.
38
+ *
39
+ * @type {Int32Array}
40
+ */
41
+ mesh_entities = new Int32Array(0);
42
+
43
+ /**
44
+ * The entity of the node the asset calls `name` — a bone, a socket's bone, an effector.
45
+ *
46
+ * @param {string} name
47
+ * @returns {number} the entity, or -1 when the model has no such node
48
+ */
49
+ entity_of(name) {
50
+ const index = this.prefab.index_of(name);
51
+
52
+ return index === -1 ? -1 : this.entities[index];
53
+ }
54
+ }
55
+
56
+ /**
57
+ * @readonly
58
+ * @type {boolean}
59
+ */
60
+ PrefabInstance.prototype.isPrefabInstance = true;
@@ -4,8 +4,9 @@
4
4
  * **What a model is in an ECS.** Each node of the prefab becomes an entity: named, attached to
5
5
  * its parent's entity by a `TransformAttachment` carrying the node's rest pose, holding a world
6
6
  * `Transform64` composed from the root's, drawing through a `ShadedGeometry` where the node
7
- * carries geometry, and declaring `GPUStateAuthority` — with a zero flags word — where a clip or a
8
- * skin may later hand the node to the GPU, so that the hand-over is a bit write and never a
7
+ * carries geometry — and deforming through a `MeshSkin` naming the joints' entities where the
8
+ * geometry is skinned — and declaring `GPUStateAuthority` — with a zero flags word — where a clip
9
+ * or a skin may later hand the node to the GPU, so that the hand-over is a bit write and never a
9
10
  * component add. Node 0 is `root` itself, the caller's entity, whose `Transform64` is the
10
11
  * placement.
11
12
  *
@@ -19,6 +20,12 @@
19
20
  * transient to serialization: a save holds the model's placement, not sixty joints of derived
20
21
  * state.
21
22
  *
23
+ * **The model's clips go on the root, last.** An {@link AnimationClips} holding them, every
24
+ * channel re-addressed to this placement's entities, is added once every entity it keys exists —
25
+ * empty when the model has none, so that whatever plays on the root is still driven. The root
26
+ * must not carry one already: it is one placement's clips, and a second placement would replace
27
+ * them under whoever is playing them.
28
+ *
22
29
  * @param {Prefab} prefab
23
30
  * @param {EntityComponentDataset} dataset
24
31
  * @param {number} root an entity carrying a `Transform64`
@@ -31,11 +38,17 @@ export function prefab_instantiate(prefab: Prefab, dataset: EntityComponentDatas
31
38
  transient?: boolean;
32
39
  }): PrefabInstance;
33
40
  /**
34
- * Remove every entity an instance spawned. The root is the caller's and stays.
41
+ * Remove every entity an instance spawned, and its clips from the root. The root is the caller's
42
+ * and stays.
35
43
  *
36
44
  * Children before parents, so that no parent's removal has to reach down and detach a child
37
45
  * that is about to go anyway.
38
46
  *
47
+ * **The clips go after the entities they key.** Whatever was playing them gives back what it
48
+ * holds for each target when they go, and a target that has already left is one there is nothing
49
+ * left to give back for. They go only if the root still carries them: the root's own removal takes
50
+ * its components one by one, and may have taken them already.
51
+ *
39
52
  * @param {EntityComponentDataset} dataset
40
53
  * @param {PrefabInstance} instance
41
54
  */
@@ -1 +1 @@
1
- {"version":3,"file":"prefab_instantiate.d.ts","sourceRoot":"","sources":["../../../../../src/engine/graphics3/prefab/prefab_instantiate.js"],"names":[],"mappings":"AAsCA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,2CARW,MAAM,WACN,sBAAsB,QACtB,MAAM;IAEY,SAAS,GAA3B,OAAO;IAEL,cAAc,CAgJ1B;AAED;;;;;;;;GAQG;AACH,iDAHW,sBAAsB,YACtB,cAAc,QAWxB;qBApNY,OAAO,aAAa,EAAE,MAAM;qCAC5B,OAAO,qCAAqC,EAAE,sBAAsB;+BAJlD,qBAAqB"}
1
+ {"version":3,"file":"prefab_instantiate.d.ts","sourceRoot":"","sources":["../../../../../src/engine/graphics3/prefab/prefab_instantiate.js"],"names":[],"mappings":"AAyCA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,2CARW,MAAM,WACN,sBAAsB,QACtB,MAAM;IAEY,SAAS,GAA3B,OAAO;IAEL,cAAc,CA+J1B;AAED;;;;;;;;;;;;;;GAcG;AACH,iDAHW,sBAAsB,YACtB,cAAc,QAiBxB;qBAxPY,OAAO,aAAa,EAAE,MAAM;qCAC5B,OAAO,qCAAqC,EAAE,sBAAsB;+BAJlD,qBAAqB"}
@@ -2,7 +2,6 @@ import { assert } from "../../../core/assert.js";
2
2
  import { m4_multiply } from "../../../core/geom/3d/mat4/m4_multiply.js";
3
3
  import { ShadeAnimationChannel } from "../../../shade/renderer/animation/ShadeAnimationChannel.js";
4
4
  import { ShadeAnimationClip } from "../../../shade/renderer/animation/ShadeAnimationClip.js";
5
- import { Skin } from "../../../shade/renderer/animation/Skin.js";
6
5
  import { SerializationMetadata } from "../../ecs/components/SerializationMetadata.js";
7
6
  import { GPUStateAuthority } from "../../ecs/gpu/GPUStateAuthority.js";
8
7
  import { Name } from "../../ecs/name/Name.js";
@@ -10,8 +9,10 @@ import { ParentEntity } from "../../ecs/parent/ParentEntity.js";
10
9
  import { TransformAttachment } from "../../ecs/transform-attachment/TransformAttachment.js";
11
10
  import { Transform64 } from "../../ecs/transform/Transform64.js";
12
11
  import { DrawMode } from "../../graphics/ecs/mesh-v2/DrawMode.js";
12
+ import { MeshSkin } from "../../graphics/ecs/mesh-v2/MeshSkin.js";
13
13
  import { ShadedGeometry } from "../../graphics/ecs/mesh-v2/ShadedGeometry.js";
14
14
  import { ShadedGeometryFlags } from "../../graphics/ecs/mesh-v2/ShadedGeometryFlags.js";
15
+ import { AnimationClips } from "../animation/AnimationClips.js";
15
16
  import { PrefabInstance } from "./PrefabInstance.js";
16
17
 
17
18
  /**
@@ -31,9 +32,11 @@ const COMPONENT_TYPES = [
31
32
  TransformAttachment,
32
33
  Name,
33
34
  ShadedGeometry,
35
+ MeshSkin,
34
36
  GPUStateAuthority,
35
37
  ParentEntity,
36
38
  SerializationMetadata,
39
+ AnimationClips,
37
40
  ];
38
41
 
39
42
  /**
@@ -42,8 +45,9 @@ const COMPONENT_TYPES = [
42
45
  * **What a model is in an ECS.** Each node of the prefab becomes an entity: named, attached to
43
46
  * its parent's entity by a `TransformAttachment` carrying the node's rest pose, holding a world
44
47
  * `Transform64` composed from the root's, drawing through a `ShadedGeometry` where the node
45
- * carries geometry, and declaring `GPUStateAuthority` — with a zero flags word — where a clip or a
46
- * skin may later hand the node to the GPU, so that the hand-over is a bit write and never a
48
+ * carries geometry — and deforming through a `MeshSkin` naming the joints' entities where the
49
+ * geometry is skinned — and declaring `GPUStateAuthority` — with a zero flags word — where a clip
50
+ * or a skin may later hand the node to the GPU, so that the hand-over is a bit write and never a
47
51
  * component add. Node 0 is `root` itself, the caller's entity, whose `Transform64` is the
48
52
  * placement.
49
53
  *
@@ -57,6 +61,12 @@ const COMPONENT_TYPES = [
57
61
  * transient to serialization: a save holds the model's placement, not sixty joints of derived
58
62
  * state.
59
63
  *
64
+ * **The model's clips go on the root, last.** An {@link AnimationClips} holding them, every
65
+ * channel re-addressed to this placement's entities, is added once every entity it keys exists —
66
+ * empty when the model has none, so that whatever plays on the root is still driven. The root
67
+ * must not carry one already: it is one placement's clips, and a second placement would replace
68
+ * them under whoever is playing them.
69
+ *
60
70
  * @param {Prefab} prefab
61
71
  * @param {EntityComponentDataset} dataset
62
72
  * @param {number} root an entity carrying a `Transform64`
@@ -81,13 +91,19 @@ export function prefab_instantiate(prefab, dataset, root, { transient = true } =
81
91
  const ATTACHMENT = dataset.computeComponentTypeIndex(TransformAttachment);
82
92
  const NAME = dataset.computeComponentTypeIndex(Name);
83
93
  const GEOMETRY = dataset.computeComponentTypeIndex(ShadedGeometry);
94
+ const SKIN = dataset.computeComponentTypeIndex(MeshSkin);
84
95
  const AUTHORITY = dataset.computeComponentTypeIndex(GPUStateAuthority);
85
96
  const PARENT = dataset.computeComponentTypeIndex(ParentEntity);
86
97
  const METADATA = dataset.computeComponentTypeIndex(SerializationMetadata);
98
+ const CLIPS = dataset.computeComponentTypeIndex(AnimationClips);
87
99
 
88
100
  const root_transform = dataset.getComponent(root, Transform64);
89
101
 
90
102
  assert.defined(root_transform, `root entity ${root} carries no Transform64 to place the model by`);
103
+ assert.equal(
104
+ dataset.getComponentByIndex(root, CLIPS), undefined,
105
+ `root entity ${root} already carries AnimationClips; one root holds one placement`
106
+ );
91
107
 
92
108
  const node_count = prefab.node_count;
93
109
 
@@ -129,6 +145,10 @@ export function prefab_instantiate(prefab, dataset, root, { transient = true } =
129
145
  // immutable while attached, and sixty copies of one number are sixty allocations for nothing.
130
146
  const owner = ParentEntity.from(root);
131
147
 
148
+ // Each skin's joints as this instance's entities, once: the meshes a skin deforms share the
149
+ // array, as they share the prefab's inverse binds.
150
+ const skin_joints = prefab.skins.map(skin => Int32Array.from(skin.joints, joint => entities[joint]));
151
+
132
152
  for (let i = 1; i < node_count; i++) {
133
153
  const entity = entities[i];
134
154
 
@@ -158,6 +178,13 @@ export function prefab_instantiate(prefab, dataset, root, { transient = true } =
158
178
  }
159
179
 
160
180
  dataset.addComponentToEntityByIndex(entity, GEOMETRY, geometry);
181
+
182
+ if (primitive.skin !== -1) {
183
+ dataset.addComponentToEntityByIndex(entity, SKIN, MeshSkin.from(
184
+ skin_joints[primitive.skin],
185
+ prefab.skins[primitive.skin].inverse_bind_matrices
186
+ ));
187
+ }
161
188
  }
162
189
 
163
190
  const attachment = new TransformAttachment();
@@ -190,14 +217,8 @@ export function prefab_instantiate(prefab, dataset, root, { transient = true } =
190
217
  instance.entities = entities;
191
218
  instance.mesh_entities = Int32Array.from(prefab.primitives, primitive => entities[primitive.node]);
192
219
 
193
- instance.skins = prefab.skins.map(skin => Skin.from({
194
- name: skin.name,
195
- joints: Array.from(skin.joints, joint => entities[joint]),
196
- inverse_bind_matrices: skin.inverse_bind_matrices,
197
- meshes: Array.from(skin.meshes, mesh => entities[mesh]),
198
- }));
199
-
200
- instance.clips = prefab.clips.map(clip => ShadeAnimationClip.from({
220
+ // Per placement: the curves are the prefab's, and only the addressing is this instance's.
221
+ const clips = prefab.clips.map(clip => ShadeAnimationClip.from({
201
222
  name: clip.name,
202
223
  channels: clip.channels.map(channel => ShadeAnimationChannel.from({
203
224
  target: entities[channel.target],
@@ -206,15 +227,25 @@ export function prefab_instantiate(prefab, dataset, root, { transient = true } =
206
227
  })),
207
228
  }));
208
229
 
230
+ // Last: whatever plays these links when they arrive, and every entity they key is complete by
231
+ // then.
232
+ dataset.addComponentToEntityByIndex(root, CLIPS, AnimationClips.from(clips));
233
+
209
234
  return instance;
210
235
  }
211
236
 
212
237
  /**
213
- * Remove every entity an instance spawned. The root is the caller's and stays.
238
+ * Remove every entity an instance spawned, and its clips from the root. The root is the caller's
239
+ * and stays.
214
240
  *
215
241
  * Children before parents, so that no parent's removal has to reach down and detach a child
216
242
  * that is about to go anyway.
217
243
  *
244
+ * **The clips go after the entities they key.** Whatever was playing them gives back what it
245
+ * holds for each target when they go, and a target that has already left is one there is nothing
246
+ * left to give back for. They go only if the root still carries them: the root's own removal takes
247
+ * its components one by one, and may have taken them already.
248
+ *
218
249
  * @param {EntityComponentDataset} dataset
219
250
  * @param {PrefabInstance} instance
220
251
  */
@@ -227,4 +258,10 @@ export function prefab_instance_destroy(dataset, instance) {
227
258
  for (let i = entities.length - 1; i >= 1; i--) {
228
259
  dataset.removeEntity(entities[i]);
229
260
  }
261
+
262
+ const root = instance.root;
263
+
264
+ if (dataset.entityExists(root) && dataset.getComponent(root, AnimationClips) !== undefined) {
265
+ dataset.removeComponentFromEntity(root, AnimationClips);
266
+ }
230
267
  }