@woosh/meep-engine 3.44.0 → 3.46.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 (447) hide show
  1. package/build/bundle-worker-terrain.js +1 -1
  2. package/package.json +1 -1
  3. package/src/core/assert.d.ts.map +1 -1
  4. package/src/core/assert.js +5 -1
  5. package/src/core/binary/hash/XXH128Hash.d.ts +1 -37
  6. package/src/core/binary/hash/XXH128Hash.d.ts.map +1 -1
  7. package/src/core/binary/hash/XXH128Hash.js +4 -55
  8. package/src/core/binary/hash/XXH3_SECRET.d.ts +1 -12
  9. package/src/core/binary/hash/XXH3_SECRET.d.ts.map +1 -1
  10. package/src/core/binary/hash/XXH3_SECRET.js +4 -25
  11. package/src/core/binary/hash/crc32.d.ts +1 -15
  12. package/src/core/binary/hash/crc32.d.ts.map +1 -1
  13. package/src/core/binary/hash/crc32.js +4 -96
  14. package/src/core/binary/hash/xxh3_128.d.ts +1 -9
  15. package/src/core/binary/hash/xxh3_128.d.ts.map +1 -1
  16. package/src/core/binary/hash/xxh3_128.js +4 -341
  17. package/src/core/binary/hash/xxh3_64.d.ts +1 -8
  18. package/src/core/binary/hash/xxh3_64.d.ts.map +1 -1
  19. package/src/core/binary/hash/xxh3_64.js +4 -241
  20. package/src/core/binary/hash/xxh3_common.d.ts +1 -223
  21. package/src/core/binary/hash/xxh3_common.d.ts.map +1 -1
  22. package/src/core/binary/hash/xxh3_common.js +90 -476
  23. package/src/core/collection/array/array_sort_insertion_ascending.d.ts +19 -0
  24. package/src/core/collection/array/array_sort_insertion_ascending.d.ts.map +1 -0
  25. package/src/core/collection/array/array_sort_insertion_ascending.js +31 -0
  26. package/src/core/collection/array/combine_hash.d.ts +6 -0
  27. package/src/core/collection/array/combine_hash.d.ts.map +1 -1
  28. package/src/core/collection/array/combine_hash.js +6 -0
  29. package/src/core/function/FunctionCompiler.js +2 -2
  30. package/src/core/geom/3d/aabb/aabb3_array_round_outward_f32.d.ts +27 -0
  31. package/src/core/geom/3d/aabb/aabb3_array_round_outward_f32.d.ts.map +1 -0
  32. package/src/core/geom/3d/aabb/aabb3_array_round_outward_f32.js +39 -0
  33. package/src/core/geom/3d/aabb/aabb3_from_v3_array.d.ts.map +1 -1
  34. package/src/core/geom/3d/aabb/aabb3_from_v3_array.js +4 -1
  35. package/src/core/geom/3d/aabb/aabb3_transform_oriented.d.ts +2 -2
  36. package/src/core/geom/3d/aabb/aabb3_transform_oriented.d.ts.map +1 -1
  37. package/src/core/geom/3d/aabb/aabb3_transform_oriented.js +1 -1
  38. package/src/core/geom/3d/mat4/m4_multiply.d.ts +3 -0
  39. package/src/core/geom/3d/mat4/m4_multiply.d.ts.map +1 -1
  40. package/src/core/geom/3d/mat4/m4_multiply.js +3 -0
  41. package/src/core/geom/3d/mat4/m4_multiply_f64.d.ts +30 -0
  42. package/src/core/geom/3d/mat4/m4_multiply_f64.d.ts.map +1 -0
  43. package/src/core/geom/3d/mat4/m4_multiply_f64.js +106 -0
  44. package/src/core/geom/3d/pose/pose3_apply_inverse_point_array.d.ts +21 -0
  45. package/src/core/geom/3d/pose/pose3_apply_inverse_point_array.d.ts.map +1 -0
  46. package/src/core/geom/3d/pose/pose3_apply_inverse_point_array.js +36 -0
  47. package/src/core/geom/3d/pose/pose3_apply_point_array.d.ts +25 -0
  48. package/src/core/geom/3d/pose/pose3_apply_point_array.d.ts.map +1 -0
  49. package/src/core/geom/3d/pose/pose3_apply_point_array.js +40 -0
  50. package/src/core/geom/3d/pose/pose3_compose_array.d.ts +28 -0
  51. package/src/core/geom/3d/pose/pose3_compose_array.d.ts.map +1 -0
  52. package/src/core/geom/3d/pose/pose3_compose_array.js +41 -0
  53. package/src/core/geom/3d/pose/pose3_to_local_array.d.ts +29 -0
  54. package/src/core/geom/3d/pose/pose3_to_local_array.d.ts.map +1 -0
  55. package/src/core/geom/3d/pose/pose3_to_local_array.js +42 -0
  56. package/src/core/geom/3d/quaternion/quat3_clamp_angle_array.d.ts +28 -0
  57. package/src/core/geom/3d/quaternion/quat3_clamp_angle_array.d.ts.map +1 -0
  58. package/src/core/geom/3d/quaternion/quat3_clamp_angle_array.js +66 -0
  59. package/src/core/geom/3d/quaternion/quat3_multiply_conjugate_left_array.d.ts +22 -0
  60. package/src/core/geom/3d/quaternion/quat3_multiply_conjugate_left_array.d.ts.map +1 -0
  61. package/src/core/geom/3d/quaternion/quat3_multiply_conjugate_left_array.js +30 -0
  62. package/src/core/geom/3d/quaternion/quat3_multiply_conjugate_right_array.d.ts +23 -0
  63. package/src/core/geom/3d/quaternion/quat3_multiply_conjugate_right_array.d.ts.map +1 -0
  64. package/src/core/geom/3d/quaternion/quat3_multiply_conjugate_right_array.js +31 -0
  65. package/src/core/geom/3d/triangle/tri3_compute_normal_area_weighted_array.d.ts +26 -0
  66. package/src/core/geom/3d/triangle/tri3_compute_normal_area_weighted_array.d.ts.map +1 -0
  67. package/src/core/geom/3d/triangle/tri3_compute_normal_area_weighted_array.js +46 -0
  68. package/src/core/geom/ConicRay.js +2 -2
  69. package/src/core/geom/Vector4.d.ts.map +1 -1
  70. package/src/core/geom/Vector4.js +8 -5
  71. package/src/core/geom/vec3/v3_distance_array.d.ts +11 -0
  72. package/src/core/geom/vec3/v3_distance_array.d.ts.map +1 -0
  73. package/src/core/geom/vec3/v3_distance_array.js +19 -0
  74. package/src/core/geom/vec3/v3_normalize_array_checked.d.ts +23 -0
  75. package/src/core/geom/vec3/v3_normalize_array_checked.d.ts.map +1 -0
  76. package/src/core/geom/vec3/v3_normalize_array_checked.js +49 -0
  77. package/src/core/geom/vec3/v3_reject_array.d.ts +15 -0
  78. package/src/core/geom/vec3/v3_reject_array.d.ts.map +1 -0
  79. package/src/core/geom/vec3/v3_reject_array.js +32 -0
  80. package/src/core/graph/csr/csr_build_incidence.d.ts +26 -0
  81. package/src/core/graph/csr/csr_build_incidence.d.ts.map +1 -0
  82. package/src/core/graph/csr/csr_build_incidence.js +71 -0
  83. package/src/core/graph/csr/csr_graph_color_greedy.d.ts +25 -0
  84. package/src/core/graph/csr/csr_graph_color_greedy.d.ts.map +1 -0
  85. package/src/core/graph/csr/csr_graph_color_greedy.js +83 -0
  86. package/src/core/graph/csr/csr_graph_validate_coloring.d.ts +15 -0
  87. package/src/core/graph/csr/csr_graph_validate_coloring.d.ts.map +1 -0
  88. package/src/core/graph/csr/csr_graph_validate_coloring.js +33 -0
  89. package/src/core/math/hash/XXH128Hash.d.ts +38 -0
  90. package/src/core/math/hash/XXH128Hash.d.ts.map +1 -0
  91. package/src/core/math/hash/XXH128Hash.js +55 -0
  92. package/src/core/math/hash/XXH3_SECRET.d.ts +13 -0
  93. package/src/core/math/hash/XXH3_SECRET.d.ts.map +1 -0
  94. package/src/core/math/hash/XXH3_SECRET.js +25 -0
  95. package/src/core/math/hash/crc32.d.ts +16 -0
  96. package/src/core/math/hash/crc32.d.ts.map +1 -0
  97. package/src/core/math/hash/crc32.js +96 -0
  98. package/src/core/math/hash/xxh3_128.d.ts +10 -0
  99. package/src/core/math/hash/xxh3_128.d.ts.map +1 -0
  100. package/src/core/math/hash/xxh3_128.js +341 -0
  101. package/src/core/math/hash/xxh3_64.d.ts +9 -0
  102. package/src/core/math/hash/xxh3_64.d.ts.map +1 -0
  103. package/src/core/math/hash/xxh3_64.js +241 -0
  104. package/src/core/math/hash/xxh3_common.d.ts +224 -0
  105. package/src/core/math/hash/xxh3_common.d.ts.map +1 -0
  106. package/src/core/math/hash/xxh3_common.js +476 -0
  107. package/src/core/math/linalg/matrix_symmetric_3x3_solve_ldlt.d.ts +26 -0
  108. package/src/core/math/linalg/matrix_symmetric_3x3_solve_ldlt.d.ts.map +1 -0
  109. package/src/core/math/linalg/matrix_symmetric_3x3_solve_ldlt.js +71 -0
  110. package/src/core/math/lookup/ParameterLookupTable.js +2 -2
  111. package/src/core/math/max2_exact.d.ts +15 -0
  112. package/src/core/math/max2_exact.d.ts.map +1 -0
  113. package/src/core/math/max2_exact.js +30 -0
  114. package/src/core/math/min2_exact.d.ts +20 -0
  115. package/src/core/math/min2_exact.d.ts.map +1 -0
  116. package/src/core/math/min2_exact.js +35 -0
  117. package/src/core/model/node-graph/node/NodeInstancePortReference.js +2 -2
  118. package/src/core/model/reactive/model/ReactiveBinaryExpression.js +2 -2
  119. package/src/core/model/reactive/model/terminal/ReactiveReference.js +2 -2
  120. package/src/engine/asset/AssetDescription.js +2 -2
  121. package/src/engine/ecs/animation/Animation.js +2 -2
  122. package/src/engine/ecs/animation/AnimationClip.d.ts.map +1 -1
  123. package/src/engine/ecs/animation/AnimationClip.js +7 -5
  124. package/src/engine/ecs/gui/GUIElement.d.ts.map +1 -1
  125. package/src/engine/ecs/gui/GUIElement.js +7 -5
  126. package/src/engine/ecs/gui/hud/HeadsUpDisplay.js +2 -2
  127. package/src/engine/ecs/gui/position/ViewportPosition.d.ts.map +1 -1
  128. package/src/engine/ecs/gui/position/ViewportPosition.js +11 -7
  129. package/src/engine/ecs/ik/IKGoalSystem.d.ts.map +1 -1
  130. package/src/engine/ecs/ik/IKGoalSystem.js +3 -19
  131. package/src/engine/ecs/parent/parent_entity_model_of.d.ts +17 -0
  132. package/src/engine/ecs/parent/parent_entity_model_of.d.ts.map +1 -0
  133. package/src/engine/ecs/parent/parent_entity_model_of.js +26 -0
  134. package/src/engine/ecs/transform/Transform64.d.ts +1 -1
  135. package/src/engine/ecs/transform/Transform64.d.ts.map +1 -1
  136. package/src/engine/ecs/transform/Transform64.js +5 -4
  137. package/src/engine/ecs/transform/t64_read_pose_array.d.ts +15 -0
  138. package/src/engine/ecs/transform/t64_read_pose_array.d.ts.map +1 -0
  139. package/src/engine/ecs/transform/t64_read_pose_array.js +24 -0
  140. package/src/engine/graphics/ecs/animation/animator/AnimationClip.d.ts.map +1 -1
  141. package/src/engine/graphics/ecs/animation/animator/AnimationClip.js +8 -5
  142. package/src/engine/graphics/ecs/animation/animator/AnimationClipDefinition.js +2 -2
  143. package/src/engine/graphics/ecs/animation/animator/AnimationNotification.js +2 -2
  144. package/src/engine/graphics/ecs/animation/animator/AnimationNotificationDefinition.js +2 -2
  145. package/src/engine/graphics/ecs/animation/animator/graph/definition/AnimationGraphDefinition.js +2 -2
  146. package/src/engine/graphics/ecs/animation/animator/graph/definition/AnimationStateDefinition.js +2 -2
  147. package/src/engine/graphics/ecs/animation/animator/graph/definition/AnimationTransitionDefinition.d.ts.map +1 -1
  148. package/src/engine/graphics/ecs/animation/animator/graph/definition/AnimationTransitionDefinition.js +8 -5
  149. package/src/engine/graphics/ecs/decal/v2/Decal.d.ts.map +1 -1
  150. package/src/engine/graphics/ecs/decal/v2/Decal.js +9 -8
  151. package/src/engine/graphics/geometry/geometry_construct_triangle_normal_area_weighted.d.ts +2 -0
  152. package/src/engine/graphics/geometry/geometry_construct_triangle_normal_area_weighted.d.ts.map +1 -1
  153. package/src/engine/graphics/geometry/geometry_construct_triangle_normal_area_weighted.js +10 -21
  154. package/src/engine/graphics/render/frame_graph/resource/TextureResourceDescriptor.d.ts.map +1 -1
  155. package/src/engine/graphics/render/frame_graph/resource/TextureResourceDescriptor.js +9 -6
  156. package/src/engine/graphics3/AnimationGraphSystem.d.ts +5 -0
  157. package/src/engine/graphics3/AnimationGraphSystem.d.ts.map +1 -1
  158. package/src/engine/graphics3/AnimationGraphSystem.js +48 -2
  159. package/src/engine/graphics3/AnimationSystem.d.ts +5 -0
  160. package/src/engine/graphics3/AnimationSystem.d.ts.map +1 -1
  161. package/src/engine/graphics3/AnimationSystem.js +47 -2
  162. package/src/engine/graphics3/ParticipatingMedia.js +204 -204
  163. package/src/engine/graphics3/animation/AnimationClips.d.ts +5 -0
  164. package/src/engine/graphics3/animation/AnimationClips.d.ts.map +1 -1
  165. package/src/engine/graphics3/animation/AnimationClips.js +5 -0
  166. package/src/engine/graphics3/register_clips.d.ts +29 -0
  167. package/src/engine/graphics3/register_clips.d.ts.map +1 -1
  168. package/src/engine/graphics3/register_clips.js +52 -0
  169. package/src/engine/grid/obstacle/GridObstacle.js +2 -2
  170. package/src/engine/intelligence/behavior/selector/WeightedElement.js +2 -2
  171. package/src/engine/interpolation/Interpolated.js +2 -2
  172. package/src/engine/physics/broadphase/compute_fat_world_aabb.d.ts +9 -0
  173. package/src/engine/physics/broadphase/compute_fat_world_aabb.d.ts.map +1 -1
  174. package/src/engine/physics/broadphase/compute_fat_world_aabb.js +3 -1
  175. package/src/engine/physics/cloth/PLAN.md +10 -8
  176. package/src/engine/physics/cloth/build/cloth_bind_in_frame.d.ts +22 -0
  177. package/src/engine/physics/cloth/build/cloth_bind_in_frame.d.ts.map +1 -1
  178. package/src/engine/physics/cloth/build/cloth_bind_in_frame.js +51 -19
  179. package/src/engine/physics/cloth/build/cloth_proxy_from_joints.d.ts.map +1 -1
  180. package/src/engine/physics/cloth/build/cloth_proxy_from_joints.js +16 -2
  181. package/src/engine/physics/cloth/build/cloth_proxy_from_mesh.d.ts.map +1 -1
  182. package/src/engine/physics/cloth/build/cloth_proxy_from_mesh.js +19 -24
  183. package/src/engine/physics/cloth/collider/ClothColliderIndex.d.ts +7 -0
  184. package/src/engine/physics/cloth/collider/ClothColliderIndex.d.ts.map +1 -1
  185. package/src/engine/physics/cloth/collider/ClothColliderIndex.js +85 -67
  186. package/src/engine/physics/cloth/collider/cloth_collider_bounds.d.ts.map +1 -1
  187. package/src/engine/physics/cloth/collider/cloth_collider_bounds.js +19 -101
  188. package/src/engine/physics/cloth/collider/cloth_collider_pack.d.ts +2 -5
  189. package/src/engine/physics/cloth/collider/cloth_collider_pack.d.ts.map +1 -1
  190. package/src/engine/physics/cloth/collider/cloth_collider_pack.js +7 -15
  191. package/src/engine/physics/cloth/collider/cloth_collider_sdf.d.ts.map +1 -1
  192. package/src/engine/physics/cloth/collider/cloth_collider_sdf.js +16 -61
  193. package/src/engine/physics/cloth/ecs/Cloth.d.ts.map +1 -1
  194. package/src/engine/physics/cloth/ecs/Cloth.js +7 -5
  195. package/src/engine/physics/cloth/ecs/ClothCollider.d.ts.map +1 -1
  196. package/src/engine/physics/cloth/ecs/ClothCollider.js +7 -5
  197. package/src/engine/physics/cloth/ecs/ClothColliderFlags.d.ts +0 -1
  198. package/src/engine/physics/cloth/ecs/ClothColliderFlags.js +6 -19
  199. package/src/engine/physics/cloth/ecs/ClothColliderSystem.d.ts +1 -2
  200. package/src/engine/physics/cloth/ecs/ClothColliderSystem.d.ts.map +1 -1
  201. package/src/engine/physics/cloth/ecs/ClothColliderSystem.js +3 -12
  202. package/src/engine/physics/cloth/ecs/ClothDynamics.d.ts.map +1 -1
  203. package/src/engine/physics/cloth/ecs/ClothDynamics.js +20 -11
  204. package/src/engine/physics/cloth/ecs/ClothWorld.d.ts.map +1 -1
  205. package/src/engine/physics/cloth/ecs/ClothWorld.js +40 -130
  206. package/src/engine/physics/cloth/ecs/cloth_build_rows.d.ts.map +1 -1
  207. package/src/engine/physics/cloth/ecs/cloth_build_rows.js +17 -58
  208. package/src/engine/physics/cloth/ecs/cloth_dynamics_map.d.ts.map +1 -1
  209. package/src/engine/physics/cloth/ecs/cloth_dynamics_map.js +3 -3
  210. package/src/engine/physics/cloth/ecs/cloth_gather_colliders.d.ts.map +1 -1
  211. package/src/engine/physics/cloth/ecs/cloth_gather_colliders.js +44 -104
  212. package/src/engine/physics/cloth/ecs/cloth_geodesic.d.ts.map +1 -1
  213. package/src/engine/physics/cloth/ecs/cloth_geodesic.js +6 -13
  214. package/src/engine/physics/cloth/ecs/cloth_holds.d.ts.map +1 -1
  215. package/src/engine/physics/cloth/ecs/cloth_holds.js +15 -40
  216. package/src/engine/physics/cloth/ecs/cloth_reconstruct_pose.d.ts.map +1 -1
  217. package/src/engine/physics/cloth/ecs/cloth_reconstruct_pose.js +45 -79
  218. package/src/engine/physics/cloth/ecs/cloth_seed_subtree.d.ts.map +1 -1
  219. package/src/engine/physics/cloth/ecs/cloth_seed_subtree.js +7 -27
  220. package/src/engine/physics/cloth/ecs/cloth_write_back.d.ts.map +1 -1
  221. package/src/engine/physics/cloth/ecs/cloth_write_back.js +30 -62
  222. package/src/engine/physics/cloth/playground/cloth_playground_build.d.ts.map +1 -1
  223. package/src/engine/physics/cloth/playground/cloth_playground_build.js +2 -3
  224. package/src/engine/physics/cloth/playground/collide_main.js +2 -28
  225. package/src/engine/physics/cloth/playground/garment_main.js +4 -19
  226. package/src/engine/physics/cloth/playground/main.js +6 -48
  227. package/src/engine/physics/cloth/playground/rig_main.js +947 -955
  228. package/src/engine/physics/cloth/playground/wind_main.js +8 -7
  229. package/src/engine/physics/cloth/solver/ClothState.d.ts.map +1 -1
  230. package/src/engine/physics/cloth/solver/ClothState.js +16 -76
  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.map +1 -1
  235. package/src/engine/physics/cloth/solver/cloth_contact_find.js +3 -2
  236. package/src/engine/physics/cloth/solver/cloth_hold_line.d.ts.map +1 -1
  237. package/src/engine/physics/cloth/solver/cloth_hold_line.js +2 -14
  238. package/src/engine/physics/cloth/solver/cloth_kinetic_energy.d.ts +21 -0
  239. package/src/engine/physics/cloth/solver/cloth_kinetic_energy.d.ts.map +1 -0
  240. package/src/engine/physics/cloth/solver/cloth_kinetic_energy.js +45 -0
  241. package/src/engine/physics/cloth/solver/cloth_particle_coupling.d.ts +32 -0
  242. package/src/engine/physics/cloth/solver/cloth_particle_coupling.d.ts.map +1 -0
  243. package/src/engine/physics/cloth/solver/cloth_particle_coupling.js +133 -0
  244. package/src/engine/physics/cloth/solver/cloth_particle_of_source.d.ts +16 -0
  245. package/src/engine/physics/cloth/solver/cloth_particle_of_source.d.ts.map +1 -0
  246. package/src/engine/physics/cloth/solver/cloth_particle_of_source.js +19 -0
  247. package/src/engine/physics/cloth/solver/cloth_self_find.d.ts.map +1 -1
  248. package/src/engine/physics/cloth/solver/cloth_self_find.js +6 -55
  249. package/src/engine/physics/cloth/solver/cloth_solve_vertex.d.ts.map +1 -1
  250. package/src/engine/physics/cloth/solver/cloth_solve_vertex.js +30 -65
  251. package/src/engine/physics/cloth/solver/cloth_step.d.ts.map +1 -1
  252. package/src/engine/physics/cloth/solver/cloth_step.js +6 -28
  253. package/src/engine/physics/cloth/solver/cloth_step_instance.d.ts.map +1 -1
  254. package/src/engine/physics/cloth/solver/cloth_step_instance.js +2 -3
  255. package/src/engine/physics/cloth/solver/cloth_stretch_residual.d.ts +21 -0
  256. package/src/engine/physics/cloth/solver/cloth_stretch_residual.d.ts.map +1 -0
  257. package/src/engine/physics/cloth/solver/cloth_stretch_residual.js +54 -0
  258. package/src/engine/physics/cloth/solver/cloth_vertex_accumulator.d.ts +15 -0
  259. package/src/engine/physics/cloth/solver/cloth_vertex_accumulator.d.ts.map +1 -1
  260. package/src/engine/physics/cloth/solver/cloth_vertex_accumulator.js +28 -0
  261. package/src/engine/physics/cloth/solver/cloth_worst_tether_ratio.d.ts +30 -0
  262. package/src/engine/physics/cloth/solver/cloth_worst_tether_ratio.d.ts.map +1 -0
  263. package/src/engine/physics/cloth/solver/cloth_worst_tether_ratio.js +56 -0
  264. package/src/engine/physics/cloth/solver/constraint/cloth_contact_row.d.ts.map +1 -1
  265. package/src/engine/physics/cloth/solver/constraint/cloth_contact_row.js +3 -17
  266. package/src/engine/physics/cloth/wind/ClothFluidWind.d.ts +2 -1
  267. package/src/engine/physics/cloth/wind/ClothFluidWind.d.ts.map +1 -1
  268. package/src/engine/physics/cloth/wind/ClothFluidWind.js +7 -25
  269. package/src/engine/physics/cloth/wind/cloth_sample_air.d.ts +3 -1
  270. package/src/engine/physics/cloth/wind/cloth_sample_air.d.ts.map +1 -1
  271. package/src/engine/physics/cloth/wind/cloth_sample_air.js +40 -62
  272. package/src/engine/physics/ecs/ContactProbeSystem.d.ts.map +1 -1
  273. package/src/engine/physics/ecs/ContactProbeSystem.js +2 -18
  274. package/src/engine/physics/ecs/PhysicsSystem.d.ts.map +1 -1
  275. package/src/engine/physics/ecs/PhysicsSystem.js +9 -50
  276. package/src/engine/physics/fluid/FluidField.d.ts.map +1 -1
  277. package/src/engine/physics/fluid/FluidField.js +7 -5
  278. package/src/engine/physics/fluid/ecs/FluidComponent.d.ts.map +1 -1
  279. package/src/engine/physics/fluid/ecs/FluidComponent.js +19 -11
  280. package/src/engine/physics/fluid/ecs/fluid_sample_domain_bounds.d.ts +24 -0
  281. package/src/engine/physics/fluid/ecs/fluid_sample_domain_bounds.d.ts.map +1 -0
  282. package/src/engine/physics/fluid/ecs/fluid_sample_domain_bounds.js +42 -0
  283. package/src/engine/physics/fluid/ecs/fluid_sample_velocity_world_mps.d.ts +25 -0
  284. package/src/engine/physics/fluid/ecs/fluid_sample_velocity_world_mps.d.ts.map +1 -0
  285. package/src/engine/physics/fluid/ecs/fluid_sample_velocity_world_mps.js +40 -0
  286. package/src/engine/physics/fluid/effector/AbstractFluidEffector.d.ts +2 -2
  287. package/src/engine/physics/fluid/effector/AbstractFluidEffector.js +2 -2
  288. package/src/engine/physics/fluid/effector/GlobalFluidEffector.d.ts.map +1 -1
  289. package/src/engine/physics/fluid/effector/GlobalFluidEffector.js +11 -7
  290. package/src/engine/physics/fluid/effector/ImpulseFluidEffector.d.ts.map +1 -1
  291. package/src/engine/physics/fluid/effector/ImpulseFluidEffector.js +11 -7
  292. package/src/engine/physics/fluid/effector/WakeFluidEffector.d.ts.map +1 -1
  293. package/src/engine/physics/fluid/effector/WakeFluidEffector.js +16 -9
  294. package/src/engine/physics/inverse_kinematics/frame_fabrik/frame_fabrik_solve.d.ts.map +1 -1
  295. package/src/engine/physics/inverse_kinematics/frame_fabrik/frame_fabrik_solve.js +40 -90
  296. package/src/engine/physics/narrowphase/capsule_contacts.d.ts.map +1 -1
  297. package/src/engine/physics/narrowphase/capsule_contacts.js +3 -5
  298. package/src/engine/physics/narrowphase/decomposition/mesh_enumerate_triangles.d.ts.map +1 -1
  299. package/src/engine/physics/narrowphase/decomposition/mesh_enumerate_triangles.js +2 -14
  300. package/src/engine/physics/narrowphase/hull_sphere_contact.d.ts.map +1 -1
  301. package/src/engine/physics/narrowphase/hull_sphere_contact.js +2 -5
  302. package/src/engine/physics/narrowphase/narrowphase_step.d.ts.map +1 -1
  303. package/src/engine/physics/narrowphase/narrowphase_step.js +13 -32
  304. package/src/engine/physics/narrowphase/sphere_box_contact.d.ts.map +1 -1
  305. package/src/engine/physics/narrowphase/sphere_box_contact.js +2 -5
  306. package/src/engine/sound/ecs/audio/AudioEmitter.d.ts.map +1 -1
  307. package/src/engine/sound/ecs/audio/AudioEmitter.js +12 -7
  308. package/src/engine/sound/ecs/trigger/AudioEventTrigger.d.ts.map +1 -1
  309. package/src/engine/sound/ecs/trigger/AudioEventTrigger.js +192 -191
  310. package/src/engine/sound/simulation/core/AcousticMedium.js +2 -2
  311. package/src/engine/sound/simulation/definition/AcousticDirectivity.js +2 -2
  312. package/src/engine/sound/simulation/definition/AcousticMaterial.d.ts.map +1 -1
  313. package/src/engine/sound/simulation/definition/AcousticMaterial.js +11 -7
  314. package/src/engine/sound/sopra/definition/BusDefinition.d.ts.map +1 -1
  315. package/src/engine/sound/sopra/definition/BusDefinition.js +5 -4
  316. package/src/engine/sound/sopra/definition/DuckingRule.d.ts.map +1 -1
  317. package/src/engine/sound/sopra/definition/DuckingRule.js +7 -5
  318. package/src/engine/sound/sopra/definition/EventDescription.d.ts.map +1 -1
  319. package/src/engine/sound/sopra/definition/EventDescription.js +23 -13
  320. package/src/engine/sound/sopra/definition/MixerSnapshot.js +2 -2
  321. package/src/engine/sound/sopra/definition/ParameterDefinition.d.ts.map +1 -1
  322. package/src/engine/sound/sopra/definition/ParameterDefinition.js +7 -5
  323. package/src/engine/sound/sopra/definition/clip/AbstractAudioClip.js +2 -2
  324. package/src/engine/sound/sopra/definition/clip/BlendContainerAudioClip.d.ts.map +1 -1
  325. package/src/engine/sound/sopra/definition/clip/BlendContainerAudioClip.js +4 -3
  326. package/src/engine/sound/sopra/definition/clip/ContainerAudioClip.js +2 -2
  327. package/src/engine/sound/sopra/definition/clip/RandomContainerAudioClip.js +3 -3
  328. package/src/engine/sound/sopra/definition/clip/SampleAudioClip.d.ts.map +1 -1
  329. package/src/engine/sound/sopra/definition/clip/SampleAudioClip.js +16 -9
  330. package/src/engine/sound/sopra/definition/clip/SilenceAudioClip.js +2 -2
  331. package/src/engine/sound/sopra/definition/clip/SwitchContainerAudioClip.d.ts +1 -1
  332. package/src/engine/sound/sopra/definition/clip/SwitchContainerAudioClip.d.ts.map +1 -1
  333. package/src/engine/sound/sopra/definition/clip/SwitchContainerAudioClip.js +2 -2
  334. package/src/engine/sound/sopra/definition/effect/CompressorEffect.d.ts.map +1 -1
  335. package/src/engine/sound/sopra/definition/effect/CompressorEffect.js +7 -5
  336. package/src/engine/sound/sopra/definition/effect/EqEffect.d.ts.map +1 -1
  337. package/src/engine/sound/sopra/definition/effect/EqEffect.js +8 -5
  338. package/src/engine/sound/sopra/definition/effect/ReverbEffect.js +2 -2
  339. package/src/engine/sound/sopra/legacy/SoundEmitter.d.ts.map +1 -1
  340. package/src/engine/sound/sopra/legacy/SoundEmitter.js +357 -352
  341. package/src/engine/sound/sopra/legacy/SoundTrack.d.ts.map +1 -1
  342. package/src/engine/sound/sopra/legacy/SoundTrack.js +281 -278
  343. package/src/format/image/png/PNGReader.js +644 -644
  344. package/src/format/image/png/crc32.d.ts +1 -1
  345. package/src/format/image/png/crc32.js +7 -8
  346. package/src/format/texture/basis/transcode/etc1s_to_astc.d.ts.map +1 -1
  347. package/src/format/texture/basis/transcode/etc1s_to_astc.js +2 -1
  348. package/src/shade/descriptor/binding/BindGroupLayoutDescriptor.js +2 -2
  349. package/src/shade/descriptor/binding/BindGroupLayoutEntry.d.ts.map +1 -1
  350. package/src/shade/descriptor/binding/BindGroupLayoutEntry.js +12 -8
  351. package/src/shade/descriptor/binding/StorageTextureBindingLayout.js +2 -2
  352. package/src/shade/descriptor/binding/TextureBindingLayout.js +2 -2
  353. package/src/shade/descriptor/blend/BlendComponent.js +2 -2
  354. package/src/shade/descriptor/pipeline/PipelineDescriptorBase.js +2 -2
  355. package/src/shade/descriptor/pipeline/PipelineLayoutDescriptor.js +2 -2
  356. package/src/shade/descriptor/pipeline/ProgrammableStage.js +2 -2
  357. package/src/shade/descriptor/pipeline/compute/ComputePipelineDescriptor.js +2 -2
  358. package/src/shade/descriptor/pipeline/render/ColorTargetState.js +2 -2
  359. package/src/shade/descriptor/pipeline/render/FragmentState.js +2 -2
  360. package/src/shade/descriptor/pipeline/render/PrimitiveState.js +2 -2
  361. package/src/shade/descriptor/pipeline/render/RenderPipelineDescriptor.d.ts.map +1 -1
  362. package/src/shade/descriptor/pipeline/render/RenderPipelineDescriptor.js +8 -5
  363. package/src/shade/descriptor/pipeline/render/VertexAttribute.js +2 -2
  364. package/src/shade/descriptor/texture/SamplerDescriptor.d.ts.map +1 -1
  365. package/src/shade/descriptor/texture/SamplerDescriptor.js +20 -12
  366. package/src/shade/descriptor/texture/TextureDescriptor.d.ts.map +1 -1
  367. package/src/shade/descriptor/texture/TextureDescriptor.js +11 -7
  368. package/src/shade/device/graph/BufferResourceDescriptor.d.ts.map +1 -1
  369. package/src/shade/device/graph/BufferResourceDescriptor.js +196 -193
  370. package/src/shade/device/graph/TextureResourceDescriptor.d.ts.map +1 -1
  371. package/src/shade/device/graph/TextureResourceDescriptor.js +178 -173
  372. package/src/shade/device/timing/profile/sgpt_read_header.js +1 -1
  373. package/src/shade/device/timing/profile/sgpt_read_records.js +1 -1
  374. package/src/shade/device/timing/profile/sgpt_write_header.js +1 -1
  375. package/src/shade/device/timing/profile/sgpt_write_record.js +1 -1
  376. package/src/shade/playground/image_decode_bench/main.js +2 -1
  377. package/src/shade/playground/skinned_blas_refit/diff_traced_against_rasterized.d.ts.map +1 -1
  378. package/src/shade/playground/skinned_blas_refit/diff_traced_against_rasterized.js +2 -1
  379. package/src/shade/playground/skinned_mesh_soup/verify_clone_vertices.d.ts.map +1 -1
  380. package/src/shade/playground/skinned_mesh_soup/verify_clone_vertices.js +2 -1
  381. package/src/shade/playground/ssr_variance/statistics.d.ts.map +1 -1
  382. package/src/shade/playground/ssr_variance/statistics.js +2 -1
  383. package/src/shade/playground/texture_encode/main.d.ts.map +1 -1
  384. package/src/shade/playground/texture_encode/main.js +2 -1
  385. package/src/shade/playground/volumetrics_froxel/measure.d.ts.map +1 -1
  386. package/src/shade/playground/volumetrics_froxel/measure.js +2 -1
  387. package/src/shade/renderer/binding/BufferBinding.js +2 -2
  388. package/src/shade/renderer/buffer/table/gpu_database_check_links.d.ts.map +1 -1
  389. package/src/shade/renderer/buffer/table/gpu_database_check_links.js +2 -1
  390. package/src/shade/renderer/camera/Camera.js +2 -2
  391. package/src/shade/renderer/geometry/Attribute.js +2 -2
  392. package/src/shade/renderer/geometry/Geometry.js +2 -2
  393. package/src/shade/renderer/geometry/geometry_deduplicate_vertices.js +2 -2
  394. package/src/shade/renderer/geometry/meshlet/MeshletBatch.js +2 -2
  395. package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_group_step.d.ts.map +1 -1
  396. package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_group_step.js +3 -2
  397. package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_leaf_frontier.d.ts.map +1 -1
  398. package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_leaf_frontier.js +2 -1
  399. package/src/shade/renderer/geometry/virtual/build/level/vgeo_partition_into_groups.d.ts.map +1 -1
  400. package/src/shade/renderer/geometry/virtual/build/level/vgeo_partition_into_groups.js +2 -1
  401. package/src/shade/renderer/geometry/virtual/build/level/vgeo_run_round.d.ts.map +1 -1
  402. package/src/shade/renderer/geometry/virtual/build/level/vgeo_run_round.js +2 -1
  403. package/src/shade/renderer/geometry/virtual/build/level/vgeo_try_repack.d.ts.map +1 -1
  404. package/src/shade/renderer/geometry/virtual/build/level/vgeo_try_repack.js +3 -2
  405. package/src/shade/renderer/geometry/virtual/build/partition/vgeo_graph_components.d.ts.map +1 -1
  406. package/src/shade/renderer/geometry/virtual/build/partition/vgeo_graph_components.js +2 -1
  407. package/src/shade/renderer/geometry/virtual/build/partition/vgeo_split_face_set_packed.d.ts.map +1 -1
  408. package/src/shade/renderer/geometry/virtual/build/partition/vgeo_split_face_set_packed.js +2 -1
  409. package/src/shade/renderer/geometry/virtual/format/checksum/vgeo_compute_asset_id.js +13 -13
  410. package/src/shade/renderer/geometry/virtual/format/checksum/vgeo_compute_directory_block_checksum.js +41 -41
  411. package/src/shade/renderer/geometry/virtual/format/checksum/vgeo_compute_frame_checksum.js +41 -41
  412. package/src/shade/renderer/geometry/virtual/format/checksum/vgeo_compute_header_checksum.js +25 -25
  413. package/src/shade/renderer/geometry/virtual/format/vgeo_write_container.d.ts.map +1 -1
  414. package/src/shade/renderer/geometry/virtual/format/vgeo_write_container.js +3 -2
  415. package/src/shade/renderer/material/StandardShadeMaterial.d.ts.map +1 -1
  416. package/src/shade/renderer/material/StandardShadeMaterial.js +13 -8
  417. package/src/shade/renderer/particles/optimizer/dag/particle_vector_extract.d.ts.map +1 -1
  418. package/src/shade/renderer/particles/optimizer/dag/particle_vector_extract.js +3 -2
  419. package/src/shade/renderer/scene/optimization/geometry/internal/triangle_fingerprint_stream.d.ts.map +1 -1
  420. package/src/shade/renderer/scene/optimization/geometry/internal/triangle_fingerprint_stream.js +14 -5
  421. package/src/shade/renderer/scene/optimization/sampler2d_from_image_bitmap.js +1 -1
  422. package/src/shade/renderer/shader/type/WGSLStructField.js +2 -2
  423. package/src/shade/renderer/shader/type/WebGPUArray.js +2 -2
  424. package/src/shade/renderer/shader/type/WebGPUStruct.d.ts.map +1 -1
  425. package/src/shade/renderer/shader/type/WebGPUStruct.js +9 -6
  426. package/src/shade/renderer/texture/ShadeTexture.d.ts.map +1 -1
  427. package/src/shade/renderer/texture/ShadeTexture.js +17 -10
  428. package/src/shade/renderer/texture/mipmaps/WebGPUMipmapGenerator.js +2 -2
  429. package/src/shade/renderer/water/surface/chunk_water_surface_sample.d.ts +4 -4
  430. package/src/shade/renderer/water/surface/chunk_water_surface_sample.js +6 -6
  431. package/src/shade/renderer/water/surface/particles/GPUWaterParticles.d.ts.map +1 -1
  432. package/src/shade/renderer/water/surface/particles/GPUWaterParticles.js +46 -55
  433. package/src/shade/renderer/water/surface/particles/WATER_PARTICLE_STRUCT.d.ts +3 -3
  434. package/src/shade/renderer/water/surface/particles/WATER_PARTICLE_STRUCT.d.ts.map +1 -1
  435. package/src/shade/renderer/water/surface/particles/WATER_PARTICLE_STRUCT.js +14 -4
  436. package/src/shade/renderer/water/surface/particles/chunk_water_particle.d.ts +10 -1
  437. package/src/shade/renderer/water/surface/particles/chunk_water_particle.d.ts.map +1 -1
  438. package/src/shade/renderer/water/surface/particles/chunk_water_particle.js +82 -40
  439. package/src/shade/renderer/water/surface/particles/chunk_water_particle_step.d.ts +4 -1
  440. package/src/shade/renderer/water/surface/particles/chunk_water_particle_step.d.ts.map +1 -1
  441. package/src/shade/renderer/water/surface/particles/chunk_water_particle_step.js +8 -4
  442. package/src/shade/renderer/water/surface/particles/shader_water_particles.d.ts +98 -86
  443. package/src/shade/renderer/water/surface/particles/shader_water_particles.d.ts.map +1 -1
  444. package/src/shade/renderer/water/surface/particles/shader_water_particles.js +440 -298
  445. package/src/view/common/HTMLElementCacheKey.d.ts.map +1 -1
  446. package/src/view/common/HTMLElementCacheKey.js +4 -3
  447. package/src/view/minimap/MinimapMarker.js +2 -2
