@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
@@ -15,9 +15,14 @@
15
15
  * @param {number} dt seconds, the fixed step the discovered rows will be used
16
16
  * across — how far a particle carries its current velocity before anything
17
17
  * gets a chance to stop it
18
+ * @param {number} kinematic_travel metres, the furthest any held particle is
19
+ * carried this step. A cloth at rest that a holder yanks has no velocity to
20
+ * reach with and still moves, dragged by the particles it hangs from, so every
21
+ * free particle reaches this much further. Zero for a cloth whose holders ride
22
+ * its frame.
18
23
  * @returns {number} how many contact rows were created
19
24
  */
20
- export function cloth_contact_find(state: ClothState, table: Float32Array | Float64Array, keys: Int32Array, count: number, dt: number): number;
25
+ export function cloth_contact_find(state: ClothState, table: Float32Array | Float64Array, keys: Int32Array, count: number, dt: number, kinematic_travel: number): number;
21
26
  /**
22
27
  * # Finding the contacts, once per step
23
28
  *
@@ -1 +1 @@
1
- {"version":3,"file":"cloth_contact_find.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/physics/cloth/solver/cloth_contact_find.js"],"names":[],"mappings":"AAgHA;;;;;;;;;;;;;;;;;;GAkBG;AACH,6DARW,YAAY,GAAC,YAAY,QACzB,UAAU,SACV,MAAM,MACN,MAAM,GAGJ,MAAM,CAwLlB;AAlSD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2EG;AAEH;;;;;;;;;GASG;AACH,mCAFU,MAAM,CAEsB"}
1
+ {"version":3,"file":"cloth_contact_find.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/physics/cloth/solver/cloth_contact_find.js"],"names":[],"mappings":"AAiHA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,6DAbW,YAAY,GAAC,YAAY,QACzB,UAAU,SACV,MAAM,MACN,MAAM,oBAGN,MAAM,GAKJ,MAAM,CAwLlB;AAvSD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2EG;AAEH;;;;;;;;;GASG;AACH,mCAFU,MAAM,CAEsB"}
@@ -1,3 +1,4 @@
1
+ import { v3_length } from "../../../../core/geom/vec3/v3_length.js";
1
2
  import {
2
3
  CCR_AABB_MAX_X,
3
4
  CCR_AABB_MAX_Y,
@@ -127,9 +128,14 @@ export const CLOTH_CONTACT_MARGIN = 1;
127
128
  * @param {number} dt seconds, the fixed step the discovered rows will be used
128
129
  * across — how far a particle carries its current velocity before anything
129
130
  * gets a chance to stop it
131
+ * @param {number} kinematic_travel metres, the furthest any held particle is
132
+ * carried this step. A cloth at rest that a holder yanks has no velocity to
133
+ * reach with and still moves, dragged by the particles it hangs from, so every
134
+ * free particle reaches this much further. Zero for a cloth whose holders ride
135
+ * its frame.
130
136
  * @returns {number} how many contact rows were created
131
137
  */
