@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
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Solve `M·x = b` for a symmetric positive definite 3×3 `M`, by LDLᵀ factorisation.
3
+ *
4
+ * `M` is read as its six distinct entries, diagonal first: `[m00, m11, m22, m01, m02, m12]`.
5
+ *
6
+ * LDLᵀ rather than a cofactor inverse. The two agree in exact arithmetic and do not agree in Float64: an SPD
7
+ * matrix with a condition number in the billions has a cofactor determinant — a sum of triple products that
8
+ * has to cancel down by that ratio squared — that can come out *negative* although every eigenvalue is
9
+ * positive. The factorisation never forms those products, so its pivots stay positive where the determinant
10
+ * does not, and their product is the determinant to full precision.
11
+ *
12
+ * The pivots of an SPD matrix are `M` restricted to nested subspaces, so all three positive *is* positive
13
+ * definiteness: the function checks exactly that, and returns `false` without writing `out` when a pivot is
14
+ * not positive and finite — an indefinite, singular or non-finite `M`. An infinite pivot needs refusing
15
+ * explicitly: it is positive, and dividing by it reads as a finite solution, zero along that axis.
16
+ *
17
+ * @param {Float64Array|Float32Array|number[]} out solution `x`, 3 entries at `out_offset`
18
+ * @param {number} out_offset
19
+ * @param {Float64Array|Float32Array|number[]} m `[m00, m11, m22, m01, m02, m12]` at `m_offset`
20
+ * @param {number} m_offset
21
+ * @param {Float64Array|Float32Array|number[]} b right-hand side, 3 entries at `b_offset`
22
+ * @param {number} b_offset
23
+ * @returns {boolean} true when `M` was positive definite and `out` holds the solution
24
+ */
25
+ export function matrix_symmetric_3x3_solve_ldlt(
26
+ out, out_offset,
27
+ m, m_offset,
28
+ b, b_offset
29
+ ) {
30
+ const m00 = m[m_offset];
31
+ const m11 = m[m_offset + 1];
32
+ const m22 = m[m_offset + 2];
33
+ const m01 = m[m_offset + 3];
34
+ const m02 = m[m_offset + 4];
35
+ const m12 = m[m_offset + 5];
36
+
37
+ const pivot_0 = m00;
38
+ const lower_10 = m01 / pivot_0;
39
+ const lower_20 = m02 / pivot_0;
40
+
41
+ const pivot_1 = m11 - lower_10 * m01;
42
+ const lower_21 = (m12 - lower_20 * m01) / pivot_1;
43
+
44
+ const pivot_2 = m22 - lower_20 * m02 - lower_21 * lower_21 * pivot_1;
45
+
46
+ if (!(
47
+ pivot_0 > 0 && pivot_0 < Infinity
48
+ && pivot_1 > 0 && pivot_1 < Infinity
49
+ && pivot_2 > 0 && pivot_2 < Infinity
50
+ )) {
51
+ return false;
52
+ }
53
+
54
+ const b0 = b[b_offset];
55
+ const b1 = b[b_offset + 1];
56
+ const b2 = b[b_offset + 2];
57
+
58
+ // Forward substitution through L, scale by D, back substitution through Lᵀ.
59
+ const forward_1 = b1 - lower_10 * b0;
60
+ const forward_2 = b2 - lower_20 * b0 - lower_21 * forward_1;
61
+
62
+ const x2 = forward_2 / pivot_2;
63
+ const x1 = forward_1 / pivot_1 - lower_21 * x2;
64
+ const x0 = b0 / pivot_0 - lower_10 * x1 - lower_20 * x2;
65
+
66
+ out[out_offset] = x0;
67
+ out[out_offset + 1] = x1;
68
+ out[out_offset + 2] = x2;
69
+
70
+ return true;
71
+ }
@@ -0,0 +1,15 @@
1
+ /**
2
+ * `Math.max(a, b)` without the call, as {@link min2_exact}: the larger, NaN if either is, and `+0`
3
+ * above `-0`.
4
+ *
5
+ * {@link max2} drops a NaN in `b` and lets the first of two zeros win; this does neither.
6
+ *
7
+ * The same as `Math.max` under `Object.is` for every pair of numbers, except that a NaN answer is the
8
+ * canonical NaN.
9
+ *
10
+ * @param {number} a
11
+ * @param {number} b
12
+ * @returns {number}
13
+ */
14
+ export function max2_exact(a: number, b: number): number;
15
+ //# sourceMappingURL=max2_exact.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"max2_exact.d.ts","sourceRoot":"","sources":["../../../../src/core/math/max2_exact.js"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,8BAJW,MAAM,KACN,MAAM,GACJ,MAAM,CAkBlB"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * `Math.max(a, b)` without the call, as {@link min2_exact}: the larger, NaN if either is, and `+0`
3
+ * above `-0`.
4
+ *
5
+ * {@link max2} drops a NaN in `b` and lets the first of two zeros win; this does neither.
6
+ *
7
+ * The same as `Math.max` under `Object.is` for every pair of numbers, except that a NaN answer is the
8
+ * canonical NaN.
9
+ *
10
+ * @param {number} a
11
+ * @param {number} b
12
+ * @returns {number}
13
+ */
14
+ export function max2_exact(a, b) {
15
+ if (a > b) {
16
+ return a;
17
+ }
18
+
19
+ if (b > a) {
20
+ return b;
21
+ }
22
+
23
+ if (a === b) {
24
+ // equal, and of two zeros the positive one if either is
25
+ return a === 0 && 1 / a < 0 ? b : a;
26
+ }
27
+
28
+ // one of them is NaN
29
+ return NaN;
30
+ }
@@ -0,0 +1,20 @@
1
+ /**
2
+ * `Math.min(a, b)` without the call: the smaller, NaN if either is, and `-0` below `+0`.
3
+ *
4
+ * {@link min2} is `a < b ? a : b`, which answers `b` whenever the comparison is false — a NaN in `a`
5
+ * is dropped, and of two zeros the second one wins. That is right for a running minimum over values
6
+ * known to be numbers, and wrong for a bound that has to stay poisoned when its input was.
7
+ *
8
+ * Why not `Math.min` itself: in code V8 has not optimised yet (a function run a few times a step can
9
+ * stay unoptimised for thousands of steps), `Math.min` is a call into a builtin that hands its answer
10
+ * back boxed into a heap object. This is comparisons only.
11
+ *
12
+ * The same as `Math.min` under `Object.is` for every pair of numbers. A NaN answer is the canonical
13
+ * NaN; which NaN `Math.min` answers is the platform's (on x64, the one with the sign bit set).
14
+ *
15
+ * @param {number} a
16
+ * @param {number} b
17
+ * @returns {number}
18
+ */
19
+ export function min2_exact(a: number, b: number): number;
20
+ //# sourceMappingURL=min2_exact.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"min2_exact.d.ts","sourceRoot":"","sources":["../../../../src/core/math/min2_exact.js"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,8BAJW,MAAM,KACN,MAAM,GACJ,MAAM,CAkBlB"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * `Math.min(a, b)` without the call: the smaller, NaN if either is, and `-0` below `+0`.
3
+ *
4
+ * {@link min2} is `a < b ? a : b`, which answers `b` whenever the comparison is false — a NaN in `a`
5
+ * is dropped, and of two zeros the second one wins. That is right for a running minimum over values
6
+ * known to be numbers, and wrong for a bound that has to stay poisoned when its input was.
7
+ *
8
+ * Why not `Math.min` itself: in code V8 has not optimised yet (a function run a few times a step can
9
+ * stay unoptimised for thousands of steps), `Math.min` is a call into a builtin that hands its answer
10
+ * back boxed into a heap object. This is comparisons only.
11
+ *
12
+ * The same as `Math.min` under `Object.is` for every pair of numbers. A NaN answer is the canonical
13
+ * NaN; which NaN `Math.min` answers is the platform's (on x64, the one with the sign bit set).
14
+ *
15
+ * @param {number} a
16
+ * @param {number} b
17
+ * @returns {number}
18
+ */
19
+ export function min2_exact(a, b) {
20
+ if (a < b) {
21
+ return a;
22
+ }
23
+
24
+ if (b < a) {
25
+ return b;
26
+ }
27
+
28
+ if (a === b) {
29
+ // equal, and of two zeros the negative one if either is
30
+ return a === 0 && 1 / a > 0 ? b : a;
31
+ }
32
+
33
+ // one of them is NaN
34
+ return NaN;
35
+ }
@@ -52,6 +52,21 @@ declare class Clock {
52
52
  * @returns {number} in seconds
53
53
  */
54
54
  getDelta(): number;
55
+ /**
56
+ * {@link getDelta}, measured to a given moment instead of to now - an animation frame's
57
+ * timestamp, so that the simulation shown by a frame is the simulation at that frame's time and
58
+ * not at whenever the code reading the clock happened to run.
59
+ *
60
+ * Only a moment between the clock's last reading and now can be measured to; anything else is
61
+ * measured to now. A frame's timestamp is when the frame began, so it can sit behind a reading
62
+ * taken earlier in that frame (a resume() from an input handler). And it is only on this
63
+ * clock's timeline where the environment keeps its promise that it is - jsdom stamps frames
64
+ * 1.5 s behind `performance.now()`, a `Date.now()` polyfill decades ahead - and measured to
65
+ * those, the clock froze or leapt.
66
+ * @param {number} time in seconds, on the {@link current_time_in_seconds} timeline
67
+ * @returns {number} in seconds
68
+ */
69
+ getDeltaAt(time: number): number;
55
70
  /**
56
71
  *
57
72
  * @returns {number} in seconds
@@ -1 +1 @@
1
- {"version":3,"file":"Clock.d.ts","sourceRoot":"","sources":["../../../src/engine/Clock.js"],"names":[],"mappings":";AAcA;;GAEG;AACH;IAEI;;;;OAIG;IACH,0BAAsB;IAEtB;;;OAGG;IACH,aAFU,MAAM,CAEA;IAEhB;;;;OAIG;IACH,aAFU,MAAM,CAEA;IAEhB;;;;OAIG;IACH,oBAAoB;IAGpB;;;;;;OAMG;IACH,gBAHU,IAAI,CAGM;IAMpB;;;OAGG;IACH,0BAEC;IAED;;;OAGG;IACH,yBAEC;IAED,cAIC;IAED,aAEC;IAED,cAeC;IAED;;;OAGG;IACH,YAFa,MAAM,CAOlB;IAED;;;OAGG;IACH,qBAFa,MAAM,CAOlB;IAED;;;;OAIG;IACH,kBAFY,MAAM,CAIjB;IAED,cAGC;CACJ;iBA1IgB,4BAA4B"}
1
+ {"version":3,"file":"Clock.d.ts","sourceRoot":"","sources":["../../../src/engine/Clock.js"],"names":[],"mappings":";AAcA;;GAEG;AACH;IAEI;;;;OAIG;IACH,0BAAsB;IAEtB;;;OAGG;IACH,aAFU,MAAM,CAEA;IAEhB;;;;OAIG;IACH,aAFU,MAAM,CAEA;IAEhB;;;;OAIG;IACH,oBAAoB;IAGpB;;;;;;OAMG;IACH,gBAHU,IAAI,CAGM;IAMpB;;;OAGG;IACH,0BAEC;IAED;;;OAGG;IACH,yBAEC;IAED,cAIC;IAED,aAEC;IAED,cAeC;IAED;;;OAGG;IACH,YAFa,MAAM,CAIlB;IAED;;;;;;;;;;;;;OAaG;IACH,iBAHW,MAAM,GACJ,MAAM,CAalB;IAED;;;OAGG;IACH,qBAFa,MAAM,CAOlB;IAED;;;;OAIG;IACH,kBAFY,MAAM,CAIjB;IAED,cAGC;CACJ;iBAlKgB,4BAA4B"}
@@ -4,9 +4,9 @@ import { current_time_in_seconds } from "../core/time/current_time_in_seconds.js
4
4
  /**
5
5
  *
6
6
  * @param {Clock} clock
7
+ * @param {number} now in seconds, on the {@link current_time_in_seconds} timeline
7
8
  */
8
- function updateElapsedTime(clock) {
9
- const now = current_time_in_seconds();
9
+ function updateElapsedTime(clock, now) {
10
10
  const delta = (now - clock.__lastMeasurement) * clock.speed;
11
11
  clock.__lastMeasurement = now;
12
12
  clock.elapsedTime += delta;
@@ -98,7 +98,7 @@ class Clock {
98
98
 
99
99
  this.__isRunning = false;
100
100
  //update time
101
- updateElapsedTime(this);
101
+ updateElapsedTime(this, current_time_in_seconds());
102
102
  }
103
103
 
104
104
  /**
@@ -106,7 +106,31 @@ class Clock {
106
106
  * @returns {number} in seconds
107
107
  */
108
108
  getDelta() {
109
- const elapsedTime = this.updateElapsedTime();
109
+ return this.getDeltaAt(current_time_in_seconds());
110
+ }
111
+
112
+ /**
113
+ * {@link getDelta}, measured to a given moment instead of to now - an animation frame's
114
+ * timestamp, so that the simulation shown by a frame is the simulation at that frame's time and
115
+ * not at whenever the code reading the clock happened to run.
116
+ *
117
+ * Only a moment between the clock's last reading and now can be measured to; anything else is
118
+ * measured to now. A frame's timestamp is when the frame began, so it can sit behind a reading
119
+ * taken earlier in that frame (a resume() from an input handler). And it is only on this
120
+ * clock's timeline where the environment keeps its promise that it is - jsdom stamps frames
121
+ * 1.5 s behind `performance.now()`, a `Date.now()` polyfill decades ahead - and measured to
122
+ * those, the clock froze or leapt.
123
+ * @param {number} time in seconds, on the {@link current_time_in_seconds} timeline
124
+ * @returns {number} in seconds
125
+ */
126
+ getDeltaAt(time) {
127
+ if (this.__isRunning) {
128
+ const now = current_time_in_seconds();
129
+
130
+ updateElapsedTime(this, time >= this.__lastMeasurement && time <= now ? time : now);
131
+ }
132
+
133
+ const elapsedTime = this.elapsedTime;
110
134
  const delta = elapsedTime - this.timeAtDelta;
111
135
  this.timeAtDelta = elapsedTime;
112
136
  return delta;
@@ -118,7 +142,7 @@ class Clock {
118
142
  */
119
143
  updateElapsedTime() {
120
144
  if (this.__isRunning) {
121
- updateElapsedTime(this);
145
+ updateElapsedTime(this, current_time_in_seconds());
122
146
  }
123
147
  return this.elapsedTime;
124
148
  }
@@ -1 +1 @@
1
- {"version":3,"file":"Engine.d.ts","sourceRoot":"","sources":["../../../src/engine/Engine.js"],"names":[],"mappings":";6BAqCa,OAAO,8BAA8B,EAAE,cAAc;AAwClE;IAiGI;;;;;;;;;OASG;IACH,sBARW,cAAc;QAEU,aAAa,GAArC,aAAa;QACK,cAAc,GAAhC,OAAO;QACW,WAAW,GAA7B,OAAO;QACW,KAAK,GAAvB,OAAO;OAiPjB;IAtSD;;;OAGG;IACH,UAFU,cAAc,GAAC,IAAI,CAEb;IAEhB;;;OAGG;IACH,OAFU,WAAW,GAAC,IAAI,CAEb;IAEb,qBAA4B;IAE5B;;;;;;;;;OASG;IACH,0BAFU,uBAAuB,CAEe;IAEhD;;;OAGG;IACH,kBAFU,mBAAmB,CAEO;IAEpC;;;;OAIG;IACH,iBAFU,MAAM,CAEM;IAEtB;;;;OAIG;IACH,mBAFU,kBAAkB,CAEa;IAoBrC;;;OAGG;IACH,UAFU,cAAc,CAEA;IAKxB;;;OAGG;IACH,aAFU,gBAAgB,CAEe;IAGzC,yCAAkE;IAK9D,6BAAkC;IAMtC;;;OAGG;IACH,cAFU,aAAa,MAAM,CAAC,CAK5B;IAEF,8CAiCE;IAgCF;;;OAGG;IACH,SAFU,WAAW,CAEoB;IAEzC;;;OAGG;IACH,oCAA0C;IAE1C;;;OAGG;IACH,sCAFU,2BAA2B,CAE+B;IAEpE,yBAAoC;IAGpC;;OAEG;IACH,aAAkB;IAElB;;;OAGG;IACH,SAFU,OAAO,CAEwB;IAGzC,2BAAsC;IAuCtC;;;OAGG;IACH,KAFU,SAAS,CAEO;IAE1B;;;OAGG;IACH,uBAFU,YAAY,CAEqD;IAI3E;;;;;MAKC;IA8BD;;;OAGG;IACH,kBAFU,OAAO,CAEW;IAwIhC,wBAgCC;IApBG,oBAAwB;IAsB5B,2BA8CC;IAED,oBAiBC;IAED;;;OAGG;IACH,+CAUC;IAED,eAkDC;IAED;;;OAGG;IACH,sBA2GC;IAqBD;;OAEG;IACH,sBAgEC;IAED,aAEC;IAED;;OAEG;IACH,4BAOC;IAIL;;;OAGG;IACH,mBAFU,OAAO,CAEQ;;CAPxB;+BAt5B8B,+BAA+B;wBAWtC,wBAAwB;0BArBtB,0CAA0C;wCAeN,iDAAiD;oCAG3E,iCAAiC;mBAElD,wBAAwB;+BAtBZ,gDAAgD;iCAO9C,+CAA+C;8BAGlD,wBAAwB;6BALzB,yBAAyB;uCAIf,6DAA6D;4BAUxE,0BAA0B;+BArBvB,iCAAiC;4CAapB,qDAAqD;AAgBjG;;GAEG;AAGH;IACI,gDAA2D;IAC3D,0BAAkC;IAClC,iCAAyC;CAC5C;6BAvC4B,sCAAsC;sBA4B7C,mBAAmB;yBAJhB,yBAAyB;8BALpB,kCAAkC;2BADrC,mCAAmC;8BAFhC,kCAAkC;8BAClC,kCAAkC;sBAb1C,+BAA+B;+BAKtB,qCAAqC;4BAPxC,kCAAkC;oBAH1C,yBAAyB"}
1
+ {"version":3,"file":"Engine.d.ts","sourceRoot":"","sources":["../../../src/engine/Engine.js"],"names":[],"mappings":";6BAqCa,OAAO,8BAA8B,EAAE,cAAc;AAwClE;IA4FI;;;;;;;;;OASG;IACH,sBARW,cAAc;QAEU,aAAa,GAArC,aAAa;QACK,cAAc,GAAhC,OAAO;QACW,WAAW,GAA7B,OAAO;QACW,KAAK,GAAvB,OAAO;OAiPjB;IAtSD;;;OAGG;IACH,UAFU,cAAc,GAAC,IAAI,CAEb;IAEhB;;;OAGG;IACH,OAFU,WAAW,GAAC,IAAI,CAEb;IAEb,qBAA4B;IAE5B;;;;;;;;;OASG;IACH,0BAFU,uBAAuB,CAEe;IAEhD;;;OAGG;IACH,kBAFU,mBAAmB,CAEO;IAEpC;;;;OAIG;IACH,iBAFU,MAAM,CAEM;IAEtB;;;;OAIG;IACH,mBAFU,kBAAkB,CAEa;IAoBrC;;;OAGG;IACH,UAFU,cAAc,CAEA;IAKxB;;;OAGG;IACH,aAFU,gBAAgB,CAEe;IAGzC,yCAAkE;IAK9D,6BAAkC;IAMtC;;;OAGG;IACH,cAFU,aAAa,MAAM,CAAC,CAK5B;IAEF,8CAiCE;IAgCF;;;OAGG;IACH,SAFU,WAAW,CAEoB;IAEzC;;;OAGG;IACH,oCAA0C;IAE1C;;;OAGG;IACH,sCAFU,2BAA2B,CAE+B;IAEpE,yBAAoC;IAGpC;;OAEG;IACH,aAAkB;IAElB;;;OAGG;IACH,SAFU,OAAO,CAEwB;IAGzC,2BAAsC;IAuCtC;;;OAGG;IACH,KAFU,SAAS,CAEO;IAE1B;;;OAGG;IACH,uBAFU,YAAY,CAEqD;IAI3E;;;;;MAKC;IA8BD;;;OAGG;IACH,kBAFU,OAAO,CAEW;IAwIhC,wBAgCC;IApBG,oBAAwB;IAsB5B,2BA8CC;IAED,oBAiBC;IAED;;;OAGG;IACH,+CAUC;IAED,eAkDC;IAED;;;OAGG;IACH,sBA0GC;IAoBD;;OAEG;IACH,sBA+DC;IAED,aAEC;IAED;;OAEG;IACH,4BAOC;IAIL;;;OAGG;IACH,mBAFU,OAAO,CAEQ;;CAPxB;+BA94B8B,+BAA+B;wBAWtC,wBAAwB;0BArBtB,0CAA0C;wCAeN,iDAAiD;oCAG3E,iCAAiC;mBAElD,wBAAwB;+BAtBZ,gDAAgD;iCAO9C,+CAA+C;8BAGlD,wBAAwB;6BALzB,yBAAyB;uCAIf,6DAA6D;4BAUxE,0BAA0B;+BArBvB,iCAAiC;4CAapB,qDAAqD;AAgBjG;;GAEG;AAGH;IACI,gDAA2D;IAC3D,0BAAkC;IAClC,iCAAyC;CAC5C;6BAvC4B,sCAAsC;sBA4B7C,mBAAmB;yBAJhB,yBAAyB;8BALpB,kCAAkC;2BADrC,mCAAmC;8BAFhC,kCAAkC;8BAClC,kCAAkC;sBAb1C,+BAA+B;+BAKtB,qCAAqC;4BAPxC,kCAAkC;oBAH1C,yBAAyB"}
@@ -86,11 +86,6 @@ class Engine {
86
86
  */
87
87
  #last_render_simulation_time = 0;
88
88
 
89
- /**
90
- * Handle of the pending render-loop frame, `-1` when the loop is not running
91
- * @type {number}
92
- */
93
- #animation_frame_handle = -1;
94
89
 
95
90
  /**
96
91
  * Handle of the pending "pause the simulation, this outage is taking a while" timer, `-1` when none
@@ -699,14 +694,14 @@ class Engine {
699
694
  scene's speed modifiers (see SceneManager), so a paused game holds its particles still
700
695
  and a slowed one slows them. A wall-clock measurement would do neither.
701
696
 
702
- `updateElapsedTime` advances the clock and reads it without touching the anchor
703
- `getDelta` keeps, so this does not consume the delta the entity manager's tick is
704
- about to be handed.
697
+ Read, not advanced: a frame draws right after the ticker advanced the clock to the
698
+ frame's timestamp (see Ticker#onFrame), so this is the simulation time of the frame.
699
+ Advancing it here would step the renderer by however long that tick took to run.
705
700
 
706
701
  Moved only when a frame is actually drawn, so simulation time that passes while
707
702
  rendering is off is caught up by the next frame rather than lost.
708
703
  */
709
- const simulation_time = this.ticker.clock.updateElapsedTime();
704
+ const simulation_time = this.ticker.clock.getElapsedTime();
710
705
  const time_delta_seconds = simulation_time - this.#last_render_simulation_time;
711
706
 
712
707
  this.#last_render_simulation_time = simulation_time;
@@ -781,10 +776,9 @@ class Engine {
781
776
 
782
777
  this.#last_frame_timestamp = performance.now();
783
778
 
784
- /**
785
- * Starting the engine
786
- */
787
- this.#animation_frame_handle = requestAnimationFrame(this.#animation_frame);
779
+ // Drawn from the ticker's frame, after that frame's tick. A render loop of its own drew
780
+ // each frame before the tick, i.e. the simulation as of whenever the previous tick ran.
781
+ this.ticker.onFrame.add(this.#animation_frame);
788
782
 
789
783
  //start simulation
790
784
  this.ticker.start({ maxTimeout: 200 });
@@ -835,13 +829,12 @@ class Engine {
835
829
  }
836
830
 
837
831
  /**
838
- * Fired every animation frame via {@link requestAnimationFrame}
832
+ * Fired every animation frame via {@link Ticker#onFrame}
839
833
  */
840
834
  #animation_frame = () => {
841
835
 
842
836
  const t0 = this.#last_frame_timestamp;
843
837
  const t1 = performance.now();
844
- this.#animation_frame_handle = requestAnimationFrame(this.#animation_frame);
845
838
  this.render();
846
839
 
847
840
  const frame_delay = (t1 - t0) / 1000;
@@ -865,10 +858,9 @@ class Engine {
865
858
  // running, which would abort the whole teardown below
866
859
  this.ticker.stop();
867
860
 
868
- // and the render loop, which re-requests itself every frame and would
869
- // otherwise keep calling render() on a torn-down engine forever
870
- cancelAnimationFrame(this.#animation_frame_handle);
871
- this.#animation_frame_handle = -1;
861
+ // which also ends the render loop, as it draws from the ticker's frames. Unsubscribed too,
862
+ // so a restart does not draw twice per frame
863
+ this.ticker.onFrame.remove(this.#animation_frame);
872
864
 
873
865
  // the input devices the constructor started. The gamepad one polls on its own animation
874
866
  // frame loop, so left alone it outlives the engine the same way the render loop would;
@@ -1 +1 @@
1
- {"version":3,"file":"IKGoalSystem.d.ts","sourceRoot":"","sources":["../../../../../src/engine/ecs/ik/IKGoalSystem.js"],"names":[],"mappings":"AAyOA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH;;IAEI,6DAA6C;IAE7C,kbASE;IAEF;;;OAGG;IACH,gBAFU,MAAM,CAEI;IAEpB;;;OAGG;IACH,WAFU,MAAM,CAEC;IAkDjB;;;;OAIG;IACH,WAJW,MAAM,cACN,mBAAmB,UACnB,MAAM,QAgChB;IAED;;;;OAIG;IACH,aAJW,MAAM,cACN,mBAAmB,UACnB,MAAM,QAkBhB;IAED,sCA+BC;;CA6nBJ;uBA1hCsB,cAAc;oCAED,gDAAgD;uBAQ7D,aAAa;4BAD7B,6BAA6B;4CA1BQ,oDAAoD;yCAEvD,uDAAuD;0BAQtE,2BAA2B;kCAEnB,6BAA6B;6BAIlC,2BAA2B;sBAPlC,4BAA4B"}
1
+ {"version":3,"file":"IKGoalSystem.d.ts","sourceRoot":"","sources":["../../../../../src/engine/ecs/ik/IKGoalSystem.js"],"names":[],"mappings":"AA0OA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH;;IAEI,6DAA6C;IAE7C,kbASE;IAEF;;;OAGG;IACH,gBAFU,MAAM,CAEI;IAEpB;;;OAGG;IACH,WAFU,MAAM,CAEC;IAkDjB;;;;OAIG;IACH,WAJW,MAAM,cACN,mBAAmB,UACnB,MAAM,QAgChB;IAED;;;;OAIG;IACH,aAJW,MAAM,cACN,mBAAmB,UACnB,MAAM,QAkBhB;IAED,sCA+BC;;CA6nBJ;uBA1hCsB,cAAc;oCAED,gDAAgD;uBAQ7D,aAAa;4BAD7B,6BAA6B;4CA3BQ,oDAAoD;yCAEvD,uDAAuD;0BAQtE,2BAA2B;kCAEnB,6BAA6B;6BAIlC,2BAA2B;sBAPlC,4BAA4B"}
@@ -19,6 +19,7 @@ import { GPUStateAuthorityFlags } from "../gpu/GPUStateAuthorityFlags.js";
19
19
  import { gpu_authority_hold } from "../gpu/gpu_authority_hold.js";
20
20
  import { gpu_authority_unhold } from "../gpu/gpu_authority_unhold.js";
21
21
  import { ParentEntity } from "../parent/ParentEntity.js";
22
+ import { parent_entity_model_of } from "../parent/parent_entity_model_of.js";
22
23
  import { System } from "../System.js";
23
24
  import { TRANSFORM_ATTACHMENT_EVENT_CHANGE } from "../transform-attachment/TRANSFORM_ATTACHMENT_EVENT_CHANGE.js";
24
25
  import { TransformAttachment } from "../transform-attachment/TransformAttachment.js";
@@ -354,8 +355,8 @@ export class IKGoalSystem extends System {
354
355
  record.entity = entity;
355
356
  record.goal = goal;
356
357
  record.system = this;
357
- record.model = model_of(dataset, entity);
358
- record.target_model = dataset.entityExists(goal.target) ? model_of(dataset, goal.target) : -1;
358
+ record.model = parent_entity_model_of(dataset, entity);
359
+ record.target_model = dataset.entityExists(goal.target) ? parent_entity_model_of(dataset, goal.target) : -1;
359
360
 
360
361
  this.#records.set(entity, record);
361
362
 
@@ -1071,23 +1072,6 @@ export class IKGoalSystem extends System {
1071
1072
  }
1072
1073
  }
1073
1074
 
1074
- /**
1075
- * The entity whose clips drive `entity`: the model its lifetime belongs to, or itself.
1076
- *
1077
- * @param {EntityComponentDataset} dataset
1078
- * @param {number} entity
1079
- * @returns {number}
1080
- */
1081
- function model_of(dataset, entity) {
1082
- const owner = dataset.getComponent(entity, ParentEntity);
1083
-
1084
- if (owner === undefined || owner === null) {
1085
- return entity;
1086
- }
1087
-
1088
- return owner.entity;
1089
- }
1090
-
1091
1075
  /**
1092
1076
  * Goals grouped by connected paths: two goals whose paths share a bone are solved together.
1093
1077
  *
@@ -0,0 +1,17 @@
1
+ /**
2
+ * The entity whose clips drive `entity`: the model its lifetime belongs to, or itself.
3
+ *
4
+ * A placed model's bones each carry a {@link ParentEntity} naming the model's root, and the root is
5
+ * where the model's clips and animation drivers live. So the model of a bone is one step up the
6
+ * lifetime edge, and an entity without one — a root, a prop, a hand-made rig — is its own model.
7
+ *
8
+ * One step, not a walk to the top: a model placed under another model is still its own model, with
9
+ * its own clips.
10
+ *
11
+ * @param {EntityComponentDataset} dataset
12
+ * @param {number} entity
13
+ * @returns {number} the model entity; `entity` itself when it has no {@link ParentEntity}, or one
14
+ * naming no entity yet (`-1`)
15
+ */
16
+ export function parent_entity_model_of(dataset: EntityComponentDataset, entity: number): number;
17
+ //# sourceMappingURL=parent_entity_model_of.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parent_entity_model_of.d.ts","sourceRoot":"","sources":["../../../../../src/engine/ecs/parent/parent_entity_model_of.js"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;GAcG;AACH,gFAJW,MAAM,GACJ,MAAM,CAWlB"}
@@ -0,0 +1,26 @@
1
+ import { ParentEntity } from "./ParentEntity.js";
2
+
3
+ /**
4
+ * The entity whose clips drive `entity`: the model its lifetime belongs to, or itself.
5
+ *
6
+ * A placed model's bones each carry a {@link ParentEntity} naming the model's root, and the root is
7
+ * where the model's clips and animation drivers live. So the model of a bone is one step up the
8
+ * lifetime edge, and an entity without one — a root, a prop, a hand-made rig — is its own model.
9
+ *
10
+ * One step, not a walk to the top: a model placed under another model is still its own model, with
11
+ * its own clips.
12
+ *
13
+ * @param {EntityComponentDataset} dataset
14
+ * @param {number} entity
15
+ * @returns {number} the model entity; `entity` itself when it has no {@link ParentEntity}, or one
16
+ * naming no entity yet (`-1`)
17
+ */
18
+ export function parent_entity_model_of(dataset, entity) {
19
+ const owner = dataset.getComponent(entity, ParentEntity);
20
+
21
+ if (owner === undefined || owner === null || owner.entity < 0) {
22
+ return entity;
23
+ }
24
+
25
+ return owner.entity;
26
+ }
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Pack a transform's rigid pose, `[tx, ty, tz, qx, qy, qz, qw]`, into an array: the translation and
3
+ * the rotation, without the scale or the matrix.
4
+ *
5
+ * Seven floats is the shape a contact kernel, an oriented box transform or a cloth holder takes a
6
+ * pose in. Read off the transform's lanes (a {@link Transform64} is a `Float64Array`) rather than
7
+ * through `translation_x` and the rest: a hot caller that does not inline those accessor calls gets
8
+ * each number back boxed, and the vector getters allocate outright.
9
+ *
10
+ * @param {number[]|Float32Array|Float64Array} out
11
+ * @param {number} out_offset receives 7 floats
12
+ * @param {Transform64|Float64Array} transform a `Transform64`, or an array in its layout
13
+ */
14
+ export function t64_read_pose_array(out: number[] | Float32Array | Float64Array, out_offset: number, transform: Transform64 | Float64Array): void;
15
+ //# sourceMappingURL=t64_read_pose_array.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"t64_read_pose_array.d.ts","sourceRoot":"","sources":["../../../../../src/engine/ecs/transform/t64_read_pose_array.js"],"names":[],"mappings":"AAEA;;;;;;;;;;;;GAYG;AACH,yCAJW,MAAM,EAAE,GAAC,YAAY,GAAC,YAAY,cAClC,MAAM,aACN,cAAY,YAAY,QAUlC"}
@@ -0,0 +1,24 @@
1
+ import { TRANSFORM64_ROTATION_OFFSET, TRANSFORM64_TRANSLATION_OFFSET } from "./Transform64.js";
2
+
3
+ /**
4
+ * Pack a transform's rigid pose, `[tx, ty, tz, qx, qy, qz, qw]`, into an array: the translation and
5
+ * the rotation, without the scale or the matrix.
6
+ *
7
+ * Seven floats is the shape a contact kernel, an oriented box transform or a cloth holder takes a
8
+ * pose in. Read off the transform's lanes (a {@link Transform64} is a `Float64Array`) rather than
9
+ * through `translation_x` and the rest: a hot caller that does not inline those accessor calls gets
10
+ * each number back boxed, and the vector getters allocate outright.
11
+ *
12
+ * @param {number[]|Float32Array|Float64Array} out
13
+ * @param {number} out_offset receives 7 floats
14
+ * @param {Transform64|Float64Array} transform a `Transform64`, or an array in its layout
15
+ */
16
+ export function t64_read_pose_array(out, out_offset, transform) {
17
+ out[out_offset] = transform[TRANSFORM64_TRANSLATION_OFFSET];
18
+ out[out_offset + 1] = transform[TRANSFORM64_TRANSLATION_OFFSET + 1];
19
+ out[out_offset + 2] = transform[TRANSFORM64_TRANSLATION_OFFSET + 2];
20
+ out[out_offset + 3] = transform[TRANSFORM64_ROTATION_OFFSET];
21
+ out[out_offset + 4] = transform[TRANSFORM64_ROTATION_OFFSET + 1];
22
+ out[out_offset + 5] = transform[TRANSFORM64_ROTATION_OFFSET + 2];
23
+ out[out_offset + 6] = transform[TRANSFORM64_ROTATION_OFFSET + 3];
24
+ }
@@ -0,0 +1,57 @@
1
+ /**
2
+ * How the geometry on this entity deforms: the joints its vertices are weighted to, as entities,
3
+ * and where each joint stood when the mesh was bound to it.
4
+ *
5
+ * **It describes the mesh, so it lives on the mesh entity.** The geometry's per-vertex joint indices
6
+ * index {@link joints}, and an inverse bind belongs to the pair (this mesh, that joint) — one joint
7
+ * can bind with different matrices in different skins. The joints are entities like any other: a
8
+ * clip, IK, a ragdoll or a cloth moves them, and the skin follows.
9
+ *
10
+ * The geometry beside it says it draws a deformed clone (`ShadedGeometryFlags.Skinned`); without
11
+ * that it draws the shared source and nothing would deform. `MeshSkinSystem` deforms it; a model
12
+ * loaded by `MeshSystem` carries one on each skinned primitive, and code builds one the same way.
13
+ *
14
+ * **Replaced, never edited.** A skin is registered once with the joints and matrices it has then;
15
+ * to change either, take the component off and put another on. Meshes of one model that share a
16
+ * skeleton and bind it the same way — a body and its hair — share one registration on the GPU,
17
+ * whether or not they share the arrays.
18
+ *
19
+ * **Not saved**, for the reason {@link ShadedGeometry} is not: the joint indices address the vertex
20
+ * attribute of a geometry no save holds, so whatever builds the geometry builds its skin.
21
+ *
22
+ * @author Alex Goldring
23
+ * @copyright Company Named Limited (c) 2026
24
+ */
25
+ export class MeshSkin {
26
+ /**
27
+ * @param {Int32Array} joints entities
28
+ * @param {Float32Array} inverse_bind_matrices `joints.length` × 16
29
+ * @returns {MeshSkin}
30
+ */
31
+ static from(joints: Int32Array, inverse_bind_matrices: Float32Array): MeshSkin;
32
+ /**
33
+ * The joints, as entities, in the order the geometry's per-vertex joint indices address them.
34
+ * Read-only once the component is on an entity.
35
+ *
36
+ * @type {Int32Array}
37
+ */
38
+ joints: Int32Array;
39
+ /**
40
+ * `joints.length` × 16 column-major matrices, flat: joint `j`'s at `[j * 16, j * 16 + 16)`, taking
41
+ * a vertex from the mesh's frame into the joint's at bind. Read-only, and shared — a model's
42
+ * placements all hold the one array their prefab compiled.
43
+ *
44
+ * @type {Float32Array}
45
+ */
46
+ inverse_bind_matrices: Float32Array;
47
+ /**
48
+ * @readonly
49
+ * @type {boolean}
50
+ */
51
+ readonly isMeshSkin: boolean;
52
+ }
53
+ export namespace MeshSkin {
54
+ let typeName: string;
55
+ let serializable: boolean;
56
+ }
57
+ //# sourceMappingURL=MeshSkin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MeshSkin.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/graphics/ecs/mesh-v2/MeshSkin.js"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH;IAkBI;;;;OAIG;IACH,oBAJW,UAAU,yBACV,YAAY,GACV,QAAQ,CAiBpB;IArCD;;;;;OAKG;IACH,QAFU,UAAU,CAEO;IAE3B;;;;;;OAMG;IACH,uBAFU,YAAY,CAEsB;IAyBhD;;;OAGG;IACH,qBAFU,OAAO,CAEY;CAN5B;;kBAUS,MAAM;sBAMN,OAAO"}
@@ -0,0 +1,84 @@
1
+ import { assert } from "../../../../core/assert.js";
2
+
3
+ /**
4
+ * How the geometry on this entity deforms: the joints its vertices are weighted to, as entities,
5
+ * and where each joint stood when the mesh was bound to it.
6
+ *
7
+ * **It describes the mesh, so it lives on the mesh entity.** The geometry's per-vertex joint indices
8
+ * index {@link joints}, and an inverse bind belongs to the pair (this mesh, that joint) — one joint
9
+ * can bind with different matrices in different skins. The joints are entities like any other: a
10
+ * clip, IK, a ragdoll or a cloth moves them, and the skin follows.
11
+ *
12
+ * The geometry beside it says it draws a deformed clone (`ShadedGeometryFlags.Skinned`); without
13
+ * that it draws the shared source and nothing would deform. `MeshSkinSystem` deforms it; a model
14
+ * loaded by `MeshSystem` carries one on each skinned primitive, and code builds one the same way.
15
+ *
16
+ * **Replaced, never edited.** A skin is registered once with the joints and matrices it has then;
17
+ * to change either, take the component off and put another on. Meshes of one model that share a
18
+ * skeleton and bind it the same way — a body and its hair — share one registration on the GPU,
19
+ * whether or not they share the arrays.
20
+ *
21
+ * **Not saved**, for the reason {@link ShadedGeometry} is not: the joint indices address the vertex
22
+ * attribute of a geometry no save holds, so whatever builds the geometry builds its skin.
23
+ *
24
+ * @author Alex Goldring
25
+ * @copyright Company Named Limited (c) 2026
26
+ */
27
+ export class MeshSkin {
28
+ /**
29
+ * The joints, as entities, in the order the geometry's per-vertex joint indices address them.
30
+ * Read-only once the component is on an entity.
31
+ *
32
+ * @type {Int32Array}
33
+ */
34
+ joints = new Int32Array(0);
35
+
36
+ /**
37
+ * `joints.length` × 16 column-major matrices, flat: joint `j`'s at `[j * 16, j * 16 + 16)`, taking
38
+ * a vertex from the mesh's frame into the joint's at bind. Read-only, and shared — a model's
39
+ * placements all hold the one array their prefab compiled.
40
+ *
41
+ * @type {Float32Array}
42
+ */
43
+ inverse_bind_matrices = new Float32Array(0);
44
+
45
+ /**
46
+ * @param {Int32Array} joints entities
47
+ * @param {Float32Array} inverse_bind_matrices `joints.length` × 16
48
+ * @returns {MeshSkin}
49
+ */
50
+ static from(joints, inverse_bind_matrices) {
51
+ assert.equal(joints instanceof Int32Array, true, 'joints must be an Int32Array of entities');
52
+ assert.greaterThanOrEqual(joints.length, 1, 'a skin has at least one joint');
53
+ assert.equal(inverse_bind_matrices instanceof Float32Array, true, 'inverse_bind_matrices must be a Float32Array');
54
+ assert.equal(
55
+ inverse_bind_matrices.length, joints.length * 16,
56
+ 'inverse_bind_matrices.length !== joints.length * 16'
57
+ );
58
+
59
+ const r = new MeshSkin();
60
+
61
+ r.joints = joints;
62
+ r.inverse_bind_matrices = inverse_bind_matrices;
63
+
64
+ return r;
65
+ }
66
+ }
67
+
68
+ /**
69
+ * @readonly
70
+ * @type {boolean}
71
+ */
72
+ MeshSkin.prototype.isMeshSkin = true;
73
+
74
+ /**
75
+ * @readonly
76
+ * @type {string}
77
+ */
78
+ MeshSkin.typeName = "MeshSkin";
79
+
80
+ /**
81
+ * @readonly
82
+ * @type {boolean}
83
+ */
84
+ MeshSkin.serializable = false;