@@ -1,204 +1,204 @@
1
- import { assert } from "../../core/assert.js";
2
- import { combine_hash } from "../../core/collection/array/combine_hash.js";
3
- import { rgb_to_luminance } from "../../core/color/rgb_to_luminance.js";
4
- import { computeHashFloat } from "../../core/primitives/numbers/computeHashFloat.js";
5
- import {
6
- VOLUMETRIC_PARTICLE_SPEC_FOG,
7
- VolumetricsParticleSpec
8
- } from "../../shade/renderer/volumetrics/ParticipatingMediaVolume.js";
9
-
10
- /**
11
- * Particles per cubic metre of dense fog, which is what a medium is until it is told otherwise.
12
- * @type {number}
13
- */
14
- const DEFAULT_DENSITY = 3e7;
15
-
16
- /**
17
- * @type {number}
18
- */
19
- const DEFAULT_FADE_DISTANCE = 0.1;
20
-
21
- /**
22
- * A box of fog, smoke, dust or cloud that an entity carries around.
23
- *
24
- * **What is in here is the medium; the {@link Transform} beside it is the box.** Shade's
25
- * {@link ParticipatingMediaVolume} is a unit cube centred on the origin, posed by a transform — so
26
- * position, size and orientation are already an ECS concept and there is nothing to restate. Which
27
- * is also why this component does nothing on its own: {@link ParticipatingMediaSystem} links it
28
- * against a `Transform` and only that pair becomes a volume.
29
- *
30
- * **Three numbers, in two different currencies.** {@link particle_spec} is what a single particle
31
- * does to light — a Mie solution, physical and reusable — and {@link density} is how many of them
32
- * there are per cubic metre. The pair is what makes smoke and fog different things rather than the
33
- * same fog at two strengths. Authoring in raw density means knowing the cross-sections, so
34
- * {@link target_extinction} exists to author the other way round: say how much light the medium
35
- * should swallow and let the particle decide the count.
36
- *
37
- * @see ParticipatingMediaSystem what turns this into something the renderer draws
38
- * @see ParticipatingMediaVolume the renderer's own object
39
- */
40
- export class ParticipatingMedia {
41
-
42
- /**
43
- * Particles per cubic metre.
44
- *
45
- * Physically a count, so the numbers are large — the default is dense fog — and the useful range
46
- * depends entirely on {@link particle_spec}: a cloud droplet blocks far more light than a haze
47
- * particle, so the same count of them is a very different medium.
48
- *
49
- * @type {number}
50
- */
51
- density = DEFAULT_DENSITY;
52
-
53
- /**
54
- * What one particle of this medium does to light.
55
- *
56
- * Defaults to fog. The generated `MIE_PARTICLES_STANDARD_PRECOMPUTED` library is where the
57
- * physically meaningful values live — `VolumetricsParticleSpec.fromMeep` converts an entry of it
58
- * into one of these.
59
- *
60
- * @type {VolumetricsParticleSpec}
61
- */
62
- particle_spec = VolumetricsParticleSpec.fromJSON(VOLUMETRIC_PARTICLE_SPEC_FOG);
63
-
64
- /**
65
- * How far in from the box's faces the medium fades out, in metres.
66
- *
67
- * **World-space, and deliberately not scaled by the transform**, so a 0.5 here is half a metre
68
- * of softness whether the volume is a metre across or a hundred. Zero gives the box hard edges,
69
- * which is visible as a straight line across the screen wherever the box crosses the view.
70
- *
71
- * @type {number}
72
- */
73
- fade_distance = DEFAULT_FADE_DISTANCE;
74
-
75
- /**
76
- * The medium's extinction per metre, which is {@link density} expressed in what it does rather
77
- * than in how many particles it took.
78
- *
79
- * The point of it is that it is comparable across particles: a smoke volume and a fog volume set
80
- * to the same target extinction swallow the same amount of light, while the same *density* in
81
- * both would differ by orders of magnitude.
82
- *
83
- * **Derived, not stored** — writing it sets {@link density}, and changing `particle_spec`
84
- * afterwards therefore changes what reading it back gives. The density is what survives a save.
85
- *
86
- * @returns {number}
87
- */
88
- get target_extinction() {
89
- return this.density * rgb_to_luminance(...this.particle_spec.extinction);
90
- }
91
-
92
- /**
93
- * @param {number} value
94
- */
95
- set target_extinction(value) {
96
- assert.isNumber(value, 'target_extinction');
97
- assert.isFinite(value, 'target_extinction');
98
-
99
- const density = value / rgb_to_luminance(...this.particle_spec.extinction);
100
-
101
- /*
102
- Catches the one way this goes wrong: a particle spec that extinguishes nothing. A default-
103
- constructed `VolumetricsParticleSpec` has zero cross-sections, and asking such a medium to
104
- reach any extinction at all needs infinitely many of its particles. Rejecting it here names
105
- the mistake; letting it through puts an `Infinity` in the GPU table, where it becomes a
106
- screenful of NaN several passes later.
107
- */
108
- assert.isFinite(density, 'the density this target_extinction implies (the particle spec extinguishes nothing)');
109
-
110
- this.density = density;
111
- }
112
-
113
- /**
114
- * @param {*} json
115
- * @returns {ParticipatingMedia}
116
- */
117
- static fromJSON(json) {
118
- const r = new ParticipatingMedia();
119
-
120
- r.fromJSON(json);
121
-
122
- return r;
123
- }
124
-
125
- toJSON() {
126
- const spec = this.particle_spec;
127
-
128
- return {
129
- density: this.density,
130
- fade_distance: this.fade_distance,
131
- particle_spec: {
132
- scattering: spec.scattering.slice(),
133
- extinction: spec.extinction.slice(),
134
- radius: spec.radius,
135
- g: spec.g
136
- }
137
- };
138
- }
139
-
140
- /**
141
- * @param {Object} options
142
- * @param {number} [options.density]
143
- * @param {number} [options.fade_distance]
144
- * @param {object} [options.particle_spec] omitted resets the medium to fog rather than leaving whatever
145
- * the component already held — a load has to determine the whole component, or an instance being
146
- * reused would carry the previous level's particle into the next one
147
- */
148
- fromJSON({
149
- density = DEFAULT_DENSITY,
150
- fade_distance = DEFAULT_FADE_DISTANCE,
151
- particle_spec
152
- }) {
153
- assert.isNumber(density, 'density');
154
- assert.isFinite(density, 'density');
155
- assert.greaterThanOrEqual(density, 0, 'density must not be negative');
156
-
157
- assert.isNumber(fade_distance, 'fade_distance');
158
- assert.isFinite(fade_distance, 'fade_distance');
159
- assert.greaterThanOrEqual(fade_distance, 0, 'fade_distance must not be negative');
160
-
161
- this.density = density;
162
- this.fade_distance = fade_distance;
163
-
164
- if (particle_spec === undefined) {
165
- this.particle_spec.copy(VOLUMETRIC_PARTICLE_SPEC_FOG);
166
- } else {
167
- this.particle_spec.fromJSON(particle_spec);
168
- }
169
- }
170
-
171
- /**
172
- * **The cross-sections and the radius are left out of this on purpose.** They run to 1e-16 and
173
- * 1e-6, and {@link computeHashFloat} collapses anything that small to zero, so mixing them in
174
- * would cost a multiply and buy no dispersion at all. A hash is allowed to collide;
175
- * {@link equals} is the exact one.
176
- *
177
- * @returns {number}
178
- */
179
- hash() {
180
- const spec = this.particle_spec;
181
-
182
- return combine_hash(
183
- computeHashFloat(this.density),
184
- computeHashFloat(this.fade_distance),
185
- computeHashFloat(spec.g)
186
- );
187
- }
188
-
189
- /**
190
- * @param {ParticipatingMedia} other
191
- * @returns {boolean}
192
- */
193
- equals(other) {
194
- return this.density === other.density
195
- && this.fade_distance === other.fade_distance
196
- && this.particle_spec.equals(other.particle_spec);
197
- }
198
- }
199
-
200
- /**
201
- * @readonly
202
- * @type {string}
203
- */
204
- ParticipatingMedia.typeName = "ParticipatingMedia";
1
+ import { assert } from "../../core/assert.js";
2
+ import { hash_mix3 } from "../../core/math/hash/hash_mix3.js";
3
+ import { rgb_to_luminance } from "../../core/color/rgb_to_luminance.js";
4
+ import { computeHashFloat } from "../../core/primitives/numbers/computeHashFloat.js";
5
+ import {
6
+ VOLUMETRIC_PARTICLE_SPEC_FOG,
7
+ VolumetricsParticleSpec
8
+ } from "../../shade/renderer/volumetrics/ParticipatingMediaVolume.js";
9
+
10
+ /**
11
+ * Particles per cubic metre of dense fog, which is what a medium is until it is told otherwise.
12
+ * @type {number}
13
+ */
14
+ const DEFAULT_DENSITY = 3e7;
15
+
16
+ /**
17
+ * @type {number}
18
+ */
19
+ const DEFAULT_FADE_DISTANCE = 0.1;
20
+
21
+ /**
22
+ * A box of fog, smoke, dust or cloud that an entity carries around.
23
+ *
24
+ * **What is in here is the medium; the {@link Transform} beside it is the box.** Shade's
25
+ * {@link ParticipatingMediaVolume} is a unit cube centred on the origin, posed by a transform — so
26
+ * position, size and orientation are already an ECS concept and there is nothing to restate. Which
27
+ * is also why this component does nothing on its own: {@link ParticipatingMediaSystem} links it
28
+ * against a `Transform` and only that pair becomes a volume.
29
+ *
30
+ * **Three numbers, in two different currencies.** {@link particle_spec} is what a single particle
31
+ * does to light — a Mie solution, physical and reusable — and {@link density} is how many of them
32
+ * there are per cubic metre. The pair is what makes smoke and fog different things rather than the
33
+ * same fog at two strengths. Authoring in raw density means knowing the cross-sections, so
34
+ * {@link target_extinction} exists to author the other way round: say how much light the medium
35
+ * should swallow and let the particle decide the count.
36
+ *
37
+ * @see ParticipatingMediaSystem what turns this into something the renderer draws
38
+ * @see ParticipatingMediaVolume the renderer's own object
39
+ */
40
+ export class ParticipatingMedia {
41
+
42
+ /**
43
+ * Particles per cubic metre.
44
+ *
45
+ * Physically a count, so the numbers are large — the default is dense fog — and the useful range
46
+ * depends entirely on {@link particle_spec}: a cloud droplet blocks far more light than a haze
47
+ * particle, so the same count of them is a very different medium.
48
+ *
49
+ * @type {number}
50
+ */
51
+ density = DEFAULT_DENSITY;
52
+
53
+ /**
54
+ * What one particle of this medium does to light.
55
+ *
56
+ * Defaults to fog. The generated `MIE_PARTICLES_STANDARD_PRECOMPUTED` library is where the
57
+ * physically meaningful values live — `VolumetricsParticleSpec.fromMeep` converts an entry of it
58
+ * into one of these.
59
+ *
60
+ * @type {VolumetricsParticleSpec}
61
+ */
62
+ particle_spec = VolumetricsParticleSpec.fromJSON(VOLUMETRIC_PARTICLE_SPEC_FOG);
63
+
64
+ /**
65
+ * How far in from the box's faces the medium fades out, in metres.
66
+ *
67
+ * **World-space, and deliberately not scaled by the transform**, so a 0.5 here is half a metre
68
+ * of softness whether the volume is a metre across or a hundred. Zero gives the box hard edges,
69
+ * which is visible as a straight line across the screen wherever the box crosses the view.
70
+ *
71
+ * @type {number}
72
+ */
73
+ fade_distance = DEFAULT_FADE_DISTANCE;
74
+
75
+ /**
76
+ * The medium's extinction per metre, which is {@link density} expressed in what it does rather
77
+ * than in how many particles it took.
78
+ *
79
+ * The point of it is that it is comparable across particles: a smoke volume and a fog volume set
80
+ * to the same target extinction swallow the same amount of light, while the same *density* in
81
+ * both would differ by orders of magnitude.
82
+ *
83
+ * **Derived, not stored** — writing it sets {@link density}, and changing `particle_spec`
84
+ * afterwards therefore changes what reading it back gives. The density is what survives a save.
85
+ *
86
+ * @returns {number}
87
+ */
88
+ get target_extinction() {
89
+ return this.density * rgb_to_luminance(...this.particle_spec.extinction);
90
+ }
91
+
92
+ /**
93
+ * @param {number} value
94
+ */
95
+ set target_extinction(value) {
96
+ assert.isNumber(value, 'target_extinction');
97
+ assert.isFinite(value, 'target_extinction');
98
+
99
+ const density = value / rgb_to_luminance(...this.particle_spec.extinction);
100
+
101
+ /*
102
+ Catches the one way this goes wrong: a particle spec that extinguishes nothing. A default-
103
+ constructed `VolumetricsParticleSpec` has zero cross-sections, and asking such a medium to
104
+ reach any extinction at all needs infinitely many of its particles. Rejecting it here names
105
+ the mistake; letting it through puts an `Infinity` in the GPU table, where it becomes a
106
+ screenful of NaN several passes later.
107
+ */
108
+ assert.isFinite(density, 'the density this target_extinction implies (the particle spec extinguishes nothing)');
109
+
110
+ this.density = density;
111
+ }
112
+
113
+ /**
114
+ * @param {*} json
115
+ * @returns {ParticipatingMedia}
116
+ */
117
+ static fromJSON(json) {
118
+ const r = new ParticipatingMedia();
119
+
120
+ r.fromJSON(json);
121
+
122
+ return r;
123
+ }
124
+
125
+ toJSON() {
126
+ const spec = this.particle_spec;
127
+
128
+ return {
129
+ density: this.density,
130
+ fade_distance: this.fade_distance,
131
+ particle_spec: {
132
+ scattering: spec.scattering.slice(),
133
+ extinction: spec.extinction.slice(),
134
+ radius: spec.radius,
135
+ g: spec.g
136
+ }
137
+ };
138
+ }
139
+
140
+ /**
141
+ * @param {Object} options
142
+ * @param {number} [options.density]
143
+ * @param {number} [options.fade_distance]
144
+ * @param {object} [options.particle_spec] omitted resets the medium to fog rather than leaving whatever
145
+ * the component already held — a load has to determine the whole component, or an instance being
146
+ * reused would carry the previous level's particle into the next one
147
+ */
148
+ fromJSON({
149
+ density = DEFAULT_DENSITY,
150
+ fade_distance = DEFAULT_FADE_DISTANCE,
151
+ particle_spec
152
+ }) {
153
+ assert.isNumber(density, 'density');
154
+ assert.isFinite(density, 'density');
155
+ assert.greaterThanOrEqual(density, 0, 'density must not be negative');
156
+
157
+ assert.isNumber(fade_distance, 'fade_distance');
158
+ assert.isFinite(fade_distance, 'fade_distance');
159
+ assert.greaterThanOrEqual(fade_distance, 0, 'fade_distance must not be negative');
160
+
161
+ this.density = density;
162
+ this.fade_distance = fade_distance;
163
+
164
+ if (particle_spec === undefined) {
165
+ this.particle_spec.copy(VOLUMETRIC_PARTICLE_SPEC_FOG);
166
+ } else {
167
+ this.particle_spec.fromJSON(particle_spec);
168
+ }
169
+ }
170
+
171
+ /**
172
+ * **The cross-sections and the radius are left out of this on purpose.** They run to 1e-16 and
173
+ * 1e-6, and {@link computeHashFloat} collapses anything that small to zero, so mixing them in
174
+ * would cost a multiply and buy no dispersion at all. A hash is allowed to collide;
175
+ * {@link equals} is the exact one.
176
+ *
177
+ * @returns {number}
178
+ */
179
+ hash() {
180
+ const spec = this.particle_spec;
181
+
182
+ return hash_mix3(
183
+ computeHashFloat(this.density),
184
+ computeHashFloat(this.fade_distance),
185
+ computeHashFloat(spec.g)
186
+ );
187
+ }
188
+
189
+ /**
190
+ * @param {ParticipatingMedia} other
191
+ * @returns {boolean}
192
+ */
193
+ equals(other) {
194
+ return this.density === other.density
195
+ && this.fade_distance === other.fade_distance
196
+ && this.particle_spec.equals(other.particle_spec);
197
+ }
198
+ }
199
+
200
+ /**
201
+ * @readonly
202
+ * @type {string}
203
+ */
204
+ ParticipatingMedia.typeName = "ParticipatingMedia";
@@ -23,6 +23,11 @@
23
23
  * clip, take the component off and put another on, which the drivers see as their entity leaving
