@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,7 +1,13 @@
1
+ import { v3_distance_array } from "../../../../core/geom/vec3/v3_distance_array.js";
2
+ import { clamp01 } from "../../../../core/math/clamp01.js";
3
+ import { csr_build_incidence } from "../../../../core/graph/csr/csr_build_incidence.js";
1
4
  import { ClothState } from "../solver/ClothState.js";
2
5
  import { ClothDynamicsFlags } from "./ClothDynamicsFlags.js";
3
6
  import { cloth_self_closest_free_pair, cloth_self_exclusions } from "../solver/cloth_self_find.js";
4
7
  import { cloth_bend_ratio, cloth_strain_allowance } from "./cloth_dynamics_map.js";
8
+ import { cloth_edge_incidence } from "./cloth_geodesic.js";
9
+ import { cloth_bend_stencil_weights } from "../solver/constraint/cloth_bend_row.js";
10
+ import { cloth_particle_of_source } from "../solver/cloth_particle_of_source.js";
5
11
 
6
12
  /**
7
13
  * # The rows, and everything that is a number rather than a walk
@@ -12,12 +18,19 @@ import { cloth_bend_ratio, cloth_strain_allowance } from "./cloth_dynamics_map.j
12
18
  * proxy's baked joint list — and what they do identically is everything after
13
19
  * that, because a row does not care what a node was made of.
14
20
  *
15
- * So the split is: a seeder produces `node_parent` and `animated_position`, and
16
- * {@link cloth_build_rows} turns those into geodesics, link rows, strain-limit
17
- * rows, skip rows, leashes and the `ClothState` itself. M3 moved this out of
18
- * `cloth_seed_subtree.js` unchanged rather than writing a second copy for the
19
- * rig path, which is the whole reason §11 could say "the solver is identical
20
- * either way; only seeding and write-back differ" and mean it.
21
+ * So the split is: a seeder produces the particles' rest pose and the **graph**
22
+ * joining them — {@link ClothInstance#edge}, {@link ClothInstance#skip},
23
+ * {@link ClothInstance#hinge} — and {@link cloth_build_rows} turns those into
24
+ * geodesics, fabric rows, strain-limit rows, bending rows, leashes and the
25
+ * `ClothState` itself. M3 moved this out of `cloth_seed_subtree.js` unchanged
26
+ * rather than writing a second copy for the rig path, which is the whole reason
27
+ * §11 could say "the solver is identical either way; only seeding and
28
+ * write-back differ" and mean it.
29
+ *
30
+ * The rows are built from a graph rather than from a parent array because a row
31
+ * is a pair or a quad and has no use for a parent. A tree hands over its parent
32
+ * links and its skip pairs ({@link cloth_tree_graph}); a mesh would hand over
33
+ * its edges and hinges; the rows below are the same code either way.
21
34
  *
22
35
  * @author Alex Goldring
23
36
  * @copyright Company Named Limited (c) 2026
@@ -36,9 +49,10 @@ export const CLOTH_PARTICLE_MASS = 0.02;
36
49
  * Slack radius at `ClothDynamics#slack = 1`, as a multiple of `d_geo`.
37
50
  *
38
51
  * It is **2**, and that is a derivation rather than a taste. The tether row
39
- * already holds every particle within `d_geo` of the anchor, and the animated
40
- * position it is leashed to is itself within `d_geo` of the anchor — a chord is
41
- * never longer than the arc it subtends. By the triangle inequality the two can
52
+ * already holds every particle within `d_geo` of the held particle it hangs
53
+ * from, and the animated position it is leashed to is itself within `d_geo` of
54
+ * that particle — a chord is never longer than the arc it subtends, and the
55
+ * animated pose is the rest pose hung from it (`ClothInstance#animated_position`). By the triangle inequality the two can
42
56
  * therefore never be more than `2·d_geo` apart, so a slack radius of `2·d_geo`
43
57
  * is **provably inactive** and `slack = 1` means exactly "no leash" with no
44
58
  * sentinel value and no discontinuity to code around.
@@ -62,32 +76,157 @@ export function cloth_build_children(instance) {
62
76
  const node_count = instance.node_count;
63
77
  const parent = instance.node_parent;
64
78
 
65
- const offset = new Int32Array(node_count + 1);
79
+ let child_count = 0;
66
80
 
67
- for (let node = 1; node < node_count; node++) {
68
- offset[parent[node] + 1]++;
81
+ for (let node = 0; node < node_count; node++) {
82
+ if (parent[node] >= 0) {
83
+ child_count++;
84
+ }
69
85
  }
70
86
 
87
+ const offset = new Int32Array(node_count + 1);
88
+ const child = new Int32Array(child_count);
89
+
90
+ // a root's parent is −1, which is in no bucket
91
+ csr_build_incidence(offset, child, parent, node_count, node_count);
92
+
93
+ instance.node_child_offset = offset;
94
+ instance.node_child = child;
95
+ }
96
+
97
+ /**
98
+ * The particle graph of a tree: a fabric edge from every node to its parent,
99
+ * and a skip pair from every node to its grandparent.
100
+ *
101
+ * The skip pair is a chain's bending model (`cloth_seed_subtree.js` carries the
102
+ * argument), and it is part of the graph rather than something the row builder
103
+ * derives from a parent array, so that the row builder never needs one.
104
+ *
105
+ * @param {ClothInstance} instance with {@link ClothInstance#node_parent} set
106
+ * @returns {void}
107
+ */
108
+ export function cloth_tree_graph(instance) {
109
+ const node_count = instance.node_count;
110
+ const parent = instance.node_parent;
111
+
112
+ const edge = [];
113
+ const skip = [];
114
+
71
115
  for (let node = 0; node < node_count; node++) {
72
- offset[node + 1] += offset[node];
116
+ const p = parent[node];
117
+
118
+ if (p < 0) {
119
+ continue;
120
+ }
121
+
122
+ edge.push(p, node);
123
+
124
+ const grandparent = parent[p];
125
+
126
+ if (grandparent >= 0) {
127
+ skip.push(grandparent, node);
128
+ }
129
+ }
130
+
131
+ instance.edge = Int32Array.from(edge);
132
+ instance.skip = Int32Array.from(skip);
133
+ instance.hinge = new Int32Array(0);
134
+ instance.triangle = new Int32Array(0);
135
+ }
136
+
137
+ /**
138
+ * The triangles around each node, CSR, and one neighbour per node to measure a
139
+ * tangent by — what `cloth_reconstruct_pose` turns a sheet's joints with. A
140
+ * cloth with no triangles gets none.
141
+ *
142
+ * @param {ClothInstance} instance with {@link ClothInstance#triangle} and
143
+ * {@link ClothInstance#edge} set
144
+ * @returns {void}
145
+ */
146
+ export function cloth_build_surface(instance) {
147
+ const node_count = instance.node_count;
148
+ const triangle = instance.triangle;
149
+
150
+ const triangle_count = triangle.length / 3;
151
+
152
+ if (triangle_count === 0) {
153
+ instance.surface_offset = null;
154
+ instance.surface_triangle = null;
155
+ instance.surface_neighbour = null;
156
+
157
+ return;
73
158
  }
74
159
 
75
- const child = new Int32Array(node_count > 0 ? node_count - 1 : 0);
76
- const cursor = offset.slice(0, node_count);
160
+ const offset = new Int32Array(node_count + 1);
161
+ const surface = new Int32Array(triangle_count * 3);
162
+
163
+ csr_build_incidence(offset, surface, triangle, triangle_count * 3, node_count);
77
164
 
78
- for (let node = 1; node < node_count; node++) {
79
- child[cursor[parent[node]]++] = node;
165
+ // a corner's flat index `t·3 + k` to its triangle `t`
166
+ for (let i = 0; i < triangle_count * 3; i++) {
167
+ surface[i] = (surface[i] / 3) | 0;
80
168
  }
81
169
 
82
- instance.node_child_offset = offset;
83
- instance.node_child = child;
170
+ // the first edge each node has: fixed for the life of the seed, which is all
171
+ // a reference direction has to be
172
+ const neighbour = new Int32Array(node_count).fill(-1);
173
+
174
+ const edge = instance.edge;
175
+
176
+ for (let e = 0; e < edge.length; e += 2) {
177
+ const a = edge[e];
178
+ const b = edge[e + 1];
179
+
180
+ if (neighbour[a] === -1) {
181
+ neighbour[a] = b;
182
+ }
183
+
184
+ if (neighbour[b] === -1) {
185
+ neighbour[b] = a;
186
+ }
187
+ }
188
+
189
+ instance.surface_offset = offset;
190
+ instance.surface_triangle = surface;
191
+ instance.surface_neighbour = neighbour;
84
192
  }
85
193
 
194
+ /**
195
+ * How much a hinge resists, as a stiffness, for a fabric's `bend` ratio.
196
+ *
197
+ * The same rule the skip row follows: a ratio of the row's own effective
198
+ * inertia over the fixed step squared. A hinge's gradient on particle `k` is
199
+ * `w_k` along each axis, so its effective inertia is `1 / Σ (w_k² / m_k)` —
200
+ * `m / Σ w_k²` with one mass — and a hinge across a sliver, whose cotangents are
201
+ * large, is softer per unit `C` for exactly the reason its `C` is larger. A
202
+ * stiffness in newtons per metre, which is what Bergou's `6·modulus/A` is,
203
+ * would leave M0's dissipative band wherever the triangles are thin.
204
+ *
205
+ * @param {Float32Array} weight 4 per hinge
206
+ * @param {number} hinge
207
+ * @returns {number} the hinge's effective inertia, kg
208
+ */
209
+ export function cloth_hinge_inertia(weight, hinge) {
210
+ let sum = 0;
211
+
212
+ for (let k = 0; k < 4; k++) {
213
+ const w = weight[hinge * 4 + k];
214
+
215
+ sum += w * w;
216
+ }
86
217
 
218
+ return sum > 0 ? CLOTH_PARTICLE_MASS / sum : 0;
219
+ }
87
220
 
88
221
  /**
89
- * Rows, geodesics and the `ClothState` itself, from a seeded
90
- * `node_parent` / `animated_position` pair.
222
+ * Rows and the `ClothState` itself, from a seeded rest pose and the graph over
223
+ * it.
224
+ *
225
+ * **Nothing is held here.** Every particle is built free, with a tether row and
226
+ * — when the fabric is leashed at all — a slack row of radius `Infinity`, which
227
+ * say nothing until `cloth_apply_holds` points them at what the particle hangs
228
+ * from. The shape of the leash table is fixed by the particle count, so holding
229
+ * and letting go rewrite numbers in it rather than building it again.
91
230
  *
92
231
  * @param {ClothInstance} instance
93
232
  * @param {number} dt
@@ -96,22 +235,22 @@ export function cloth_build_children(instance) {
96
235
  export function cloth_build_rows(instance, dt) {
97
236
  const node_count = instance.node_count;
98
237
 
99
- const parent = instance.node_parent;
100
- const rest = instance.animated_position;
238
+ const rest = instance.rest_position;
101
239
 
102
- const dynamics = instance.cloth.dynamics;
240
+ const edge = instance.edge;
241
+ const skip = instance.skip;
242
+ const hinge = instance.hinge;
103
243
 
104
- const strain_limited = (dynamics.flags & ClothDynamicsFlags.StrainLimit) !== 0;
244
+ const edge_count = edge.length >> 1;
245
+ const skip_count = skip.length >> 1;
246
+ const hinge_count = hinge.length >> 2;
105
247
 
106
- const geodesic = new Float32Array(node_count);
248
+ const dynamics = instance.cloth.dynamics;
107
249
 
108
- const mass_inverse = new Float32Array(node_count);
250
+ const strain_limited = (dynamics.flags & ClothDynamicsFlags.StrainLimit) !== 0;
109
251
 
110
- // The anchor is the fixed set: zero inverse mass, and a geodesic of zero,
111
- // which is what makes every derived radius collapse onto it correctly.
112
- for (let node = 1; node < node_count; node++) {
113
- mass_inverse[node] = 1 / CLOTH_PARTICLE_MASS;
114
- }
252
+ // Free, every one: what is held is the holds' business.
253
+ const mass_inverse = new Float32Array(node_count).fill(1 / CLOTH_PARTICLE_MASS);
115
254
 
116
255
  const stretch_particle = [];
117
256
  const stretch_rest = [];
@@ -119,47 +258,35 @@ export function cloth_build_rows(instance, dt) {
119
258
  const stretch_force_min = [];
120
259
  const stretch_force_max = [];
121
260
 
122
- const link_row = new Int32Array(node_count).fill(-1);
123
- const strain_row = new Int32Array(node_count).fill(-1);
124
- const skip_row = new Int32Array(node_count).fill(-1);
125
-
126
- const strain = cloth_strain_allowance(dynamics.stretch);
261
+ const edge_length = new Float64Array(edge_count);
127
262
 
128
- // A skip row spans two links and both of its ends are free, so its
129
- // effective inertia along the constraint is half a particle's.
130
- const bend_stiffness = cloth_bend_ratio(dynamics.bend)
131
- * (CLOTH_PARTICLE_MASS * 0.5) / (dt * dt);
132
-
133
- let reach = 0;
263
+ const edge_row = new Int32Array(edge_count).fill(-1);
264
+ const strain_row = new Int32Array(edge_count).fill(-1);
265
+ const skip_row = new Int32Array(skip_count).fill(-1);
134
266
 
135
- for (let node = 1; node < node_count; node++) {
136
- const p = parent[node];
267
+ const strain = cloth_strain_allowance(dynamics.stretch);
137
268
 
138
- const length = Math.hypot(
139
- rest[node * 3] - rest[p * 3],
140
- rest[node * 3 + 1] - rest[p * 3 + 1],
141
- rest[node * 3 + 2] - rest[p * 3 + 2]
142
- );
269
+ for (let e = 0; e < edge_count; e++) {
270
+ const a = edge[e * 2];
271
+ const b = edge[e * 2 + 1];
143
272
 
144
- geodesic[node] = geodesic[p] + length;
273
+ const length = v3_distance_array(rest, a * 3, rest, b * 3);
145
274
 
146
- if (geodesic[node] > reach) {
147
- reach = geodesic[node];
148
- }
275
+ edge_length[e] = length;
149
276
 
150
- link_row[node] = stretch_rest.length;
277
+ edge_row[e] = stretch_rest.length;
151
278
 
152
279
  // Hard, bilateral: the fabric row. It is hard because a *penalty* stiff
153
280
  // enough to be fabric adds energy rather than dissipating it — see
154
281
  // `cloth_dynamics_map.js`, and `MEASUREMENTS.md` §6 for the +6.8 J.
155
- stretch_particle.push(p, node);
282
+ stretch_particle.push(a, b);
156
283
  stretch_rest.push(length);
157
284
  stretch_stiffness.push(Infinity);
158
285
  stretch_force_min.push(-Infinity);
159
286
  stretch_force_max.push(Infinity);
160
287
 
161
288
  if (strain_limited) {
162
- strain_row[node] = stretch_rest.length;
289
+ strain_row[e] = stretch_rest.length;
163
290
 
164
291
  // Hard, one-sided: §6's strain limit, and note the clamp. A row
165
292
  // that bounds a distance from ABOVE may only apply force that
@@ -167,56 +294,89 @@ export function cloth_build_rows(instance, dt) {
167
294
  // `[0, +∞)`. §6's table has this row at `(−∞, 0]`, which is the
168
295
  // force that pushes the two ends apart; `cloth_leash_row.js`
169
296
  // carries the derivation and a spec that shows it directly.
170
- stretch_particle.push(p, node);
297
+ stretch_particle.push(a, b);
171
298
  stretch_rest.push(length * (1 + strain));
172
299
  stretch_stiffness.push(Infinity);
173
300
  stretch_force_min.push(0);
174
301
  stretch_force_max.push(Infinity);
175
302
  }
303
+ }
176
304
 
177
- const grandparent = parent[p];
305
+ // A skip row spans two links and both of its ends are free, so its
306
+ // effective inertia along the constraint is half a particle's.
307
+ const bend_stiffness = cloth_bend_ratio(dynamics.bend)
308
+ * (CLOTH_PARTICLE_MASS * 0.5) / (dt * dt);
178
309
 
179
- if (grandparent >= 0 && bend_stiffness > 0) {
180
- const span = Math.hypot(
181
- rest[node * 3] - rest[grandparent * 3],
182
- rest[node * 3 + 1] - rest[grandparent * 3 + 1],
183
- rest[node * 3 + 2] - rest[grandparent * 3 + 2]
184
- );
310
+ if (bend_stiffness > 0) {
311
+ for (let s = 0; s < skip_count; s++) {
312
+ const a = skip[s * 2];
313
+ const b = skip[s * 2 + 1];
185
314
 
186
- skip_row[node] = stretch_rest.length;
315
+ skip_row[s] = stretch_rest.length;
187
316
 
188
317
  // Soft, bilateral: the bending model. Its rest length is read from
189
318
  // the authored pose, so a chain authored with a curve holds it.
190
- stretch_particle.push(grandparent, node);
191
- stretch_rest.push(span);
319
+ stretch_particle.push(a, b);
320
+ stretch_rest.push(v3_distance_array(rest, a * 3, rest, b * 3));
192
321
  stretch_stiffness.push(bend_stiffness);
193
322
  stretch_force_min.push(-Infinity);
194
323
  stretch_force_max.push(Infinity);
195
324
  }
196
325
  }
197
326
 
327
+ // A surface bends through its hinges: §6's quadratic stencil, its weights
328
+ // read from the rest pose, its stiffness a ratio of its own inertia.
329
+ const bend_ratio = cloth_bend_ratio(dynamics.bend);
330
+
331
+ const hinge_built = bend_ratio > 0 ? hinge_count : 0;
332
+
333
+ const bend_weight = new Float32Array(hinge_built * 4);
334
+ const hinge_stiffness = new Float32Array(hinge_built);
335
+ const hinge_inertia = new Float32Array(hinge_built);
336
+
337
+ for (let h = 0; h < hinge_built; h++) {
338
+ cloth_bend_stencil_weights(
339
+ bend_weight, h * 4, rest,
340
+ hinge[h * 4], hinge[h * 4 + 1], hinge[h * 4 + 2], hinge[h * 4 + 3]
341
+ );
342
+
343
+ hinge_inertia[h] = cloth_hinge_inertia(bend_weight, h);
344
+ hinge_stiffness[h] = bend_ratio * hinge_inertia[h] / (dt * dt);
345
+ }
346
+
198
347
  const leash_particle = [];
199
348
  const leash_radius = [];
200
349
 
201
350
  const slack_row = new Int32Array(node_count).fill(-1);
202
351
  const tether_row = new Int32Array(node_count).fill(-1);
203
352
 
204
- const slack_scale = CLOTH_SLACK_REACH * clamp01(dynamics.slack);
353
+ const leashed = clamp01(dynamics.slack) < 1;
205
354
 
206
- for (let node = 1; node < node_count; node++) {
355
+ for (let node = 0; node < node_count; node++) {
207
356
  // Tether first: §7 P2's long-range attachment, and the row that makes a
208
357
  // low iteration budget viable at all, because being hard it is enforced
209
358
  // almost exactly in one iteration however deep the chain is.
210
359
  tether_row[node] = leash_radius.length;
211
360
 
212
361
  leash_particle.push(node);
213
- leash_radius.push(geodesic[node]);
362
+ leash_radius.push(Infinity);
214
363
 
215
- if (slack_scale < CLOTH_SLACK_REACH) {
364
+ if (leashed) {
216
365
  slack_row[node] = leash_radius.length;
217
366
 
218
367
  leash_particle.push(node);
219
- leash_radius.push(slack_scale * geodesic[node]);
368
+ leash_radius.push(Infinity);
369
+ }
370
+ }
371
+
372
+ // Until the holds say otherwise, everything hangs from the frame.
373
+ let reach = 0;
374
+
375
+ for (let node = 0; node < node_count; node++) {
376
+ const r = Math.hypot(rest[node * 3], rest[node * 3 + 1], rest[node * 3 + 2]);
377
+
378
+ if (r > reach) {
379
+ reach = r;
220
380
  }
221
381
  }
222
382
 
@@ -232,9 +392,13 @@ export function cloth_build_rows(instance, dt) {
232
392
  // authority to speak of and its reach is the only length it carries.
233
393
  instance.shortest_row = shortest_row < Infinity ? shortest_row : reach;
234
394
 
235
- instance.geodesic = geodesic;
395
+ instance.geodesic = new Float32Array(node_count).fill(Infinity);
396
+ instance.tether_source = new Int32Array(node_count).fill(-1);
397
+ instance.edge_length = edge_length;
398
+ instance.edge_incidence = cloth_edge_incidence(node_count, edge);
399
+ instance.hinge_inertia = hinge_inertia;
236
400
  instance.reach = reach;
237
- instance.link_row = link_row;
401
+ instance.edge_row = edge_row;
238
402
  instance.strain_row = strain_row;
239
403
  instance.skip_row = skip_row;
240
404
  instance.slack_row = slack_row;
@@ -248,6 +412,9 @@ export function cloth_build_rows(instance, dt) {
248
412
  stretch_stiffness: Float32Array.from(stretch_stiffness),
249
413
  stretch_force_min: Float32Array.from(stretch_force_min),
250
414
  stretch_force_max: Float32Array.from(stretch_force_max),
415
+ bend_particle: hinge.subarray(0, hinge_built * 4),
416
+ bend_weight,
417
+ bend_stiffness: hinge_stiffness,
251
418
  leash_particle: Int32Array.from(leash_particle),
252
419
  leash_radius: Float32Array.from(leash_radius),
253
420
  shared: instance.shared_state
@@ -255,9 +422,7 @@ export function cloth_build_rows(instance, dt) {
255
422
 
256
423
  const particle_of_node = new Int32Array(node_count);
257
424
 
258
- for (let particle = 0; particle < node_count; particle++) {
259
- particle_of_node[state.source_of_particle[particle]] = particle;
260
- }
425
+ cloth_particle_of_source(particle_of_node, state.source_of_particle, node_count);
261
426
 
262
427
  // Everything derived from the rows, derived again — and from the bind pose,
263
428
  // which is what `closest_free_pair` has to be measured in: the answer is a
@@ -278,19 +443,21 @@ export function cloth_build_rows(instance, dt) {
278
443
  instance.particle_of_node = particle_of_node;
279
444
  instance.blended_position = new Float64Array(node_count * 3);
280
445
  instance.blended_rotation = new Float64Array(node_count * 4);
446
+
447
+ instance.node_hold = new Int32Array(node_count).fill(-1);
448
+ instance.tether_loose = new Uint8Array(node_count);
449
+ instance.tether_loose_count = 0;
450
+ instance.node_hold_slot = new Int32Array(node_count).fill(-1);
451
+ instance.held_target = new Float64Array(node_count * 3);
452
+
453
+ // Nothing held yet, so the animated pose is the rest pose.
454
+ instance.animated_position = Float64Array.from(rest);
455
+ instance.animated_rotation = Float64Array.from(instance.rest_rotation);
456
+
281
457
  instance.state = state;
282
458
  instance.seeded = true;
283
459
  }
284
460
 
285
- /**
286
- * @param {number} v
287
- * @returns {number}
288
- * @private
289
- */
290
- function clamp01(v) {
291
- return v < 0 ? 0 : (v > 1 ? 1 : v);
292
- }
293
-
294
461
  /**
295
462
  * Re-parameterise the rows of an already-seeded cloth from its current
296
463
  * {@link ClothDynamics}, without walking the subtree again.
@@ -313,32 +480,61 @@ export function cloth_reparameterise(instance, dt) {
313
480
 
314
481
  const state = instance.state;
315
482
 
316
- const node_count = instance.node_count;
317
-
318
483
  const strain = cloth_strain_allowance(dynamics.stretch);
319
484
 
485
+ const edge_row = instance.edge_row;
486
+ const strain_row = instance.strain_row;
487
+
488
+ for (let e = 0; e < strain_row.length; e++) {
489
+ const strain_limit = strain_row[e];
490
+
491
+ if (strain_limit >= 0) {
492
+ state.stretch_rest[strain_limit] = state.stretch_rest[edge_row[e]] * (1 + strain);
493
+ }
494
+ }
495
+
320
496
  const bend_stiffness = cloth_bend_ratio(dynamics.bend)
321
497
  * (CLOTH_PARTICLE_MASS * 0.5) / (dt * dt);
322
498
 
499
+ const skip_row = instance.skip_row;
500
+
501
+ for (let s = 0; s < skip_row.length; s++) {
502
+ const row = skip_row[s];
503
+
504
+ if (row >= 0) {
505
+ state.stretch_stiffness[row] = bend_stiffness;
506
+ }
507
+ }
508
+
509
+ // A hinge is bend row `h`, in the order they were built.
510
+ const bend_ratio = cloth_bend_ratio(dynamics.bend);
511
+ const hinge_inertia = instance.hinge_inertia;
512
+
513
+ for (let h = 0; h < state.bend_count; h++) {
514
+ const stiffness = bend_ratio * hinge_inertia[h] / (dt * dt);
515
+
516
+ state.bend_stiffness[h] = stiffness;
517
+ state.bend_penalty[h] = stiffness;
518
+ }
519
+
323
520
  const slack_scale = CLOTH_SLACK_REACH * clamp01(dynamics.slack);
324
521
 
325
- for (let node = 1; node < node_count; node++) {
326
- const link = instance.link_row[node];
327
- const strain_limit = instance.strain_row[node];
328
- const skip = instance.skip_row[node];
522
+ const node_count = instance.node_count;
523
+
524
+ for (let node = 0; node < node_count; node++) {
329
525
  const slack = instance.slack_row[node];
330
526
 
331
- if (strain_limit >= 0) {
332
- state.stretch_rest[strain_limit] = state.stretch_rest[link] * (1 + strain);
527
+ if (slack < 0) {
528
+ continue;
333
529
  }
334
530
 
335
- if (skip >= 0) {
336
- state.stretch_stiffness[skip] = bend_stiffness;
337
- }
531
+ const d = instance.geodesic[node];
338
532
 
339
- if (slack >= 0) {
340
- state.leash_radius[slack] = slack_scale * instance.geodesic[node];
341
- }
533
+ // A free particle something holds; anything else has no bound to scale,
534
+ // and `0 · Infinity` would be a NaN where `Infinity` is meant.
535
+ state.leash_radius[slack] = d < Infinity && instance.node_hold[node] === -1
536
+ ? slack_scale * d
537
+ : Infinity;
342
538
  }
343
539
 
344
540
  instance.dynamics_seen.copy(dynamics);
@@ -195,9 +195,10 @@ export const CLOTH_VELOCITY_CORRECTION_MARGIN: number;
195
195
  */
196
196
  export const CLOTH_DAMPING_RATE: number;
197
197
  /**
198
- * How far a cloth's anchor may carry it in one fixed step, as a multiple of the
198
+ * How far a cloth's frame may carry it in one fixed step, as a multiple of the
199
199
  * cloth's own reach. Motion above this is felt as though it were exactly this,
200
- * which is what "anchor speed limit" means in §7 P7.
200
+ * which is what "anchor speed limit" means in §7 P7 — the frame being what the
201
+ * cloth rides.
201
202
  *
202
203
  * Expressing it as a fraction of reach rather than in metres per second is what
203
204
  * makes it work for a 3 cm pendant and a 30 m mooring line at the same time: a
@@ -208,9 +209,9 @@ export const CLOTH_DAMPING_RATE: number;
208
209
  * badly-keyed cut does exceed.
209
210
  * @type {number}
210
211
  */
211
- export const CLOTH_ANCHOR_TRAVEL_REACH: number;
212
+ export const CLOTH_FRAME_TRAVEL_REACH: number;
212
213
  /**
213
- * How far a cloth's anchor may rotate in one fixed step, radians. Rotation
214
+ * How far a cloth's frame may rotate in one fixed step, radians. Rotation
214
215
  * above this is felt as though it were exactly this.
215
216
  *
216
217
  * Unlike the travel limit this has no length scale to hang off — an angle is
@@ -218,10 +219,11 @@ export const CLOTH_ANCHOR_TRAVEL_REACH: number;
218
219
  * about 1,700 degrees a second, which is a spin rather than a turn.
219
220
  * @type {number}
220
221
  */
221
- export const CLOTH_ANCHOR_ROTATION_LIMIT: number;
222
+ export const CLOTH_FRAME_ROTATION_LIMIT: number;
222
223
  /**
223
- * Anchor displacement in one fixed step, as a multiple of the cloth's reach,
224
- * above which the motion is a **teleport** rather than locomotion (§7 P6).
224
+ * Displacement of the frame, or of a holder in the frame, in one fixed step, as
225
+ * a multiple of the cloth's reach, above which the motion is a **teleport**
226
+ * rather than locomotion (§7 P6).
225
227
  *
226
228
  * Four reaches in one step is 240 reaches a second: for a 1 m rope that is
227
229
  * 240 m/s, well past anything the world moves at and well short of the values a
@@ -1 +1 @@
1
- {"version":3,"file":"cloth_dynamics_map.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/physics/cloth/ecs/cloth_dynamics_map.js"],"names":[],"mappings":"AAmQA;;;;;;;;GAQG;AACH,gDAHW,MAAM,GACJ,MAAM,CAMlB;AAED;;;;;;;;GAQG;AACH,uCAHW,MAAM,GACJ,MAAM,CAUlB;AAED;;;;;;;;;;;GAWG;AACH,mDAPW,MAAM,YAEN,MAAM,cACN,MAAM,MACN,MAAM,GACJ,MAAM,CAIlB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,0CAJW,MAAM,MACN,MAAM,GACJ,MAAM,CAYlB;AAED;;;;;;;;GAQG;AACH,kDAJW,MAAM,MACN,MAAM,GACJ,MAAM,CAQlB;AA7WD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AAEH;;;;;GAKG;AACH,+BAFU,MAAM,CAEqB;AAErC;;;;;GAKG;AACH,+BAFU,MAAM,CAEqB;AAErC;;;;;;;;;;;GAWG;AACH,mCAFU,MAAM,CAEsB;AAEtC;;;;;GAKG;AACH,mCAFU,MAAM,CAEyB;AAEzC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,+CAFU,MAAM,CAEkC;AAElD;;;;;;;;GAQG;AACH,iCAFU,MAAM,CAEqB;AAErC;;;;;;;;;;;;;GAaG;AACH,wCAFU,MAAM,CAE6B;AAE7C;;;;;;;;GAQG;AACH,0CAFU,MAAM,CAE+B;AAE/C;;;;;;;;GAQG;AACH,mCAFU,MAAM,CAEsB;AAEtC;;;;;;;;GAQG;AACH,mCAFU,MAAM,CAEsB;AAEtC;;;;;;;GAOG;AACH,oCAFU,MAAM,CAEwB;AAExC;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,kCAFU,MAAM,CAEsB;AAEtC;;;;;;;GAOG;AACH,sCAFU,MAAM,CAE4B;AAE5C;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,6CAFU,MAAM,CAEmC;AAEnD;;;;;GAKG;AACH,gCAFU,MAAM,CAEoB"}
1
+ {"version":3,"file":"cloth_dynamics_map.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/physics/cloth/ecs/cloth_dynamics_map.js"],"names":[],"mappings":"AAuQA;;;;;;;;GAQG;AACH,gDAHW,MAAM,GACJ,MAAM,CAIlB;AAED;;;;;;;;GAQG;AACH,uCAHW,MAAM,GACJ,MAAM,CAUlB;AAED;;;;;;;;;;;GAWG;AACH,mDAPW,MAAM,YAEN,MAAM,cACN,MAAM,MACN,MAAM,GACJ,MAAM,CAIlB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,0CAJW,MAAM,MACN,MAAM,GACJ,MAAM,CAYlB;AAED;;;;;;;;GAQG;AACH,kDAJW,MAAM,MACN,MAAM,GACJ,MAAM,CAQlB;AA7WD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AAEH;;;;;GAKG;AACH,+BAFU,MAAM,CAEqB;AAErC;;;;;GAKG;AACH,+BAFU,MAAM,CAEqB;AAErC;;;;;;;;;;;GAWG;AACH,mCAFU,MAAM,CAEsB;AAEtC;;;;;GAKG;AACH,mCAFU,MAAM,CAEyB;AAEzC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,+CAFU,MAAM,CAEkC;AAElD;;;;;;;;GAQG;AACH,iCAFU,MAAM,CAEqB;AAErC;;;;;;;;;;;;;;GAcG;AACH,uCAFU,MAAM,CAE4B;AAE5C;;;;;;;;GAQG;AACH,yCAFU,MAAM,CAE8B;AAE9C;;;;;;;;;GASG;AACH,mCAFU,MAAM,CAEsB;AAEtC;;;;;;;;GAQG;AACH,mCAFU,MAAM,CAEsB;AAEtC;;;;;;;GAOG;AACH,oCAFU,MAAM,CAEwB;AAExC;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,kCAFU,MAAM,CAEsB;AAEtC;;;;;;;GAOG;AACH,sCAFU,MAAM,CAE4B;AAE5C;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,6CAFU,MAAM,CAEmC;AAEnD;;;;;GAKG;AACH,gCAFU,MAAM,CAEoB"}