@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,263 +1,262 @@
1
- import { assert } from "../../../core/assert.js";
2
- import { AnimationEventTypes } from "../../graphics/ecs/animation/animator/AnimationEventTypes.js";
3
- import { ClipPlayback } from "./ClipPlayback.js";
4
- import { wrap_clip_time } from "./wrap_clip_time.js";
5
-
6
- /**
7
- * Plays one {@link Animation} component's list of clips against one model.
8
- *
9
- * **The component is reused as it stands**, unlike the graph's, which had to be restated because it
10
- * *was* an `AnimationMixer`: `Animation` holds a name, a repeat count, a weight and a time scale per
11
- * clip and no renderer handle of any kind. What the legacy system added to it — the mixer, its
12
- * actions and their clocks — is what this replaces, and the clocks are here because the pose
13
- * gameplay asks about has to come off the same clock the picture is drawn from (I-4).
14
- *
15
- * **Weights are shares of one pose.** Shade's accumulator adds up what every bound clip contributes
16
- * and has no rest-pose term, so what reaches it is each clip's weight over the list's total —
17
- * which is what three's mixer did too, by cumulative weight, and is why the game can author a walk
18
- * clip at weight 1000 against an idle at 1 and mean "the walk".
19
- *
20
- * **A clip that has run out holds its last frame.** Three disabled a finished one-shot and let the
21
- * rig fall back to its bind pose; there is no pose to fall back to here, and a list whose every clip
22
- * has stopped contributing resolves each joint it drives to *zero* rather than to rest. So
23
- * `AnimationClipFlag.ClampWhenFinished` decides nothing — holding is the only case — and it keeps
24
- * deserializing (I-13) like `AnimationFlags.MeshSizeCulling`, whose 32 px² cull does not come across
25
- * either: a clock camera framing can stop is a simulation camera framing can change (§2.6-2).
26
- */
27
- export class ClipListPlayer {
28
- /**
29
- * The list being played. Every entry's `weight`, `timeScale` and `repeatCount` is read each
30
- * tick, so changing one takes effect without removing and re-adding the clip.
31
- *
32
- * @type {Animation}
33
- */
34
- component = null;
35
-
36
- /**
37
- * The entity's private copy of the model — where the clips named in the list are found, and
38
- * where their durations come from.
39
- *
40
- * @type {PrefabInstance}
41
- */
42
- instance = null;
43
-
44
- /**
45
- * One per entry of {@link component}'s list, in the list's own order.
46
- *
47
- * @type {ClipPlayback[]}
48
- */
49
- playbacks = [];
50
-
51
- /**
52
- * What each of the model's clips weighs, by the instance's own clip order — which is the order
53
- * the animation manager's registration uses, so it is the lookup for both.
54
- *
55
- * A clip the list does not name weighs zero: `MeshSystem` registers every clip a model carries,
56
- * and an unclaimed one would otherwise lay itself over the pose at full strength.
57
- *
58
- * @type {Float32Array}
59
- */
60
- weights = new Float32Array(0);
61
-
62
- /**
63
- * @type {number}
64
- */
65
- #entity = -1;
66
-
67
- /**
68
- * @type {EntityComponentDataset}
69
- */
70
- #dataset = null;
71
-
72
- /**
73
- * Names already reported as absent from this model, so the report is one line rather than one a
74
- * frame. Cleared with the model, because the next one may well carry the name.
75
- *
76
- * @type {Set<string>}
77
- */
78
- #reported_missing = new Set();
79
-
80
- /**
81
- * @param {Animation} component
82
- * @returns {ClipListPlayer}
83
- */
84
- static from(component) {
85
- assert.defined(component, 'component');
86
-
87
- const r = new ClipListPlayer();
88
-
89
- r.component = component;
90
-
91
- return r;
92
- }
93
-
94
- /**
95
- * Take up a model, and the entity whose events its clips fire as.
96
- *
97
- * Every playback is dropped, because the clips a playback was pointing at are not this model's.
98
- *
99
- * @param {number} entity
100
- * @param {EntityComponentDataset} ecd
101
- * @param {PrefabInstance} instance
102
- */
103
- bind(entity, ecd, instance) {
104
- assert.isNonNegativeInteger(entity, 'entity');
105
- assert.defined(ecd, 'ecd');
106
- assert.defined(instance, 'instance');
107
-
108
- this.#entity = entity;
109
- this.#dataset = ecd;
110
-
111
- this.instance = instance;
112
- this.playbacks = [];
113
- this.weights = new Float32Array(instance.clips.length);
114
- this.#reported_missing.clear();
115
- }
116
-
117
- /**
118
- * Advance every clock, say so when one runs out, and work out what the list therefore weighs.
119
- *
120
- * Unconditional by design: §2.6-2's split puts pose evaluation and its events on the CPU
121
- * precisely so that camera framing cannot decide whether a clip's end is ever reached.
122
- *
123
- * @param {number} time_delta_seconds
124
- */
125
- tick(time_delta_seconds) {
126
- this.#reconcile();
127
- this.#advance(time_delta_seconds);
128
- this.#blend();
129
- }
130
-
131
- /**
132
- * Match the playbacks against the list, which the game edits while it runs —
133
- * `StartAnimationBehavior` adds an entry, `StopAnimationBehavior` and `AnimationController`'s
134
- * rules remove one. Identity is the match, so a clip stopped and started again is a new entry
135
- * and plays from its own beginning.
136
- *
137
- * **A name the model has not got does not play, and says so once (D43).** Clip names are
138
- * authored against models the game does not own and they do miss — the strategy map's buildings
139
- * ask for `Take01` of a model whose clip is `Take 001`, and one that has no clips at all. This
140
- * threw until D43, out of `AnimationSystem.update`, which cost *every* entity its animation on
141
- * every frame for as long as one such entity existed. Reporting it per frame buries the console
142
- * and reporting it not at all is how the mismatch survived the three path unnoticed, so it is
143
- * said once per name, with the model's real clip list beside it.
144
- */
145
- #reconcile() {
146
- const clips = this.component.clips;
147
- const playbacks = this.playbacks;
148
-
149
- for (let i = playbacks.length - 1; i >= 0; i--) {
150
- if (clips.indexOf(playbacks[i].clip) === -1) {
151
- playbacks.splice(i, 1);
152
- }
153
- }
154
-
155
- const available = this.instance.clips;
156
-
157
- for (let i = 0; i < clips.length; i++) {
158
- const clip = clips.get(i);
159
-
160
- if (find_playback(playbacks, clip) !== null) {
161
- continue;
162
- }
163
-
164
- const name = clip.name.getValue();
165
- const slot = available.findIndex(c => c.name === name);
166
-
167
- if (slot === -1) {
168
- this.#report_missing(name, available);
169
-
170
- continue;
171
- }
172
-
173
- playbacks.push(ClipPlayback.from(clip, slot, available[slot].duration));
174
- }
175
- }
176
-
177
- /**
178
- * Say once, per name, that this model has no such clip — and say what it does have, because the
179
- * mismatch is nearly always spelling and the answer is in the list beside it.
180
- *
181
- * @param {string} name
182
- * @param {ShadeAnimationClip[]} available
183
- */
184
- #report_missing(name, available) {
185
- if (this.#reported_missing.has(name)) {
186
- return;
187
- }
188
-
189
- this.#reported_missing.add(name);
190
-
191
- console.warn(
192
- `Animation clip '${name}' is not in the model of entity ${this.#entity}, so it does not `
193
- + `play. The model carries: ${available.map(c => `'${c.name}'`).join(', ')}`
194
- );
195
- }
196
-
197
- /**
198
- * @param {number} time_delta_seconds
199
- */
200
- #advance(time_delta_seconds) {
201
- const playing = this.component.isPlaying;
202
- const playbacks = this.playbacks;
203
-
204
- for (let i = 0; i < playbacks.length; i++) {
205
- const playback = playbacks[i];
206
-
207
- if (playing && !playback.finished) {
208
- playback.elapsed += time_delta_seconds * playback.clip.timeScale.getValue();
209
- }
210
-
211
- const repeats = playback.clip.repeatCount.getValue();
212
-
213
- // `Infinity * duration` is `Infinity`, which no elapsed time reaches — so a looping
214
- // clip takes the wrapping branch forever without a case of its own
215
- const finished = playback.elapsed >= repeats * playback.duration;
216
-
217
- playback.time = wrap_clip_time(playback.elapsed, playback.duration, !finished);
218
-
219
- if (finished && !playback.finished) {
220
- playback.finished = true;
221
-
222
- this.#dataset.sendEvent(this.#entity, AnimationEventTypes.ClipEnded, playback.clip);
223
- }
224
- }
225
- }
226
-
227
- #blend() {
228
- const playbacks = this.playbacks;
229
- const weights = this.weights;
230
-
231
- weights.fill(0);
232
-
233
- let total = 0;
234
-
235
- for (let i = 0; i < playbacks.length; i++) {
236
- total += playbacks[i].clip.weight.getValue();
237
- }
238
-
239
- for (let i = 0; i < playbacks.length; i++) {
240
- const playback = playbacks[i];
241
-
242
- // an author who weighted every clip at zero asked for silence, and gets it
243
- playback.weight = total > 0 ? playback.clip.weight.getValue() / total : 0;
244
-
245
- weights[playback.slot] += playback.weight;
246
- }
247
- }
248
- }
249
-
250
- /**
251
- * @param {ClipPlayback[]} playbacks
252
- * @param {AnimationClip} clip
253
- * @returns {ClipPlayback|null}
254
- */
255
- function find_playback(playbacks, clip) {
256
- for (let i = 0; i < playbacks.length; i++) {
257
- if (playbacks[i].clip === clip) {
258
- return playbacks[i];
259
- }
260
- }
261
-
262
- return null;
263
- }
1
+ import { assert } from "../../../core/assert.js";
2
+ import { AnimationEventTypes } from "../../graphics/ecs/animation/animator/AnimationEventTypes.js";
3
+ import { ClipPlayback } from "./ClipPlayback.js";
4
+ import { wrap_clip_time } from "./wrap_clip_time.js";
5
+
6
+ /**
7
+ * Plays one {@link Animation} component's list of clips against the clips its entity carries — its
8
+ * `AnimationClips`.
9
+ *
10
+ * **The component is reused as it stands**, unlike the graph's, which had to be restated because it
11
+ * *was* an `AnimationMixer`: `Animation` holds a name, a repeat count, a weight and a time scale per
12
+ * clip and no renderer handle of any kind. What the legacy system added to it — the mixer, its
13
+ * actions and their clocks — is what this replaces, and the clocks are here because the pose
14
+ * gameplay asks about has to come off the same clock the picture is drawn from (I-4).
15
+ *
16
+ * **Weights are shares of one pose.** Shade's accumulator adds up what every bound clip contributes
17
+ * and has no rest-pose term, so what reaches it is each clip's weight over the list's total —
18
+ * which is what three's mixer did too, by cumulative weight, and is why the game can author a walk
19
+ * clip at weight 1000 against an idle at 1 and mean "the walk".
20
+ *
21
+ * **A clip that has run out holds its last frame.** Three disabled a finished one-shot and let the
22
+ * rig fall back to its bind pose; there is no pose to fall back to here, and a list whose every clip
23
+ * has stopped contributing resolves each joint it drives to *zero* rather than to rest. So
24
+ * `AnimationClipFlag.ClampWhenFinished` decides nothing — holding is the only case — and it keeps
25
+ * deserializing (I-13) like `AnimationFlags.MeshSizeCulling`, whose 32 px² cull does not come across
26
+ * either: a clock camera framing can stop is a simulation camera framing can change (§2.6-2).
27
+ */
28
+ export class ClipListPlayer {
29
+ /**
30
+ * The list being played. Every entry's `weight`, `timeScale` and `repeatCount` is read each
31
+ * tick, so changing one takes effect without removing and re-adding the clip.
32
+ *
33
+ * @type {Animation}
34
+ */
35
+ component = null;
36
+
37
+ /**
38
+ * The entity's clips — where the clips named in the list are found, and where their durations
39
+ * come from.
40
+ *
41
+ * @type {ShadeAnimationClip[]}
42
+ */
43
+ clips = null;
44
+
45
+ /**
46
+ * One per entry of {@link component}'s list, in the list's own order.
47
+ *
48
+ * @type {ClipPlayback[]}
49
+ */
50
+ playbacks = [];
51
+
52
+ /**
53
+ * What each of the entity's clips weighs, in {@link clips}' order — which is the order the
54
+ * animation manager's registration uses, so it is the lookup for both. A clip the list does not
55
+ * name weighs zero.
56
+ *
57
+ * @type {Float32Array}
58
+ */
59
+ weights = new Float32Array(0);
60
+
61
+ /**
62
+ * @type {number}
63
+ */
64
+ #entity = -1;
65
+
66
+ /**
67
+ * @type {EntityComponentDataset}
68
+ */
69
+ #dataset = null;
70
+
71
+ /**
72
+ * Names already reported as absent from these clips, so the report is one line rather than one a
73
+ * frame. Cleared with the clips, because the next set may well carry the name.
74
+ *
75
+ * @type {Set<string>}
76
+ */
77
+ #reported_missing = new Set();
78
+
79
+ /**
80
+ * @param {Animation} component
81
+ * @returns {ClipListPlayer}
82
+ */
83
+ static from(component) {
84
+ assert.defined(component, 'component');
85
+
86
+ const r = new ClipListPlayer();
87
+
88
+ r.component = component;
89
+
90
+ return r;
91
+ }
92
+
93
+ /**
94
+ * Take up a set of clips, and the entity whose events they fire as.
95
+ *
96
+ * Every playback is dropped, because the clips a playback was pointing at are not these.
97
+ *
98
+ * @param {number} entity
99
+ * @param {EntityComponentDataset} ecd
100
+ * @param {ShadeAnimationClip[]} clips the entity's `AnimationClips`
101
+ */
102
+ bind(entity, ecd, clips) {
103
+ assert.isNonNegativeInteger(entity, 'entity');
104
+ assert.defined(ecd, 'ecd');
105
+ assert.isArray(clips, 'clips');
106
+
107
+ this.#entity = entity;
108
+ this.#dataset = ecd;
109
+
110
+ this.clips = clips;
111
+ this.playbacks = [];
112
+ this.weights = new Float32Array(clips.length);
113
+ this.#reported_missing.clear();
114
+ }
115
+
116
+ /**
117
+ * Advance every clock, say so when one runs out, and work out what the list therefore weighs.
118
+ *
119
+ * Unconditional by design: §2.6-2's split puts pose evaluation and its events on the CPU
120
+ * precisely so that camera framing cannot decide whether a clip's end is ever reached.
121
+ *
122
+ * @param {number} time_delta_seconds
123
+ */
124
+ tick(time_delta_seconds) {
125
+ this.#reconcile();
126
+ this.#advance(time_delta_seconds);
127
+ this.#blend();
128
+ }
129
+
130
+ /**
131
+ * Match the playbacks against the list, which the game edits while it runs —
132
+ * `StartAnimationBehavior` adds an entry, `StopAnimationBehavior` and `AnimationController`'s
133
+ * rules remove one. Identity is the match, so a clip stopped and started again is a new entry
134
+ * and plays from its own beginning.
135
+ *
136
+ * **A name the entity's clips have not got does not play, and says so once (D43).** Clip names
137
+ * are authored against models the game does not own and they do miss — the strategy map's
138
+ * buildings ask for `Take01` of a model whose clip is `Take 001`, and one that has no clips at
139
+ * all. This threw until D43, out of `AnimationSystem.update`, which cost *every* entity its
140
+ * animation on every frame for as long as one such entity existed. Reporting it per frame buries
141
+ * the console and reporting it not at all is how the mismatch survived the three path unnoticed,
142
+ * so it is said once per name, with the real clip list beside it.
143
+ */
144
+ #reconcile() {
145
+ const clips = this.component.clips;
146
+ const playbacks = this.playbacks;
147
+
148
+ for (let i = playbacks.length - 1; i >= 0; i--) {
149
+ if (clips.indexOf(playbacks[i].clip) === -1) {
150
+ playbacks.splice(i, 1);
151
+ }
152
+ }
153
+
154
+ const available = this.clips;
155
+
156
+ for (let i = 0; i < clips.length; i++) {
157
+ const clip = clips.get(i);
158
+
159
+ if (find_playback(playbacks, clip) !== null) {
160
+ continue;
161
+ }
162
+
163
+ const name = clip.name.getValue();
164
+ const slot = available.findIndex(c => c.name === name);
165
+
166
+ if (slot === -1) {
167
+ this.#report_missing(name, available);
168
+
169
+ continue;
170
+ }
171
+
172
+ playbacks.push(ClipPlayback.from(clip, slot, available[slot].duration));
173
+ }
174
+ }
175
+
176
+ /**
177
+ * Say once, per name, that the entity has no such clip — and say what it does have, because the
178
+ * mismatch is nearly always spelling and the answer is in the list beside it.
179
+ *
180
+ * @param {string} name
181
+ * @param {ShadeAnimationClip[]} available
182
+ */
183
+ #report_missing(name, available) {
184
+ if (this.#reported_missing.has(name)) {
185
+ return;
186
+ }
187
+
188
+ this.#reported_missing.add(name);
189
+
190
+ console.warn(
191
+ `Animation clip '${name}' is not among the clips of entity ${this.#entity}, so it does not `
192
+ + `play. Its AnimationClips carries: ${available.map(c => `'${c.name}'`).join(', ')}`
193
+ );
194
+ }
195
+
196
+ /**
197
+ * @param {number} time_delta_seconds
198
+ */
199
+ #advance(time_delta_seconds) {
200
+ const playing = this.component.isPlaying;
201
+ const playbacks = this.playbacks;
202
+
203
+ for (let i = 0; i < playbacks.length; i++) {
204
+ const playback = playbacks[i];
205
+
206
+ if (playing && !playback.finished) {
207
+ playback.elapsed += time_delta_seconds * playback.clip.timeScale.getValue();
208
+ }
209
+
210
+ const repeats = playback.clip.repeatCount.getValue();
211
+
212
+ // `Infinity * duration` is `Infinity`, which no elapsed time reaches — so a looping
213
+ // clip takes the wrapping branch forever without a case of its own
214
+ const finished = playback.elapsed >= repeats * playback.duration;
215
+
216
+ playback.time = wrap_clip_time(playback.elapsed, playback.duration, !finished);
217
+
218
+ if (finished && !playback.finished) {
219
+ playback.finished = true;
220
+
221
+ this.#dataset.sendEvent(this.#entity, AnimationEventTypes.ClipEnded, playback.clip);
222
+ }
223
+ }
224
+ }
225
+
226
+ #blend() {
227
+ const playbacks = this.playbacks;
228
+ const weights = this.weights;
229
+
230
+ weights.fill(0);
231
+
232
+ let total = 0;
233
+
234
+ for (let i = 0; i < playbacks.length; i++) {
235
+ total += playbacks[i].clip.weight.getValue();
236
+ }
237
+
238
+ for (let i = 0; i < playbacks.length; i++) {
239
+ const playback = playbacks[i];
240
+
241
+ // an author who weighted every clip at zero asked for silence, and gets it
242
+ playback.weight = total > 0 ? playback.clip.weight.getValue() / total : 0;
243
+
244
+ weights[playback.slot] += playback.weight;
245
+ }
246
+ }
247
+ }
248
+
249
+ /**
250
+ * @param {ClipPlayback[]} playbacks
251
+ * @param {AnimationClip} clip
252
+ * @returns {ClipPlayback|null}
253
+ */
254
+ function find_playback(playbacks, clip) {
255
+ for (let i = 0; i < playbacks.length; i++) {
256
+ if (playbacks[i].clip === clip) {
257
+ return playbacks[i];
258
+ }
259
+ }
260
+
261
+ return null;
262
+ }
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Hand one clip list's blend down to the renderer: what each of the model's clips weighs, and where
2
+ * Hand one clip list's blend down to the renderer: what each of the entity's clips weighs, and where
3
3
  * each of the audible ones is playing.