24
24
  * and coming back.
25
25
  *
26
+ * **The entities it keys go no sooner than it does.** While it is on, the drivers hold a row for
27
+ * every entity a channel keys, as a skin holds its joints'. Removing one of them means taking this
28
+ * off before the next frame — `prefab_instance_destroy` removes the entities and then the clips, in
29
+ * one step — or the scene is left holding the row of an entity that is gone.
30
+ *
26
31
  * **Not saved**, for the reason `MeshSkin` is not: the channels key entities that whatever builds
27
32
  * the rig creates, and the curves are asset data. A load rebuilds them the way it rebuilds the rig.
28
33
  *
@@ -1 +1 @@
1
- {"version":3,"file":"AnimationClips.d.ts","sourceRoot":"","sources":["../../../../../src/engine/graphics3/animation/AnimationClips.js"],"names":[],"mappings":"AAEA;;GAEG;AAEH;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH;IASI;;;OAGG;IACH,mBAHW,kBAAkB,EAAE,GAClB,cAAc,CAc1B;IAxBD;;;;;OAKG;IACH,OAFU,kBAAkB,EAAE,CAEnB;IAqBf;;;OAGG;IACH,2BAFU,OAAO,CAEwB;CANxC;;kBAUS,MAAM;sBAMN,OAAO;;iCAzEJ,OAAO,yDAAyD,EAAE,kBAAkB"}
1
+ {"version":3,"file":"AnimationClips.d.ts","sourceRoot":"","sources":["../../../../../src/engine/graphics3/animation/AnimationClips.js"],"names":[],"mappings":"AAEA;;GAEG;AAEH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH;IASI;;;OAGG;IACH,mBAHW,kBAAkB,EAAE,GAClB,cAAc,CAc1B;IAxBD;;;;;OAKG;IACH,OAFU,kBAAkB,EAAE,CAEnB;IAqBf;;;OAGG;IACH,2BAFU,OAAO,CAEwB;CANxC;;kBAUS,MAAM;sBAMN,OAAO;;iCA9EJ,OAAO,yDAAyD,EAAE,kBAAkB"}
@@ -26,6 +26,11 @@ import { assert } from "../../../core/assert.js";
26
26
  * clip, take the component off and put another on, which the drivers see as their entity leaving