132
- export function cloth_contact_find(state, table, keys, count, dt) {
138
+ export function cloth_contact_find(state, table, keys, count, dt, kinematic_travel) {
133
139
  const particle_count = state.particle_count;
134
140
 
135
141
  const collider = state.contact_collider;
@@ -167,7 +173,7 @@ export function cloth_contact_find(state, table, keys, count, dt) {
167
173
  for (let record = 0; record < count; record++) {
168
174
  const r = record * CCR_STRIDE;
169
175
 
170
- TRAVEL[record] = Math.hypot(
176
+ TRAVEL[record] = v3_length(
171
177
  table[r + CCR_TX] - table[r + CCR_PREV_TX],
172
178
  table[r + CCR_TY] - table[r + CCR_PREV_TY],
173
179
  table[r + CCR_TZ] - table[r + CCR_PREV_TZ]
@@ -213,7 +219,7 @@ export function cloth_contact_find(state, table, keys, count, dt) {
213
219
  // How far this particle carries its current velocity across the step.
214
220
  // Hoisted out of the record loop: it is a property of the particle, and
215
221
  // the loop below is the hot one.
216
- const travel = dt * Math.hypot(velocity[p], velocity[p + 1], velocity[p + 2]);
222
+ const travel = dt * v3_length(velocity[p], velocity[p + 1], velocity[p + 2]) + kinematic_travel;
217
223
 
218
224
  let found = 0;
219
225
 
@@ -0,0 +1,114 @@
1
+ /**
2
+ * Whether the held particles lie on one line, and which: written to `line` as
3
+ * the origin then the unit direction.
4
+ *
5
+ * The origin is the first held particle and the direction runs to the one
6
+ * furthest from it, which spans at least half of the set. Every held particle is
7
+ * then measured off that line.
8
+ *
9
+ * @param {Float64Array} line out, {@link CLOTH_HOLD_LINE_WORDS}
10
+ * @param {Float32Array} position
11
+ * @param {Int32Array} held particle indices
12
+ * @param {number} held_count
13
+ * @returns {boolean} `false` when there are fewer than two distinct held points
14
+ * or they are not on one line; `line` is then not written
15
+ */
16
+ export function cloth_hold_line_fit(line: Float64Array, position: Float32Array, held: Int32Array, held_count: number): boolean;
17
+ /**
18
+ * Take one Newton step of the substep's energy along the turn about `line`, and
19
+ * turn every free particle by the angle it gives — see the module docblock.
20
+ *
21
+ * @param {ClothState} state
22
+ * @param {Float64Array} line from {@link cloth_hold_line_fit}
23
+ * @param {number} inverse_h_squared `1/h²` for the substep in progress
24
+ * @param {Float32Array|Float64Array|null} collider_table as the vertex update
25
+ * takes it; `null` skips the contact rows
26
+ * @returns {number} the angle turned, radians; `0` when there is nothing to turn
27
+ */
28
+ export function cloth_hold_line_turn(state: ClothState, line: Float64Array, inverse_h_squared: number, collider_table: Float32Array | Float64Array | null): number;
29
+ /**
30
+ * # The turn about a hold line — one more block of the descent
31
+ *
32
+ * VBD is block coordinate descent on the step's energy, one 3×3 block per
33
+ * particle. A cloth whose held particles lie on one line has a motion no such
34
+ * block can make: turning the whole cloth about that line as a rigid body. Every
35
+ * internal row is unchanged by it — its ends turn together, or one of them is on
36
+ * the axis — so the only parts of the energy that see the turn are the inertial
37
+ * term and the rows measured from outside the cloth. When the line is vertical
38
+ * nothing outside restores it either, because gravity is parallel to the axis.
39
+ *
40
+ * A vertex update moves one particle, so every update adds `x_i × m·Δx_i` of
41
+ * angular momentum about the line, and the step stopped at a fabric's iteration
42
+ * count leaves a residual whose moment about it is not zero. The warm start keeps
43
+ * a quarter of each hard multiplier (§5.2), so a cloth at rest re-solves three
44
+ * quarters of its weight every substep, is never a fixed point, and leaves that
45
+ * residual every substep. A flag on a pole turned at ten degrees a second for as
46
+ * long as it was run (PLAN §18, `MEASUREMENTS.md` §63).
47
+ *
48
+ * So the turn gets a block of its own: **one Newton step of the substep's energy
49
+ * along the rotation about the hold line**, then every free particle turned by
50
+ * the angle it gives. It is a descent step on the same energy as the vertex
51
+ * updates, so §5.3 is untouched, and it changes no row, multiplier or constant.
52
+ *
53
+ * ## What enters
54
+ *
55
+ * With `a` the line's unit direction, `r_i` a particle's offset from the line's
56
+ * origin and `t_i = a × r_i` its velocity under a unit turn, along the path
57
+ * `x_i(θ) = o + R(θ)·r_i`:
58
+ *
59
+ * g = dE/dθ = Σ t_i·∇E_i
60
+ * H = d²E/dθ² = Σ t_iᵀ·H_i·t_i + Σ ∇E_i·(a(a·r_i) − r_i)
61
+ * θ = −g/H
62
+ *
63
+ * - `∇E_i` and `H_i` are the vertex update's own assembly with the internal rows
64
+ * left out: the inertial term `(m/h²)(x − y)`, the leash rows, the backstop
65
+ * rows and the contacts. Stretch, bend and self-collision rows are invariant
66
+ * under the turn: a row's energy does not change along the path, so its share
67
+ * of `g` is zero and its two shares of `H` cancel, and leaving it out is
68
+ * leaving out a zero. A tether is invariant too, since it is measured from a
69
+ * held particle and that is on the axis, but it shares its accumulation with
70
+ * the slack row, which is not. It enters, and it can only shorten the step.
71
+ * - The last sum is the path's own curvature, `d²x/dθ² = −r⊥`. About a vertical
72
+ * axis gravity has no part in it and what is left is close to zero; about a
73
+ * horizontal one it is the pendulum's gravity stiffness. It is added only where
74
+ * it is positive, which keeps `H` at least the first sum, positive definite
75
+ * through the mass term: a step no longer than the one without it.
76
+ *
77
+ * ## When it runs
78
+ *
79
+ * When the held particles lie on one line **at this substep**, at two or more
80
+ * distinct points — a fact about the holds the predict already has in hand,
81
+ * since it carries every held particle. A single held point has three free turns
82
+ * and a cloth nothing holds has six; this block is the line's, and neither of
83
+ * those is handled here. It runs on a line gravity restores too, a horizontal
84
+ * one included, and there it has slowed some sleeps and kept one cloth awake
85
+ * (PLAN §18).
86
+ *
87
+ * It runs once a substep, in the **last** iteration, after the sweep and before
88
+ * that iteration's dual update. Run in every iteration it measured no better on
89
+ * a flag and cost 9–19% of a step rather than 3–9% (`MEASUREMENTS.md` §66).
90
+ *
91
+ * @author Alex Goldring
92
+ * @copyright Company Named Limited (c) 2026
93
+ */
94
+ /**
95
+ * How far a held particle may sit off the line and still be on it, as a
96
+ * fraction of the largest coordinate among the held particles.
97
+ *
98
+ * Relative, because what it separates is rounding from geometry, and rounding is
99
+ * a proportion of magnitude. Held positions are `Float32` and are carried through
100
+ * the step in double and stored again at each substep. A flag turned off every
101
+ * axis, whose hoist is straight in exact arithmetic, measured at most 6.3e-8 of
102
+ * its largest coordinate off its own line — half a unit in the last place —
103
+ * from the origin out to four kilometres. This is 240 times that, and 15 µm at a
104
+ * metre. `MEASUREMENTS.md` §66.
105
+ *
106
+ * @type {number}
107
+ */
108
+ export const CLOTH_HOLD_LINE_TOLERANCE: number;
109
+ /**
110
+ * Words of a hold line: the origin, then the unit direction.
111
+ * @type {number}
112
+ */
113
+ export const CLOTH_HOLD_LINE_WORDS: number;
114
+ //# sourceMappingURL=cloth_hold_line.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloth_hold_line.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/physics/cloth/solver/cloth_hold_line.js"],"names":[],"mappings":"AAyGA;;;;;;;;;;;;;;GAcG;AACH,0CAPW,YAAY,YACZ,YAAY,QACZ,UAAU,cACV,MAAM,GACJ,OAAO,CAiGnB;AAED;;;;;;;;;;GAUG;AACH,8DANW,YAAY,qBACZ,MAAM,kBACN,YAAY,GAAC,YAAY,GAAC,IAAI,GAE5B,MAAM,CAqHlB;AArUD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgEG;AAEH;;;;;;;;;;;;;GAaG;AACH,wCAFU,MAAM,CAEkC;AAElD;;;GAGG;AACH,oCAFU,MAAM,CAEuB"}
@@ -0,0 +1,350 @@
1
+ import { cloth_backstop_accumulate } from "./constraint/cloth_backstop_row.js";
2
+ import { cloth_contact_accumulate } from "./constraint/cloth_contact_row.js";
3
+ import { cloth_leash_accumulate } from "./constraint/cloth_leash_row.js";
4
+ import {
5
+ CVA_F_X,
6
+ CVA_F_Y,
7
+ CVA_F_Z,
8
+ CVA_H_XX,
9
+ CVA_H_XY,
10
+ CVA_H_XZ,
11
+ CVA_H_YY,
12
+ CVA_H_YZ,
13
+ CVA_H_ZZ,
14
+ CVA_STRIDE,
15
+ cloth_vertex_accumulator_seed
16
+ } from "./cloth_vertex_accumulator.js";
17
+
18
+ /**
19
+ * # The turn about a hold line — one more block of the descent
20
+ *
21
+ * VBD is block coordinate descent on the step's energy, one 3×3 block per
22
+ * particle. A cloth whose held particles lie on one line has a motion no such
23
+ * block can make: turning the whole cloth about that line as a rigid body. Every
24
+ * internal row is unchanged by it — its ends turn together, or one of them is on
25
+ * the axis — so the only parts of the energy that see the turn are the inertial
26
+ * term and the rows measured from outside the cloth. When the line is vertical
27
+ * nothing outside restores it either, because gravity is parallel to the axis.
28
+ *
29
+ * A vertex update moves one particle, so every update adds `x_i × m·Δx_i` of
30
+ * angular momentum about the line, and the step stopped at a fabric's iteration
31
+ * count leaves a residual whose moment about it is not zero. The warm start keeps
32
+ * a quarter of each hard multiplier (§5.2), so a cloth at rest re-solves three
33
+ * quarters of its weight every substep, is never a fixed point, and leaves that
34
+ * residual every substep. A flag on a pole turned at ten degrees a second for as
35
+ * long as it was run (PLAN §18, `MEASUREMENTS.md` §63).
36
+ *
37
+ * So the turn gets a block of its own: **one Newton step of the substep's energy
38
+ * along the rotation about the hold line**, then every free particle turned by
39
+ * the angle it gives. It is a descent step on the same energy as the vertex
40
+ * updates, so §5.3 is untouched, and it changes no row, multiplier or constant.
41
+ *
42
+ * ## What enters
43
+ *
44
+ * With `a` the line's unit direction, `r_i` a particle's offset from the line's
45
+ * origin and `t_i = a × r_i` its velocity under a unit turn, along the path
46
+ * `x_i(θ) = o + R(θ)·r_i`:
47
+ *
48
+ * g = dE/dθ = Σ t_i·∇E_i
49
+ * H = d²E/dθ² = Σ t_iᵀ·H_i·t_i + Σ ∇E_i·(a(a·r_i) − r_i)
50
+ * θ = −g/H
51
+ *
52
+ * - `∇E_i` and `H_i` are the vertex update's own assembly with the internal rows
53
+ * left out: the inertial term `(m/h²)(x − y)`, the leash rows, the backstop
54
+ * rows and the contacts. Stretch, bend and self-collision rows are invariant
55
+ * under the turn: a row's energy does not change along the path, so its share
56
+ * of `g` is zero and its two shares of `H` cancel, and leaving it out is
57
+ * leaving out a zero. A tether is invariant too, since it is measured from a
58
+ * held particle and that is on the axis, but it shares its accumulation with
59
+ * the slack row, which is not. It enters, and it can only shorten the step.
60
+ * - The last sum is the path's own curvature, `d²x/dθ² = −r⊥`. About a vertical
61
+ * axis gravity has no part in it and what is left is close to zero; about a
62
+ * horizontal one it is the pendulum's gravity stiffness. It is added only where
63
+ * it is positive, which keeps `H` at least the first sum, positive definite
64
+ * through the mass term: a step no longer than the one without it.
65
+ *
66
+ * ## When it runs
67
+ *
68
+ * When the held particles lie on one line **at this substep**, at two or more
69
+ * distinct points — a fact about the holds the predict already has in hand,
70
+ * since it carries every held particle. A single held point has three free turns
71
+ * and a cloth nothing holds has six; this block is the line's, and neither of
72
+ * those is handled here. It runs on a line gravity restores too, a horizontal
73
+ * one included, and there it has slowed some sleeps and kept one cloth awake
74
+ * (PLAN §18).
75
+ *
76
+ * It runs once a substep, in the **last** iteration, after the sweep and before
77
+ * that iteration's dual update. Run in every iteration it measured no better on
78
+ * a flag and cost 9–19% of a step rather than 3–9% (`MEASUREMENTS.md` §66).
79
+ *
80
+ * @author Alex Goldring
81
+ * @copyright Company Named Limited (c) 2026
82
+ */
83
+
84
+ /**
85
+ * How far a held particle may sit off the line and still be on it, as a
86
+ * fraction of the largest coordinate among the held particles.
87
+ *
88
+ * Relative, because what it separates is rounding from geometry, and rounding is
89
+ * a proportion of magnitude. Held positions are `Float32` and are carried through
90
+ * the step in double and stored again at each substep. A flag turned off every
91
+ * axis, whose hoist is straight in exact arithmetic, measured at most 6.3e-8 of
92
+ * its largest coordinate off its own line — half a unit in the last place —
93
+ * from the origin out to four kilometres. This is 240 times that, and 15 µm at a
94
+ * metre. `MEASUREMENTS.md` §66.
95
+ *
96
+ * @type {number}
97
+ */
98
+ export const CLOTH_HOLD_LINE_TOLERANCE = 2 ** -16;
99
+
100
+ /**
101
+ * Words of a hold line: the origin, then the unit direction.
102
+ * @type {number}
103
+ */
104
+ export const CLOTH_HOLD_LINE_WORDS = 6;
105
+
106
+ /**
107
+ * Whether the held particles lie on one line, and which: written to `line` as
108
+ * the origin then the unit direction.
109
+ *
110
+ * The origin is the first held particle and the direction runs to the one
111
+ * furthest from it, which spans at least half of the set. Every held particle is
112
+ * then measured off that line.
113
+ *
114
+ * @param {Float64Array} line out, {@link CLOTH_HOLD_LINE_WORDS}
115
+ * @param {Float32Array} position
116
+ * @param {Int32Array} held particle indices
117
+ * @param {number} held_count
118
+ * @returns {boolean} `false` when there are fewer than two distinct held points
119
+ * or they are not on one line; `line` is then not written
120
+ */
121
+ export function cloth_hold_line_fit(line, position, held, held_count) {
122
+ if (held_count < 2) {
123
+ return false;
124
+ }
125
+
126
+ const o = held[0] * 3;
127
+
128
+ const ox = position[o];
129
+ const oy = position[o + 1];
130
+ const oz = position[o + 2];
131
+
132
+ let scale = Math.max(Math.abs(ox), Math.abs(oy), Math.abs(oz));
133
+
134
+ let far = o;
135
+ let far_squared = 0;
136
+
137
+ for (let k = 1; k < held_count; k++) {
138
+ const p = held[k] * 3;
139
+
140
+ const x = position[p];
141
+ const y = position[p + 1];
142
+ const z = position[p + 2];
143
+
144
+ const size_x = Math.abs(x);
145
+ const size_y = Math.abs(y);
146
+ const size_z = Math.abs(z);
147
+
148
+ if (size_x > scale) {
149
+ scale = size_x;
150
+ }
151
+
152
+ if (size_y > scale) {
153
+ scale = size_y;
154
+ }
155
+
156
+ if (size_z > scale) {
157
+ scale = size_z;
158
+ }
159
+
160
+ const dx = x - ox;
161
+ const dy = y - oy;
162
+ const dz = z - oz;
163
+
164
+ const d_squared = dx * dx + dy * dy + dz * dz;
165
+
166
+ if (d_squared > far_squared) {
167
+ far_squared = d_squared;
168
+ far = p;
169
+ }
170
+ }
171
+
172
+ const tolerance = CLOTH_HOLD_LINE_TOLERANCE * scale;
173
+
174
+ const far_distance = Math.sqrt(far_squared);
175
+
176
+ if (!(far_distance > tolerance)) {
177
+ // One point, however many particles are held at it.
178
+ return false;
179
+ }
180
+
181
+ const inverse = 1 / far_distance;
182
+
183
+ const ax = (position[far] - ox) * inverse;
184
+ const ay = (position[far + 1] - oy) * inverse;
185
+ const az = (position[far + 2] - oz) * inverse;
186
+
187
+ const tolerance_squared = tolerance * tolerance;
188
+
189
+ for (let k = 1; k < held_count; k++) {
190
+ const p = held[k] * 3;
191
+
192
+ const rx = position[p] - ox;
193
+ const ry = position[p + 1] - oy;
194
+ const rz = position[p + 2] - oz;
195
+
196
+ const along = rx * ax + ry * ay + rz * az;
197
+
198
+ const qx = rx - along * ax;
199
+ const qy = ry - along * ay;
200
+ const qz = rz - along * az;
201
+
202
+ if (qx * qx + qy * qy + qz * qz > tolerance_squared) {
203
+ return false;
204
+ }
205
+ }
206
+
207
+ line[0] = ox;
208
+ line[1] = oy;
209
+ line[2] = oz;
210
+ line[3] = ax;
211
+ line[4] = ay;
212
+ line[5] = az;
213
+
214
+ return true;
215
+ }
216
+
217
+ /**
218
+ * Take one Newton step of the substep's energy along the turn about `line`, and
219
+ * turn every free particle by the angle it gives — see the module docblock.
220
+ *
221
+ * @param {ClothState} state
222
+ * @param {Float64Array} line from {@link cloth_hold_line_fit}
223
+ * @param {number} inverse_h_squared `1/h²` for the substep in progress
224
+ * @param {Float32Array|Float64Array|null} collider_table as the vertex update
225
+ * takes it; `null` skips the contact rows
226
+ * @returns {number} the angle turned, radians; `0` when there is nothing to turn
227
+ */
228
+ export function cloth_hold_line_turn(state, line, inverse_h_squared, collider_table) {
229
+ const particle_count = state.particle_count;
230
+
231
+ const position = state.position;
232
+ const inertial = state.inertial;
233
+ const mass_inverse = state.mass_inverse;
234
+
235
+ const ox = line[0];
236
+ const oy = line[1];
237
+ const oz = line[2];
238
+ const ax = line[3];
239
+ const ay = line[4];
240
+ const az = line[5];
241
+
242
+ const accumulator = ACCUMULATOR;
243
+
244
+ let gradient = 0;
245
+ let curvature = 0;
246
+ let path = 0;
247
+
248
+ for (let i = 0; i < particle_count; i++) {
249
+ const inverse_mass = mass_inverse[i];
250
+
251
+ if (inverse_mass === 0) {
252
+ continue;
253
+ }
254
+
255
+ const p = i * 3;
256
+
257
+ const x = position[p];
258
+ const y = position[p + 1];
259
+ const z = position[p + 2];
260
+
261
+ const rx = x - ox;
262
+ const ry = y - oy;
263
+ const rz = z - oz;
264
+
265
+ const tx = ay * rz - az * ry;
266
+ const ty = az * rx - ax * rz;
267
+ const tz = ax * ry - ay * rx;
268
+
269
+ // The vertex update's assembly, seeded the same way, with only the rows
270
+ // the turn can see.
271
+ cloth_vertex_accumulator_seed(accumulator, position, inertial, p, inverse_h_squared / inverse_mass);
272
+
273
+ cloth_leash_accumulate(accumulator, state, i);
274
+ cloth_backstop_accumulate(accumulator, state, i);
275
+
276
+ if (collider_table !== null) {
277
+ cloth_contact_accumulate(accumulator, state, i, collider_table);
278
+ }
279
+
280
+ // `f = −∇E_i`
281
+ const fx = accumulator[CVA_F_X];
282
+ const fy = accumulator[CVA_F_Y];
283
+ const fz = accumulator[CVA_F_Z];
284
+
285
+ gradient -= tx * fx + ty * fy + tz * fz;
286
+
287
+ const h_xx = accumulator[CVA_H_XX];
288
+ const h_yy = accumulator[CVA_H_YY];
289
+ const h_zz = accumulator[CVA_H_ZZ];
290
+ const h_xy = accumulator[CVA_H_XY];
291
+ const h_xz = accumulator[CVA_H_XZ];
292
+ const h_yz = accumulator[CVA_H_YZ];
293
+
294
+ curvature += tx * (h_xx * tx + h_xy * ty + h_xz * tz)
295
+ + ty * (h_xy * tx + h_yy * ty + h_yz * tz)
296
+ + tz * (h_xz * tx + h_yz * ty + h_zz * tz);
297
+
298
+ // `∇E_i·(a(a·r) − r)`, which is `f·r⊥`
299
+ const along = ax * rx + ay * ry + az * rz;
300
+
301
+ path += fx * (rx - along * ax) + fy * (ry - along * ay) + fz * (rz - along * az);
302
+ }
303
+
304
+ if (path > 0) {
305
+ curvature += path;
306
+ }
307
+
308
+ if (!(curvature > 0)) {
309
+ // Every free particle is on the axis: there is no turn to take.
310
+ return 0;
311
+ }
312
+
313
+ const theta = -gradient / curvature;
314
+
315
+ if (theta === 0) {
316
+ return 0;
317
+ }
318
+
319
+ // Rodrigues, about the line through `o`.
320
+ const cos = Math.cos(theta);
321
+ const sin = Math.sin(theta);
322
+ const versine = 1 - cos;
323
+
324
+ for (let i = 0; i < particle_count; i++) {
325
+ if (mass_inverse[i] === 0) {
326
+ continue;
327
+ }
328
+
329
+ const p = i * 3;
330
+
331
+ const rx = position[p] - ox;
332
+ const ry = position[p + 1] - oy;
333
+ const rz = position[p + 2] - oz;
334
+
335
+ const along = (ax * rx + ay * ry + az * rz) * versine;
336
+
337
+ position[p] = ox + rx * cos + (ay * rz - az * ry) * sin + ax * along;
338
+ position[p + 1] = oy + ry * cos + (az * rx - ax * rz) * sin + ay * along;
339
+ position[p + 2] = oz + rz * cos + (ax * ry - ay * rx) * sin + az * along;
340
+ }
341
+
342
+ return theta;
343
+ }
344
+
345
+ /**
346
+ * The `(f, H)` scratch, laid out as the vertex update's. Module-level and reused.
347
+ * @type {Float64Array}
348
+ * @private
349
+ */
350
+ const ACCUMULATOR = new Float64Array(CVA_STRIDE);
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Total kinetic energy of a cloth's free particles, `Σ ½·|v|²/w` over every
3
+ * particle with a non-zero inverse mass `w`, in joules.
4
+ *
5
+ * A held particle (`w = 0`) is skipped rather than treated as infinitely heavy:
6
+ * its velocity is whatever its holder gave it, and a cloth hanging still from a
7
+ * moving hand has come to rest in every sense §7 P5 means. A cloth that has
8
+ * settled reads zero and a cloth that is ringing does not, which is why the
9
+ * measurements read this rather than a displacement threshold.
10
+ *
11
+ * A diagnostic for specs, measurements and the playgrounds; nothing in the
12
+ * step reads it.
13
+ *
14
+ * @param {ClothState} state
15
+ * @returns {number} joules
16
+ *
17
+ * @author Alex Goldring
18
+ * @copyright Company Named Limited (c) 2026
19
+ */
20
+ export function cloth_kinetic_energy(state: ClothState): number;
21
+ //# sourceMappingURL=cloth_kinetic_energy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloth_kinetic_energy.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/physics/cloth/solver/cloth_kinetic_energy.js"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,yDALa,MAAM,CA8BlB"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Total kinetic energy of a cloth's free particles, `Σ ½·|v|²/w` over every
3
+ * particle with a non-zero inverse mass `w`, in joules.
4
+ *
5
+ * A held particle (`w = 0`) is skipped rather than treated as infinitely heavy:
6
+ * its velocity is whatever its holder gave it, and a cloth hanging still from a
7
+ * moving hand has come to rest in every sense §7 P5 means. A cloth that has
8
+ * settled reads zero and a cloth that is ringing does not, which is why the
9
+ * measurements read this rather than a displacement threshold.
10
+ *
11
+ * A diagnostic for specs, measurements and the playgrounds; nothing in the
12
+ * step reads it.
13
+ *
14
+ * @param {ClothState} state
15
+ * @returns {number} joules
16
+ *
17
+ * @author Alex Goldring
18
+ * @copyright Company Named Limited (c) 2026
19
+ */
20
+ export function cloth_kinetic_energy(state) {
21
+ const particle_count = state.particle_count;
22
+
23
+ const mass_inverse = state.mass_inverse;
24
+ const velocity = state.velocity;
25
+
26
+ let energy = 0;
27
+
28
+ for (let i = 0; i < particle_count; i++) {
29
+ const w = mass_inverse[i];
30
+
31
+ if (w === 0) {
32
+ continue;
33
+ }
34
+
35
+ const p = i * 3;
36
+
37
+ const vx = velocity[p];
38
+ const vy = velocity[p + 1];
39
+ const vz = velocity[p + 2];
40
+
41
+ energy += 0.5 * (vx * vx + vy * vy + vz * vz) / w;
42
+ }
43
+
44
+ return energy;
45
+ }
@@ -0,0 +1,32 @@
1
+ /**
2
+ * The particle graph a cloth's rows imply: an edge between every two particles
3
+ * that share a row, as a sorted CSR adjacency.
4
+ *
5
+ * A stretch row couples its two endpoints; a bend stencil couples all six pairs
6
+ * of its four particles, since every one of them appears in the same row. Two
7
+ * build-time consumers want exactly this set — the colouring, where an edge is
8
+ * a pair that must not be updated at once (`cloth_color_particles.js`), and the
9
+ * self-collision exclusions, where it is a pair a row already governs
10
+ * (`cloth_self_find.js`) — and this is the one place it is built.
11
+ *
12
+ * The set is deduplicated, because a garment adds every hinge's shared edge
13
+ * once as a stretch row and again as a bend pair, so duplicates are the common
14
+ * case; and a row that names one particle twice couples nothing. Each particle's
15
+ * partners come out ascending, which is the contract the exclusion scans read.
16
+ *
17
+ * Build-time only: it allocates its result and a scratch the size of the
18
+ * half-edge list.
19
+ *
20
+ * @param {number} particle_count
21
+ * @param {Int32Array|number[]} stretch_particle particle index pairs, 2 per row
22
+ * @param {number} stretch_count
23
+ * @param {Int32Array|number[]} bend_particle particle index quads, 4 per row
24
+ * @param {number} bend_count
25
+ * @returns {{offset: Int32Array, partner: Int32Array}} `partner[offset[i] .. offset[i + 1])` are the
26
+ * particles sharing a row with `i`, ascending, without `i` itself
27
+ */
28
+ export function cloth_particle_coupling(particle_count: number, stretch_particle: Int32Array | number[], stretch_count: number, bend_particle: Int32Array | number[], bend_count: number): {
29
+ offset: Int32Array;
30
+ partner: Int32Array;
31
+ };
32
+ //# sourceMappingURL=cloth_particle_coupling.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloth_particle_coupling.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/physics/cloth/solver/cloth_particle_coupling.js"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wDARW,MAAM,oBACN,UAAU,GAAC,MAAM,EAAE,iBACnB,MAAM,iBACN,UAAU,GAAC,MAAM,EAAE,cACnB,MAAM,GACJ;IAAC,MAAM,EAAE,UAAU,CAAC;IAAC,OAAO,EAAE,UAAU,CAAA;CAAC,CAyGrD"}