4
4
  *
5
5
  * **Time is written every frame and weight only when it moves.** The clock is the reason this
@@ -14,8 +14,8 @@
14
14
  *
15
15
  * @param {GPUAnimationManager} manager
16
16
  * @param {ClipListPlayer} player
17
- * @param {ArrayLike<number>} clip_ids the manager's id for each of the model's clips, in the
18
- * instance's order, or {@link CLIP_NOT_REGISTERED} for one this driver does not play. Those are
17
+ * @param {ArrayLike<number>} clip_ids the manager's id for each of the entity's clips, in its
18
+ * `AnimationClips`' order, or {@link CLIP_NOT_REGISTERED} for one this driver does not play. Those are
19
19
  * skipped rather than written at weight zero: an unregistered clip has no row, and it is unregistered
20
20
  * precisely so that it marks no joints (D37)
21
21
  * @param {Float32Array} written the weight each of those clips was last given; updated in place.
@@ -1,8 +1,8 @@
1
1
  import { assert } from "../../../core/assert.js";
2
- import { CLIP_NOT_REGISTERED } from "../register_instance_animation.js";
2
+ import { CLIP_NOT_REGISTERED } from "../register_clips.js";
3
3
 
4
4
  /**
5
- * Hand one clip list's blend down to the renderer: what each of the model's clips weighs, and where
5
+ * Hand one clip list's blend down to the renderer: what each of the entity's clips weighs, and where
6
6
  * each of the audible ones is playing.
7
7
  *
8
8
  * **Time is written every frame and weight only when it moves.** The clock is the reason this
@@ -17,8 +17,8 @@ import { CLIP_NOT_REGISTERED } from "../register_instance_animation.js";
17
17
  *
18
18
  * @param {GPUAnimationManager} manager
19
19
  * @param {ClipListPlayer} player
20
- * @param {ArrayLike<number>} clip_ids the manager's id for each of the model's clips, in the
21
- * instance's order, or {@link CLIP_NOT_REGISTERED} for one this driver does not play. Those are
20
+ * @param {ArrayLike<number>} clip_ids the manager's id for each of the entity's clips, in its
21
+ * `AnimationClips`' order, or {@link CLIP_NOT_REGISTERED} for one this driver does not play. Those are
22
22
  * skipped rather than written at weight zero: an unregistered clip has no row, and it is unregistered
23
23
  * precisely so that it marks no joints (D37)
24
24
  * @param {Float32Array} written the weight each of those clips was last given; updated in place.
@@ -12,6 +12,11 @@
12
12
  * (hierarchy, clip set, time, weights), off the same clock the renderer is written from, which is
13
13
  * what keeps a socket on the mesh that is drawn — whether or not the GPU owns the joint's row.
14
14
  *
15
+ * **A name is only how a loaded model is asked.** For a joint the caller already holds — one of a
16
+ * rig built in code — there is nothing to look up: {@link collect_entity_playbacks} for the entity
17
+ * playing its clips, then {@link t64_evaluate_world} for the joint, which is all this does once the
18
+ * name is resolved.
19
+ *
15
20
  * The result carries both its matrix and its components.
16
21
  *
17
22
  * @param {Transform64} result
@@ -1 +1 @@
1
- {"version":3,"file":"query_entity_node_world_pose.d.ts","sourceRoot":"","sources":["../../../../../src/engine/graphics3/pose/query_entity_node_world_pose.js"],"names":[],"mappings":"AAcA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,yGANW,MAAM,aACN,MAAM,GACJ,OAAO,CAwCnB"}
1
+ {"version":3,"file":"query_entity_node_world_pose.d.ts","sourceRoot":"","sources":["../../../../../src/engine/graphics3/pose/query_entity_node_world_pose.js"],"names":[],"mappings":"AAcA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,yGANW,MAAM,aACN,MAAM,GACJ,OAAO,CAwCnB"}