27
27
  * and coming back.
28
28
  *
29
+ * **The entities it keys go no sooner than it does.** While it is on, the drivers hold a row for
30
+ * every entity a channel keys, as a skin holds its joints'. Removing one of them means taking this
31
+ * off before the next frame — `prefab_instance_destroy` removes the entities and then the clips, in
32
+ * one step — or the scene is left holding the row of an entity that is gone.
33
+ *
29
34
  * **Not saved**, for the reason `MeshSkin` is not: the channels key entities that whatever builds
30
35
  * the rig creates, and the curves are asset data. A load rebuilds them the way it rebuilds the rig.
31
36
  *
@@ -1,3 +1,30 @@
1
+ /**
2
+ * Hold a row, with the chain above it, for every entity the clips key.
3
+ *
4
+ * **A clip binds only once every node it keys holds a row**, and until then it is queued and moves
5
+ * nothing. A skin holds its joints' chains and a primitive its own, but a keyed node that is neither
6
+ * — a leaf an exporter left out of the skin, a socket nothing is attached to yet, an animated empty
7
+ * — is held by nothing else, and one such node keeps the whole clip from playing. So the driver that
8
+ * plays the clips holds every node they key, for as long as it has the clips.
9
+ *
10
+ * Every clip of the set, not only the ones registered: the set is replaced and never edited, so its
11
+ * targets are settled once, while which of its clips are registered moves with the list or the graph.
12
+ *
13
+ * One hold per channel, given back one per channel by {@link release_clip_targets}: the chains count
14
+ * holds, so a node keyed by several channels is held until the last of them is released.
15
+ *
16
+ * @param {RowChains} chains
17
+ * @param {ShadeAnimationClip[]} clips their channels target entities
18
+ */
19
+ export function hold_clip_targets(chains: RowChains, clips: ShadeAnimationClip[]): void;
20
+ /**
21
+ * Give back what {@link hold_clip_targets} took for the same clips. Released after the clips are
22
+ * unregistered, so no binding outlives the row it writes.
23
+ *
24
+ * @param {RowChains} chains
25
+ * @param {ShadeAnimationClip[]} clips
26
+ */
27
+ export function release_clip_targets(chains: RowChains, clips: ShadeAnimationClip[]): void;
1
28
  /**
2
29
  * Make some of an entity's clips playable — the ones a driver actually plays, and no others.
3
30
  *
@@ -28,6 +55,7 @@ export function unregister_clips(registration: ClipRegistration): void;
28
55
  /**
29
56
  * @typedef {import("../../shade/renderer/scene/GPUSceneContext.js").GPUSceneContext} GPUSceneContext
30
57
  * @typedef {import("../../shade/renderer/animation/ShadeAnimationClip.js").ShadeAnimationClip} ShadeAnimationClip
58
+ * @typedef {import("./RowChains.js").RowChains} RowChains
31
59
  */
