@woosh/meep-engine 3.43.0 → 3.45.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (466) hide show
  1. package/build/bundle-worker-terrain.js +1 -1
  2. package/editor/prototypeEditorShell.d.ts.map +1 -1
  3. package/editor/prototypeEditorShell.js +4 -2
  4. package/package.json +1 -1
  5. package/src/core/collection/array/array_sort_insertion_ascending.d.ts +19 -0
  6. package/src/core/collection/array/array_sort_insertion_ascending.d.ts.map +1 -0
  7. package/src/core/collection/array/array_sort_insertion_ascending.js +31 -0
  8. package/src/core/geom/3d/aabb/aabb3_array_round_outward_f32.d.ts +27 -0
  9. package/src/core/geom/3d/aabb/aabb3_array_round_outward_f32.d.ts.map +1 -0
  10. package/src/core/geom/3d/aabb/aabb3_array_round_outward_f32.js +39 -0
  11. package/src/core/geom/3d/aabb/aabb3_from_v3_array.d.ts.map +1 -1
  12. package/src/core/geom/3d/aabb/aabb3_from_v3_array.js +4 -1
  13. package/src/core/geom/3d/aabb/aabb3_transform_oriented.d.ts +2 -2
  14. package/src/core/geom/3d/aabb/aabb3_transform_oriented.d.ts.map +1 -1
  15. package/src/core/geom/3d/aabb/aabb3_transform_oriented.js +1 -1
  16. package/src/core/geom/3d/pose/pose3_apply_inverse_point_array.d.ts +21 -0
  17. package/src/core/geom/3d/pose/pose3_apply_inverse_point_array.d.ts.map +1 -0
  18. package/src/core/geom/3d/pose/pose3_apply_inverse_point_array.js +36 -0
  19. package/src/core/geom/3d/pose/pose3_apply_point_array.d.ts +25 -0
  20. package/src/core/geom/3d/pose/pose3_apply_point_array.d.ts.map +1 -0
  21. package/src/core/geom/3d/pose/pose3_apply_point_array.js +40 -0
  22. package/src/core/geom/3d/pose/pose3_compose_array.d.ts +28 -0
  23. package/src/core/geom/3d/pose/pose3_compose_array.d.ts.map +1 -0
  24. package/src/core/geom/3d/pose/pose3_compose_array.js +41 -0
  25. package/src/core/geom/3d/pose/pose3_to_local_array.d.ts +29 -0
  26. package/src/core/geom/3d/pose/pose3_to_local_array.d.ts.map +1 -0
  27. package/src/core/geom/3d/pose/pose3_to_local_array.js +42 -0
  28. package/src/core/geom/3d/quaternion/quat3_clamp_angle_array.d.ts +28 -0
  29. package/src/core/geom/3d/quaternion/quat3_clamp_angle_array.d.ts.map +1 -0
  30. package/src/core/geom/3d/quaternion/quat3_clamp_angle_array.js +66 -0
  31. package/src/core/geom/3d/quaternion/quat3_multiply_conjugate_left_array.d.ts +22 -0
  32. package/src/core/geom/3d/quaternion/quat3_multiply_conjugate_left_array.d.ts.map +1 -0
  33. package/src/core/geom/3d/quaternion/quat3_multiply_conjugate_left_array.js +30 -0
  34. package/src/core/geom/3d/quaternion/quat3_multiply_conjugate_right_array.d.ts +23 -0
  35. package/src/core/geom/3d/quaternion/quat3_multiply_conjugate_right_array.d.ts.map +1 -0
  36. package/src/core/geom/3d/quaternion/quat3_multiply_conjugate_right_array.js +31 -0
  37. package/src/core/geom/3d/triangle/tri3_compute_normal_area_weighted_array.d.ts +26 -0
  38. package/src/core/geom/3d/triangle/tri3_compute_normal_area_weighted_array.d.ts.map +1 -0
  39. package/src/core/geom/3d/triangle/tri3_compute_normal_area_weighted_array.js +46 -0
  40. package/src/core/geom/vec3/v3_distance_array.d.ts +11 -0
  41. package/src/core/geom/vec3/v3_distance_array.d.ts.map +1 -0
  42. package/src/core/geom/vec3/v3_distance_array.js +19 -0
  43. package/src/core/geom/vec3/v3_normalize_array_checked.d.ts +23 -0
  44. package/src/core/geom/vec3/v3_normalize_array_checked.d.ts.map +1 -0
  45. package/src/core/geom/vec3/v3_normalize_array_checked.js +49 -0
  46. package/src/core/geom/vec3/v3_reject_array.d.ts +15 -0
  47. package/src/core/geom/vec3/v3_reject_array.d.ts.map +1 -0
  48. package/src/core/geom/vec3/v3_reject_array.js +32 -0
  49. package/src/core/graph/csr/csr_build_incidence.d.ts +26 -0
  50. package/src/core/graph/csr/csr_build_incidence.d.ts.map +1 -0
  51. package/src/core/graph/csr/csr_build_incidence.js +71 -0
  52. package/src/core/graph/csr/csr_graph_color_greedy.d.ts +25 -0
  53. package/src/core/graph/csr/csr_graph_color_greedy.d.ts.map +1 -0
  54. package/src/core/graph/csr/csr_graph_color_greedy.js +83 -0
  55. package/src/core/graph/csr/csr_graph_validate_coloring.d.ts +15 -0
  56. package/src/core/graph/csr/csr_graph_validate_coloring.d.ts.map +1 -0
  57. package/src/core/graph/csr/csr_graph_validate_coloring.js +33 -0
  58. package/src/core/math/linalg/matrix_symmetric_3x3_solve_ldlt.d.ts +26 -0
  59. package/src/core/math/linalg/matrix_symmetric_3x3_solve_ldlt.d.ts.map +1 -0
  60. package/src/core/math/linalg/matrix_symmetric_3x3_solve_ldlt.js +71 -0
  61. package/src/core/math/max2_exact.d.ts +15 -0
  62. package/src/core/math/max2_exact.d.ts.map +1 -0
  63. package/src/core/math/max2_exact.js +30 -0
  64. package/src/core/math/min2_exact.d.ts +20 -0
  65. package/src/core/math/min2_exact.d.ts.map +1 -0
  66. package/src/core/math/min2_exact.js +35 -0
  67. package/src/engine/Clock.d.ts +15 -0
  68. package/src/engine/Clock.d.ts.map +1 -1
  69. package/src/engine/Clock.js +29 -5
  70. package/src/engine/Engine.d.ts.map +1 -1
  71. package/src/engine/Engine.js +11 -19
  72. package/src/engine/ecs/ik/IKGoalSystem.d.ts.map +1 -1
  73. package/src/engine/ecs/ik/IKGoalSystem.js +3 -19
  74. package/src/engine/ecs/parent/parent_entity_model_of.d.ts +17 -0
  75. package/src/engine/ecs/parent/parent_entity_model_of.d.ts.map +1 -0
  76. package/src/engine/ecs/parent/parent_entity_model_of.js +26 -0
  77. package/src/engine/ecs/transform/t64_read_pose_array.d.ts +15 -0
  78. package/src/engine/ecs/transform/t64_read_pose_array.d.ts.map +1 -0
  79. package/src/engine/ecs/transform/t64_read_pose_array.js +24 -0
  80. package/src/engine/graphics/ecs/mesh-v2/MeshSkin.d.ts +57 -0
  81. package/src/engine/graphics/ecs/mesh-v2/MeshSkin.d.ts.map +1 -0
  82. package/src/engine/graphics/ecs/mesh-v2/MeshSkin.js +84 -0
  83. package/src/engine/graphics/geometry/geometry_construct_triangle_normal_area_weighted.d.ts +2 -0
  84. package/src/engine/graphics/geometry/geometry_construct_triangle_normal_area_weighted.d.ts.map +1 -1
  85. package/src/engine/graphics/geometry/geometry_construct_triangle_normal_area_weighted.js +10 -21
  86. package/src/engine/graphics3/AnimationGraphSystem.d.ts +28 -13
  87. package/src/engine/graphics3/AnimationGraphSystem.d.ts.map +1 -1
  88. package/src/engine/graphics3/AnimationGraphSystem.js +107 -64
  89. package/src/engine/graphics3/AnimationSystem.d.ts +29 -15
  90. package/src/engine/graphics3/AnimationSystem.d.ts.map +1 -1
  91. package/src/engine/graphics3/AnimationSystem.js +112 -61
  92. package/src/engine/graphics3/MeshSkinSystem.d.ts +56 -0
  93. package/src/engine/graphics3/MeshSkinSystem.d.ts.map +1 -0
  94. package/src/engine/graphics3/MeshSkinSystem.js +317 -0
  95. package/src/engine/graphics3/MeshSystem.d.ts +15 -35
  96. package/src/engine/graphics3/MeshSystem.d.ts.map +1 -1
  97. package/src/engine/graphics3/MeshSystem.js +21 -298
  98. package/src/engine/graphics3/RowChains.d.ts +76 -0
  99. package/src/engine/graphics3/RowChains.d.ts.map +1 -0
  100. package/src/engine/graphics3/RowChains.js +347 -0
  101. package/src/engine/graphics3/ShadedGeometrySystem.d.ts +6 -0
  102. package/src/engine/graphics3/ShadedGeometrySystem.d.ts.map +1 -1
  103. package/src/engine/graphics3/ShadedGeometrySystem.js +329 -309
  104. package/src/engine/graphics3/animation/AnimationClips.d.ts +56 -0
  105. package/src/engine/graphics3/animation/AnimationClips.d.ts.map +1 -0
  106. package/src/engine/graphics3/animation/AnimationClips.js +79 -0
  107. package/src/engine/graphics3/animation/ClipListPlayer.d.ts +13 -14
  108. package/src/engine/graphics3/animation/ClipListPlayer.d.ts.map +1 -1
  109. package/src/engine/graphics3/animation/ClipListPlayer.js +262 -263
  110. package/src/engine/graphics3/animation/write_clip_playback.d.ts +3 -3
  111. package/src/engine/graphics3/animation/write_clip_playback.js +4 -4
  112. package/src/engine/graphics3/pose/query_entity_node_world_pose.d.ts +5 -0
  113. package/src/engine/graphics3/pose/query_entity_node_world_pose.d.ts.map +1 -1
  114. package/src/engine/graphics3/pose/query_entity_node_world_pose.js +80 -75
  115. package/src/engine/graphics3/prefab/PrefabInstance.d.ts +4 -24
  116. package/src/engine/graphics3/prefab/PrefabInstance.d.ts.map +1 -1
  117. package/src/engine/graphics3/prefab/PrefabInstance.js +60 -80
  118. package/src/engine/graphics3/prefab/prefab_instantiate.d.ts +16 -3
  119. package/src/engine/graphics3/prefab/prefab_instantiate.d.ts.map +1 -1
  120. package/src/engine/graphics3/prefab/prefab_instantiate.js +49 -12
  121. package/src/engine/graphics3/prefab/prefab_place.d.ts +31 -17
  122. package/src/engine/graphics3/prefab/prefab_place.d.ts.map +1 -1
  123. package/src/engine/graphics3/prefab/prefab_place.js +175 -130
  124. package/src/engine/graphics3/register_clips.d.ts +93 -0
  125. package/src/engine/graphics3/register_clips.d.ts.map +1 -0
  126. package/src/engine/graphics3/register_clips.js +166 -0
  127. package/src/engine/physics/broadphase/compute_fat_world_aabb.d.ts +9 -0
  128. package/src/engine/physics/broadphase/compute_fat_world_aabb.d.ts.map +1 -1
  129. package/src/engine/physics/broadphase/compute_fat_world_aabb.js +3 -1
  130. package/src/engine/physics/cloth/MEASUREMENTS.md +795 -0
  131. package/src/engine/physics/cloth/PLAN.md +349 -17
  132. package/src/engine/physics/cloth/build/ClothProxy.d.ts +113 -61
  133. package/src/engine/physics/cloth/build/ClothProxy.d.ts.map +1 -1
  134. package/src/engine/physics/cloth/build/ClothProxy.js +142 -77
  135. package/src/engine/physics/cloth/build/cloth_bind_in_frame.d.ts +44 -0
  136. package/src/engine/physics/cloth/build/cloth_bind_in_frame.d.ts.map +1 -0
  137. package/src/engine/physics/cloth/build/cloth_bind_in_frame.js +107 -0
  138. package/src/engine/physics/cloth/build/cloth_proxy_from_joints.d.ts +43 -30
  139. package/src/engine/physics/cloth/build/cloth_proxy_from_joints.d.ts.map +1 -1
  140. package/src/engine/physics/cloth/build/cloth_proxy_from_joints.js +371 -284
  141. package/src/engine/physics/cloth/build/cloth_proxy_from_mesh.d.ts +62 -0
  142. package/src/engine/physics/cloth/build/cloth_proxy_from_mesh.d.ts.map +1 -0
  143. package/src/engine/physics/cloth/build/cloth_proxy_from_mesh.js +275 -0
  144. package/src/engine/physics/cloth/collider/ClothColliderIndex.d.ts +7 -0
  145. package/src/engine/physics/cloth/collider/ClothColliderIndex.d.ts.map +1 -1
  146. package/src/engine/physics/cloth/collider/ClothColliderIndex.js +85 -67
  147. package/src/engine/physics/cloth/collider/cloth_collider_bounds.d.ts.map +1 -1
  148. package/src/engine/physics/cloth/collider/cloth_collider_bounds.js +19 -101
  149. package/src/engine/physics/cloth/collider/cloth_collider_pack.d.ts +2 -5
  150. package/src/engine/physics/cloth/collider/cloth_collider_pack.d.ts.map +1 -1
  151. package/src/engine/physics/cloth/collider/cloth_collider_pack.js +7 -15
  152. package/src/engine/physics/cloth/collider/cloth_collider_sdf.d.ts +1 -1
  153. package/src/engine/physics/cloth/collider/cloth_collider_sdf.d.ts.map +1 -1
  154. package/src/engine/physics/cloth/collider/cloth_collider_sdf.js +17 -62
  155. package/src/engine/physics/cloth/ecs/Cloth.d.ts +17 -9
  156. package/src/engine/physics/cloth/ecs/Cloth.d.ts.map +1 -1
  157. package/src/engine/physics/cloth/ecs/Cloth.js +220 -212
  158. package/src/engine/physics/cloth/ecs/ClothColliderFlags.d.ts +0 -1
  159. package/src/engine/physics/cloth/ecs/ClothColliderFlags.js +6 -19
  160. package/src/engine/physics/cloth/ecs/ClothColliderSystem.d.ts +1 -2
  161. package/src/engine/physics/cloth/ecs/ClothColliderSystem.d.ts.map +1 -1
  162. package/src/engine/physics/cloth/ecs/ClothColliderSystem.js +3 -12
  163. package/src/engine/physics/cloth/ecs/ClothDynamicsFlags.js +6 -0
  164. package/src/engine/physics/cloth/ecs/ClothHold.d.ts +91 -0
  165. package/src/engine/physics/cloth/ecs/ClothHold.d.ts.map +1 -0
  166. package/src/engine/physics/cloth/ecs/ClothHold.js +103 -0
  167. package/src/engine/physics/cloth/ecs/ClothInstance.d.ts +254 -48
  168. package/src/engine/physics/cloth/ecs/ClothInstance.d.ts.map +1 -1
  169. package/src/engine/physics/cloth/ecs/ClothInstance.js +277 -47
  170. package/src/engine/physics/cloth/ecs/ClothPin.d.ts +73 -0
  171. package/src/engine/physics/cloth/ecs/ClothPin.d.ts.map +1 -0
  172. package/src/engine/physics/cloth/ecs/ClothPin.js +92 -0
  173. package/src/engine/physics/cloth/ecs/ClothPinSerializationAdapter.d.ts +36 -0
  174. package/src/engine/physics/cloth/ecs/ClothPinSerializationAdapter.d.ts.map +1 -0
  175. package/src/engine/physics/cloth/ecs/ClothPinSerializationAdapter.js +61 -0
  176. package/src/engine/physics/cloth/ecs/ClothRig.d.ts +23 -17
  177. package/src/engine/physics/cloth/ecs/ClothRig.d.ts.map +1 -1
  178. package/src/engine/physics/cloth/ecs/ClothRig.js +29 -27
  179. package/src/engine/physics/cloth/ecs/ClothSystem.d.ts +12 -14
  180. package/src/engine/physics/cloth/ecs/ClothSystem.d.ts.map +1 -1
  181. package/src/engine/physics/cloth/ecs/ClothSystem.js +20 -15
  182. package/src/engine/physics/cloth/ecs/ClothWorld.d.ts +57 -36
  183. package/src/engine/physics/cloth/ecs/ClothWorld.d.ts.map +1 -1
  184. package/src/engine/physics/cloth/ecs/ClothWorld.js +754 -207
  185. package/src/engine/physics/cloth/ecs/WorkerClothSystem.d.ts +12 -13
  186. package/src/engine/physics/cloth/ecs/WorkerClothSystem.d.ts.map +1 -1
  187. package/src/engine/physics/cloth/ecs/WorkerClothSystem.js +20 -14
  188. package/src/engine/physics/cloth/ecs/cloth_build_rows.d.ts +63 -11
  189. package/src/engine/physics/cloth/ecs/cloth_build_rows.d.ts.map +1 -1
  190. package/src/engine/physics/cloth/ecs/cloth_build_rows.js +297 -101
  191. package/src/engine/physics/cloth/ecs/cloth_dynamics_map.d.ts +9 -7
  192. package/src/engine/physics/cloth/ecs/cloth_dynamics_map.d.ts.map +1 -1
  193. package/src/engine/physics/cloth/ecs/cloth_dynamics_map.js +12 -10
  194. package/src/engine/physics/cloth/ecs/cloth_gather_colliders.d.ts +3 -3
  195. package/src/engine/physics/cloth/ecs/cloth_gather_colliders.d.ts.map +1 -1
  196. package/src/engine/physics/cloth/ecs/cloth_gather_colliders.js +60 -120
  197. package/src/engine/physics/cloth/ecs/cloth_geodesic.d.ts +37 -0
  198. package/src/engine/physics/cloth/ecs/cloth_geodesic.d.ts.map +1 -0
  199. package/src/engine/physics/cloth/ecs/cloth_geodesic.js +135 -0
  200. package/src/engine/physics/cloth/ecs/cloth_holds.d.ts +97 -0
  201. package/src/engine/physics/cloth/ecs/cloth_holds.d.ts.map +1 -0
  202. package/src/engine/physics/cloth/ecs/cloth_holds.js +583 -0
  203. package/src/engine/physics/cloth/ecs/cloth_reconstruct_pose.d.ts +2 -2
  204. package/src/engine/physics/cloth/ecs/cloth_reconstruct_pose.d.ts.map +1 -1
  205. package/src/engine/physics/cloth/ecs/cloth_reconstruct_pose.js +168 -51
  206. package/src/engine/physics/cloth/ecs/cloth_seed_rig.d.ts +17 -22
  207. package/src/engine/physics/cloth/ecs/cloth_seed_rig.d.ts.map +1 -1
  208. package/src/engine/physics/cloth/ecs/cloth_seed_rig.js +55 -117
  209. package/src/engine/physics/cloth/ecs/cloth_seed_subtree.d.ts +21 -6
  210. package/src/engine/physics/cloth/ecs/cloth_seed_subtree.d.ts.map +1 -1
  211. package/src/engine/physics/cloth/ecs/cloth_seed_subtree.js +51 -42
  212. package/src/engine/physics/cloth/ecs/cloth_write_back.d.ts +5 -0
  213. package/src/engine/physics/cloth/ecs/cloth_write_back.d.ts.map +1 -1
  214. package/src/engine/physics/cloth/ecs/cloth_write_back.js +62 -50
  215. package/src/engine/physics/cloth/ecs/cloth_write_back_rig.d.ts.map +1 -1
  216. package/src/engine/physics/cloth/ecs/cloth_write_back_rig.js +65 -58
  217. package/src/engine/physics/cloth/playground/cloth_playground_build.d.ts.map +1 -1
  218. package/src/engine/physics/cloth/playground/cloth_playground_build.js +2 -3
  219. package/src/engine/physics/cloth/playground/collide_main.js +3 -29
  220. package/src/engine/physics/cloth/playground/garment_build.d.ts.map +1 -1
  221. package/src/engine/physics/cloth/playground/garment_build.js +17 -5
  222. package/src/engine/physics/cloth/playground/garment_main.js +5 -20
  223. package/src/engine/physics/cloth/playground/main.js +6 -48
  224. package/src/engine/physics/cloth/playground/rig_build.d.ts.map +1 -1
  225. package/src/engine/physics/cloth/playground/rig_build.js +302 -296
  226. package/src/engine/physics/cloth/playground/rig_main.js +947 -955
  227. package/src/engine/physics/cloth/playground/wind_main.js +8 -7
  228. package/src/engine/physics/cloth/solver/ClothState.d.ts +45 -7
  229. package/src/engine/physics/cloth/solver/ClothState.d.ts.map +1 -1
  230. package/src/engine/physics/cloth/solver/ClothState.js +79 -83
  231. package/src/engine/physics/cloth/solver/cloth_color_particles.d.ts +10 -8
  232. package/src/engine/physics/cloth/solver/cloth_color_particles.d.ts.map +1 -1
  233. package/src/engine/physics/cloth/solver/cloth_color_particles.js +30 -102
  234. package/src/engine/physics/cloth/solver/cloth_contact_find.d.ts +6 -1
  235. package/src/engine/physics/cloth/solver/cloth_contact_find.d.ts.map +1 -1
  236. package/src/engine/physics/cloth/solver/cloth_contact_find.js +9 -3
  237. package/src/engine/physics/cloth/solver/cloth_hold_line.d.ts +114 -0
  238. package/src/engine/physics/cloth/solver/cloth_hold_line.d.ts.map +1 -0
  239. package/src/engine/physics/cloth/solver/cloth_hold_line.js +350 -0
  240. package/src/engine/physics/cloth/solver/cloth_kinetic_energy.d.ts +21 -0
  241. package/src/engine/physics/cloth/solver/cloth_kinetic_energy.d.ts.map +1 -0
  242. package/src/engine/physics/cloth/solver/cloth_kinetic_energy.js +45 -0
  243. package/src/engine/physics/cloth/solver/cloth_particle_coupling.d.ts +32 -0
  244. package/src/engine/physics/cloth/solver/cloth_particle_coupling.d.ts.map +1 -0
  245. package/src/engine/physics/cloth/solver/cloth_particle_coupling.js +133 -0
  246. package/src/engine/physics/cloth/solver/cloth_particle_of_source.d.ts +16 -0
  247. package/src/engine/physics/cloth/solver/cloth_particle_of_source.d.ts.map +1 -0
  248. package/src/engine/physics/cloth/solver/cloth_particle_of_source.js +19 -0
  249. package/src/engine/physics/cloth/solver/cloth_self_find.d.ts +6 -2
  250. package/src/engine/physics/cloth/solver/cloth_self_find.d.ts.map +1 -1
  251. package/src/engine/physics/cloth/solver/cloth_self_find.js +19 -68
  252. package/src/engine/physics/cloth/solver/cloth_solve_vertex.d.ts.map +1 -1
  253. package/src/engine/physics/cloth/solver/cloth_solve_vertex.js +30 -65
  254. package/src/engine/physics/cloth/solver/cloth_solver_constants.d.ts +24 -12
  255. package/src/engine/physics/cloth/solver/cloth_solver_constants.d.ts.map +1 -1
  256. package/src/engine/physics/cloth/solver/cloth_solver_constants.js +24 -12
  257. package/src/engine/physics/cloth/solver/cloth_step.d.ts +16 -0
  258. package/src/engine/physics/cloth/solver/cloth_step.d.ts.map +1 -1
  259. package/src/engine/physics/cloth/solver/cloth_step.js +189 -48
  260. package/src/engine/physics/cloth/solver/cloth_step_instance.d.ts +1 -0
  261. package/src/engine/physics/cloth/solver/cloth_step_instance.d.ts.map +1 -1
  262. package/src/engine/physics/cloth/solver/cloth_step_instance.js +12 -6
  263. package/src/engine/physics/cloth/solver/cloth_stretch_residual.d.ts +21 -0
  264. package/src/engine/physics/cloth/solver/cloth_stretch_residual.d.ts.map +1 -0
  265. package/src/engine/physics/cloth/solver/cloth_stretch_residual.js +54 -0
  266. package/src/engine/physics/cloth/solver/cloth_vertex_accumulator.d.ts +15 -0
  267. package/src/engine/physics/cloth/solver/cloth_vertex_accumulator.d.ts.map +1 -1
  268. package/src/engine/physics/cloth/solver/cloth_vertex_accumulator.js +28 -0
  269. package/src/engine/physics/cloth/solver/cloth_worst_tether_ratio.d.ts +30 -0
  270. package/src/engine/physics/cloth/solver/cloth_worst_tether_ratio.d.ts.map +1 -0
  271. package/src/engine/physics/cloth/solver/cloth_worst_tether_ratio.js +56 -0
  272. package/src/engine/physics/cloth/solver/constraint/cloth_contact_row.d.ts.map +1 -1
  273. package/src/engine/physics/cloth/solver/constraint/cloth_contact_row.js +3 -17
  274. package/src/engine/physics/cloth/solver/constraint/cloth_leash_row.d.ts +1 -1
  275. package/src/engine/physics/cloth/solver/constraint/cloth_leash_row.d.ts.map +1 -1
  276. package/src/engine/physics/cloth/solver/constraint/cloth_leash_row.js +353 -346
  277. package/src/engine/physics/cloth/solver/constraint/cloth_self_row.d.ts +7 -5
  278. package/src/engine/physics/cloth/solver/constraint/cloth_self_row.d.ts.map +1 -1
  279. package/src/engine/physics/cloth/solver/constraint/cloth_self_row.js +7 -5
  280. package/src/engine/physics/cloth/wind/ClothFluidWind.d.ts +2 -1
  281. package/src/engine/physics/cloth/wind/ClothFluidWind.d.ts.map +1 -1
  282. package/src/engine/physics/cloth/wind/ClothFluidWind.js +7 -25
  283. package/src/engine/physics/cloth/wind/cloth_sample_air.d.ts +12 -10
  284. package/src/engine/physics/cloth/wind/cloth_sample_air.d.ts.map +1 -1
  285. package/src/engine/physics/cloth/wind/cloth_sample_air.js +60 -82
  286. package/src/engine/physics/ecs/ContactProbeSystem.d.ts.map +1 -1
  287. package/src/engine/physics/ecs/ContactProbeSystem.js +2 -18
  288. package/src/engine/physics/ecs/PhysicsSystem.d.ts.map +1 -1
  289. package/src/engine/physics/ecs/PhysicsSystem.js +9 -50
  290. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
  291. package/src/engine/physics/fluid/ecs/fluid_sample_domain_bounds.d.ts +24 -0
  292. package/src/engine/physics/fluid/ecs/fluid_sample_domain_bounds.d.ts.map +1 -0
  293. package/src/engine/physics/fluid/ecs/fluid_sample_domain_bounds.js +42 -0
  294. package/src/engine/physics/fluid/ecs/fluid_sample_velocity_world_mps.d.ts +25 -0
  295. package/src/engine/physics/fluid/ecs/fluid_sample_velocity_world_mps.d.ts.map +1 -0
  296. package/src/engine/physics/fluid/ecs/fluid_sample_velocity_world_mps.js +40 -0
  297. package/src/engine/physics/inverse_kinematics/frame_fabrik/frame_fabrik_solve.d.ts.map +1 -1
  298. package/src/engine/physics/inverse_kinematics/frame_fabrik/frame_fabrik_solve.js +40 -90
  299. package/src/engine/physics/narrowphase/capsule_contacts.d.ts.map +1 -1
  300. package/src/engine/physics/narrowphase/capsule_contacts.js +3 -5
  301. package/src/engine/physics/narrowphase/decomposition/mesh_enumerate_triangles.d.ts.map +1 -1
  302. package/src/engine/physics/narrowphase/decomposition/mesh_enumerate_triangles.js +2 -14
  303. package/src/engine/physics/narrowphase/hull_sphere_contact.d.ts.map +1 -1
  304. package/src/engine/physics/narrowphase/hull_sphere_contact.js +2 -5
  305. package/src/engine/physics/narrowphase/narrowphase_step.d.ts.map +1 -1
  306. package/src/engine/physics/narrowphase/narrowphase_step.js +13 -32
  307. package/src/engine/physics/narrowphase/sphere_box_contact.d.ts.map +1 -1
  308. package/src/engine/physics/narrowphase/sphere_box_contact.js +2 -5
  309. package/src/engine/simulation/Ticker.d.ts +13 -0
  310. package/src/engine/simulation/Ticker.d.ts.map +1 -1
  311. package/src/engine/simulation/Ticker.js +43 -8
  312. package/src/format/texture/basis/transcode/etc1s_to_astc.d.ts.map +1 -1
  313. package/src/format/texture/basis/transcode/etc1s_to_astc.js +2 -1
  314. package/src/shade/RENDERER_CONTRACT.md +8 -2
  315. package/src/shade/playground/image_decode_bench/main.js +2 -1
  316. package/src/shade/playground/mesh_row_ceiling/main.js +2 -1
  317. package/src/shade/playground/skinned_blas_refit/diff_traced_against_rasterized.d.ts.map +1 -1
  318. package/src/shade/playground/skinned_blas_refit/diff_traced_against_rasterized.js +2 -1
  319. package/src/shade/playground/skinned_blas_refit/main.d.ts.map +1 -1
  320. package/src/shade/playground/skinned_blas_refit/main.js +11 -19
  321. package/src/shade/playground/skinned_blas_refit/place_character.d.ts +6 -3
  322. package/src/shade/playground/skinned_blas_refit/place_character.d.ts.map +1 -1
  323. package/src/shade/playground/skinned_blas_refit/place_character.js +90 -90
  324. package/src/shade/playground/skinned_mesh_soup/main.d.ts.map +1 -1
  325. package/src/shade/playground/skinned_mesh_soup/main.js +502 -509
  326. package/src/shade/playground/skinned_mesh_soup/verify_clone_vertices.d.ts.map +1 -1
  327. package/src/shade/playground/skinned_mesh_soup/verify_clone_vertices.js +2 -1
  328. package/src/shade/playground/ssr_variance/statistics.d.ts.map +1 -1
  329. package/src/shade/playground/ssr_variance/statistics.js +2 -1
  330. package/src/shade/playground/texture_encode/README.md +129 -109
  331. package/src/shade/playground/texture_encode/main.d.ts.map +1 -1
  332. package/src/shade/playground/texture_encode/main.js +1431 -1430
  333. package/src/shade/playground/volumetrics_froxel/measure.d.ts.map +1 -1
  334. package/src/shade/playground/volumetrics_froxel/measure.js +2 -1
  335. package/src/shade/renderer/animation/GPUAnimationManager.d.ts +45 -14
  336. package/src/shade/renderer/animation/GPUAnimationManager.d.ts.map +1 -1
  337. package/src/shade/renderer/animation/GPUAnimationManager.js +316 -64
  338. package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.d.ts +5 -0
  339. package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.d.ts.map +1 -1
  340. package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.js +11 -1
  341. package/src/shade/renderer/buffer/table/gpu_database_check_links.d.ts.map +1 -1
  342. package/src/shade/renderer/buffer/table/gpu_database_check_links.js +2 -1
  343. package/src/shade/renderer/geometry/BoxGeometry.d.ts +1 -11
  344. package/src/shade/renderer/geometry/BoxGeometry.d.ts.map +1 -1
  345. package/src/shade/renderer/geometry/BoxGeometry.js +6 -13
  346. package/src/shade/renderer/geometry/CapsuleGeometry.d.ts +19 -0
  347. package/src/shade/renderer/geometry/CapsuleGeometry.d.ts.map +1 -0
  348. package/src/shade/renderer/geometry/CapsuleGeometry.js +24 -0
  349. package/src/shade/renderer/geometry/ConeGeometry.d.ts +20 -0
  350. package/src/shade/renderer/geometry/ConeGeometry.d.ts.map +1 -0
  351. package/src/shade/renderer/geometry/ConeGeometry.js +33 -0
  352. package/src/shade/renderer/geometry/CylinderGeometry.d.ts +21 -0
  353. package/src/shade/renderer/geometry/CylinderGeometry.d.ts.map +1 -0
  354. package/src/shade/renderer/geometry/CylinderGeometry.js +35 -0
  355. package/src/shade/renderer/geometry/PlaneGeometry.d.ts +17 -0
  356. package/src/shade/renderer/geometry/PlaneGeometry.d.ts.map +1 -0
  357. package/src/shade/renderer/geometry/PlaneGeometry.js +22 -0
  358. package/src/shade/renderer/geometry/TorusGeometry.d.ts +18 -0
  359. package/src/shade/renderer/geometry/TorusGeometry.d.ts.map +1 -0
  360. package/src/shade/renderer/geometry/TorusGeometry.js +23 -0
  361. package/src/shade/renderer/geometry/UVSphereGeometry.d.ts +21 -0
  362. package/src/shade/renderer/geometry/UVSphereGeometry.d.ts.map +1 -0
  363. package/src/shade/renderer/geometry/UVSphereGeometry.js +34 -0
  364. package/src/shade/renderer/geometry/primitives/make_capsule_geometry.d.ts +19 -0
  365. package/src/shade/renderer/geometry/primitives/make_capsule_geometry.d.ts.map +1 -0
  366. package/src/shade/renderer/geometry/primitives/make_capsule_geometry.js +205 -0
  367. package/src/shade/renderer/geometry/primitives/make_cone_geometry.d.ts +21 -0
  368. package/src/shade/renderer/geometry/primitives/make_cone_geometry.d.ts.map +1 -0
  369. package/src/shade/renderer/geometry/primitives/make_cone_geometry.js +36 -0
  370. package/src/shade/renderer/geometry/primitives/make_cylinder_geometry.d.ts +1 -1
  371. package/src/shade/renderer/geometry/primitives/make_cylinder_geometry.d.ts.map +1 -1
  372. package/src/shade/renderer/geometry/primitives/make_cylinder_geometry.js +44 -9
  373. package/src/shade/renderer/geometry/primitives/make_uv_sphere_geometry.d.ts +20 -0
  374. package/src/shade/renderer/geometry/primitives/make_uv_sphere_geometry.d.ts.map +1 -0
  375. package/src/shade/renderer/geometry/primitives/make_uv_sphere_geometry.js +190 -0
  376. package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_group_step.d.ts.map +1 -1
  377. package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_group_step.js +3 -2
  378. package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_leaf_frontier.d.ts.map +1 -1
  379. package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_leaf_frontier.js +2 -1
  380. package/src/shade/renderer/geometry/virtual/build/level/vgeo_partition_into_groups.d.ts.map +1 -1
  381. package/src/shade/renderer/geometry/virtual/build/level/vgeo_partition_into_groups.js +2 -1
  382. package/src/shade/renderer/geometry/virtual/build/level/vgeo_run_round.d.ts.map +1 -1
  383. package/src/shade/renderer/geometry/virtual/build/level/vgeo_run_round.js +2 -1
  384. package/src/shade/renderer/geometry/virtual/build/level/vgeo_try_repack.d.ts.map +1 -1
  385. package/src/shade/renderer/geometry/virtual/build/level/vgeo_try_repack.js +3 -2
  386. package/src/shade/renderer/geometry/virtual/build/partition/vgeo_graph_components.d.ts.map +1 -1
  387. package/src/shade/renderer/geometry/virtual/build/partition/vgeo_graph_components.js +2 -1
  388. package/src/shade/renderer/geometry/virtual/build/partition/vgeo_split_face_set_packed.d.ts.map +1 -1
  389. package/src/shade/renderer/geometry/virtual/build/partition/vgeo_split_face_set_packed.js +2 -1
  390. package/src/shade/renderer/geometry/virtual/format/vgeo_write_container.d.ts.map +1 -1
  391. package/src/shade/renderer/geometry/virtual/format/vgeo_write_container.js +3 -2
  392. package/src/shade/renderer/geometry/virtual/runtime/graph_vgeo_expand_instances_to_meshlets.d.ts.map +1 -1
  393. package/src/shade/renderer/geometry/virtual/runtime/graph_vgeo_expand_instances_to_meshlets.js +7 -2
  394. package/src/shade/renderer/gpu_primitive/prefix_sum/v1/graph_prefix_scan_csdldf.d.ts +26 -8
  395. package/src/shade/renderer/gpu_primitive/prefix_sum/v1/graph_prefix_scan_csdldf.d.ts.map +1 -1
  396. package/src/shade/renderer/gpu_primitive/prefix_sum/v1/graph_prefix_scan_csdldf.js +56 -39
  397. package/src/shade/renderer/gpu_primitive/prefix_sum/v1/shader_prefix_scan_csdldf.d.ts +7 -0
  398. package/src/shade/renderer/gpu_primitive/prefix_sum/v1/shader_prefix_scan_csdldf.d.ts.map +1 -1
  399. package/src/shade/renderer/gpu_primitive/prefix_sum/v1/shader_prefix_scan_csdldf.js +46 -4
  400. package/src/shade/renderer/gpu_primitive/prefix_sum/v1/test_prefix_sum.d.ts.map +1 -1
  401. package/src/shade/renderer/gpu_primitive/prefix_sum/v1/test_prefix_sum.js +4 -2
  402. package/src/shade/renderer/gpu_primitive/sort/defs.d.ts +2 -2
  403. package/src/shade/renderer/gpu_primitive/sort/defs.js +79 -79
  404. package/src/shade/renderer/gpu_primitive/sort/graph_radix_sort.d.ts +1 -1
  405. package/src/shade/renderer/gpu_primitive/sort/graph_radix_sort.d.ts.map +1 -1
  406. package/src/shade/renderer/gpu_primitive/sort/graph_radix_sort.js +7 -3
  407. package/src/shade/renderer/particles/GPUParticleSystem.js +1 -1
  408. package/src/shade/renderer/particles/coherence/graph_particle_bucket.d.ts +4 -3
  409. package/src/shade/renderer/particles/coherence/graph_particle_bucket.d.ts.map +1 -1
  410. package/src/shade/renderer/particles/coherence/graph_particle_bucket.js +200 -194
  411. package/src/shade/renderer/particles/graph_particles.d.ts.map +1 -1
  412. package/src/shade/renderer/particles/graph_particles.js +6 -2
  413. package/src/shade/renderer/particles/optimizer/dag/particle_vector_extract.d.ts.map +1 -1
  414. package/src/shade/renderer/particles/optimizer/dag/particle_vector_extract.js +3 -2
  415. package/src/shade/renderer/particles/warmup/graph_particle_warmup.d.ts.map +1 -1
  416. package/src/shade/renderer/particles/warmup/graph_particle_warmup.js +334 -329
  417. package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.d.ts.map +1 -1
  418. package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.js +7 -2
  419. package/src/shade/renderer/rasterize/expand/mesh/graph_expand_meshes_to_meshlets.d.ts.map +1 -1
  420. package/src/shade/renderer/rasterize/expand/mesh/graph_expand_meshes_to_meshlets.js +16 -4
  421. package/src/shade/renderer/texture/COMPRESSED_TEXTURE_PLAN_2026_09_01.md +2444 -2345
  422. package/src/shade/renderer/texture/encode/chunk_astc_encode_block_4x4_rgb.d.ts.map +1 -1
  423. package/src/shade/renderer/texture/encode/chunk_astc_encode_block_4x4_rgb.js +312 -310
  424. package/src/shade/renderer/texture/encode/chunk_bc1_encode_block.d.ts +3 -3
  425. package/src/shade/renderer/texture/encode/chunk_bc1_encode_block.d.ts.map +1 -1
  426. package/src/shade/renderer/texture/encode/chunk_bc1_encode_block.js +383 -375
  427. package/src/shade/renderer/texture/encode/chunk_bc6h_encode_block_mode11.d.ts.map +1 -1
  428. package/src/shade/renderer/texture/encode/chunk_bc6h_encode_block_mode11.js +349 -346
  429. package/src/shade/renderer/texture/encode/chunk_bc7_encode_block.d.ts +58 -0
  430. package/src/shade/renderer/texture/encode/chunk_bc7_encode_block.d.ts.map +1 -0
  431. package/src/shade/renderer/texture/encode/chunk_bc7_encode_block.js +536 -0
  432. package/src/shade/renderer/texture/encode/chunk_bc7_encode_block_mode6.d.ts +21 -7
  433. package/src/shade/renderer/texture/encode/chunk_bc7_encode_block_mode6.d.ts.map +1 -1
  434. package/src/shade/renderer/texture/encode/chunk_bc7_encode_block_mode6.js +291 -327
  435. package/src/shade/renderer/texture/encode/chunk_bc7_pack_mode1.d.ts +25 -0
  436. package/src/shade/renderer/texture/encode/chunk_bc7_pack_mode1.d.ts.map +1 -0
  437. package/src/shade/renderer/texture/encode/chunk_bc7_pack_mode1.js +99 -0
  438. package/src/shade/renderer/texture/encode/chunk_bc7_pack_mode6.d.ts +5 -3
  439. package/src/shade/renderer/texture/encode/chunk_bc7_pack_mode6.d.ts.map +1 -1
  440. package/src/shade/renderer/texture/encode/chunk_bc7_pack_mode6.js +47 -71
  441. package/src/shade/renderer/texture/encode/chunk_bc7_partition_2.d.ts +10 -0
  442. package/src/shade/renderer/texture/encode/chunk_bc7_partition_2.d.ts.map +1 -0
  443. package/src/shade/renderer/texture/encode/chunk_bc7_partition_2.js +50 -0
  444. package/src/shade/renderer/texture/encode/shader_texture_encode_bc7.d.ts +4 -5
  445. package/src/shade/renderer/texture/encode/shader_texture_encode_bc7.d.ts.map +1 -1
  446. package/src/shade/renderer/texture/encode/shader_texture_encode_bc7.js +7 -8
  447. package/src/shade/renderer/water/chunk_water_transport.d.ts.map +1 -1
  448. package/src/shade/renderer/water/chunk_water_transport.js +7 -5
  449. package/src/shade/renderer/water/medium/GPUWaterBodies.d.ts.map +1 -1
  450. package/src/shade/renderer/water/medium/GPUWaterBodies.js +8 -2
  451. package/src/shade/renderer/water/optics/chunk_water_receiver_downwelling.d.ts +3 -2
  452. package/src/shade/renderer/water/optics/chunk_water_receiver_downwelling.d.ts.map +1 -1
  453. package/src/shade/renderer/water/optics/chunk_water_receiver_downwelling.js +3 -2
  454. package/src/shade/renderer/water/shader_water.d.ts.map +1 -1
  455. package/src/shade/renderer/water/shader_water.js +3 -1
  456. package/src/shade/renderer/water/surface/GPUWaterSurface.d.ts.map +1 -1
  457. package/src/shade/renderer/water/surface/GPUWaterSurface.js +3 -1
  458. package/src/shade/renderer/water/surface/graph_water_tessellation.d.ts.map +1 -1
  459. package/src/shade/renderer/water/surface/graph_water_tessellation.js +11 -4
  460. package/src/shade/renderer/water/surface/particles/GPUWaterParticles.d.ts.map +1 -1
  461. package/src/shade/renderer/water/surface/particles/GPUWaterParticles.js +37 -20
  462. package/src/shade/wgsl/validate_wgsl_source.d.ts.map +1 -1
  463. package/src/shade/wgsl/validate_wgsl_source.js +74 -3
  464. package/src/engine/graphics3/register_instance_animation.d.ts +0 -114
  465. package/src/engine/graphics3/register_instance_animation.d.ts.map +0 -1
  466. package/src/engine/graphics3/register_instance_animation.js +0 -201
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Hamilton product with the left operand conjugated, `out = a* ⊗ b`, both read from arrays.
3
+ *
4
+ * For unit quaternions the conjugate is the inverse, so this is `a⁻¹ ⊗ b`: the rotation `b` expressed
5
+ * in the frame `a` rotates into — a world orientation written in a parent's or a body's frame. Callers
6
+ * used to build `a*` in a scratch array and hand it to {@link quat3_multiply_array}; the conjugate's
7
+ * signs are folded into the product here instead, so there is no scratch and no extra pass.
8
+ *
9
+ * Sign convention: `(x, y, z, w)` — `w` last, matching {@link Quaternion} and the rest of the
10
+ * `core/geom/3d/quaternion/` family.
11
+ *
12
+ * `out` may be `a` or `b`: all eight components are read before the first write.
13
+ *
14
+ * @param {number[]|Float32Array|Float64Array} out
15
+ * @param {number} out_offset offset into `out`; receives 4 floats (x, y, z, w)
16
+ * @param {number[]|Float32Array|Float64Array} a `[x, y, z, w]`, the operand that is conjugated
17
+ * @param {number} a_offset
18
+ * @param {number[]|Float32Array|Float64Array} b `[x, y, z, w]`
19
+ * @param {number} b_offset
20
+ */
21
+ export function quat3_multiply_conjugate_left_array(out, out_offset, a, a_offset, b, b_offset) {
22
+ const ax = a[a_offset], ay = a[a_offset + 1], az = a[a_offset + 2], aw = a[a_offset + 3];
23
+ const bx = b[b_offset], by = b[b_offset + 1], bz = b[b_offset + 2], bw = b[b_offset + 3];
24
+
25
+ // quat3_multiply with (ax, ay, az) negated
26
+ out[out_offset] = aw * bx - ax * bw - ay * bz + az * by;
27
+ out[out_offset + 1] = aw * by + ax * bz - ay * bw - az * bx;
28
+ out[out_offset + 2] = aw * bz - ax * by + ay * bx - az * bw;
29
+ out[out_offset + 3] = aw * bw + ax * bx + ay * by + az * bz;
30
+ }
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Hamilton product with the right operand conjugated, `out = a ⊗ b*`, both read from arrays.
3
+ *
4
+ * For unit quaternions the conjugate is the inverse, so this is `a ⊗ b⁻¹`: the world-frame rotation
5
+ * that takes orientation `b` to orientation `a` — the turn a holder made since a hold began, the
6
+ * rotation a body must make to reach a target. Callers used to build `b*` in a scratch array, or pass
7
+ * its components negated, to {@link quat3_multiply_array}; the conjugate's signs are folded into the
8
+ * product here instead.
9
+ *
10
+ * Sign convention: `(x, y, z, w)` — `w` last, matching {@link Quaternion} and the rest of the
11
+ * `core/geom/3d/quaternion/` family.
12
+ *
13
+ * `out` may be `a` or `b`: all eight components are read before the first write.
14
+ *
15
+ * @param {number[]|Float32Array|Float64Array} out
16
+ * @param {number} out_offset offset into `out`; receives 4 floats (x, y, z, w)
17
+ * @param {number[]|Float32Array|Float64Array} a `[x, y, z, w]`
18
+ * @param {number} a_offset
19
+ * @param {number[]|Float32Array|Float64Array} b `[x, y, z, w]`, the operand that is conjugated
20
+ * @param {number} b_offset
21
+ */
22
+ export function quat3_multiply_conjugate_right_array(out: number[] | Float32Array | Float64Array, out_offset: number, a: number[] | Float32Array | Float64Array, a_offset: number, b: number[] | Float32Array | Float64Array, b_offset: number): void;
23
+ //# sourceMappingURL=quat3_multiply_conjugate_right_array.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quat3_multiply_conjugate_right_array.d.ts","sourceRoot":"","sources":["../../../../../../src/core/geom/3d/quaternion/quat3_multiply_conjugate_right_array.js"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,0DAPW,MAAM,EAAE,GAAC,YAAY,GAAC,YAAY,cAClC,MAAM,KACN,MAAM,EAAE,GAAC,YAAY,GAAC,YAAY,YAClC,MAAM,KACN,MAAM,EAAE,GAAC,YAAY,GAAC,YAAY,YAClC,MAAM,QAWhB"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Hamilton product with the right operand conjugated, `out = a ⊗ b*`, both read from arrays.
3
+ *
4
+ * For unit quaternions the conjugate is the inverse, so this is `a ⊗ b⁻¹`: the world-frame rotation
5
+ * that takes orientation `b` to orientation `a` — the turn a holder made since a hold began, the
6
+ * rotation a body must make to reach a target. Callers used to build `b*` in a scratch array, or pass
7
+ * its components negated, to {@link quat3_multiply_array}; the conjugate's signs are folded into the
8
+ * product here instead.
9
+ *
10
+ * Sign convention: `(x, y, z, w)` — `w` last, matching {@link Quaternion} and the rest of the
11
+ * `core/geom/3d/quaternion/` family.
12
+ *
13
+ * `out` may be `a` or `b`: all eight components are read before the first write.
14
+ *
15
+ * @param {number[]|Float32Array|Float64Array} out
16
+ * @param {number} out_offset offset into `out`; receives 4 floats (x, y, z, w)
17
+ * @param {number[]|Float32Array|Float64Array} a `[x, y, z, w]`
18
+ * @param {number} a_offset
19
+ * @param {number[]|Float32Array|Float64Array} b `[x, y, z, w]`, the operand that is conjugated
20
+ * @param {number} b_offset
21
+ */
22
+ export function quat3_multiply_conjugate_right_array(out, out_offset, a, a_offset, b, b_offset) {
23
+ const ax = a[a_offset], ay = a[a_offset + 1], az = a[a_offset + 2], aw = a[a_offset + 3];
24
+ const bx = b[b_offset], by = b[b_offset + 1], bz = b[b_offset + 2], bw = b[b_offset + 3];
25
+
26
+ // quat3_multiply with (bx, by, bz) negated
27
+ out[out_offset] = ax * bw - aw * bx - ay * bz + az * by;
28
+ out[out_offset + 1] = ay * bw - aw * by + ax * bz - az * bx;
29
+ out[out_offset + 2] = az * bw - aw * bz - ax * by + ay * bx;
30
+ out[out_offset + 3] = aw * bw + ax * bx + ay * by + az * bz;
31
+ }
@@ -0,0 +1,26 @@
1
+ /**
2
+ * The face normal of triangle `abc`, NOT normalised: the raw cross product `(c − b) × (a − b)`, whose
3
+ * magnitude is twice the triangle's area and whose direction follows the counter-clockwise winding
4
+ * `a → b → c`, the same winding {@link tri3_compute_normal} uses.
5
+ *
6
+ * The magnitude is the point. A pass that accumulates one normal per incident face and normalises at
7
+ * the end wants each face to pull in proportion to how much surface it is, so that a sliver beside a
8
+ * large face hardly moves the result and retriangulating the same surface does not change it. A
9
+ * triangle with no area contributes a zero vector, which is the right vote for nothing, where a
10
+ * normalising helper has to invent some unit vector.
11
+ *
12
+ * Each corner is its own array and offset, so corners may live in one shared position buffer
13
+ * (`positions, index * 3`) or anywhere else. `out` may alias any of them.
14
+ *
15
+ * @param {number[]|Float32Array|Float64Array} out
16
+ * @param {number} out_offset
17
+ * @param {number[]|Float32Array|Float64Array} a
18
+ * @param {number} a_offset
19
+ * @param {number[]|Float32Array|Float64Array} b
20
+ * @param {number} b_offset
21
+ * @param {number[]|Float32Array|Float64Array} c
22
+ * @param {number} c_offset
23
+ * @returns {void}
24
+ */
25
+ export function tri3_compute_normal_area_weighted_array(out: number[] | Float32Array | Float64Array, out_offset: number, a: number[] | Float32Array | Float64Array, a_offset: number, b: number[] | Float32Array | Float64Array, b_offset: number, c: number[] | Float32Array | Float64Array, c_offset: number): void;
26
+ //# sourceMappingURL=tri3_compute_normal_area_weighted_array.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tri3_compute_normal_area_weighted_array.d.ts","sourceRoot":"","sources":["../../../../../../src/core/geom/3d/triangle/tri3_compute_normal_area_weighted_array.js"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,6DAVW,MAAM,EAAE,GAAC,YAAY,GAAC,YAAY,cAClC,MAAM,KACN,MAAM,EAAE,GAAC,YAAY,GAAC,YAAY,YAClC,MAAM,KACN,MAAM,EAAE,GAAC,YAAY,GAAC,YAAY,YAClC,MAAM,KACN,MAAM,EAAE,GAAC,YAAY,GAAC,YAAY,YAClC,MAAM,GACJ,IAAI,CAuBhB"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * The face normal of triangle `abc`, NOT normalised: the raw cross product `(c − b) × (a − b)`, whose
3
+ * magnitude is twice the triangle's area and whose direction follows the counter-clockwise winding
4
+ * `a → b → c`, the same winding {@link tri3_compute_normal} uses.
5
+ *
6
+ * The magnitude is the point. A pass that accumulates one normal per incident face and normalises at
7
+ * the end wants each face to pull in proportion to how much surface it is, so that a sliver beside a
8
+ * large face hardly moves the result and retriangulating the same surface does not change it. A
9
+ * triangle with no area contributes a zero vector, which is the right vote for nothing, where a
10
+ * normalising helper has to invent some unit vector.
11
+ *
12
+ * Each corner is its own array and offset, so corners may live in one shared position buffer
13
+ * (`positions, index * 3`) or anywhere else. `out` may alias any of them.
14
+ *
15
+ * @param {number[]|Float32Array|Float64Array} out
16
+ * @param {number} out_offset
17
+ * @param {number[]|Float32Array|Float64Array} a
18
+ * @param {number} a_offset
19
+ * @param {number[]|Float32Array|Float64Array} b
20
+ * @param {number} b_offset
21
+ * @param {number[]|Float32Array|Float64Array} c
22
+ * @param {number} c_offset
23
+ * @returns {void}
24
+ */
25
+ export function tri3_compute_normal_area_weighted_array(
26
+ out, out_offset,
27
+ a, a_offset,
28
+ b, b_offset,
29
+ c, c_offset
30
+ ) {
31
+ const bx = b[b_offset];
32
+ const by = b[b_offset + 1];
33
+ const bz = b[b_offset + 2];
34
+
35
+ const cb_x = c[c_offset] - bx;
36
+ const cb_y = c[c_offset + 1] - by;
37
+ const cb_z = c[c_offset + 2] - bz;
38
+
39
+ const ab_x = a[a_offset] - bx;
40
+ const ab_y = a[a_offset + 1] - by;
41
+ const ab_z = a[a_offset + 2] - bz;
42
+
43
+ out[out_offset] = cb_y * ab_z - cb_z * ab_y;
44
+ out[out_offset + 1] = cb_z * ab_x - cb_x * ab_z;
45
+ out[out_offset + 2] = cb_x * ab_y - cb_y * ab_x;
46
+ }
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Euclidean distance between two 3-vectors stored in arrays.
3
+ *
4
+ * @param {number[]|Float32Array|Float64Array} a
5
+ * @param {number} a_offset
6
+ * @param {number[]|Float32Array|Float64Array} b
7
+ * @param {number} b_offset
8
+ * @returns {number}
9
+ */
10
+ export function v3_distance_array(a: number[] | Float32Array | Float64Array, a_offset: number, b: number[] | Float32Array | Float64Array, b_offset: number): number;
11
+ //# sourceMappingURL=v3_distance_array.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"v3_distance_array.d.ts","sourceRoot":"","sources":["../../../../../src/core/geom/vec3/v3_distance_array.js"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,qCANW,MAAM,EAAE,GAAC,YAAY,GAAC,YAAY,YAClC,MAAM,KACN,MAAM,EAAE,GAAC,YAAY,GAAC,YAAY,YAClC,MAAM,GACJ,MAAM,CAWlB"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Euclidean distance between two 3-vectors stored in arrays.
3
+ *
4
+ * @param {number[]|Float32Array|Float64Array} a
5
+ * @param {number} a_offset
6
+ * @param {number[]|Float32Array|Float64Array} b
7
+ * @param {number} b_offset
8
+ * @returns {number}
9
+ */
10
+ export function v3_distance_array(
11
+ a, a_offset,
12
+ b, b_offset
13
+ ) {
14
+ const dx = b[b_offset] - a[a_offset];
15
+ const dy = b[b_offset + 1] - a[a_offset + 1];
16
+ const dz = b[b_offset + 2] - a[a_offset + 2];
17
+
18
+ return Math.sqrt(dx * dx + dy * dy + dz * dz);
19
+ }
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Normalise a vector, reporting whether it had a direction to normalise.
3
+ *
4
+ * Unlike {@link v3_normalize_array}, which passes a zero vector through and scales anything else, a
5
+ * vector whose squared length is below `epsilon_sqr` is refused: `false` is returned and `output` is
6
+ * not written at all, so with `output === input` the vector is left as it was. A vector that short
7
+ * has a direction made of rounding, and a caller that builds a rotation from it wants to know.
8
+ *
9
+ * So is a vector with no finite squared length — a NaN component, an infinite one, or one so long
10
+ * its square overflows — since none of those leaves a unit vector to write.
11
+ *
12
+ * `output` may alias `input`.
13
+ *
14
+ * @param {number[]|Float32Array|Float64Array} output
15
+ * @param {number} output_offset
16
+ * @param {number[]|Float32Array|Float64Array} input
17
+ * @param {number} input_offset
18
+ * @param {number} epsilon_sqr squared length below which the vector has no direction; positive, since at
19
+ * zero a zero vector would pass and normalise to NaN
20
+ * @returns {boolean} true when `output` received the unit vector, false when it was not written
21
+ */
22
+ export function v3_normalize_array_checked(output: number[] | Float32Array | Float64Array, output_offset: number, input: number[] | Float32Array | Float64Array, input_offset: number, epsilon_sqr: number): boolean;
23
+ //# sourceMappingURL=v3_normalize_array_checked.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"v3_normalize_array_checked.d.ts","sourceRoot":"","sources":["../../../../../src/core/geom/vec3/v3_normalize_array_checked.js"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,mDARW,MAAM,EAAE,GAAC,YAAY,GAAC,YAAY,iBAClC,MAAM,SACN,MAAM,EAAE,GAAC,YAAY,GAAC,YAAY,gBAClC,MAAM,eACN,MAAM,GAEJ,OAAO,CA2BnB"}
@@ -0,0 +1,49 @@
1
+ import { assert } from "../../assert.js";
2
+
3
+ /**
4
+ * Normalise a vector, reporting whether it had a direction to normalise.
5
+ *
6
+ * Unlike {@link v3_normalize_array}, which passes a zero vector through and scales anything else, a
7
+ * vector whose squared length is below `epsilon_sqr` is refused: `false` is returned and `output` is
8
+ * not written at all, so with `output === input` the vector is left as it was. A vector that short
9
+ * has a direction made of rounding, and a caller that builds a rotation from it wants to know.
10
+ *
11
+ * So is a vector with no finite squared length — a NaN component, an infinite one, or one so long
12
+ * its square overflows — since none of those leaves a unit vector to write.
13
+ *
14
+ * `output` may alias `input`.
15
+ *
16
+ * @param {number[]|Float32Array|Float64Array} output
17
+ * @param {number} output_offset
18
+ * @param {number[]|Float32Array|Float64Array} input
19
+ * @param {number} input_offset
20
+ * @param {number} epsilon_sqr squared length below which the vector has no direction; positive, since at
21
+ * zero a zero vector would pass and normalise to NaN
22
+ * @returns {boolean} true when `output` received the unit vector, false when it was not written
23
+ */
24
+ export function v3_normalize_array_checked(
25
+ output, output_offset,
26
+ input, input_offset,
27
+ epsilon_sqr
28
+ ) {
29
+ assert.greaterThan(epsilon_sqr, 0, 'epsilon_sqr');
30
+
31
+ const x = input[input_offset];
32
+ const y = input[input_offset + 1];
33
+ const z = input[input_offset + 2];
34
+
35
+ const length_sqr = x * x + y * y + z * z;
36
+
37
+ // Written so that NaN, which fails every comparison, lands on the refusing side.
38
+ if (!(length_sqr >= epsilon_sqr && length_sqr < Infinity)) {
39
+ return false;
40
+ }
41
+
42
+ const inverse = 1 / Math.sqrt(length_sqr);
43
+
44
+ output[output_offset] = x * inverse;
45
+ output[output_offset + 1] = y * inverse;
46
+ output[output_offset + 2] = z * inverse;
47
+
48
+ return true;
49
+ }
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Vector rejection: the part of `v` square to the unit vector `n`, `v − (v·n) n`. Equivalently, `v`
3
+ * projected onto the plane through the origin whose normal is `n`.
4
+ *
5
+ * `n` must be of unit length; nothing here normalises it. `output` may alias `input` or `normal`.
6
+ *
7
+ * @param {number[]|Float32Array|Float64Array} output
8
+ * @param {number} output_offset
9
+ * @param {number[]|Float32Array|Float64Array} input `v`
10
+ * @param {number} input_offset
11
+ * @param {number[]|Float32Array|Float64Array} normal `n`, unit length
12
+ * @param {number} normal_offset
13
+ */
14
+ export function v3_reject_array(output: number[] | Float32Array | Float64Array, output_offset: number, input: number[] | Float32Array | Float64Array, input_offset: number, normal: number[] | Float32Array | Float64Array, normal_offset: number): void;
15
+ //# sourceMappingURL=v3_reject_array.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"v3_reject_array.d.ts","sourceRoot":"","sources":["../../../../../src/core/geom/vec3/v3_reject_array.js"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,wCAPW,MAAM,EAAE,GAAC,YAAY,GAAC,YAAY,iBAClC,MAAM,SACN,MAAM,EAAE,GAAC,YAAY,GAAC,YAAY,gBAClC,MAAM,UACN,MAAM,EAAE,GAAC,YAAY,GAAC,YAAY,iBAClC,MAAM,QAoBhB"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Vector rejection: the part of `v` square to the unit vector `n`, `v − (v·n) n`. Equivalently, `v`
3
+ * projected onto the plane through the origin whose normal is `n`.
4
+ *
5
+ * `n` must be of unit length; nothing here normalises it. `output` may alias `input` or `normal`.
6
+ *
7
+ * @param {number[]|Float32Array|Float64Array} output
8
+ * @param {number} output_offset
9
+ * @param {number[]|Float32Array|Float64Array} input `v`
10
+ * @param {number} input_offset
11
+ * @param {number[]|Float32Array|Float64Array} normal `n`, unit length
12
+ * @param {number} normal_offset
13
+ */
14
+ export function v3_reject_array(
15
+ output, output_offset,
16
+ input, input_offset,
17
+ normal, normal_offset
18
+ ) {
19
+ const x = input[input_offset];
20
+ const y = input[input_offset + 1];
21
+ const z = input[input_offset + 2];
22
+
23
+ const nx = normal[normal_offset];
24
+ const ny = normal[normal_offset + 1];
25
+ const nz = normal[normal_offset + 2];
26
+
27
+ const d = x * nx + y * ny + z * nz;
28
+
29
+ output[output_offset] = x - d * nx;
30
+ output[output_offset + 1] = y - d * ny;
31
+ output[output_offset + 2] = z - d * nz;
32
+ }
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Group the indices of a key array by key, as CSR: for every bucket `k`, the items
3
+ * `out_items[out_offset[k] .. out_offset[k + 1])` are the indices `i` with `keys[i] === k`, in ascending order.
4
+ *
5
+ * This is the counting sort behind every "which rows touch this vertex" table — count each key into
6
+ * `out_offset[k + 1]`, prefix-sum, then scatter each index through a per-bucket cursor. A key array with a
7
+ * fixed arity (two vertices per edge, three per triangle) is passed flat, and an item is then the flat index
8
+ * `element · arity + slot`; a caller that wants the element divides by the arity. Ascending order within a
9
+ * bucket is what makes the result a function of the keys alone, and what lets a consumer walking a bucket
10
+ * read its elements' tables forwards.
11
+ *
12
+ * A negative key is skipped: it is in no bucket and its index appears nowhere — the form a parent array takes
13
+ * at its roots.
14
+ *
15
+ * Allocation-free: `out_offset` itself is the scatter cursor. After the scatter every `out_offset[k]` has
16
+ * advanced to the start of bucket `k + 1`, so one shift down by a slot restores the starts.
17
+ *
18
+ * @param {Int32Array|Uint32Array|number[]} out_offset written whole, `bucket_count + 1` entries; the last is the
19
+ * number of items written
20
+ * @param {Int32Array|Uint32Array|number[]} out_items at least as long as the number of non-negative keys
21
+ * @param {ArrayLike<number>} keys bucket of each index, in `[0, bucket_count)`, or negative for none
22
+ * @param {number} key_count how many leading entries of `keys` to group
23
+ * @param {number} bucket_count
24
+ */
25
+ export function csr_build_incidence(out_offset: Int32Array | Uint32Array | number[], out_items: Int32Array | Uint32Array | number[], keys: ArrayLike<number>, key_count: number, bucket_count: number): void;
26
+ //# sourceMappingURL=csr_build_incidence.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"csr_build_incidence.d.ts","sourceRoot":"","sources":["../../../../../src/core/graph/csr/csr_build_incidence.js"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,gDAPW,UAAU,GAAC,WAAW,GAAC,MAAM,EAAE,aAE/B,UAAU,GAAC,WAAW,GAAC,MAAM,EAAE,QAC/B,UAAU,MAAM,CAAC,aACjB,MAAM,gBACN,MAAM,QA8ChB"}
@@ -0,0 +1,71 @@
1
+ import { assert } from "../../assert.js";
2
+
3
+ /**
4
+ * Group the indices of a key array by key, as CSR: for every bucket `k`, the items
5
+ * `out_items[out_offset[k] .. out_offset[k + 1])` are the indices `i` with `keys[i] === k`, in ascending order.
6
+ *
7
+ * This is the counting sort behind every "which rows touch this vertex" table — count each key into
8
+ * `out_offset[k + 1]`, prefix-sum, then scatter each index through a per-bucket cursor. A key array with a
9
+ * fixed arity (two vertices per edge, three per triangle) is passed flat, and an item is then the flat index
10
+ * `element · arity + slot`; a caller that wants the element divides by the arity. Ascending order within a
11
+ * bucket is what makes the result a function of the keys alone, and what lets a consumer walking a bucket
12
+ * read its elements' tables forwards.
13
+ *
14
+ * A negative key is skipped: it is in no bucket and its index appears nowhere — the form a parent array takes
15
+ * at its roots.
16
+ *
17
+ * Allocation-free: `out_offset` itself is the scatter cursor. After the scatter every `out_offset[k]` has
18
+ * advanced to the start of bucket `k + 1`, so one shift down by a slot restores the starts.
19
+ *
20
+ * @param {Int32Array|Uint32Array|number[]} out_offset written whole, `bucket_count + 1` entries; the last is the
21
+ * number of items written
22
+ * @param {Int32Array|Uint32Array|number[]} out_items at least as long as the number of non-negative keys
23
+ * @param {ArrayLike<number>} keys bucket of each index, in `[0, bucket_count)`, or negative for none
24
+ * @param {number} key_count how many leading entries of `keys` to group
25
+ * @param {number} bucket_count
26
+ */
27
+ export function csr_build_incidence(out_offset, out_items, keys, key_count, bucket_count) {
28
+ assert.isNonNegativeInteger(key_count, 'key_count');
29
+ assert.isNonNegativeInteger(bucket_count, 'bucket_count');
30
+ assert.greaterThanOrEqual(out_offset.length, bucket_count + 1, 'out_offset shorter than bucket_count + 1');
31
+ assert.greaterThanOrEqual(keys.length, key_count, 'keys shorter than key_count');
32
+
33
+ for (let k = 0; k <= bucket_count; k++) {
34
+ out_offset[k] = 0;
35
+ }
36
+
37
+ for (let i = 0; i < key_count; i++) {
38
+ const key = keys[i];
39
+
40
+ if (key < 0) {
41
+ continue;
42
+ }
43
+
44
+ assert.lessThan(key, bucket_count, 'key out of range');
45
+
46
+ out_offset[key + 1]++;
47
+ }
48
+
49
+ for (let k = 0; k < bucket_count; k++) {
50
+ out_offset[k + 1] += out_offset[k];
51
+ }
52
+
53
+ assert.greaterThanOrEqual(out_items.length, out_offset[bucket_count], 'out_items shorter than the item count');
54
+
55
+ // `out_offset[k]` is bucket `k`'s write cursor; it ends at the start of bucket `k + 1`
56
+ for (let i = 0; i < key_count; i++) {
57
+ const key = keys[i];
58
+
59
+ if (key < 0) {
60
+ continue;
61
+ }
62
+
63
+ out_items[out_offset[key]++] = i;
64
+ }
65
+
66
+ for (let k = bucket_count; k > 0; k--) {
67
+ out_offset[k] = out_offset[k - 1];
68
+ }
69
+
70
+ out_offset[0] = 0;
71
+ }
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Greedy graph colouring over a CSR adjacency: visit the vertices in `order`, and give each the lowest colour
3
+ * none of its already-coloured neighbours holds.
4
+ *
5
+ * Greedy colouring is order-sensitive, and the order is the caller's — Welsh–Powell's largest-degree-first
6
+ * is the usual choice, and the reason it is a parameter rather than a policy. For a given order the result
7
+ * is fully determined: the order of neighbours within a row, and duplicate entries in a row, do not change
8
+ * it. A vertex's colour is at most its degree, so the colour count is at most the largest degree plus one.
9
+ *
10
+ * Works on the raw CSR arrays rather than a {@link CSRGraph}, so any row-pointer/column-index pair can be
11
+ * coloured without being copied into one; for a `CSRGraph` pass `graph.edge_addresses, graph.adjacency`.
12
+ * A self-loop is ignored, since a vertex is uncoloured while its own colour is being chosen.
13
+ *
14
+ * Allocation-free per call, beyond growing the module scratch to `vertex_count + 1`; not reentrant.
15
+ *
16
+ * @param {Uint32Array|Int32Array|number[]} out_colors colour of every vertex, written for `[0, vertex_count)`
17
+ * @param {Uint32Array|Int32Array|ArrayLike<number>} edge_addresses row offsets, `vertex_count + 1` entries
18
+ * @param {Uint32Array|Int32Array|ArrayLike<number>} adjacency neighbour ids, rows
19
+ * `adjacency[edge_addresses[v] .. edge_addresses[v + 1])`
20
+ * @param {ArrayLike<number>} order a permutation of `[0, vertex_count)`, the visit order
21
+ * @param {number} vertex_count
22
+ * @returns {number} number of colours used; colours are `[0, count)`
23
+ */
24
+ export function csr_graph_color_greedy(out_colors: Uint32Array | Int32Array | number[], edge_addresses: Uint32Array | Int32Array | ArrayLike<number>, adjacency: Uint32Array | Int32Array | ArrayLike<number>, order: ArrayLike<number>, vertex_count: number): number;
25
+ //# sourceMappingURL=csr_graph_color_greedy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"csr_graph_color_greedy.d.ts","sourceRoot":"","sources":["../../../../../src/core/graph/csr/csr_graph_color_greedy.js"],"names":[],"mappings":"AAUA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,mDARW,WAAW,GAAC,UAAU,GAAC,MAAM,EAAE,kBAC/B,WAAW,GAAC,UAAU,GAAC,UAAU,MAAM,CAAC,aACxC,WAAW,GAAC,UAAU,GAAC,UAAU,MAAM,CAAC,SAExC,UAAU,MAAM,CAAC,gBACjB,MAAM,GACJ,MAAM,CAmDlB"}
@@ -0,0 +1,83 @@
1
+ import { assert } from "../../assert.js";
2
+
3
+ /**
4
+ * Per-colour stamp: `MARK[c] === i + 1` while visiting the `i`-th vertex of the order means a neighbour
5
+ * already holds colour `c`. Module-static and grown on demand; the colouring runs synchronously start to
6
+ * finish, so reuse is safe.
7
+ * @type {Uint32Array}
8
+ */
9
+ let MARK = new Uint32Array(0);
10
+
11
+ /**
12
+ * Greedy graph colouring over a CSR adjacency: visit the vertices in `order`, and give each the lowest colour
13
+ * none of its already-coloured neighbours holds.
14
+ *
15
+ * Greedy colouring is order-sensitive, and the order is the caller's — Welsh–Powell's largest-degree-first
16
+ * is the usual choice, and the reason it is a parameter rather than a policy. For a given order the result
17
+ * is fully determined: the order of neighbours within a row, and duplicate entries in a row, do not change
18
+ * it. A vertex's colour is at most its degree, so the colour count is at most the largest degree plus one.
19
+ *
20
+ * Works on the raw CSR arrays rather than a {@link CSRGraph}, so any row-pointer/column-index pair can be
21
+ * coloured without being copied into one; for a `CSRGraph` pass `graph.edge_addresses, graph.adjacency`.
22
+ * A self-loop is ignored, since a vertex is uncoloured while its own colour is being chosen.
23
+ *
24
+ * Allocation-free per call, beyond growing the module scratch to `vertex_count + 1`; not reentrant.
25
+ *
26
+ * @param {Uint32Array|Int32Array|number[]} out_colors colour of every vertex, written for `[0, vertex_count)`
27
+ * @param {Uint32Array|Int32Array|ArrayLike<number>} edge_addresses row offsets, `vertex_count + 1` entries
28
+ * @param {Uint32Array|Int32Array|ArrayLike<number>} adjacency neighbour ids, rows
29
+ * `adjacency[edge_addresses[v] .. edge_addresses[v + 1])`
30
+ * @param {ArrayLike<number>} order a permutation of `[0, vertex_count)`, the visit order
31
+ * @param {number} vertex_count
32
+ * @returns {number} number of colours used; colours are `[0, count)`
33
+ */
34
+ export function csr_graph_color_greedy(out_colors, edge_addresses, adjacency, order, vertex_count) {
35
+ assert.isNonNegativeInteger(vertex_count, 'vertex_count');
36
+ assert.greaterThanOrEqual(order.length, vertex_count, 'order shorter than vertex_count');
37
+ assert.greaterThanOrEqual(out_colors.length, vertex_count, 'out_colors shorter than vertex_count');
38
+
39
+ if (MARK.length < vertex_count + 1) {
40
+ MARK = new Uint32Array(vertex_count + 1);
41
+ } else {
42
+ MARK.fill(0, 0, vertex_count + 1);
43
+ }
44
+
45
+ const mark = MARK;
46
+
47
+ // No colour reaches `vertex_count`, so it stands for "not coloured yet" in whatever type the caller's
48
+ // array is.
49
+ for (let v = 0; v < vertex_count; v++) {
50
+ out_colors[v] = vertex_count;
51
+ }
52
+
53
+ let colour_count = 0;
54
+
55
+ for (let i = 0; i < vertex_count; i++) {
56
+ const v = order[i];
57
+ const stamp = i + 1;
58
+
59
+ const end = edge_addresses[v + 1];
60
+
61
+ for (let k = edge_addresses[v]; k < end; k++) {
62
+ const neighbour_colour = out_colors[adjacency[k]];
63
+
64
+ if (neighbour_colour < vertex_count) {
65
+ mark[neighbour_colour] = stamp;
66
+ }
67
+ }
68
+
69
+ let colour = 0;
70
+
71
+ while (mark[colour] === stamp) {
72
+ colour++;
73
+ }
74
+
75
+ out_colors[v] = colour;
76
+
77
+ if (colour >= colour_count) {
78
+ colour_count = colour + 1;
79
+ }
80
+ }
81
+
82
+ return colour_count;
83
+ }
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Whether a colouring is proper over a CSR adjacency: no vertex shares its colour with any of its neighbours.
3
+ * A self-loop is not a conflict.
4
+ *
5
+ * A debug check, meant to sit behind `assert.*` after a colouring is built; it reads every adjacency entry
6
+ * once. Works on the raw CSR arrays, like {@link csr_graph_color_greedy}.
7
+ *
8
+ * @param {ArrayLike<number>} colors colour of every vertex
9
+ * @param {ArrayLike<number>} edge_addresses row offsets, `vertex_count + 1` entries
10
+ * @param {ArrayLike<number>} adjacency neighbour ids
11
+ * @param {number} vertex_count
12
+ * @returns {boolean} true when no edge joins two vertices of one colour
13
+ */
14
+ export function csr_graph_validate_coloring(colors: ArrayLike<number>, edge_addresses: ArrayLike<number>, adjacency: ArrayLike<number>, vertex_count: number): boolean;
15
+ //# sourceMappingURL=csr_graph_validate_coloring.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"csr_graph_validate_coloring.d.ts","sourceRoot":"","sources":["../../../../../src/core/graph/csr/csr_graph_validate_coloring.js"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,oDANW,UAAU,MAAM,CAAC,kBACjB,UAAU,MAAM,CAAC,aACjB,UAAU,MAAM,CAAC,gBACjB,MAAM,GACJ,OAAO,CAqBnB"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Whether a colouring is proper over a CSR adjacency: no vertex shares its colour with any of its neighbours.
3
+ * A self-loop is not a conflict.
4
+ *
5
+ * A debug check, meant to sit behind `assert.*` after a colouring is built; it reads every adjacency entry
6
+ * once. Works on the raw CSR arrays, like {@link csr_graph_color_greedy}.
7
+ *
8
+ * @param {ArrayLike<number>} colors colour of every vertex
9
+ * @param {ArrayLike<number>} edge_addresses row offsets, `vertex_count + 1` entries
10
+ * @param {ArrayLike<number>} adjacency neighbour ids
11
+ * @param {number} vertex_count
12
+ * @returns {boolean} true when no edge joins two vertices of one colour
13
+ */
14
+ export function csr_graph_validate_coloring(colors, edge_addresses, adjacency, vertex_count) {
15
+ if (colors.length < vertex_count) {
16
+ return false;
17
+ }
18
+
19
+ for (let v = 0; v < vertex_count; v++) {
20
+ const colour = colors[v];
21
+ const end = edge_addresses[v + 1];
22
+
23
+ for (let k = edge_addresses[v]; k < end; k++) {
24
+ const neighbour = adjacency[k];
25
+
26
+ if (neighbour !== v && colors[neighbour] === colour) {
27
+ return false;
28
+ }
29
+ }
30
+ }
31
+
32
+ return true;
33
+ }
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Solve `M·x = b` for a symmetric positive definite 3×3 `M`, by LDLᵀ factorisation.
3
+ *
4
+ * `M` is read as its six distinct entries, diagonal first: `[m00, m11, m22, m01, m02, m12]`.
5
+ *
6
+ * LDLᵀ rather than a cofactor inverse. The two agree in exact arithmetic and do not agree in Float64: an SPD
7
+ * matrix with a condition number in the billions has a cofactor determinant — a sum of triple products that
8
+ * has to cancel down by that ratio squared — that can come out *negative* although every eigenvalue is
9
+ * positive. The factorisation never forms those products, so its pivots stay positive where the determinant
10
+ * does not, and their product is the determinant to full precision.
11
+ *
12
+ * The pivots of an SPD matrix are `M` restricted to nested subspaces, so all three positive *is* positive
13
+ * definiteness: the function checks exactly that, and returns `false` without writing `out` when a pivot is
14
+ * not positive and finite — an indefinite, singular or non-finite `M`. An infinite pivot needs refusing
15
+ * explicitly: it is positive, and dividing by it reads as a finite solution, zero along that axis.
16
+ *
17
+ * @param {Float64Array|Float32Array|number[]} out solution `x`, 3 entries at `out_offset`
18
+ * @param {number} out_offset
19
+ * @param {Float64Array|Float32Array|number[]} m `[m00, m11, m22, m01, m02, m12]` at `m_offset`
20
+ * @param {number} m_offset
21
+ * @param {Float64Array|Float32Array|number[]} b right-hand side, 3 entries at `b_offset`
22
+ * @param {number} b_offset
23
+ * @returns {boolean} true when `M` was positive definite and `out` holds the solution
24
+ */
25
+ export function matrix_symmetric_3x3_solve_ldlt(out: Float64Array | Float32Array | number[], out_offset: number, m: Float64Array | Float32Array | number[], m_offset: number, b: Float64Array | Float32Array | number[], b_offset: number): boolean;
26
+ //# sourceMappingURL=matrix_symmetric_3x3_solve_ldlt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"matrix_symmetric_3x3_solve_ldlt.d.ts","sourceRoot":"","sources":["../../../../../src/core/math/linalg/matrix_symmetric_3x3_solve_ldlt.js"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,qDARW,YAAY,GAAC,YAAY,GAAC,MAAM,EAAE,cAClC,MAAM,KACN,YAAY,GAAC,YAAY,GAAC,MAAM,EAAE,YAClC,MAAM,KACN,YAAY,GAAC,YAAY,GAAC,MAAM,EAAE,YAClC,MAAM,GACJ,OAAO,CAgDnB"}