@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 +1 @@
1
- {"version":3,"file":"prototypeEditorShell.d.ts","sourceRoot":"","sources":["../../editor/prototypeEditorShell.js"],"names":[],"mappings":"AAuLA;;;;;GAKG;AACH,2BAFU,QAAQ;IAAC,MAAM,SAAS;IAAC,MAAM,SAAS;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,OAAO,UAAS;CAAC,CAAC,CAEzD"}
1
+ {"version":3,"file":"prototypeEditorShell.d.ts","sourceRoot":"","sources":["../../editor/prototypeEditorShell.js"],"names":[],"mappings":"AAyLA;;;;;GAKG;AACH,2BAFU,QAAQ;IAAC,MAAM,SAAS;IAAC,MAAM,SAAS;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,OAAO,UAAS;CAAC,CAAC,CAEzD"}
@@ -32,6 +32,7 @@ import {
32
32
  import {
33
33
  ShadedGeometrySystem
34
34
  } from "../src/engine/graphics3/ShadedGeometrySystem.js";
35
+ import { MeshSkinSystem } from "../src/engine/graphics3/MeshSkinSystem.js";
35
36
  import { GPUParticleEmitterSystem } from "../src/engine/graphics3/GPUParticleEmitterSystem.js";
36
37
  import { enableEditor } from "./enableEditor.js";
37
38
 
@@ -96,9 +97,10 @@ async function addGraphicsSystems(engine) {
96
97
 
97
98
  await em.addSystem(meshes);
98
99
 
99
- // a model with neither skin nor clip becomes entities, and its primitives are drawn by the
100
- // system that owns primitives (D47)
100
+ // a model becomes entities: its primitives are drawn by the system that owns primitives
101
+ // (D47), and the skinned ones deformed by the system that owns skins
101
102
  await em.addSystem(new ShadedGeometrySystem(engine.graphics, EngineHarness.shadeScene(engine)));
103
+ await em.addSystem(new MeshSkinSystem(engine.graphics, EngineHarness.shadeScene(engine)));
102
104
 
103
105
  /*
104
106
  One outline pass and both of its sources, because the editor offers a `Highlight` editor and
package/package.json CHANGED
@@ -6,7 +6,7 @@
6
6
  "description": "Advanced 3D game engine",
7
7
  "type": "module",
8
8
  "author": "Alexander Goldring",
9
- "version": "3.43.0",
9
+ "version": "3.45.0",
10
10
  "exports": {
11
11
  "./build/*": "./build/*",
12
12
  "./src/*": "./src/*",
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Sort `array[start, end)` ascending by `>`, in place, by insertion.
3
+ *
4
+ * For a few elements — a query's handful of hits — an insertion sort is as fast as anything
5
+ * cleverer and allocates nothing, where `Array.prototype.sort` copies the elements into a work array
6
+ * of its own on every call and `TypedArray.prototype.sort` over a range needs a `subarray` view. Its
7
+ * cost is quadratic, so a caller that can be handed many elements picks its own cut-over to
8
+ * something linear-logarithmic or a radix sort.
9
+ *
10
+ * Stable. Numbers only: the comparison is `>`, so a NaN never moves past anything and leaves the
11
+ * range unsorted around it.
12
+ *
13
+ * @param {number[]|Uint32Array|Int32Array|Float32Array|Float64Array} array
14
+ * @param {number} start first index of the range
15
+ * @param {number} end one past the last index of the range
16
+ * @returns {void}
17
+ */
18
+ export function array_sort_insertion_ascending(array: number[] | Uint32Array | Int32Array | Float32Array | Float64Array, start: number, end: number): void;
19
+ //# sourceMappingURL=array_sort_insertion_ascending.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"array_sort_insertion_ascending.d.ts","sourceRoot":"","sources":["../../../../../src/core/collection/array/array_sort_insertion_ascending.js"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,sDALW,MAAM,EAAE,GAAC,WAAW,GAAC,UAAU,GAAC,YAAY,GAAC,YAAY,SACzD,MAAM,OACN,MAAM,GACJ,IAAI,CAehB"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Sort `array[start, end)` ascending by `>`, in place, by insertion.
3
+ *
4
+ * For a few elements — a query's handful of hits — an insertion sort is as fast as anything
5
+ * cleverer and allocates nothing, where `Array.prototype.sort` copies the elements into a work array
6
+ * of its own on every call and `TypedArray.prototype.sort` over a range needs a `subarray` view. Its
7
+ * cost is quadratic, so a caller that can be handed many elements picks its own cut-over to
8
+ * something linear-logarithmic or a radix sort.
9
+ *
10
+ * Stable. Numbers only: the comparison is `>`, so a NaN never moves past anything and leaves the
11
+ * range unsorted around it.
12
+ *
13
+ * @param {number[]|Uint32Array|Int32Array|Float32Array|Float64Array} array
14
+ * @param {number} start first index of the range
15
+ * @param {number} end one past the last index of the range
16
+ * @returns {void}
17
+ */
18
+ export function array_sort_insertion_ascending(array, start, end) {
19
+ for (let i = start + 1; i < end; i++) {
20
+ const v = array[i];
21
+
22
+ let j = i - 1;
23
+
24
+ while (j >= start && array[j] > v) {
25
+ array[j + 1] = array[j];
26
+ j--;
27
+ }
28
+
29
+ array[j + 1] = v;
30
+ }
31
+ }
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Round a box outward to float32: each lower bound down and each upper bound up to the nearest
3
+ * float32 on that side, so the result is the tightest float32 box that contains the input.
4
+ *
5
+ * A float32 store — a BVH node, a GPU buffer — rounds to the NEAREST float32, which is inward on
6
+ * any side that rounds that way, by up to half a float32 step. That step is a proportion of the
7
+ * magnitude, so the inward error is too: 3 cm at 1e6 m, half a metre at 1e7. A box stored that way
8
+ * stops containing what it
9
+ * bounded, and a query reaching the content through the box misses whatever lay outside it — far
10
+ * from the origin only, and silently. Rounding through this first makes the store exact.
11
+ * Measured in the rigid-body broadphase before it did this: a ray dropped onto a 2 mm plate 1e6 m
12
+ * out missed it, and so did rays a millimetre inside a 1 m crate's faces 1e5 m out.
13
+ *
14
+ * A bound that is already a float32 is kept as it is. A bound beyond the largest finite float32
15
+ * on its own side — a lower bound below `-F32_MAX`, an upper bound above `F32_MAX` — goes to that
16
+ * side's infinity; one beyond it on the other side becomes `±F32_MAX`. A NaN stays NaN.
17
+ *
18
+ * `result` may be `aabb` at the same offset.
19
+ *
20
+ * @param {number[]|Float32Array|Float64Array} result receives `[x0, y0, z0, x1, y1, z1]`
21
+ * @param {number} result_offset
22
+ * @param {number[]|Float32Array|Float64Array} aabb `[x0, y0, z0, x1, y1, z1]`
23
+ * @param {number} aabb_offset
24
+ * @returns {void}
25
+ */
26
+ export function aabb3_array_round_outward_f32(result: number[] | Float32Array | Float64Array, result_offset: number, aabb: number[] | Float32Array | Float64Array, aabb_offset: number): void;
27
+ //# sourceMappingURL=aabb3_array_round_outward_f32.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aabb3_array_round_outward_f32.d.ts","sourceRoot":"","sources":["../../../../../../src/core/geom/3d/aabb/aabb3_array_round_outward_f32.js"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,sDANW,MAAM,EAAE,GAAC,YAAY,GAAC,YAAY,iBAClC,MAAM,QACN,MAAM,EAAE,GAAC,YAAY,GAAC,YAAY,eAClC,MAAM,GACJ,IAAI,CAYhB"}
@@ -0,0 +1,39 @@
1
+ import { f32_next_down } from "../../../math/f32_next_down.js";
2
+ import { f32_next_up } from "../../../math/f32_next_up.js";
3
+
4
+ /**
5
+ * Round a box outward to float32: each lower bound down and each upper bound up to the nearest
6
+ * float32 on that side, so the result is the tightest float32 box that contains the input.
7
+ *
8
+ * A float32 store — a BVH node, a GPU buffer — rounds to the NEAREST float32, which is inward on
9
+ * any side that rounds that way, by up to half a float32 step. That step is a proportion of the
10
+ * magnitude, so the inward error is too: 3 cm at 1e6 m, half a metre at 1e7. A box stored that way
11
+ * stops containing what it
12
+ * bounded, and a query reaching the content through the box misses whatever lay outside it — far
13
+ * from the origin only, and silently. Rounding through this first makes the store exact.
14
+ * Measured in the rigid-body broadphase before it did this: a ray dropped onto a 2 mm plate 1e6 m
15
+ * out missed it, and so did rays a millimetre inside a 1 m crate's faces 1e5 m out.
16
+ *
17
+ * A bound that is already a float32 is kept as it is. A bound beyond the largest finite float32
18
+ * on its own side — a lower bound below `-F32_MAX`, an upper bound above `F32_MAX` — goes to that
19
+ * side's infinity; one beyond it on the other side becomes `±F32_MAX`. A NaN stays NaN.
20
+ *
21
+ * `result` may be `aabb` at the same offset.
22
+ *
23
+ * @param {number[]|Float32Array|Float64Array} result receives `[x0, y0, z0, x1, y1, z1]`
24
+ * @param {number} result_offset
25
+ * @param {number[]|Float32Array|Float64Array} aabb `[x0, y0, z0, x1, y1, z1]`
26
+ * @param {number} aabb_offset
27
+ * @returns {void}
28
+ */
29
+ export function aabb3_array_round_outward_f32(result, result_offset, aabb, aabb_offset) {
30
+ for (let i = 0; i < 3; i++) {
31
+ const lower = aabb[aabb_offset + i];
32
+ const lower_f32 = Math.fround(lower);
33
+ result[result_offset + i] = lower_f32 > lower ? f32_next_down(lower_f32) : lower_f32;
34
+
35
+ const upper = aabb[aabb_offset + i + 3];
36
+ const upper_f32 = Math.fround(upper);
37
+ result[result_offset + i + 3] = upper_f32 < upper ? f32_next_up(upper_f32) : upper_f32;
38
+ }
39
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"aabb3_from_v3_array.d.ts","sourceRoot":"","sources":["../../../../../../src/core/geom/3d/aabb/aabb3_from_v3_array.js"],"names":[],"mappings":"AAKA;;;;;GAKG;AACH,4CAJW,UAAU,MAAM,CAAC,GAAC,MAAM,EAAE,GAAC,YAAY,QAAM,SAC7C,MAAM,EAAE,GAAC,UAAU,MAAM,CAAC,GAAC,YAAY,gBACvC,MAAM,QA6BhB"}
1
+ {"version":3,"file":"aabb3_from_v3_array.d.ts","sourceRoot":"","sources":["../../../../../../src/core/geom/3d/aabb/aabb3_from_v3_array.js"],"names":[],"mappings":"AAKA;;;;;GAKG;AACH,4CAJW,UAAU,MAAM,CAAC,GAAC,MAAM,EAAE,GAAC,YAAY,QAAM,SAC7C,MAAM,EAAE,GAAC,UAAU,MAAM,CAAC,GAAC,YAAY,gBACvC,MAAM,QAgChB"}
@@ -10,7 +10,10 @@ import { aabb3_array_set } from "./aabb3_array_set.js";
10
10
  * @param {number} input_length length of the input array
11
11
  */
12
12
  export function aabb3_from_v3_array(result, input, input_length) {
13
- assert.equal(input_length % 3, 0, `Input must be divisible by 3, instead was ${input_length}`)
13
+ // the message is built only on failure: this runs per step in physics
14
+ if (input_length % 3 !== 0) {
15
+ assert.ok(false, `Input must be divisible by 3, instead was ${input_length}`);
16
+ }
14
17
 
15
18
  let x0 = Infinity;
16
19
  let y0 = Infinity;
@@ -37,9 +37,9 @@ export function aabb3_transform_oriented(result: number[] | Float32Array | Float
37
37
  * @param {number} result_offset
38
38
  * @param {number[]|Float32Array|Float64Array} aabb local box `[x0, y0, z0, x1, y1, z1]`
39
39
  * @param {number} aabb_offset
40
- * @param {number[]|Float64Array} pose translation then orientation (unit quaternion):
40
+ * @param {number[]|Float32Array|Float64Array} pose translation then orientation (unit quaternion):
41
41
  * `[px, py, pz, qx, qy, qz, qw]`
42
42
  * @param {number} pose_offset
43
43
  */
44
- export function aabb3_transform_oriented_array(result: number[] | Float32Array | Float64Array, result_offset: number, aabb: number[] | Float32Array | Float64Array, aabb_offset: number, pose: number[] | Float64Array, pose_offset: number): void;
44
+ export function aabb3_transform_oriented_array(result: number[] | Float32Array | Float64Array, result_offset: number, aabb: number[] | Float32Array | Float64Array, aabb_offset: number, pose: number[] | Float32Array | Float64Array, pose_offset: number): void;
45
45
  //# sourceMappingURL=aabb3_transform_oriented.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"aabb3_transform_oriented.d.ts","sourceRoot":"","sources":["../../../../../../src/core/geom/3d/aabb/aabb3_transform_oriented.js"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,iDAhBW,MAAM,EAAE,GAAC,YAAY,GAAC,YAAY,iBAClC,MAAM,OACN,MAAM,OACN,MAAM,OACN,MAAM,OACN,MAAM,OACN,MAAM,OACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,QAkBhB;AAMD;;;;;;;;;;;;;GAaG;AACH,uDARW,MAAM,EAAE,GAAC,YAAY,GAAC,YAAY,iBAClC,MAAM,QACN,MAAM,EAAE,GAAC,YAAY,GAAC,YAAY,eAClC,MAAM,QACN,MAAM,EAAE,GAAC,YAAY,eAErB,MAAM,QAuEhB"}
1
+ {"version":3,"file":"aabb3_transform_oriented.d.ts","sourceRoot":"","sources":["../../../../../../src/core/geom/3d/aabb/aabb3_transform_oriented.js"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,iDAhBW,MAAM,EAAE,GAAC,YAAY,GAAC,YAAY,iBAClC,MAAM,OACN,MAAM,OACN,MAAM,OACN,MAAM,OACN,MAAM,OACN,MAAM,OACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,QAkBhB;AAMD;;;;;;;;;;;;;GAaG;AACH,uDARW,MAAM,EAAE,GAAC,YAAY,GAAC,YAAY,iBAClC,MAAM,QACN,MAAM,EAAE,GAAC,YAAY,GAAC,YAAY,eAClC,MAAM,QACN,MAAM,EAAE,GAAC,YAAY,GAAC,YAAY,eAElC,MAAM,QAuEhB"}
@@ -58,7 +58,7 @@ const scratch_pose = new Float64Array(7);
58
58
  * @param {number} result_offset
59
59
  * @param {number[]|Float32Array|Float64Array} aabb local box `[x0, y0, z0, x1, y1, z1]`
60
60
  * @param {number} aabb_offset
61
- * @param {number[]|Float64Array} pose translation then orientation (unit quaternion):
61
+ * @param {number[]|Float32Array|Float64Array} pose translation then orientation (unit quaternion):
62
62
  * `[px, py, pz, qx, qy, qz, qw]`
63
63
  * @param {number} pose_offset
64
64
  */
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Bring a point into a rigid pose's frame: `out = q⁻¹·(p − t)`.
3
+ *
4
+ * The inverse of {@link pose3_apply_point_array}, and with the same operands: translation and unit
5
+ * rotation separately, each an array and an offset, so a `Transform64`'s lanes, a cloth's split frame
6
+ * arrays and a packed seven-float record are all read where they sit. Nothing is allocated.
7
+ *
8
+ * `out` may be `p`, and may be `t` at the same offset: the difference is held aside before the first
9
+ * write. It may not otherwise overlap `t` or `q`.
10
+ *
11
+ * @param {number[]|Float32Array|Float64Array} out
12
+ * @param {number} out_offset receives 3 floats
13
+ * @param {number[]|Float32Array|Float64Array} t the pose's translation `[x, y, z]`
14
+ * @param {number} t_offset
15
+ * @param {number[]|Float32Array|Float64Array} q the pose's rotation, a unit quaternion `[x, y, z, w]`
16
+ * @param {number} q_offset
17
+ * @param {number[]|Float32Array|Float64Array} p the point, in the frame the pose is expressed in
18
+ * @param {number} p_offset
19
+ */
20
+ export function pose3_apply_inverse_point_array(out: number[] | Float32Array | Float64Array, out_offset: number, t: number[] | Float32Array | Float64Array, t_offset: number, q: number[] | Float32Array | Float64Array, q_offset: number, p: number[] | Float32Array | Float64Array, p_offset: number): void;
21
+ //# sourceMappingURL=pose3_apply_inverse_point_array.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pose3_apply_inverse_point_array.d.ts","sourceRoot":"","sources":["../../../../../../src/core/geom/3d/pose/pose3_apply_inverse_point_array.js"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;GAkBG;AACH,qDATW,MAAM,EAAE,GAAC,YAAY,GAAC,YAAY,cAClC,MAAM,KACN,MAAM,EAAE,GAAC,YAAY,GAAC,YAAY,YAClC,MAAM,KACN,MAAM,EAAE,GAAC,YAAY,GAAC,YAAY,YAClC,MAAM,KACN,MAAM,EAAE,GAAC,YAAY,GAAC,YAAY,YAClC,MAAM,QAUhB"}
@@ -0,0 +1,36 @@
1
+ import { v3_quaternion_apply_inverse_array } from "../../vec3/v3_quaternion_apply_inverse.js";
2
+
3
+ /**
4
+ * Bring a point into a rigid pose's frame: `out = q⁻¹·(p − t)`.
5
+ *
6
+ * The inverse of {@link pose3_apply_point_array}, and with the same operands: translation and unit
7
+ * rotation separately, each an array and an offset, so a `Transform64`'s lanes, a cloth's split frame
8
+ * arrays and a packed seven-float record are all read where they sit. Nothing is allocated.
9
+ *
10
+ * `out` may be `p`, and may be `t` at the same offset: the difference is held aside before the first
11
+ * write. It may not otherwise overlap `t` or `q`.
12
+ *
13
+ * @param {number[]|Float32Array|Float64Array} out
14
+ * @param {number} out_offset receives 3 floats
15
+ * @param {number[]|Float32Array|Float64Array} t the pose's translation `[x, y, z]`
16
+ * @param {number} t_offset
17
+ * @param {number[]|Float32Array|Float64Array} q the pose's rotation, a unit quaternion `[x, y, z, w]`
18
+ * @param {number} q_offset
19
+ * @param {number[]|Float32Array|Float64Array} p the point, in the frame the pose is expressed in
20
+ * @param {number} p_offset
21
+ */
22
+ export function pose3_apply_inverse_point_array(out, out_offset, t, t_offset, q, q_offset, p, p_offset) {
23
+ const offset = scratch_offset;
24
+
25
+ offset[0] = p[p_offset] - t[t_offset];
26
+ offset[1] = p[p_offset + 1] - t[t_offset + 1];
27
+ offset[2] = p[p_offset + 2] - t[t_offset + 2];
28
+
29
+ v3_quaternion_apply_inverse_array(out, out_offset, offset, 0, q, q_offset);
30
+ }
31
+
32
+ /**
33
+ * @type {Float64Array}
34
+ * @private
35
+ */
36
+ const scratch_offset = new Float64Array(3);
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Bring a point out of a rigid pose's frame: `out = t + q·p`.
3
+ *
4
+ * A rigid pose here is a translation and a unit rotation with no scale — what a body, a holder, a
5
+ * cloth's local frame or a joint is — and the two are separate operands rather than one packed record,
6
+ * because the poses that use them are kept both ways: a `Transform64` holds its translation at lane 12
7
+ * and its rotation at lane 16, a cloth keeps its frame in two arrays, a contact record packs seven
8
+ * floats. Each operand is an array and an offset; nothing is allocated.
9
+ *
10
+ * The inverse is {@link pose3_apply_inverse_point_array}.
11
+ *
12
+ * `out` may be `p`, and may be `t` at the same offset: the rotated point is held aside before the
13
+ * first write. It may not otherwise overlap `t` or `q`.
14
+ *
15
+ * @param {number[]|Float32Array|Float64Array} out
16
+ * @param {number} out_offset receives 3 floats
17
+ * @param {number[]|Float32Array|Float64Array} t the pose's translation `[x, y, z]`
18
+ * @param {number} t_offset
19
+ * @param {number[]|Float32Array|Float64Array} q the pose's rotation, a unit quaternion `[x, y, z, w]`
20
+ * @param {number} q_offset
21
+ * @param {number[]|Float32Array|Float64Array} p the point, in the pose's frame
22
+ * @param {number} p_offset
23
+ */
24
+ export function pose3_apply_point_array(out: number[] | Float32Array | Float64Array, out_offset: number, t: number[] | Float32Array | Float64Array, t_offset: number, q: number[] | Float32Array | Float64Array, q_offset: number, p: number[] | Float32Array | Float64Array, p_offset: number): void;
25
+ //# sourceMappingURL=pose3_apply_point_array.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pose3_apply_point_array.d.ts","sourceRoot":"","sources":["../../../../../../src/core/geom/3d/pose/pose3_apply_point_array.js"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,6CATW,MAAM,EAAE,GAAC,YAAY,GAAC,YAAY,cAClC,MAAM,KACN,MAAM,EAAE,GAAC,YAAY,GAAC,YAAY,YAClC,MAAM,KACN,MAAM,EAAE,GAAC,YAAY,GAAC,YAAY,YAClC,MAAM,KACN,MAAM,EAAE,GAAC,YAAY,GAAC,YAAY,YAClC,MAAM,QAUhB"}
@@ -0,0 +1,40 @@
1
+ import { v3_quaternion_apply_array } from "../../vec3/v3_quaternion_apply.js";
2
+
3
+ /**
4
+ * Bring a point out of a rigid pose's frame: `out = t + q·p`.
5
+ *
6
+ * A rigid pose here is a translation and a unit rotation with no scale — what a body, a holder, a
7
+ * cloth's local frame or a joint is — and the two are separate operands rather than one packed record,
8
+ * because the poses that use them are kept both ways: a `Transform64` holds its translation at lane 12
9
+ * and its rotation at lane 16, a cloth keeps its frame in two arrays, a contact record packs seven
10
+ * floats. Each operand is an array and an offset; nothing is allocated.
11
+ *
12
+ * The inverse is {@link pose3_apply_inverse_point_array}.
13
+ *
14
+ * `out` may be `p`, and may be `t` at the same offset: the rotated point is held aside before the
15
+ * first write. It may not otherwise overlap `t` or `q`.
16
+ *
17
+ * @param {number[]|Float32Array|Float64Array} out
18
+ * @param {number} out_offset receives 3 floats
19
+ * @param {number[]|Float32Array|Float64Array} t the pose's translation `[x, y, z]`
20
+ * @param {number} t_offset
21
+ * @param {number[]|Float32Array|Float64Array} q the pose's rotation, a unit quaternion `[x, y, z, w]`
22
+ * @param {number} q_offset
23
+ * @param {number[]|Float32Array|Float64Array} p the point, in the pose's frame
24
+ * @param {number} p_offset
25
+ */
26
+ export function pose3_apply_point_array(out, out_offset, t, t_offset, q, q_offset, p, p_offset) {
27
+ const rotated = scratch_rotated;
28
+
29
+ v3_quaternion_apply_array(rotated, 0, p, p_offset, q, q_offset);
30
+
31
+ out[out_offset] = t[t_offset] + rotated[0];
32
+ out[out_offset + 1] = t[t_offset + 1] + rotated[1];
33
+ out[out_offset + 2] = t[t_offset + 2] + rotated[2];
34
+ }
35
+
36
+ /**
37
+ * @type {Float64Array}
38
+ * @private
39
+ */
40
+ const scratch_rotated = new Float64Array(3);
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Compose two rigid poses, a local one hung from a parent: `t' = t_p + q_p·t_l`, `q' = q_p ⊗ q_l`.
3
+ *
4
+ * What a child's pose is once its parent's is known — a bind pose built down a hierarchy, a seeded
5
+ * subtree's rest pose. The inverse is {@link pose3_to_local_array}.
6
+ *
7
+ * Every operand is an array and an offset, translation and rotation apart — see
8
+ * {@link pose3_apply_point_array} for why. Nothing is allocated.
9
+ *
10
+ * `out_t` may be `parent_t` or `local_t` at the same offset, and `out_q` may be `parent_q` or
11
+ * `local_q` at the same offset; the translation is written before the rotations are read, so `out_t`
12
+ * may not otherwise overlap any operand.
13
+ *
14
+ * @param {number[]|Float32Array|Float64Array} out_t receives 3 floats
15
+ * @param {number} out_t_offset
16
+ * @param {number[]|Float32Array|Float64Array} out_q receives 4 floats
17
+ * @param {number} out_q_offset
18
+ * @param {number[]|Float32Array|Float64Array} parent_t the parent's translation
19
+ * @param {number} parent_t_offset
20
+ * @param {number[]|Float32Array|Float64Array} parent_q the parent's rotation, a unit quaternion
21
+ * @param {number} parent_q_offset
22
+ * @param {number[]|Float32Array|Float64Array} local_t the local pose's translation, in the parent's frame
23
+ * @param {number} local_t_offset
24
+ * @param {number[]|Float32Array|Float64Array} local_q the local pose's rotation, likewise
25
+ * @param {number} local_q_offset
26
+ */
27
+ export function pose3_compose_array(out_t: number[] | Float32Array | Float64Array, out_t_offset: number, out_q: number[] | Float32Array | Float64Array, out_q_offset: number, parent_t: number[] | Float32Array | Float64Array, parent_t_offset: number, parent_q: number[] | Float32Array | Float64Array, parent_q_offset: number, local_t: number[] | Float32Array | Float64Array, local_t_offset: number, local_q: number[] | Float32Array | Float64Array, local_q_offset: number): void;
28
+ //# sourceMappingURL=pose3_compose_array.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pose3_compose_array.d.ts","sourceRoot":"","sources":["../../../../../../src/core/geom/3d/pose/pose3_compose_array.js"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,2CAbW,MAAM,EAAE,GAAC,YAAY,GAAC,YAAY,gBAClC,MAAM,SACN,MAAM,EAAE,GAAC,YAAY,GAAC,YAAY,gBAClC,MAAM,YACN,MAAM,EAAE,GAAC,YAAY,GAAC,YAAY,mBAClC,MAAM,YACN,MAAM,EAAE,GAAC,YAAY,GAAC,YAAY,mBAClC,MAAM,WACN,MAAM,EAAE,GAAC,YAAY,GAAC,YAAY,kBAClC,MAAM,WACN,MAAM,EAAE,GAAC,YAAY,GAAC,YAAY,kBAClC,MAAM,QAahB"}
@@ -0,0 +1,41 @@
1
+ import { quat3_multiply_array } from "../quaternion/quat3_multiply.js";
2
+ import { pose3_apply_point_array } from "./pose3_apply_point_array.js";
3
+
4
+ /**
5
+ * Compose two rigid poses, a local one hung from a parent: `t' = t_p + q_p·t_l`, `q' = q_p ⊗ q_l`.
6
+ *
7
+ * What a child's pose is once its parent's is known — a bind pose built down a hierarchy, a seeded
8
+ * subtree's rest pose. The inverse is {@link pose3_to_local_array}.
9
+ *
10
+ * Every operand is an array and an offset, translation and rotation apart — see
11
+ * {@link pose3_apply_point_array} for why. Nothing is allocated.
12
+ *
13
+ * `out_t` may be `parent_t` or `local_t` at the same offset, and `out_q` may be `parent_q` or
14
+ * `local_q` at the same offset; the translation is written before the rotations are read, so `out_t`
15
+ * may not otherwise overlap any operand.
16
+ *
17
+ * @param {number[]|Float32Array|Float64Array} out_t receives 3 floats
18
+ * @param {number} out_t_offset
19
+ * @param {number[]|Float32Array|Float64Array} out_q receives 4 floats
20
+ * @param {number} out_q_offset
21
+ * @param {number[]|Float32Array|Float64Array} parent_t the parent's translation
22
+ * @param {number} parent_t_offset
23
+ * @param {number[]|Float32Array|Float64Array} parent_q the parent's rotation, a unit quaternion
24
+ * @param {number} parent_q_offset
25
+ * @param {number[]|Float32Array|Float64Array} local_t the local pose's translation, in the parent's frame
26
+ * @param {number} local_t_offset
27
+ * @param {number[]|Float32Array|Float64Array} local_q the local pose's rotation, likewise
28
+ * @param {number} local_q_offset
29
+ */
30
+ export function pose3_compose_array(
31
+ out_t, out_t_offset,
32
+ out_q, out_q_offset,
33
+ parent_t, parent_t_offset,
34
+ parent_q, parent_q_offset,
35
+ local_t, local_t_offset,
36
+ local_q, local_q_offset
37
+ ) {
38
+ pose3_apply_point_array(out_t, out_t_offset, parent_t, parent_t_offset, parent_q, parent_q_offset, local_t, local_t_offset);
39
+
40
+ quat3_multiply_array(out_q, out_q_offset, parent_q, parent_q_offset, local_q, local_q_offset);
41
+ }
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Express a rigid pose in another pose's frame: `t' = q_f⁻¹·(t − t_f)`, `q' = q_f⁻¹ ⊗ q`.
3
+ *
4
+ * What a world pose is relative to a parent, a holder in a cloth's moving frame, a collider in the
5
+ * frame its contacts are solved in. The inverse is {@link pose3_compose_array}: composing the frame
6
+ * with the result gives the pose back.
7
+ *
8
+ * Every operand is an array and an offset, translation and rotation apart — see
9
+ * {@link pose3_apply_point_array} for why. Nothing is allocated.
10
+ *
11
+ * `out_t` may be `t` at the same offset and `out_q` may be `q` at the same offset; the translation is
12
+ * written before the rotation is read, so `out_t` may not overlap `q`, `frame_q` or `frame_t`
13
+ * otherwise, and `out_q` may not overlap `frame_q` otherwise.
14
+ *
15
+ * @param {number[]|Float32Array|Float64Array} out_t receives 3 floats
16
+ * @param {number} out_t_offset
17
+ * @param {number[]|Float32Array|Float64Array} out_q receives 4 floats
18
+ * @param {number} out_q_offset
19
+ * @param {number[]|Float32Array|Float64Array} frame_t the frame's translation
20
+ * @param {number} frame_t_offset
21
+ * @param {number[]|Float32Array|Float64Array} frame_q the frame's rotation, a unit quaternion
22
+ * @param {number} frame_q_offset
23
+ * @param {number[]|Float32Array|Float64Array} t the pose's translation, in the frame the frame is in
24
+ * @param {number} t_offset
25
+ * @param {number[]|Float32Array|Float64Array} q the pose's rotation, likewise
26
+ * @param {number} q_offset
27
+ */
28
+ export function pose3_to_local_array(out_t: number[] | Float32Array | Float64Array, out_t_offset: number, out_q: number[] | Float32Array | Float64Array, out_q_offset: number, frame_t: number[] | Float32Array | Float64Array, frame_t_offset: number, frame_q: number[] | Float32Array | Float64Array, frame_q_offset: number, t: number[] | Float32Array | Float64Array, t_offset: number, q: number[] | Float32Array | Float64Array, q_offset: number): void;
29
+ //# sourceMappingURL=pose3_to_local_array.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pose3_to_local_array.d.ts","sourceRoot":"","sources":["../../../../../../src/core/geom/3d/pose/pose3_to_local_array.js"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,4CAbW,MAAM,EAAE,GAAC,YAAY,GAAC,YAAY,gBAClC,MAAM,SACN,MAAM,EAAE,GAAC,YAAY,GAAC,YAAY,gBAClC,MAAM,WACN,MAAM,EAAE,GAAC,YAAY,GAAC,YAAY,kBAClC,MAAM,WACN,MAAM,EAAE,GAAC,YAAY,GAAC,YAAY,kBAClC,MAAM,KACN,MAAM,EAAE,GAAC,YAAY,GAAC,YAAY,YAClC,MAAM,KACN,MAAM,EAAE,GAAC,YAAY,GAAC,YAAY,YAClC,MAAM,QAahB"}
@@ -0,0 +1,42 @@
1
+ import { quat3_multiply_conjugate_left_array } from "../quaternion/quat3_multiply_conjugate_left_array.js";
2
+ import { pose3_apply_inverse_point_array } from "./pose3_apply_inverse_point_array.js";
3
+
4
+ /**
5
+ * Express a rigid pose in another pose's frame: `t' = q_f⁻¹·(t − t_f)`, `q' = q_f⁻¹ ⊗ q`.
6
+ *
7
+ * What a world pose is relative to a parent, a holder in a cloth's moving frame, a collider in the
8
+ * frame its contacts are solved in. The inverse is {@link pose3_compose_array}: composing the frame
9
+ * with the result gives the pose back.
10
+ *
11
+ * Every operand is an array and an offset, translation and rotation apart — see
12
+ * {@link pose3_apply_point_array} for why. Nothing is allocated.
13
+ *
14
+ * `out_t` may be `t` at the same offset and `out_q` may be `q` at the same offset; the translation is
15
+ * written before the rotation is read, so `out_t` may not overlap `q`, `frame_q` or `frame_t`
16
+ * otherwise, and `out_q` may not overlap `frame_q` otherwise.
17
+ *
18
+ * @param {number[]|Float32Array|Float64Array} out_t receives 3 floats
19
+ * @param {number} out_t_offset
20
+ * @param {number[]|Float32Array|Float64Array} out_q receives 4 floats
21
+ * @param {number} out_q_offset
22
+ * @param {number[]|Float32Array|Float64Array} frame_t the frame's translation
23
+ * @param {number} frame_t_offset
24
+ * @param {number[]|Float32Array|Float64Array} frame_q the frame's rotation, a unit quaternion
25
+ * @param {number} frame_q_offset
26
+ * @param {number[]|Float32Array|Float64Array} t the pose's translation, in the frame the frame is in
27
+ * @param {number} t_offset
28
+ * @param {number[]|Float32Array|Float64Array} q the pose's rotation, likewise
29
+ * @param {number} q_offset
30
+ */
31
+ export function pose3_to_local_array(
32
+ out_t, out_t_offset,
33
+ out_q, out_q_offset,
34
+ frame_t, frame_t_offset,
35
+ frame_q, frame_q_offset,
36
+ t, t_offset,
37
+ q, q_offset
38
+ ) {
39
+ pose3_apply_inverse_point_array(out_t, out_t_offset, frame_t, frame_t_offset, frame_q, frame_q_offset, t, t_offset);
40
+
41
+ quat3_multiply_conjugate_left_array(out_q, out_q_offset, frame_q, frame_q_offset, q, q_offset);
42
+ }
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Limit a rotation's angle: `out` turns about the same axis as `q` by `min(θ, max_angle)`, exactly.
3
+ *
4
+ * The rotation is read as an axis and an angle and the angle is replaced, so the answer is the
5
+ * limit itself and not an approximation of it. The alternative it exists to replace — nlerp from
6
+ * the identity towards `q` by `max_angle / θ` — follows the chord rather than the arc and
7
+ * undershoots more the larger `θ` is: at `θ = π` asked for `π/4` it turns `0.64` rad, not `0.785`.
8
+ *
9
+ * `q` and `-q` name the same rotation; the angle is measured on the one with `w ≥ 0`, so `θ` is
10
+ * the shorter turn, in `[0, π]`. A rotation within the limit is passed through unchanged, sign
11
+ * included; one beyond it is written with `w ≥ 0`. The identity (no axis) is within any limit.
12
+ *
13
+ * Sign convention: `(x, y, z, w)` — `w` last, matching {@link Quaternion} and the rest of the
14
+ * `core/geom/3d/quaternion/` family.
15
+ *
16
+ * `out` may be `q`: every component is read before the first write.
17
+ *
18
+ * **Precondition: `q` is a unit quaternion.** The angle is `2·atan2(|v|, w)`, which does not care,
19
+ * but a limited rotation is written unit and an unlimited one as it came.
20
+ *
21
+ * @param {number[]|Float32Array|Float64Array} out
22
+ * @param {number} out_offset receives 4 floats (x, y, z, w)
23
+ * @param {number[]|Float32Array|Float64Array} q `[x, y, z, w]`
24
+ * @param {number} q_offset
25
+ * @param {number} max_angle radians, `≥ 0`
26
+ */
27
+ export function quat3_clamp_angle_array(out: number[] | Float32Array | Float64Array, out_offset: number, q: number[] | Float32Array | Float64Array, q_offset: number, max_angle: number): void;
28
+ //# sourceMappingURL=quat3_clamp_angle_array.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quat3_clamp_angle_array.d.ts","sourceRoot":"","sources":["../../../../../../src/core/geom/3d/quaternion/quat3_clamp_angle_array.js"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,6CANW,MAAM,EAAE,GAAC,YAAY,GAAC,YAAY,cAClC,MAAM,KACN,MAAM,EAAE,GAAC,YAAY,GAAC,YAAY,YAClC,MAAM,aACN,MAAM,QAuChB"}
@@ -0,0 +1,66 @@
1
+ import { assert } from "../../../assert.js";
2
+
3
+ /**
4
+ * Limit a rotation's angle: `out` turns about the same axis as `q` by `min(θ, max_angle)`, exactly.
5
+ *
6
+ * The rotation is read as an axis and an angle and the angle is replaced, so the answer is the
7
+ * limit itself and not an approximation of it. The alternative it exists to replace — nlerp from
8
+ * the identity towards `q` by `max_angle / θ` — follows the chord rather than the arc and
9
+ * undershoots more the larger `θ` is: at `θ = π` asked for `π/4` it turns `0.64` rad, not `0.785`.
10
+ *
11
+ * `q` and `-q` name the same rotation; the angle is measured on the one with `w ≥ 0`, so `θ` is
12
+ * the shorter turn, in `[0, π]`. A rotation within the limit is passed through unchanged, sign
13
+ * included; one beyond it is written with `w ≥ 0`. The identity (no axis) is within any limit.
14
+ *
15
+ * Sign convention: `(x, y, z, w)` — `w` last, matching {@link Quaternion} and the rest of the
16
+ * `core/geom/3d/quaternion/` family.
17
+ *
18
+ * `out` may be `q`: every component is read before the first write.
19
+ *
20
+ * **Precondition: `q` is a unit quaternion.** The angle is `2·atan2(|v|, w)`, which does not care,
21
+ * but a limited rotation is written unit and an unlimited one as it came.
22
+ *
23
+ * @param {number[]|Float32Array|Float64Array} out
24
+ * @param {number} out_offset receives 4 floats (x, y, z, w)
25
+ * @param {number[]|Float32Array|Float64Array} q `[x, y, z, w]`
26
+ * @param {number} q_offset
27
+ * @param {number} max_angle radians, `≥ 0`
28
+ */
29
+ export function quat3_clamp_angle_array(out, out_offset, q, q_offset, max_angle) {
30
+ assert.isNumber(max_angle, 'max_angle');
31
+ assert.greaterThanOrEqual(max_angle, 0, 'max_angle must be non-negative');
32
+
33
+ let x = q[q_offset], y = q[q_offset + 1], z = q[q_offset + 2], w = q[q_offset + 3];
34
+
35
+ const pass_x = x, pass_y = y, pass_z = z, pass_w = w;
36
+
37
+ if (w < 0) {
38
+ x = -x;
39
+ y = -y;
40
+ z = -z;
41
+ w = -w;
42
+ }
43
+
44
+ const sin_half = Math.sqrt(x * x + y * y + z * z);
45
+
46
+ // atan2 rather than acos(w): accurate near the identity, where acos loses half the digits
47
+ const angle = 2 * Math.atan2(sin_half, w);
48
+
49
+ if (angle <= max_angle) {
50
+ out[out_offset] = pass_x;
51
+ out[out_offset + 1] = pass_y;
52
+ out[out_offset + 2] = pass_z;
53
+ out[out_offset + 3] = pass_w;
54
+
55
+ return;
56
+ }
57
+
58
+ // sin_half > 0 here: a zero vector part has angle 0, within any limit
59
+ const half = max_angle * 0.5;
60
+ const k = Math.sin(half) / sin_half;
61
+
62
+ out[out_offset] = x * k;
63
+ out[out_offset + 1] = y * k;
64
+ out[out_offset + 2] = z * k;
65
+ out[out_offset + 3] = Math.cos(half);
66
+ }
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Hamilton product with the left operand conjugated, `out = a* ⊗ b`, both read from arrays.
3
+ *
4
+ * For unit quaternions the conjugate is the inverse, so this is `a⁻¹ ⊗ b`: the rotation `b` expressed
5
+ * in the frame `a` rotates into — a world orientation written in a parent's or a body's frame. Callers
6
+ * used to build `a*` in a scratch array and hand it to {@link quat3_multiply_array}; the conjugate's
7
+ * signs are folded into the product here instead, so there is no scratch and no extra pass.
8
+ *
9
+ * Sign convention: `(x, y, z, w)` — `w` last, matching {@link Quaternion} and the rest of the
10
+ * `core/geom/3d/quaternion/` family.
11
+ *
12
+ * `out` may be `a` or `b`: all eight components are read before the first write.
13
+ *
14
+ * @param {number[]|Float32Array|Float64Array} out
15
+ * @param {number} out_offset offset into `out`; receives 4 floats (x, y, z, w)
16
+ * @param {number[]|Float32Array|Float64Array} a `[x, y, z, w]`, the operand that is conjugated
17
+ * @param {number} a_offset
18
+ * @param {number[]|Float32Array|Float64Array} b `[x, y, z, w]`
19
+ * @param {number} b_offset
20
+ */
21
+ export function quat3_multiply_conjugate_left_array(out: number[] | Float32Array | Float64Array, out_offset: number, a: number[] | Float32Array | Float64Array, a_offset: number, b: number[] | Float32Array | Float64Array, b_offset: number): void;
22
+ //# sourceMappingURL=quat3_multiply_conjugate_left_array.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quat3_multiply_conjugate_left_array.d.ts","sourceRoot":"","sources":["../../../../../../src/core/geom/3d/quaternion/quat3_multiply_conjugate_left_array.js"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,yDAPW,MAAM,EAAE,GAAC,YAAY,GAAC,YAAY,cAClC,MAAM,KACN,MAAM,EAAE,GAAC,YAAY,GAAC,YAAY,YAClC,MAAM,KACN,MAAM,EAAE,GAAC,YAAY,GAAC,YAAY,YAClC,MAAM,QAWhB"}