32
60
  /**
33
61
  * The id a clip has when nobody registered it.
@@ -61,4 +89,5 @@ export class ClipRegistration {
61
89
  }
62
90
  export type GPUSceneContext = import("../../shade/renderer/scene/GPUSceneContext.js").GPUSceneContext;
63
91
  export type ShadeAnimationClip = import("../../shade/renderer/animation/ShadeAnimationClip.js").ShadeAnimationClip;
92
+ export type RowChains = import("./RowChains.js").RowChains;
64
93
  //# sourceMappingURL=register_clips.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"register_clips.d.ts","sourceRoot":"","sources":["../../../../src/engine/graphics3/register_clips.js"],"names":[],"mappings":"AAwCA;;;;;;;;;;;;;;;;GAgBG;AACH,wCALW,eAAe,SACf,kBAAkB,EAAE,SACpB,UAAU,MAAM,CAAC,GACf,gBAAgB,CA6B5B;AAED;;;;;;;GAOG;AACH,+CAFW,gBAAgB,QAqB1B;AA/GD;;;GAGG;AAEH;;;GAGG;AACH,kCAFU,MAAM,CAEsB;AAEtC;;;;;;;GAOG;AACH;IACI;;;;;;;;;OASG;IACH,SAFU,eAAe,GAAC,IAAI,CAEf;IAEf;;OAEG;IACH,KAFU,UAAU,CAEI;CAC3B;8BAnCY,OAAO,+CAA+C,EAAE,eAAe;iCACvE,OAAO,sDAAsD,EAAE,kBAAkB"}
1
+ {"version":3,"file":"register_clips.d.ts","sourceRoot":"","sources":["../../../../src/engine/graphics3/register_clips.js"],"names":[],"mappings":"AAyCA;;;;;;;;;;;;;;;;;GAiBG;AACH,0CAHW,SAAS,SACT,kBAAkB,EAAE,QAa9B;AAED;;;;;;GAMG;AACH,6CAHW,SAAS,SACT,kBAAkB,EAAE,QAa9B;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wCALW,eAAe,SACf,kBAAkB,EAAE,SACpB,UAAU,MAAM,CAAC,GACf,gBAAgB,CA6B5B;AAED;;;;;;;GAOG;AACH,+CAFW,gBAAgB,QAqB1B;AAnKD;;;;GAIG;AAEH;;;GAGG;AACH,kCAFU,MAAM,CAEsB;AAEtC;;;;;;;GAOG;AACH;IACI;;;;;;;;;OASG;IACH,SAFU,eAAe,GAAC,IAAI,CAEf;IAEf;;OAEG;IACH,KAFU,UAAU,CAEI;CAC3B;8BApCY,OAAO,+CAA+C,EAAE,eAAe;iCACvE,OAAO,sDAAsD,EAAE,kBAAkB;wBACjF,OAAO,gBAAgB,EAAE,SAAS"}
@@ -3,6 +3,7 @@ import { assert } from "../../core/assert.js";
3
3
  /**
4
4
  * @typedef {import("../../shade/renderer/scene/GPUSceneContext.js").GPUSceneContext} GPUSceneContext
5
5
  * @typedef {import("../../shade/renderer/animation/ShadeAnimationClip.js").ShadeAnimationClip} ShadeAnimationClip
6
+ * @typedef {import("./RowChains.js").RowChains} RowChains
6
7
  */
7
8
 
8
9
  /**
@@ -38,6 +39,57 @@ export class ClipRegistration {
38
39
  ids = new Int32Array(0);
39
40
  }
40
41
 
42
+ /**
43
+ * Hold a row, with the chain above it, for every entity the clips key.
44
+ *
45
+ * **A clip binds only once every node it keys holds a row**, and until then it is queued and moves
46
+ * nothing. A skin holds its joints' chains and a primitive its own, but a keyed node that is neither
47
+ * — a leaf an exporter left out of the skin, a socket nothing is attached to yet, an animated empty
48
+ * — is held by nothing else, and one such node keeps the whole clip from playing. So the driver that
49
+ * plays the clips holds every node they key, for as long as it has the clips.
50
+ *
51
+ * Every clip of the set, not only the ones registered: the set is replaced and never edited, so its
52
+ * targets are settled once, while which of its clips are registered moves with the list or the graph.
53
+ *
54
+ * One hold per channel, given back one per channel by {@link release_clip_targets}: the chains count
55
+ * holds, so a node keyed by several channels is held until the last of them is released.
56
+ *
57
+ * @param {RowChains} chains
58
+ * @param {ShadeAnimationClip[]} clips their channels target entities
59
+ */
60
+ export function hold_clip_targets(chains, clips) {
61
+ assert.defined(chains, 'chains');
62
+ assert.isArray(clips, 'clips');
63
+
64
+ for (let i = 0; i < clips.length; i++) {
65
+ const channels = clips[i].channels;
66
+
67
+ for (let j = 0; j < channels.length; j++) {
68
+ chains.hold(channels[j].target);
69
+ }
70
+ }
71
+ }
72
+
73
+ /**
74
+ * Give back what {@link hold_clip_targets} took for the same clips. Released after the clips are
75
+ * unregistered, so no binding outlives the row it writes.
76
+ *
77
+ * @param {RowChains} chains
78
+ * @param {ShadeAnimationClip[]} clips
79
+ */
80
+ export function release_clip_targets(chains, clips) {
81
+ assert.defined(chains, 'chains');
82
+ assert.isArray(clips, 'clips');
83
+
84
+ for (let i = 0; i < clips.length; i++) {
85
+ const channels = clips[i].channels;
86
+
87
+ for (let j = 0; j < channels.length; j++) {
88
+ chains.release(channels[j].target);
89
+ }
90
+ }
91
+ }
92
+
41
93
  /**
42
94
  * Make some of an entity's clips playable — the ones a driver actually plays, and no others.
43
95
  *
@@ -1,5 +1,5 @@
1
1
  import { assert } from "../../../core/assert.js";
2
- import { combine_hash } from "../../../core/collection/array/combine_hash.js";
2
+ import { hash_mix2 } from "../../../core/math/hash/hash_mix2.js";
3
3
  import { computeIntegerArrayHash } from "../../../core/collection/array/computeIntegerArrayHash.js";
4
4
  import { isArrayEqualStrict } from "../../../core/collection/array/isArrayEqualStrict.js";
5
5
  import Vector2 from '../../../core/geom/Vector2.js';
@@ -235,7 +235,7 @@ class GridObstacle {
235
235
  * @returns {number}
236
236
  */
237
237
  hash() {
238
- return combine_hash(
238
+ return hash_mix2(
239
239
  this.size.hash(),
240
240
  computeIntegerArrayHash(this.data, 0, this.data.length)
241
241
  );
@@ -1,5 +1,5 @@
1
1
  import { assert } from "../../../../core/assert.js";
2
- import { combine_hash } from "../../../../core/collection/array/combine_hash.js";
2
+ import { hash_mix2 } from "../../../../core/math/hash/hash_mix2.js";
3
3
  import { invokeObjectEquals } from "../../../../core/model/object/invokeObjectEquals.js";
4
4
  import { invokeObjectHash } from "../../../../core/model/object/invokeObjectHash.js";
5
5
  import { computeHashFloat } from "../../../../core/primitives/numbers/computeHashFloat.js";
@@ -66,7 +66,7 @@ export class WeightedElement {
66
66
  * @return {number}
67
67
  */
68
68
  hash() {
69
- return combine_hash(
69
+ return hash_mix2(
70
70
  computeHashFloat(this.weight),
71
71
  invokeObjectHash(this.data)
72
72
  );
@@ -1,4 +1,4 @@
1
- import { combine_hash } from "../../core/collection/array/combine_hash.js";
1
+ import { hash_mix2 } from "../../core/math/hash/hash_mix2.js";
2
2
 
3
3
  /**
4
4
  * Sentinel for {@link Interpolated#key} before assignment. The
@@ -114,7 +114,7 @@ export class Interpolated {
114
114
  let h = this.sourceId | 0;
115
115
  const ips = this.interpolands;
116
116
  for (let i = 0; i < ips.length; i++) {
117
- h = combine_hash(h, ips[i].type_id | 0);
117
+ h = hash_mix2(h, ips[i].type_id | 0);
118
118
  }
119
119
  return h;
120
120
  }
@@ -50,4 +50,13 @@ export function fatten_world_aabb_array(aabb: number[] | Float32Array | Float64A
50
50
  * @param {number} dt step size
51
51
  */
52
52
  export function compute_fat_world_aabb(result: number[] | Float32Array | Float64Array, result_offset: number, shape: AbstractShape3D, transform: Transform64, vx: number, vy: number, vz: number, dt: number): void;
53
+ /**
54
+ * Constant inflation applied to a world AABB so a small motion doesn't churn
55
+ * the broadphase. Tuned to Box2D / Bullet conventions. Symmetric: jitter has
56
+ * no preferred direction.
57
+ *
58
+ * Exported because `ClothColliderIndex` fattens its leaves by the same slack, for the same reason.
59
+ * @type {number}
60
+ */
61
+ export const FAT_LINEAR: number;
53
62
  //# sourceMappingURL=compute_fat_world_aabb.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"compute_fat_world_aabb.d.ts","sourceRoot":"","sources":["../../../../../src/engine/physics/broadphase/compute_fat_world_aabb.js"],"names":[],"mappings":"AAuBA;;;;;;;;GAQG;AACH,2CALW,MAAM,EAAE,GAAC,YAAY,GAAC,YAAY,iBAClC,MAAM,wDAchB;AAED;;;;;;;;;;;;;GAaG;AACH,wCAPW,MAAM,EAAE,GAAC,YAAY,GAAC,YAAY,UAClC,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,QAUhB;AAKD;;;;;;;;;;GAUG;AACH,8CANW,MAAM,EAAE,GAAC,YAAY,GAAC,YAAY,UAClC,MAAM,YACN,MAAM,EAAE,GAAC,YAAY,GAAC,YAAY,mBAClC,MAAM,MACN,MAAM,QAkBhB;AAED;;;;;;;;;;;;;GAaG;AACH,+CATW,MAAM,EAAE,GAAC,YAAY,GAAC,YAAY,iBAClC,MAAM,sDAGN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,QAShB"}
1
+ {"version":3,"file":"compute_fat_world_aabb.d.ts","sourceRoot":"","sources":["../../../../../src/engine/physics/broadphase/compute_fat_world_aabb.js"],"names":[],"mappings":"AAyBA;;;;;;;;GAQG;AACH,2CALW,MAAM,EAAE,GAAC,YAAY,GAAC,YAAY,iBAClC,MAAM,wDAchB;AAED;;;;;;;;;;;;;GAaG;AACH,wCAPW,MAAM,EAAE,GAAC,YAAY,GAAC,YAAY,UAClC,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,QAUhB;AAKD;;;;;;;;;;GAUG;AACH,8CANW,MAAM,EAAE,GAAC,YAAY,GAAC,YAAY,UAClC,MAAM,YACN,MAAM,EAAE,GAAC,YAAY,GAAC,YAAY,mBAClC,MAAM,MACN,MAAM,QAkBhB;AAED;;;;;;;;;;;;;GAaG;AACH,+CATW,MAAM,EAAE,GAAC,YAAY,GAAC,YAAY,iBAClC,MAAM,sDAGN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,QAShB;AAvHD;;;;;;;GAOG;AACH,yBAFU,MAAM,CAEe"}
@@ -6,9 +6,11 @@ const scratch_local = new Float64Array(6);
6
6
  * Constant inflation applied to a world AABB so a small motion doesn't churn
7
7
  * the broadphase. Tuned to Box2D / Bullet conventions. Symmetric: jitter has
8
8
  * no preferred direction.
9
+ *
10
+ * Exported because `ClothColliderIndex` fattens its leaves by the same slack, for the same reason.
9
11
  * @type {number}
10
12
  */
11
- const FAT_LINEAR = 0.05;
13
+ export const FAT_LINEAR = 0.05;
12
14
 
13
15
  /**
14
16
  * Per-second-of-velocity inflation. Two seconds of motion is a generous