@woosh/meep-engine 2.156.0 → 2.157.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 (654) hide show
  1. package/README.md +1 -3
  2. package/editor/view/ecs/components/common/AutoCanvasView.js +100 -53
  3. package/editor/view/ecs/components/common/TextController.js +59 -0
  4. package/editor/view/node-graph/NodeGraphCamera.js +90 -0
  5. package/editor/view/node-graph/NodeGraphEditorView.js +121 -22
  6. package/editor/view/node-graph/NodeGraphSelection.js +89 -0
  7. package/editor/view/node-graph/NodeGraphView.js +669 -453
  8. package/editor/view/node-graph/NodeView.js +211 -135
  9. package/editor/view/node-graph/actions/ConnectionCreateAction.js +53 -0
  10. package/editor/view/node-graph/actions/ConnectionDeleteAction.js +36 -0
  11. package/editor/view/node-graph/actions/NodeDeleteAction.js +88 -0
  12. package/editor/view/node-graph/actions/NodeParameterSetAction.js +52 -0
  13. package/editor/view/node-graph/actions/NodesMoveAction.js +41 -0
  14. package/editor/view/node-graph/actions/SelectionSetAction.js +60 -0
  15. package/editor/view/node-graph/connection_wire_geometry.js +107 -0
  16. package/package.json +1 -1
  17. package/samples/generation/SampleGenerator0.js +8 -1
  18. package/src/core/binary/reinterpret_float32_as_uint32.d.ts +7 -0
  19. package/src/core/binary/reinterpret_float32_as_uint32.d.ts.map +1 -0
  20. package/src/core/binary/reinterpret_float32_as_uint32.js +13 -0
  21. package/src/core/binary/reinterpret_uint32_as_float32.d.ts +7 -0
  22. package/src/core/binary/reinterpret_uint32_as_float32.d.ts.map +1 -0
  23. package/src/core/binary/reinterpret_uint32_as_float32.js +14 -0
  24. package/src/core/bvh2/bvh3/ebvh_build_for_geometry_incremental.d.ts.map +1 -1
  25. package/src/core/bvh2/bvh3/ebvh_build_for_geometry_incremental.js +1 -3
  26. package/src/core/bvh2/bvh3/query/bvh_query_user_data_overlaps_sphere.d.ts +12 -0
  27. package/src/core/bvh2/bvh3/query/bvh_query_user_data_overlaps_sphere.d.ts.map +1 -0
  28. package/src/core/bvh2/bvh3/query/bvh_query_user_data_overlaps_sphere.js +92 -0
  29. package/src/core/bvh8/BVH8.d.ts +127 -0
  30. package/src/core/bvh8/BVH8.d.ts.map +1 -0
  31. package/src/core/bvh8/BVH8.js +436 -0
  32. package/src/core/bvh8/NOTES.md +63 -0
  33. package/src/core/bvh8/build/BVH8Converter.d.ts +59 -0
  34. package/src/core/bvh8/build/BVH8Converter.d.ts.map +1 -0
  35. package/src/core/bvh8/build/BVH8Converter.js +588 -0
  36. package/src/core/bvh8/build/NodeProxy.d.ts +66 -0
  37. package/src/core/bvh8/build/NodeProxy.d.ts.map +1 -0
  38. package/src/core/bvh8/build/NodeProxy.js +308 -0
  39. package/src/core/bvh8/build/TriangleCluster.d.ts +29 -0
  40. package/src/core/bvh8/build/TriangleCluster.d.ts.map +1 -0
  41. package/src/core/bvh8/build/TriangleCluster.js +123 -0
  42. package/src/core/bvh8/build/aabb3_compute_merge_cost.d.ts +8 -0
  43. package/src/core/bvh8/build/aabb3_compute_merge_cost.d.ts.map +1 -0
  44. package/src/core/bvh8/build/aabb3_compute_merge_cost.js +29 -0
  45. package/src/core/bvh8/build/aabb3_from_triangle_by_index.d.ts +10 -0
  46. package/src/core/bvh8/build/aabb3_from_triangle_by_index.d.ts.map +1 -0
  47. package/src/core/bvh8/build/aabb3_from_triangle_by_index.js +18 -0
  48. package/src/core/bvh8/build/bvh8_build_for_geometry.d.ts +10 -0
  49. package/src/core/bvh8/build/bvh8_build_for_geometry.d.ts.map +1 -0
  50. package/src/core/bvh8/build/bvh8_build_for_geometry.js +303 -0
  51. package/src/core/bvh8/build/bvh8_from_proxy.d.ts +9 -0
  52. package/src/core/bvh8/build/bvh8_from_proxy.d.ts.map +1 -0
  53. package/src/core/bvh8/build/bvh8_from_proxy.js +256 -0
  54. package/src/core/bvh8/build/byte.d.ts +7 -0
  55. package/src/core/bvh8/build/byte.d.ts.map +1 -0
  56. package/src/core/bvh8/build/byte.js +10 -0
  57. package/src/core/bvh8/build/encode_bounds_e.d.ts +9 -0
  58. package/src/core/bvh8/build/encode_bounds_e.d.ts.map +1 -0
  59. package/src/core/bvh8/build/encode_bounds_e.js +12 -0
  60. package/src/core/bvh8/bvh8_convert_to_dot.d.ts +11 -0
  61. package/src/core/bvh8/bvh8_convert_to_dot.d.ts.map +1 -0
  62. package/src/core/bvh8/bvh8_convert_to_dot.js +133 -0
  63. package/src/core/bvh8/bvh8_count_primitives.d.ts +22 -0
  64. package/src/core/bvh8/bvh8_count_primitives.d.ts.map +1 -0
  65. package/src/core/bvh8/bvh8_count_primitives.js +98 -0
  66. package/src/core/bvh8/bvh8_geometry_validate.d.ts +16 -0
  67. package/src/core/bvh8/bvh8_geometry_validate.d.ts.map +1 -0
  68. package/src/core/bvh8/bvh8_geometry_validate.js +149 -0
  69. package/src/core/bvh8/bvh8_geometry_validate_indirect.d.ts +16 -0
  70. package/src/core/bvh8/bvh8_geometry_validate_indirect.d.ts.map +1 -0
  71. package/src/core/bvh8/bvh8_geometry_validate_indirect.js +177 -0
  72. package/src/core/bvh8/bvh8_get_node_bounds.d.ts +9 -0
  73. package/src/core/bvh8/bvh8_get_node_bounds.d.ts.map +1 -0
  74. package/src/core/bvh8/bvh8_get_node_bounds.js +35 -0
  75. package/src/core/bvh8/bvh8_get_node_child_bounds.d.ts +10 -0
  76. package/src/core/bvh8/bvh8_get_node_child_bounds.d.ts.map +1 -0
  77. package/src/core/bvh8/bvh8_get_node_child_bounds.js +53 -0
  78. package/src/core/bvh8/bvh8_node_child_surface_area.d.ts +9 -0
  79. package/src/core/bvh8/bvh8_node_child_surface_area.d.ts.map +1 -0
  80. package/src/core/bvh8/bvh8_node_child_surface_area.js +18 -0
  81. package/src/core/bvh8/bvh8_node_count_triangles.d.ts +8 -0
  82. package/src/core/bvh8/bvh8_node_count_triangles.d.ts.map +1 -0
  83. package/src/core/bvh8/bvh8_node_count_triangles.js +28 -0
  84. package/src/core/bvh8/bvh8_quality.d.ts +8 -0
  85. package/src/core/bvh8/bvh8_quality.d.ts.map +1 -0
  86. package/src/core/bvh8/bvh8_quality.js +73 -0
  87. package/src/core/bvh8/bvh8_validate_structure.d.ts +15 -0
  88. package/src/core/bvh8/bvh8_validate_structure.d.ts.map +1 -0
  89. package/src/core/bvh8/bvh8_validate_structure.js +87 -0
  90. package/src/core/collection/Uint32MinHeap.d.ts +56 -0
  91. package/src/core/collection/Uint32MinHeap.d.ts.map +1 -0
  92. package/src/core/collection/Uint32MinHeap.js +109 -0
  93. package/src/core/collection/list/FilteredListProjection.js +1 -1
  94. package/src/{engine/physics/island → core/collection/union-find}/union_find.d.ts +8 -5
  95. package/src/core/collection/union-find/union_find.d.ts.map +1 -0
  96. package/src/{engine/physics/island → core/collection/union-find}/union_find.js +8 -5
  97. package/src/core/dom/isImageBitmap.d.ts +7 -0
  98. package/src/core/dom/isImageBitmap.d.ts.map +1 -0
  99. package/src/core/dom/isImageBitmap.js +12 -0
  100. package/src/core/function/frameThrottle.d.ts +8 -0
  101. package/src/core/function/frameThrottle.d.ts.map +1 -0
  102. package/src/core/function/frameThrottle.js +23 -0
  103. package/src/{engine/physics/narrowphase/clip_against_axis_uv.d.ts → core/geom/2d/polygon/polygon2_clip_axis_halfplane.d.ts} +3 -3
  104. package/src/core/geom/2d/polygon/polygon2_clip_axis_halfplane.d.ts.map +1 -0
  105. package/src/{engine/physics/narrowphase/clip_against_axis_uv.js → core/geom/2d/polygon/polygon2_clip_axis_halfplane.js} +51 -51
  106. package/src/{engine/physics/narrowphase/decomposition/aabb_world_to_local.d.ts → core/geom/3d/aabb/aabb3_transform_oriented_inverse.d.ts} +9 -7
  107. package/src/core/geom/3d/aabb/aabb3_transform_oriented_inverse.d.ts.map +1 -0
  108. package/src/{engine/physics/narrowphase/decomposition/aabb_world_to_local.js → core/geom/3d/aabb/aabb3_transform_oriented_inverse.js} +9 -7
  109. package/src/core/geom/3d/aabb/compute_triangle_group_aabb3.d.ts +12 -0
  110. package/src/core/geom/3d/aabb/compute_triangle_group_aabb3.d.ts.map +1 -0
  111. package/src/core/geom/3d/aabb/compute_triangle_group_aabb3.js +46 -0
  112. package/src/core/geom/3d/box/box3_projected_half_extent.d.ts +28 -0
  113. package/src/core/geom/3d/box/box3_projected_half_extent.d.ts.map +1 -0
  114. package/src/core/geom/3d/box/box3_projected_half_extent.js +35 -0
  115. package/src/core/geom/3d/frustum/read_cluster_frustum_corners.js +1 -1
  116. package/src/core/geom/3d/frustum/read_frustum_corner.d.ts +9 -0
  117. package/src/core/geom/3d/frustum/read_frustum_corner.d.ts.map +1 -0
  118. package/src/core/geom/3d/frustum/read_frustum_corner.js +14 -0
  119. package/src/core/geom/3d/gjk/gjk.d.ts.map +1 -0
  120. package/src/{engine/physics → core/geom/3d}/gjk/gjk.js +430 -372
  121. package/src/{engine/physics → core/geom/3d}/gjk/gjk_epa_penetration.d.ts +8 -5
  122. package/src/core/geom/3d/gjk/gjk_epa_penetration.d.ts.map +1 -0
  123. package/src/{engine/physics → core/geom/3d}/gjk/gjk_epa_penetration.js +520 -544
  124. package/src/{engine/physics → core/geom/3d}/gjk/minkowski_support.d.ts +5 -4
  125. package/src/core/geom/3d/gjk/minkowski_support.d.ts.map +1 -0
  126. package/src/{engine/physics → core/geom/3d}/gjk/minkowski_support.js +71 -70
  127. package/src/{engine/physics → core/geom/3d}/gjk/mpr.d.ts +3 -3
  128. package/src/core/geom/3d/gjk/mpr.d.ts.map +1 -0
  129. package/src/{engine/physics → core/geom/3d}/gjk/mpr.js +368 -362
  130. package/src/{engine/physics/integration/quat_integrate.d.ts → core/geom/3d/quaternion/quat3_integrate.d.ts} +2 -2
  131. package/src/core/geom/3d/quaternion/quat3_integrate.d.ts.map +1 -0
  132. package/src/{engine/physics/integration/quat_integrate.js → core/geom/3d/quaternion/quat3_integrate.js} +1 -1
  133. package/src/{engine/physics/narrowphase/PosedShape.d.ts → core/geom/3d/shape/PosedShape3D.d.ts} +9 -8
  134. package/src/{engine/physics/narrowphase/PosedShape.d.ts.map → core/geom/3d/shape/PosedShape3D.d.ts.map} +1 -1
  135. package/src/{engine/physics/narrowphase/PosedShape.js → core/geom/3d/shape/PosedShape3D.js} +10 -9
  136. package/src/core/geom/3d/shape/TransformedShape3D.d.ts.map +1 -1
  137. package/src/core/geom/3d/shape/TransformedShape3D.js +15 -11
  138. package/src/core/geom/vec3/v3_quat3_apply_inverse.d.ts +1 -1
  139. package/src/core/geom/vec3/v3_quat3_apply_inverse.js +1 -1
  140. package/src/core/math/complex/complex_add.d.ts +1 -1
  141. package/src/core/math/complex/complex_add.d.ts.map +1 -1
  142. package/src/core/math/complex/complex_add.js +12 -3
  143. package/src/core/math/complex/complex_div.d.ts +1 -1
  144. package/src/core/math/complex/complex_div.d.ts.map +1 -1
  145. package/src/core/math/complex/complex_div.js +11 -4
  146. package/src/core/math/complex/complex_mul.d.ts +1 -1
  147. package/src/core/math/complex/complex_mul.d.ts.map +1 -1
  148. package/src/core/math/complex/complex_mul.js +10 -3
  149. package/src/core/math/complex/complex_sub.d.ts +1 -1
  150. package/src/core/math/complex/complex_sub.d.ts.map +1 -1
  151. package/src/core/math/complex/complex_sub.js +12 -3
  152. package/src/{engine/physics/fluid/solver/optimal_sor_omega.d.ts → core/math/linalg/sor_optimal_omega.d.ts} +4 -3
  153. package/src/core/math/linalg/sor_optimal_omega.d.ts.map +1 -0
  154. package/src/{engine/physics/fluid/solver/optimal_sor_omega.js → core/math/linalg/sor_optimal_omega.js} +4 -3
  155. package/src/core/math/lookup/ParameterLookupTable.d.ts +123 -0
  156. package/src/core/math/lookup/ParameterLookupTable.d.ts.map +1 -0
  157. package/src/core/math/lookup/ParameterLookupTable.js +495 -0
  158. package/src/core/math/lookup/ParameterLookupTableFlags.d.ts +5 -0
  159. package/src/core/math/lookup/ParameterLookupTableFlags.d.ts.map +1 -0
  160. package/src/core/math/lookup/ParameterLookupTableFlags.js +6 -0
  161. package/src/core/math/physics/kinematics/computeInterceptPoint.d.ts.map +1 -0
  162. package/src/{engine/physics → core/math/physics/kinematics}/computeInterceptPoint.js +79 -79
  163. package/src/core/math/physics/mie/ri_air.d.ts.map +1 -1
  164. package/src/core/math/physics/mie/ri_air.js +1 -3
  165. package/src/core/math/physics/mie/ri_ammonium_sulfate.d.ts.map +1 -1
  166. package/src/core/math/physics/mie/ri_ammonium_sulfate.js +1 -3
  167. package/src/core/math/physics/mie/ri_brine.d.ts.map +1 -1
  168. package/src/core/math/physics/mie/ri_brine.js +1 -3
  169. package/src/core/math/physics/mie/ri_dust.d.ts.map +1 -1
  170. package/src/core/math/physics/mie/ri_dust.js +1 -3
  171. package/src/core/math/physics/mie/ri_pollen.d.ts.map +1 -1
  172. package/src/core/math/physics/mie/ri_pollen.js +1 -3
  173. package/src/core/math/physics/mie/ri_smoke.d.ts.map +1 -1
  174. package/src/core/math/physics/mie/ri_smoke.js +1 -3
  175. package/src/core/math/physics/mie/ri_soot.d.ts.map +1 -1
  176. package/src/core/math/physics/mie/ri_soot.js +1 -3
  177. package/src/core/math/physics/mie/ri_water.d.ts.map +1 -1
  178. package/src/core/math/physics/mie/ri_water.js +1 -3
  179. package/src/core/math/random/random_pick_weighted_index.d.ts +10 -0
  180. package/src/core/math/random/random_pick_weighted_index.d.ts.map +1 -0
  181. package/src/core/math/random/random_pick_weighted_index.js +26 -0
  182. package/src/core/model/node-graph/NodeGraph.d.ts +9 -0
  183. package/src/core/model/node-graph/NodeGraph.d.ts.map +1 -1
  184. package/src/core/model/node-graph/NodeGraph.js +38 -0
  185. package/src/core/model/node-graph/visual/NodeGraphVisualData.d.ts +23 -0
  186. package/src/core/model/node-graph/visual/NodeGraphVisualData.d.ts.map +1 -1
  187. package/src/core/model/node-graph/visual/NodeGraphVisualData.js +54 -0
  188. package/src/core/path/convertPathToURL.d.ts +9 -0
  189. package/src/core/path/convertPathToURL.d.ts.map +1 -0
  190. package/src/core/path/convertPathToURL.js +107 -0
  191. package/src/core/process/worker/WorkerBuilder.js +1 -1
  192. package/src/core/process/worker/extractTransferables.js +1 -1
  193. package/src/engine/animation/curve/draw/build_tangent_editor.d.ts.map +1 -1
  194. package/src/engine/animation/curve/draw/build_tangent_editor.js +8 -1
  195. package/src/engine/animation/curve/editor/createKeyframeDraggableAspect.d.ts.map +1 -1
  196. package/src/engine/animation/curve/editor/createKeyframeDraggableAspect.js +11 -5
  197. package/src/engine/asset/Asset.d.ts.map +1 -1
  198. package/src/engine/asset/Asset.js +16 -6
  199. package/src/engine/asset/AssetManager.d.ts +61 -52
  200. package/src/engine/asset/AssetManager.d.ts.map +1 -1
  201. package/src/engine/asset/AssetManager.js +1411 -1045
  202. package/src/engine/asset/AssetRequest.d.ts +1 -1
  203. package/src/engine/asset/AssetRequest.d.ts.map +1 -1
  204. package/src/engine/asset/AssetRequest.js +1 -1
  205. package/src/engine/asset/AssetRequestScope.d.ts.map +1 -1
  206. package/src/engine/asset/AssetRequestScope.js +7 -0
  207. package/src/engine/asset/PendingAsset.d.ts +32 -1
  208. package/src/engine/asset/PendingAsset.d.ts.map +1 -1
  209. package/src/engine/asset/PendingAsset.js +108 -61
  210. package/src/engine/asset/loaders/ArrayBufferLoader.js +2 -2
  211. package/src/engine/asset/loaders/AssetLoader.d.ts.map +1 -1
  212. package/src/engine/asset/loaders/AssetLoader.js +19 -2
  213. package/src/engine/asset/loaders/GLTFAssetLoader.d.ts.map +1 -1
  214. package/src/engine/asset/loaders/GLTFAssetLoader.js +123 -114
  215. package/src/engine/asset/loaders/JavascriptAssetLoader.d.ts +1 -1
  216. package/src/engine/asset/loaders/JavascriptAssetLoader.d.ts.map +1 -1
  217. package/src/engine/asset/loaders/JavascriptAssetLoader.js +31 -47
  218. package/src/engine/asset/loaders/JsonAssetLoader.js +1 -1
  219. package/src/engine/asset/loaders/SVGAssetLoader.js +2 -2
  220. package/src/engine/asset/loaders/SoundAssetLoader.js +1 -1
  221. package/src/engine/asset/loaders/TextAssetLoader.js +2 -2
  222. package/src/{core → engine/asset/loaders}/font/FontAsset.d.ts +1 -1
  223. package/src/engine/asset/loaders/font/FontAsset.d.ts.map +1 -0
  224. package/src/{core → engine/asset/loaders}/font/FontAsset.js +21 -21
  225. package/src/{core → engine/asset/loaders}/font/FontAssetLoader.d.ts +1 -1
  226. package/src/engine/asset/loaders/font/FontAssetLoader.d.ts.map +1 -0
  227. package/src/{core → engine/asset/loaders}/font/FontAssetLoader.js +20 -20
  228. package/src/engine/asset/loaders/image/ImageRGBADataLoader.d.ts +1 -1
  229. package/src/engine/asset/loaders/image/ImageRGBADataLoader.d.ts.map +1 -1
  230. package/src/engine/asset/loaders/image/ImageRGBADataLoader.js +11 -20
  231. package/src/engine/asset/loaders/texture/TextureAssetLoader.d.ts.map +1 -1
  232. package/src/engine/asset/loaders/texture/TextureAssetLoader.js +8 -2
  233. package/src/engine/asset/preloader/AssetPreloader.js +1 -1
  234. package/src/engine/ecs/sockets/serialization/AttachmentSocketsAssetLoader.d.ts +1 -1
  235. package/src/engine/ecs/sockets/serialization/AttachmentSocketsAssetLoader.d.ts.map +1 -1
  236. package/src/engine/ecs/sockets/serialization/AttachmentSocketsAssetLoader.js +19 -22
  237. package/src/engine/graphics/FrameThrottle.d.ts +1 -7
  238. package/src/engine/graphics/FrameThrottle.d.ts.map +1 -1
  239. package/src/engine/graphics/FrameThrottle.js +2 -24
  240. package/src/{core/geom/3d/shape/util → engine/graphics/debug}/shape_to_visual_entity.d.ts +1 -1
  241. package/src/engine/graphics/debug/shape_to_visual_entity.d.ts.map +1 -0
  242. package/src/{core/geom/3d/shape/util → engine/graphics/debug}/shape_to_visual_entity.js +159 -159
  243. package/src/{core/geom/3d/tetrahedra → engine/graphics/debug}/visualize_tetrahedral_mesh.d.ts +1 -1
  244. package/src/engine/graphics/debug/visualize_tetrahedral_mesh.d.ts.map +1 -0
  245. package/src/{core/geom/3d/tetrahedra → engine/graphics/debug}/visualize_tetrahedral_mesh.js +46 -46
  246. package/src/engine/graphics/ecs/animation/animator/graph/definition/serialization/AnimationGraphDefinitionAssetLoader.d.ts +1 -1
  247. package/src/engine/graphics/ecs/animation/animator/graph/definition/serialization/AnimationGraphDefinitionAssetLoader.d.ts.map +1 -1
  248. package/src/engine/graphics/ecs/animation/animator/graph/definition/serialization/AnimationGraphDefinitionAssetLoader.js +22 -32
  249. package/src/engine/graphics/particles/particular/engine/emitter/serde/ParameterLookupTableSerializationAdapter.d.ts.map +1 -1
  250. package/src/engine/graphics/particles/particular/engine/emitter/serde/ParameterLookupTableSerializationAdapter.js +2 -76
  251. package/src/engine/graphics/particles/particular/engine/parameter/ParameterLookupTable.d.ts.map +1 -1
  252. package/src/engine/graphics/particles/particular/engine/parameter/ParameterLookupTable.js +2 -427
  253. package/src/engine/graphics/particles/particular/engine/parameter/ParameterLookupTableFlags.d.ts +1 -4
  254. package/src/engine/graphics/particles/particular/engine/parameter/ParameterLookupTableFlags.d.ts.map +1 -1
  255. package/src/engine/graphics/particles/particular/engine/parameter/ParameterLookupTableFlags.js +2 -6
  256. package/src/engine/graphics/particles/particular/engine/utils/volume/prototypeParticleVolume.js +1 -1
  257. package/src/engine/graphics/render/forward_plus/read_frustum_corner.d.ts +1 -8
  258. package/src/engine/graphics/render/forward_plus/read_frustum_corner.d.ts.map +1 -1
  259. package/src/engine/graphics/render/forward_plus/read_frustum_corner.js +2 -14
  260. package/src/engine/graphics/sh3/path_tracer/geometry/compute_triangle_group_aabb3.d.ts +1 -11
  261. package/src/engine/graphics/sh3/path_tracer/geometry/compute_triangle_group_aabb3.d.ts.map +1 -1
  262. package/src/engine/graphics/sh3/path_tracer/geometry/compute_triangle_group_aabb3.js +2 -46
  263. package/src/engine/graphics/sh3/prototypeSH3Probe.js +1 -1
  264. package/src/engine/graphics/texture/3d/scs3d_sample_linear3.d.ts +27 -0
  265. package/src/engine/graphics/texture/3d/scs3d_sample_linear3.d.ts.map +1 -0
  266. package/src/engine/graphics/texture/3d/scs3d_sample_linear3.js +81 -0
  267. package/src/engine/graphics/texture/isImageBitmap.d.ts +1 -6
  268. package/src/engine/graphics/texture/isImageBitmap.d.ts.map +1 -1
  269. package/src/engine/graphics/texture/isImageBitmap.js +2 -12
  270. package/src/{core/process/action → engine/intelligence/behavior/util}/AsynchronousDelayAction.d.ts +2 -2
  271. package/src/engine/intelligence/behavior/util/AsynchronousDelayAction.d.ts.map +1 -0
  272. package/src/{core/process/action → engine/intelligence/behavior/util}/AsynchronousDelayAction.js +55 -55
  273. package/src/engine/network/NetworkSession.d.ts +12 -1
  274. package/src/engine/network/NetworkSession.d.ts.map +1 -1
  275. package/src/engine/network/NetworkSession.js +52 -1
  276. package/src/engine/network/README.md +45 -0
  277. package/src/engine/network/convertPathToURL.d.ts +1 -8
  278. package/src/engine/network/convertPathToURL.d.ts.map +1 -1
  279. package/src/engine/network/convertPathToURL.js +2 -107
  280. package/src/engine/network/core/quantize/quantize_float.d.ts.map +1 -1
  281. package/src/engine/network/core/quantize/quantize_float.js +7 -0
  282. package/src/engine/network/core/quantize/quantize_position.d.ts.map +1 -1
  283. package/src/engine/network/core/quantize/quantize_position.js +12 -1
  284. package/src/engine/network/orchestrator/NetworkPeer.d.ts.map +1 -1
  285. package/src/engine/network/orchestrator/NetworkPeer.js +15 -1
  286. package/src/engine/network/replication/Replicator.d.ts +8 -0
  287. package/src/engine/network/replication/Replicator.d.ts.map +1 -1
  288. package/src/engine/network/replication/Replicator.js +48 -0
  289. package/src/engine/network/transport/Channel.d.ts.map +1 -1
  290. package/src/engine/network/transport/Channel.js +46 -12
  291. package/src/engine/network/transport/ReliableCommandPipeline.d.ts +16 -0
  292. package/src/engine/network/transport/ReliableCommandPipeline.d.ts.map +1 -1
  293. package/src/engine/network/transport/ReliableCommandPipeline.js +29 -0
  294. package/src/engine/network/transport/adapters/NodeUDPTransport.d.ts.map +1 -1
  295. package/src/engine/network/transport/adapters/NodeUDPTransport.js +7 -1
  296. package/src/engine/network/transport/fragments/packet_size.d.ts +5 -5
  297. package/src/engine/network/transport/fragments/packet_size.d.ts.map +1 -1
  298. package/src/engine/network/transport/fragments/packet_size.js +5 -5
  299. package/src/engine/physics/BULLET_REVIEW.md +1 -1
  300. package/src/engine/physics/JOLT_REVIEW.md +2 -2
  301. package/src/engine/physics/PLAN.md +1094 -945
  302. package/src/engine/physics/RAPIER_REVIEW.md +2 -2
  303. package/src/engine/physics/body/BodyStorage.d.ts +2 -12
  304. package/src/engine/physics/body/BodyStorage.d.ts.map +1 -1
  305. package/src/engine/physics/body/BodyStorage.js +406 -452
  306. package/src/engine/physics/body/SolverBodyState.d.ts.map +1 -1
  307. package/src/engine/physics/body/SolverBodyState.js +12 -3
  308. package/src/engine/physics/broadphase/compute_fat_world_aabb.d.ts +28 -3
  309. package/src/engine/physics/broadphase/compute_fat_world_aabb.d.ts.map +1 -1
  310. package/src/engine/physics/broadphase/compute_fat_world_aabb.js +60 -24
  311. package/src/engine/physics/broadphase/generate_pairs.d.ts +9 -5
  312. package/src/engine/physics/broadphase/generate_pairs.d.ts.map +1 -1
  313. package/src/engine/physics/broadphase/generate_pairs.js +52 -37
  314. package/src/engine/physics/ccd/linear_sweep.d.ts +15 -5
  315. package/src/engine/physics/ccd/linear_sweep.d.ts.map +1 -1
  316. package/src/engine/physics/ccd/linear_sweep.js +122 -40
  317. package/src/engine/physics/constraint/solve_constraints.d.ts.map +1 -1
  318. package/src/engine/physics/constraint/solve_constraints.js +830 -805
  319. package/src/engine/physics/contact/ManifoldStore.d.ts +91 -16
  320. package/src/engine/physics/contact/ManifoldStore.d.ts.map +1 -1
  321. package/src/engine/physics/contact/ManifoldStore.js +204 -60
  322. package/src/engine/physics/ecs/BodyKind.d.ts +7 -3
  323. package/src/engine/physics/ecs/BodyKind.d.ts.map +1 -1
  324. package/src/engine/physics/ecs/BodyKind.js +29 -25
  325. package/src/engine/physics/ecs/Collider.d.ts +7 -0
  326. package/src/engine/physics/ecs/Collider.d.ts.map +1 -1
  327. package/src/engine/physics/ecs/Collider.js +7 -0
  328. package/src/engine/physics/ecs/ColliderSerializationAdapter.js +1 -1
  329. package/src/engine/physics/ecs/PhysicsSystem.d.ts +110 -6
  330. package/src/engine/physics/ecs/PhysicsSystem.d.ts.map +1 -1
  331. package/src/engine/physics/ecs/PhysicsSystem.js +467 -45
  332. package/src/engine/physics/ecs/RigidBody.d.ts +20 -5
  333. package/src/engine/physics/ecs/RigidBody.d.ts.map +1 -1
  334. package/src/engine/physics/ecs/RigidBody.js +307 -286
  335. package/src/engine/physics/ecs/RigidBodyFlags.d.ts +6 -3
  336. package/src/engine/physics/ecs/RigidBodyFlags.d.ts.map +1 -1
  337. package/src/engine/physics/ecs/RigidBodyFlags.js +31 -28
  338. package/src/engine/physics/ecs/RigidBodySerializationAdapter.d.ts +12 -4
  339. package/src/engine/physics/ecs/RigidBodySerializationAdapter.d.ts.map +1 -1
  340. package/src/engine/physics/ecs/RigidBodySerializationAdapter.js +19 -5
  341. package/src/engine/physics/ecs/RigidBodySerializationUpgrader_0_1.d.ts +10 -0
  342. package/src/engine/physics/ecs/RigidBodySerializationUpgrader_0_1.d.ts.map +1 -0
  343. package/src/engine/physics/ecs/RigidBodySerializationUpgrader_0_1.js +37 -0
  344. package/src/engine/physics/ecs/find_non_finite_physics_state.d.ts +28 -0
  345. package/src/engine/physics/ecs/find_non_finite_physics_state.d.ts.map +1 -0
  346. package/src/engine/physics/ecs/find_non_finite_physics_state.js +76 -0
  347. package/src/engine/physics/events/ContactEventBuffer.d.ts +11 -0
  348. package/src/engine/physics/events/ContactEventBuffer.d.ts.map +1 -1
  349. package/src/engine/physics/events/ContactEventBuffer.js +40 -0
  350. package/src/engine/physics/events/diff_manifolds.d.ts +30 -13
  351. package/src/engine/physics/events/diff_manifolds.d.ts.map +1 -1
  352. package/src/engine/physics/events/diff_manifolds.js +87 -50
  353. package/src/engine/physics/fluid/FluidField.d.ts +45 -17
  354. package/src/engine/physics/fluid/FluidField.d.ts.map +1 -1
  355. package/src/engine/physics/fluid/FluidField.js +53 -23
  356. package/src/engine/physics/fluid/FluidSimulator.d.ts +141 -5
  357. package/src/engine/physics/fluid/FluidSimulator.d.ts.map +1 -1
  358. package/src/engine/physics/fluid/FluidSimulator.js +336 -43
  359. package/src/engine/physics/fluid/REVIEW_02_PLAN.md +114 -0
  360. package/src/engine/physics/fluid/ecs/FluidComponent.d.ts +4 -3
  361. package/src/engine/physics/fluid/ecs/FluidComponent.d.ts.map +1 -1
  362. package/src/engine/physics/fluid/ecs/FluidComponent.js +4 -3
  363. package/src/engine/physics/fluid/ecs/FluidSystem.d.ts +3 -3
  364. package/src/engine/physics/fluid/effector/AmbientWindFluidEffector.d.ts +41 -0
  365. package/src/engine/physics/fluid/effector/AmbientWindFluidEffector.d.ts.map +1 -0
  366. package/src/engine/physics/fluid/effector/AmbientWindFluidEffector.js +124 -0
  367. package/src/engine/physics/fluid/effector/WakeFluidEffector.d.ts +27 -8
  368. package/src/engine/physics/fluid/effector/WakeFluidEffector.d.ts.map +1 -1
  369. package/src/engine/physics/fluid/effector/WakeFluidEffector.js +67 -18
  370. package/src/engine/physics/fluid/solver/v3_grid_advect_maccormack_scalar.d.ts +42 -0
  371. package/src/engine/physics/fluid/solver/v3_grid_advect_maccormack_scalar.d.ts.map +1 -0
  372. package/src/engine/physics/fluid/solver/v3_grid_advect_maccormack_scalar.js +136 -0
  373. package/src/engine/physics/fluid/solver/v3_grid_advect_maccormack_velocity.d.ts +37 -0
  374. package/src/engine/physics/fluid/solver/v3_grid_advect_maccormack_velocity.d.ts.map +1 -0
  375. package/src/engine/physics/fluid/solver/v3_grid_advect_maccormack_velocity.js +169 -0
  376. package/src/engine/physics/fluid/solver/v3_grid_advect_sl_velocity.d.ts +36 -0
  377. package/src/engine/physics/fluid/solver/v3_grid_advect_sl_velocity.d.ts.map +1 -0
  378. package/src/engine/physics/fluid/solver/v3_grid_advect_sl_velocity.js +100 -0
  379. package/src/engine/physics/fluid/solver/v3_grid_apply_advection_forward.d.ts +6 -0
  380. package/src/engine/physics/fluid/solver/v3_grid_apply_advection_forward.d.ts.map +1 -1
  381. package/src/engine/physics/fluid/solver/v3_grid_apply_advection_forward.js +6 -0
  382. package/src/engine/physics/fluid/solver/v3_grid_apply_diffusion.d.ts +7 -2
  383. package/src/engine/physics/fluid/solver/v3_grid_apply_diffusion.d.ts.map +1 -1
  384. package/src/engine/physics/fluid/solver/v3_grid_apply_diffusion.js +17 -12
  385. package/src/engine/physics/fluid/solver/v3_grid_apply_vorticity_confinement.d.ts +42 -0
  386. package/src/engine/physics/fluid/solver/v3_grid_apply_vorticity_confinement.d.ts.map +1 -0
  387. package/src/engine/physics/fluid/solver/v3_grid_apply_vorticity_confinement.js +131 -0
  388. package/src/engine/physics/fluid/solver/v3_grid_compute_solid_neighbour_mask.d.ts +32 -22
  389. package/src/engine/physics/fluid/solver/v3_grid_compute_solid_neighbour_mask.d.ts.map +1 -1
  390. package/src/engine/physics/fluid/solver/v3_grid_compute_solid_neighbour_mask.js +43 -26
  391. package/src/engine/physics/fluid/solver/v3_grid_patch_edges_constant.d.ts +31 -0
  392. package/src/engine/physics/fluid/solver/v3_grid_patch_edges_constant.d.ts.map +1 -0
  393. package/src/engine/physics/fluid/solver/v3_grid_patch_edges_constant.js +77 -0
  394. package/src/engine/physics/fluid/solver/v3_grid_solve_pressure.d.ts +26 -19
  395. package/src/engine/physics/fluid/solver/v3_grid_solve_pressure.d.ts.map +1 -1
  396. package/src/engine/physics/fluid/solver/v3_grid_solve_pressure.js +46 -42
  397. package/src/engine/physics/fluid/solver/v3_grid_solve_pressure_pcg.d.ts +38 -10
  398. package/src/engine/physics/fluid/solver/v3_grid_solve_pressure_pcg.d.ts.map +1 -1
  399. package/src/engine/physics/fluid/solver/v3_grid_solve_pressure_pcg.js +158 -75
  400. package/src/engine/physics/fluid/solver/v3_grid_subtract_pressure_gradient.d.ts +22 -17
  401. package/src/engine/physics/fluid/solver/v3_grid_subtract_pressure_gradient.d.ts.map +1 -1
  402. package/src/engine/physics/fluid/solver/v3_grid_subtract_pressure_gradient.js +108 -96
  403. package/src/engine/physics/inertia/world_inverse_inertia.d.ts +30 -1
  404. package/src/engine/physics/inertia/world_inverse_inertia.d.ts.map +1 -1
  405. package/src/engine/physics/inertia/world_inverse_inertia.js +160 -116
  406. package/src/engine/physics/integration/integrate_position.js +97 -97
  407. package/src/engine/physics/island/IslandBuilder.d.ts +49 -8
  408. package/src/engine/physics/island/IslandBuilder.d.ts.map +1 -1
  409. package/src/engine/physics/island/IslandBuilder.js +93 -14
  410. package/src/engine/physics/narrowphase/box_box_manifold.d.ts.map +1 -1
  411. package/src/engine/physics/narrowphase/box_box_manifold.js +683 -673
  412. package/src/engine/physics/narrowphase/box_triangle_contact.d.ts.map +1 -1
  413. package/src/engine/physics/narrowphase/box_triangle_contact.js +899 -749
  414. package/src/engine/physics/narrowphase/capsule_contacts.d.ts +27 -0
  415. package/src/engine/physics/narrowphase/capsule_contacts.d.ts.map +1 -1
  416. package/src/engine/physics/narrowphase/capsule_contacts.js +624 -459
  417. package/src/engine/physics/narrowphase/capsule_triangle_contact.d.ts.map +1 -1
  418. package/src/engine/physics/narrowphase/capsule_triangle_contact.js +58 -38
  419. package/src/engine/physics/narrowphase/compute_penetration.d.ts.map +1 -1
  420. package/src/engine/physics/narrowphase/compute_penetration.js +369 -325
  421. package/src/engine/physics/narrowphase/convex_convex_manifold.d.ts +3 -1
  422. package/src/engine/physics/narrowphase/convex_convex_manifold.d.ts.map +1 -1
  423. package/src/engine/physics/narrowphase/convex_convex_manifold.js +568 -422
  424. package/src/engine/physics/narrowphase/decomposition/heightmap_enumerate_triangles.d.ts +6 -3
  425. package/src/engine/physics/narrowphase/decomposition/heightmap_enumerate_triangles.d.ts.map +1 -1
  426. package/src/engine/physics/narrowphase/decomposition/heightmap_enumerate_triangles.js +66 -10
  427. package/src/engine/physics/narrowphase/decomposition/mesh_enumerate_triangles.d.ts +4 -1
  428. package/src/engine/physics/narrowphase/decomposition/mesh_enumerate_triangles.d.ts.map +1 -1
  429. package/src/engine/physics/narrowphase/decomposition/mesh_enumerate_triangles.js +97 -94
  430. package/src/engine/physics/narrowphase/mesh_mesh_tet_manifold.js +117 -117
  431. package/src/engine/physics/narrowphase/narrowphase_step.d.ts.map +1 -1
  432. package/src/engine/physics/narrowphase/narrowphase_step.js +1738 -1739
  433. package/src/engine/physics/narrowphase/reduce_manifold_contacts.d.ts +14 -7
  434. package/src/engine/physics/narrowphase/reduce_manifold_contacts.d.ts.map +1 -1
  435. package/src/engine/physics/narrowphase/reduce_manifold_contacts.js +74 -69
  436. package/src/engine/physics/persistence/solver_caches.d.ts +20 -0
  437. package/src/engine/physics/persistence/solver_caches.d.ts.map +1 -0
  438. package/src/engine/physics/persistence/solver_caches.js +309 -0
  439. package/src/engine/physics/queries/overlap_shape.d.ts.map +1 -1
  440. package/src/engine/physics/queries/overlap_shape.js +187 -184
  441. package/src/engine/physics/queries/raycast.d.ts +3 -2
  442. package/src/engine/physics/queries/raycast.d.ts.map +1 -1
  443. package/src/engine/physics/queries/raycast.js +37 -11
  444. package/src/engine/physics/queries/shape_cast.d.ts +18 -5
  445. package/src/engine/physics/queries/shape_cast.d.ts.map +1 -1
  446. package/src/engine/physics/queries/shape_cast.js +417 -393
  447. package/src/engine/physics/solver/solve_contacts.d.ts +22 -6
  448. package/src/engine/physics/solver/solve_contacts.d.ts.map +1 -1
  449. package/src/engine/physics/solver/solve_contacts.js +1482 -1338
  450. package/src/engine/physics/vehicle/RaycastVehicle.d.ts.map +1 -1
  451. package/src/engine/physics/vehicle/RaycastVehicle.js +344 -339
  452. package/src/engine/ui/DraggableAspect.d.ts +12 -3
  453. package/src/engine/ui/DraggableAspect.d.ts.map +1 -1
  454. package/src/engine/ui/DraggableAspect.js +115 -83
  455. package/src/generation/COORDINATES.md +54 -0
  456. package/src/generation/GridTaskGroup.js +2 -2
  457. package/src/generation/REVIEW_01_ACTION_PLAN.md +628 -0
  458. package/src/generation/automata/CaveGeneratorCellularAutomata.d.ts +9 -1
  459. package/src/generation/automata/CaveGeneratorCellularAutomata.d.ts.map +1 -1
  460. package/src/generation/automata/CaveGeneratorCellularAutomata.js +79 -59
  461. package/src/generation/automata/CellularAutomata.d.ts +6 -3
  462. package/src/generation/automata/CellularAutomata.d.ts.map +1 -1
  463. package/src/generation/automata/CellularAutomata.js +22 -19
  464. package/src/generation/filtering/CellFilter.d.ts +17 -0
  465. package/src/generation/filtering/CellFilter.d.ts.map +1 -1
  466. package/src/generation/filtering/CellFilter.js +117 -77
  467. package/src/generation/filtering/CellFilterCellMatcher.d.ts.map +1 -1
  468. package/src/generation/filtering/CellFilterCellMatcher.js +2 -0
  469. package/src/generation/filtering/boolean/CellFilterLiteralBoolean.d.ts +5 -0
  470. package/src/generation/filtering/boolean/CellFilterLiteralBoolean.d.ts.map +1 -1
  471. package/src/generation/filtering/boolean/CellFilterLiteralBoolean.js +15 -0
  472. package/src/generation/filtering/core/CellFilterBinaryOperation.d.ts +0 -1
  473. package/src/generation/filtering/core/CellFilterBinaryOperation.d.ts.map +1 -1
  474. package/src/generation/filtering/core/CellFilterBinaryOperation.js +37 -50
  475. package/src/generation/filtering/core/CellFilterOperationTertiary.d.ts +0 -1
  476. package/src/generation/filtering/core/CellFilterOperationTertiary.d.ts.map +1 -1
  477. package/src/generation/filtering/core/CellFilterOperationTertiary.js +43 -59
  478. package/src/generation/filtering/core/CellFilterUnaryOperation.d.ts +0 -1
  479. package/src/generation/filtering/core/CellFilterUnaryOperation.d.ts.map +1 -1
  480. package/src/generation/filtering/core/CellFilterUnaryOperation.js +29 -33
  481. package/src/generation/filtering/numeric/CellFilterCache.d.ts +1 -0
  482. package/src/generation/filtering/numeric/CellFilterCache.d.ts.map +1 -1
  483. package/src/generation/filtering/numeric/complex/CellFilterAngleToNormal.d.ts +3 -2
  484. package/src/generation/filtering/numeric/complex/CellFilterAngleToNormal.d.ts.map +1 -1
  485. package/src/generation/filtering/numeric/complex/CellFilterAngleToNormal.js +9 -35
  486. package/src/generation/filtering/numeric/complex/CellFilterCurvature.d.ts +0 -1
  487. package/src/generation/filtering/numeric/complex/CellFilterCurvature.d.ts.map +1 -1
  488. package/src/generation/filtering/numeric/complex/CellFilterCurvature.js +19 -43
  489. package/src/generation/filtering/numeric/complex/CellFilterFXAA.d.ts +0 -1
  490. package/src/generation/filtering/numeric/complex/CellFilterFXAA.d.ts.map +1 -1
  491. package/src/generation/filtering/numeric/complex/CellFilterFXAA.js +2 -6
  492. package/src/generation/filtering/numeric/complex/CellFilterGaussianBlur.d.ts.map +1 -1
  493. package/src/generation/filtering/numeric/complex/CellFilterGaussianBlur.js +9 -12
  494. package/src/generation/filtering/numeric/complex/CellFilterSimplexNoise.d.ts.map +1 -1
  495. package/src/generation/filtering/numeric/complex/CellFilterSimplexNoise.js +2 -1
  496. package/src/generation/filtering/numeric/complex/CellFilterSobel.d.ts +0 -1
  497. package/src/generation/filtering/numeric/complex/CellFilterSobel.d.ts.map +1 -1
  498. package/src/generation/filtering/numeric/complex/CellFilterSobel.js +2 -6
  499. package/src/generation/filtering/numeric/math/CellFilterInverseLerp.d.ts +5 -4
  500. package/src/generation/filtering/numeric/math/CellFilterInverseLerp.d.ts.map +1 -1
  501. package/src/generation/filtering/numeric/math/CellFilterInverseLerp.js +5 -4
  502. package/src/generation/filtering/numeric/process/computeFilterSurfaceNormal.d.ts +17 -0
  503. package/src/generation/filtering/numeric/process/computeFilterSurfaceNormal.d.ts.map +1 -0
  504. package/src/generation/filtering/numeric/process/computeFilterSurfaceNormal.js +42 -0
  505. package/src/generation/filtering/numeric/sampling/AbstractCellFilterSampleGridLayer.d.ts.map +1 -1
  506. package/src/generation/filtering/numeric/sampling/AbstractCellFilterSampleGridLayer.js +7 -1
  507. package/src/generation/filtering/numeric/util/populateSampler2DFromCellFilter.d.ts.map +1 -1
  508. package/src/generation/filtering/numeric/util/populateSampler2DFromCellFilter.js +7 -10
  509. package/src/generation/filtering/numeric/util/sampler_from_filter.d.ts.map +1 -1
  510. package/src/generation/filtering/numeric/util/sampler_from_filter.js +2 -1
  511. package/src/generation/grid/GridData.d.ts.map +1 -1
  512. package/src/generation/grid/GridData.js +14 -1
  513. package/src/generation/grid/actions/ContinuousGridCellAction.d.ts +10 -3
  514. package/src/generation/grid/actions/ContinuousGridCellAction.d.ts.map +1 -1
  515. package/src/generation/grid/actions/ContinuousGridCellAction.js +18 -3
  516. package/src/generation/grid/actions/ContinuousGridCellActionSetTerrainHeight.d.ts +11 -1
  517. package/src/generation/grid/actions/ContinuousGridCellActionSetTerrainHeight.d.ts.map +1 -1
  518. package/src/generation/grid/actions/ContinuousGridCellActionSetTerrainHeight.js +13 -3
  519. package/src/generation/grid/actions/ContinuousGridCellActionSetTerrainObstacle.d.ts +1 -1
  520. package/src/generation/grid/actions/ContinuousGridCellActionSetTerrainObstacle.js +2 -2
  521. package/src/generation/grid/actions/ContinuousGridCellActionWriteObstacle.d.ts +1 -1
  522. package/src/generation/grid/actions/ContinuousGridCellActionWriteObstacle.d.ts.map +1 -1
  523. package/src/generation/grid/actions/ContinuousGridCellActionWriteObstacle.js +4 -6
  524. package/src/generation/grid/coords/grid_to_texel.d.ts +9 -0
  525. package/src/generation/grid/coords/grid_to_texel.d.ts.map +1 -0
  526. package/src/generation/grid/coords/grid_to_texel.js +10 -0
  527. package/src/generation/grid/coords/texel_to_grid.d.ts +9 -0
  528. package/src/generation/grid/coords/texel_to_grid.d.ts.map +1 -0
  529. package/src/generation/grid/coords/texel_to_grid.js +10 -0
  530. package/src/generation/grid/generation/GridTaskApplyActionToCells.d.ts +2 -2
  531. package/src/generation/grid/generation/GridTaskApplyActionToCells.d.ts.map +1 -1
  532. package/src/generation/grid/generation/GridTaskApplyActionToCells.js +10 -6
  533. package/src/generation/grid/generation/GridTaskDensityMarkerDistribution.d.ts.map +1 -1
  534. package/src/generation/grid/generation/GridTaskDensityMarkerDistribution.js +20 -21
  535. package/src/generation/grid/generation/GridTaskExecuteRuleTimes.d.ts +7 -0
  536. package/src/generation/grid/generation/GridTaskExecuteRuleTimes.d.ts.map +1 -1
  537. package/src/generation/grid/generation/GridTaskExecuteRuleTimes.js +18 -10
  538. package/src/generation/grid/generation/discrete/GridTaskCellularAutomata.d.ts.map +1 -1
  539. package/src/generation/grid/generation/discrete/GridTaskCellularAutomata.js +16 -7
  540. package/src/generation/grid/generation/discrete/GridTaskConnectRooms.d.ts +5 -3
  541. package/src/generation/grid/generation/discrete/GridTaskConnectRooms.d.ts.map +1 -1
  542. package/src/generation/grid/generation/discrete/GridTaskConnectRooms.js +26 -23
  543. package/src/generation/grid/generation/discrete/layer/GridTaskBuildSourceDistanceMap.d.ts.map +1 -1
  544. package/src/generation/grid/generation/discrete/layer/GridTaskBuildSourceDistanceMap.js +10 -1
  545. package/src/generation/grid/generation/grid/select/CellSupplierBestN.d.ts.map +1 -1
  546. package/src/generation/grid/generation/grid/select/CellSupplierBestN.js +4 -0
  547. package/src/generation/grid/generation/road/GridTaskGenerateRoads.d.ts +15 -8
  548. package/src/generation/grid/generation/road/GridTaskGenerateRoads.d.ts.map +1 -1
  549. package/src/generation/grid/generation/road/GridTaskGenerateRoads.js +89 -92
  550. package/src/generation/markers/GridActionRuleSet.d.ts.map +1 -1
  551. package/src/generation/markers/GridActionRuleSet.js +10 -2
  552. package/src/generation/markers/GridCellActionPlaceMarker.d.ts +11 -0
  553. package/src/generation/markers/GridCellActionPlaceMarker.d.ts.map +1 -1
  554. package/src/generation/markers/GridCellActionPlaceMarker.js +20 -3
  555. package/src/generation/markers/GridCellActionPlaceMarkerGroup.d.ts +3 -1
  556. package/src/generation/markers/GridCellActionPlaceMarkerGroup.d.ts.map +1 -1
  557. package/src/generation/markers/GridCellActionPlaceMarkerGroup.js +9 -2
  558. package/src/generation/markers/MarkerNode.d.ts +8 -3
  559. package/src/generation/markers/MarkerNode.d.ts.map +1 -1
  560. package/src/generation/markers/MarkerNode.js +12 -5
  561. package/src/generation/markers/actions/MarkerNodeActionEntityPlacement.js +1 -1
  562. package/src/generation/markers/actions/placement/MarkerNodeEntityProcessor.d.ts +1 -1
  563. package/src/generation/markers/actions/placement/MarkerNodeEntityProcessor.d.ts.map +1 -1
  564. package/src/generation/markers/actions/placement/MarkerNodeEntityProcessor.js +1 -1
  565. package/src/generation/markers/actions/placement/MarkerNodeEntityProcessorClingToTerrain.d.ts +1 -1
  566. package/src/generation/markers/actions/placement/MarkerNodeEntityProcessorClingToTerrain.d.ts.map +1 -1
  567. package/src/generation/markers/actions/placement/MarkerNodeEntityProcessorClingToTerrain.js +1 -1
  568. package/src/generation/markers/actions/placement/MarkerNodeEntityProcessorRandomRotation.d.ts +1 -1
  569. package/src/generation/markers/actions/placement/MarkerNodeEntityProcessorRandomRotation.d.ts.map +1 -1
  570. package/src/generation/markers/actions/placement/MarkerNodeEntityProcessorRandomRotation.js +2 -2
  571. package/src/generation/markers/actions/placement/MarkerNodeEntityProcessorSequence.d.ts +1 -1
  572. package/src/generation/markers/actions/placement/MarkerNodeEntityProcessorSequence.d.ts.map +1 -1
  573. package/src/generation/markers/actions/placement/MarkerNodeEntityProcessorSequence.js +2 -2
  574. package/src/generation/markers/actions/probability/MarkerNodeActionSelectWeighted.d.ts.map +1 -1
  575. package/src/generation/markers/actions/probability/MarkerNodeActionSelectWeighted.js +6 -4
  576. package/src/generation/markers/actions/probability/MarkerNodeActionWeightedElement.d.ts.map +1 -1
  577. package/src/generation/markers/actions/probability/MarkerNodeActionWeightedElement.js +1 -3
  578. package/src/generation/markers/actions/terrain/MarkerNodeActionPaintTerrain.d.ts.map +1 -1
  579. package/src/generation/markers/actions/terrain/MarkerNodeActionPaintTerrain.js +12 -11
  580. package/src/generation/markers/matcher/MarkerNodeMatcherAnd.js +2 -2
  581. package/src/generation/markers/transform/MarkerNodeTransformer.d.ts +4 -1
  582. package/src/generation/markers/transform/MarkerNodeTransformer.d.ts.map +1 -1
  583. package/src/generation/markers/transform/MarkerNodeTransformer.js +4 -1
  584. package/src/generation/markers/transform/MarkerNodeTransformerAddPositionYFromFilter.d.ts.map +1 -1
  585. package/src/generation/markers/transform/MarkerNodeTransformerAddPositionYFromFilter.js +1 -3
  586. package/src/generation/markers/transform/MarkerNodeTransformerOffsetPosition.d.ts +5 -0
  587. package/src/generation/markers/transform/MarkerNodeTransformerOffsetPosition.d.ts.map +1 -1
  588. package/src/generation/markers/transform/MarkerNodeTransformerOffsetPosition.js +15 -0
  589. package/src/generation/markers/transform/MarkerNodeTransformerRecordProperty.d.ts.map +1 -1
  590. package/src/generation/markers/transform/MarkerNodeTransformerRecordProperty.js +1 -3
  591. package/src/generation/markers/transform/MarkerNodeTransformerYRotateByFilter.d.ts.map +1 -1
  592. package/src/generation/markers/transform/MarkerNodeTransformerYRotateByFilter.js +2 -4
  593. package/src/generation/markers/transform/MarkerNodeTransformerYRotateByFilterGradient.d.ts.map +1 -1
  594. package/src/generation/markers/transform/MarkerNodeTransformerYRotateByFilterGradient.js +1 -3
  595. package/src/generation/placement/GridCellPlacementRule.d.ts.map +1 -1
  596. package/src/generation/placement/GridCellPlacementRule.js +1 -3
  597. package/src/generation/placement/action/GridCellActionWriteFilterToLayer.d.ts.map +1 -1
  598. package/src/generation/placement/action/GridCellActionWriteFilterToLayer.js +8 -10
  599. package/src/generation/placement/action/random/weighted/CellActionSelectWeightedRandom.d.ts.map +1 -1
  600. package/src/generation/placement/action/random/weighted/CellActionSelectWeightedRandom.js +6 -4
  601. package/src/generation/placement/action/random/weighted/WeightedGridCellAction.d.ts.map +1 -1
  602. package/src/generation/placement/action/random/weighted/WeightedGridCellAction.js +1 -3
  603. package/src/generation/rules/CellMatcher.d.ts +3 -1
  604. package/src/generation/rules/CellMatcher.d.ts.map +1 -1
  605. package/src/generation/rules/CellMatcher.js +3 -1
  606. package/src/generation/rules/CellMatcherFromFilter.d.ts.map +1 -1
  607. package/src/generation/rules/CellMatcherFromFilter.js +1 -3
  608. package/src/generation/rules/CellMatcherLayerBitMaskTest.d.ts.map +1 -1
  609. package/src/generation/rules/CellMatcherLayerBitMaskTest.js +6 -20
  610. package/src/generation/test_support/executeTaskTreeSync.d.ts +9 -0
  611. package/src/generation/test_support/executeTaskTreeSync.d.ts.map +1 -0
  612. package/src/generation/test_support/executeTaskTreeSync.js +78 -0
  613. package/src/generation/theme/TerrainLayerRuleAggregator.d.ts +2 -1
  614. package/src/generation/theme/TerrainLayerRuleAggregator.d.ts.map +1 -1
  615. package/src/generation/theme/TerrainLayerRuleAggregator.js +9 -6
  616. package/src/generation/theme/Theme.d.ts +1 -1
  617. package/src/generation/theme/Theme.d.ts.map +1 -1
  618. package/src/generation/theme/Theme.js +2 -2
  619. package/src/generation/theme/ThemeEngine.d.ts +3 -3
  620. package/src/generation/theme/ThemeEngine.d.ts.map +1 -1
  621. package/src/generation/theme/ThemeEngine.js +26 -16
  622. package/src/generation/theme/cell/CellProcessingRule.d.ts +3 -3
  623. package/src/generation/theme/cell/CellProcessingRule.d.ts.map +1 -1
  624. package/src/generation/theme/cell/CellProcessingRule.js +6 -10
  625. package/src/generation/theme/cell/CellProcessingRuleSet.d.ts +1 -1
  626. package/src/generation/theme/cell/CellProcessingRuleSet.d.ts.map +1 -1
  627. package/src/generation/theme/cell/CellProcessingRuleSet.js +2 -2
  628. package/src/view/common/ListView.js +1 -1
  629. package/src/view/elements/BottomLeftResizeHandleView.d.ts.map +1 -1
  630. package/src/view/elements/BottomLeftResizeHandleView.js +13 -5
  631. package/src/core/font/FontAsset.d.ts.map +0 -1
  632. package/src/core/font/FontAssetLoader.d.ts.map +0 -1
  633. package/src/core/geom/3d/shape/util/shape_to_visual_entity.d.ts.map +0 -1
  634. package/src/core/geom/3d/tetrahedra/visualize_tetrahedral_mesh.d.ts.map +0 -1
  635. package/src/core/process/action/AsynchronousDelayAction.d.ts.map +0 -1
  636. package/src/engine/physics/computeInterceptPoint.d.ts.map +0 -1
  637. package/src/engine/physics/fluid/solver/optimal_sor_omega.d.ts.map +0 -1
  638. package/src/engine/physics/gjk/gjk.d.ts.map +0 -1
  639. package/src/engine/physics/gjk/gjk_epa_penetration.d.ts.map +0 -1
  640. package/src/engine/physics/gjk/minkowski_support.d.ts.map +0 -1
  641. package/src/engine/physics/gjk/mpr.d.ts.map +0 -1
  642. package/src/engine/physics/integration/quat_integrate.d.ts.map +0 -1
  643. package/src/engine/physics/island/union_find.d.ts.map +0 -1
  644. package/src/engine/physics/narrowphase/clip_against_axis_uv.d.ts.map +0 -1
  645. package/src/engine/physics/narrowphase/decomposition/aabb_world_to_local.d.ts.map +0 -1
  646. package/src/generation/grid/generation/discrete/layer/GridTaskDistanceToMarkers.d.ts +0 -21
  647. package/src/generation/grid/generation/discrete/layer/GridTaskDistanceToMarkers.d.ts.map +0 -1
  648. package/src/generation/grid/generation/discrete/layer/GridTaskDistanceToMarkers.js +0 -68
  649. package/src/generation/grid/generation/grid/GridTaskGridAlignedNodeGenerator.d.ts +0 -10
  650. package/src/generation/grid/generation/grid/GridTaskGridAlignedNodeGenerator.d.ts.map +0 -1
  651. package/src/generation/grid/generation/grid/GridTaskGridAlignedNodeGenerator.js +0 -17
  652. /package/src/{engine/physics → core/geom/3d}/gjk/NOTES.md +0 -0
  653. /package/src/{engine/physics → core/geom/3d}/gjk/gjk.d.ts +0 -0
  654. /package/src/{engine/physics → core/math/physics/kinematics}/computeInterceptPoint.d.ts +0 -0
@@ -1,372 +1,430 @@
1
- import { v3_dot } from "../../../core/geom/vec3/v3_dot.js";
2
- import { v3_triple_cross_product } from "../../../core/geom/vec3/v3_triple_cross_product.js";
3
- import { minkowski_support } from "./minkowski_support.js";
4
-
5
- const GJK_MAX_ITERATIONS = 64;
6
-
7
- /**
8
- * Search-direction scratch. The Minkowski-support call uses its own
9
- * pair of scratch buffers from {@link minkowski_support}; this one is
10
- * just for the per-iteration search direction the simplex algorithm
11
- * mutates in place.
12
- *
13
- * Float64 — see the precision sweep that converted the rest of the
14
- * solver-path arrays.
15
- */
16
- const scratch_dir = new Float64Array(3);
17
-
18
- /**
19
- * GJK intersection test for two convex shapes.
20
- *
21
- * Determines whether two convex shapes overlap by iteratively building a simplex
22
- * in the Minkowski difference space. If the origin is enclosed by the simplex,
23
- * the shapes intersect.
24
- *
25
- * Adapted from https://github.com/kevinmoran/GJK/blob/master/GJK.h
26
- *
27
- * @param {number[]|Float64Array} simplex Working buffer for simplex vertices (4 vec3s). Must have length >= 12.
28
- * @param {AbstractShape3D} shape_a
29
- * @param {AbstractShape3D} shape_b
30
- * @returns {boolean} true if the shapes intersect
31
- */
32
- export function gjk(simplex, shape_a, shape_b) {
33
- // Default initial search direction (1, 0, 0). gjk_core uses the
34
- // caller's `dir` buffer as both the seed and the working
35
- // direction, but for this wrapper the seed is fixed and the
36
- // final direction is discarded.
37
- scratch_dir[0] = 1;
38
- scratch_dir[1] = 0;
39
- scratch_dir[2] = 0;
40
- return gjk_core(simplex, shape_a, shape_b, scratch_dir);
41
- }
42
-
43
- /**
44
- * Core GJK routine — parameterised on the search-direction buffer.
45
- * The caller seeds `dir[0..2]` with an initial direction (`(1, 0, 0)`
46
- * for the {@link gjk} cold-start wrapper), and on return `dir` holds the
47
- * FINAL search direction the algorithm settled on.
48
- *
49
- * @param {number[]|Float64Array} simplex
50
- * @param {AbstractShape3D} shape_a
51
- * @param {AbstractShape3D} shape_b
52
- * @param {Float64Array} dir 3 floats; seed direction on entry, final
53
- * direction on exit. The buffer is mutated throughout the function.
54
- * @returns {boolean}
55
- */
56
- function gjk_core(simplex, shape_a, shape_b, dir) {
57
-
58
- // Get initial support point (simplex point C). Uses `dir` (the
59
- // caller's seed) as the search direction.
60
- minkowski_support(
61
- simplex, 6,
62
- shape_a, shape_b,
63
- dir[0], dir[1], dir[2]
64
- );
65
-
66
- // Search toward the origin from C
67
- dir[0] = -simplex[6];
68
- dir[1] = -simplex[7];
69
- dir[2] = -simplex[8];
70
-
71
- if (dir[0] === 0 && dir[1] === 0 && dir[2] === 0) {
72
- // Origin is exactly on the first support point — intersection
73
- return true;
74
- }
75
-
76
- // Get second support point (simplex point B)
77
- minkowski_support(simplex, 3, shape_a, shape_b, dir[0], dir[1], dir[2]);
78
-
79
- // B didn't pass the origin — no intersection possible
80
- if (v3_dot(simplex[3], simplex[4], simplex[5], dir[0], dir[1], dir[2]) < 0) {
81
- return false;
82
- }
83
-
84
- // Line case: compute direction perpendicular to line segment BC toward origin
85
- // CB = C - B
86
- const cb_x = simplex[6] - simplex[3];
87
- const cb_y = simplex[7] - simplex[4];
88
- const cb_z = simplex[8] - simplex[5];
89
-
90
- // BO = -B (origin - B)
91
- const bo_x = -simplex[3];
92
- const bo_y = -simplex[4];
93
- const bo_z = -simplex[5];
94
-
95
- // dir = CB × BO × CB (triple cross product)
96
- v3_triple_cross_product(dir, 0, cb_x, cb_y, cb_z, bo_x, bo_y, bo_z);
97
-
98
- // Handle degenerate case where origin is on the line segment
99
- if (dir[0] === 0 && dir[1] === 0 && dir[2] === 0) {
100
- // Origin is on the line segment — pick any perpendicular direction
101
- // Use the cross product of CB with an arbitrary axis
102
- // CB × (1,0,0)
103
- dir[0] = cb_y;
104
- dir[1] = -cb_x;
105
- dir[2] = 0;
106
-
107
- if (dir[0] === 0 && dir[1] === 0 && dir[2] === 0) {
108
- // CB is parallel to (1,0,0), use (0,1,0)
109
- dir[0] = -cb_z;
110
- dir[1] = 0;
111
- dir[2] = cb_x;
112
- }
113
- }
114
-
115
- let simplex_size = 2; // we have B and C
116
-
117
- for (let iterations = 0; iterations < GJK_MAX_ITERATIONS; iterations++) {
118
- // Get new support point A
119
- minkowski_support(simplex, 0, shape_a, shape_b, dir[0], dir[1], dir[2]);
120
-
121
- const a_x = simplex[0];
122
- const a_y = simplex[1];
123
- const a_z = simplex[2];
124
-
125
- // Check if A passed the origin
126
- if (v3_dot(a_x, a_y, a_z, dir[0], dir[1], dir[2]) < 0) {
127
- return false; // no intersection
128
- }
129
-
130
- simplex_size++;
131
-
132
- if (simplex_size === 3) {
133
- // Triangle case — may reduce to line (size 2) or keep as
134
- // triangle (size 3) before shifting slots for the next iter.
135
- simplex_size = update_simplex_triangle(dir, simplex);
136
- } else {
137
- // Tetrahedron case — 0 if origin enclosed, else new size
138
- // after recursive face reduction.
139
- const result = update_simplex_tetrahedron(dir, simplex);
140
- if (result === 0) {
141
- return true;
142
- }
143
- simplex_size = result;
144
- }
145
- }
146
-
147
- // Did not converge — assume no intersection
148
- return false;
149
- }
150
-
151
- /**
152
- * Update simplex for the triangle case (3 points: A, B, C).
153
- *
154
- * Determines the Voronoi region of the origin relative to triangle ABC
155
- * and updates the search direction accordingly. When the origin is
156
- * closest to a triangle edge the simplex is reduced to a line (return
157
- * 2). When the origin is above or below the triangle, the existing
158
- * vertices are shifted (A → B, B → C, C → D for "above";
159
- * B → D, A → B for "below") so the next iteration's new support
160
- * point can be written into slot 0 without losing simplex history,
161
- * and the function returns 3 — the main loop's `simplex_size++` then
162
- * promotes it to 4 (tetrahedron case) on the next pass.
163
- *
164
- * simplex layout: [A(0-2), B(3-5), C(6-8), D(9-11)]
165
- *
166
- * @param {number[]|Float64Array} search_dir output: next search direction
167
- * @param {Float64Array} simplex
168
- * @returns {number} new simplex size — 2 if reduced to a line,
169
- * 3 if a triangle was retained (with vertices shifted toward higher
170
- * slots so the next iteration grows into a tetrahedron)
171
- */
172
- function update_simplex_triangle(search_dir, simplex) {
173
- const a_x = simplex[0], a_y = simplex[1], a_z = simplex[2];
174
- const b_x = simplex[3], b_y = simplex[4], b_z = simplex[5];
175
- const c_x = simplex[6], c_y = simplex[7], c_z = simplex[8];
176
-
177
- // AB = B - A
178
- const ab_x = b_x - a_x;
179
- const ab_y = b_y - a_y;
180
- const ab_z = b_z - a_z;
181
-
182
- // AC = C - A
183
- const ac_x = c_x - a_x;
184
- const ac_y = c_y - a_y;
185
- const ac_z = c_z - a_z;
186
-
187
- // AO = -A (origin - A)
188
- const ao_x = -a_x;
189
- const ao_y = -a_y;
190
- const ao_z = -a_z;
191
-
192
- // Normal of triangle ABC
193
- const abc_x = ab_y * ac_z - ab_z * ac_y;
194
- const abc_y = ab_z * ac_x - ab_x * ac_z;
195
- const abc_z = ab_x * ac_y - ab_y * ac_x;
196
-
197
- // Test edge AC
198
- // ABC × AC
199
- const abc_cross_ac_x = abc_y * ac_z - abc_z * ac_y;
200
- const abc_cross_ac_y = abc_z * ac_x - abc_x * ac_z;
201
- const abc_cross_ac_z = abc_x * ac_y - abc_y * ac_x;
202
-
203
- if (v3_dot(abc_cross_ac_x, abc_cross_ac_y, abc_cross_ac_z, ao_x, ao_y, ao_z) > 0) {
204
- // Origin is on the AC side — reduce to line {A, C}, drop B.
205
- //
206
- // Slot management note: every main-loop iteration writes the
207
- // newest support point into simplex[0..2] (the A slot),
208
- // OVERWRITING the previous A. For "old A" to survive into the
209
- // next iteration's triangle, it must be moved into another
210
- // slot here. Kevin Moran's reference does `b = a;` — A's value
211
- // is copied into the B slot. C stays where it is. Next iter's
212
- // new A lands at slot 0; the simplex is then {new A, old A
213
- // (in B slot), C} a valid 3-vertex triangle.
214
- //
215
- // The previous implementation here wrote `simplex[3..5] = C`,
216
- // which both duplicated C and discarded old A. Combined with
217
- // the missing simplex-size accounting that kept the main loop
218
- // calling `update_simplex_tetrahedron` with a stale D slot,
219
- // this produced false-positive overlap for sphere-vs-sphere
220
- // configurations placed off-axis. See `gjk.spec.js`'s
221
- // documented regression block.
222
- simplex[3] = a_x;
223
- simplex[4] = a_y;
224
- simplex[5] = a_z;
225
-
226
- // New direction: AC × AO × AC
227
- v3_triple_cross_product(search_dir, 0, ac_x, ac_y, ac_z, ao_x, ao_y, ao_z);
228
- return 2;
229
- }
230
-
231
- // Test edge AB
232
- // AB × ABC
233
- const ab_cross_abc_x = ab_y * abc_z - ab_z * abc_y;
234
- const ab_cross_abc_y = ab_z * abc_x - ab_x * abc_z;
235
- const ab_cross_abc_z = ab_x * abc_y - ab_y * abc_x;
236
-
237
- if (v3_dot(ab_cross_abc_x, ab_cross_abc_y, ab_cross_abc_z, ao_x, ao_y, ao_z) > 0) {
238
- // Origin is on the AB side — reduce to line {A, B}, drop C.
239
- // Kevin Moran: `c = a;` A's value into C slot. B stays.
240
- simplex[6] = a_x;
241
- simplex[7] = a_y;
242
- simplex[8] = a_z;
243
-
244
- // New direction: AB × AO × AB
245
- v3_triple_cross_product(search_dir, 0, ab_x, ab_y, ab_z, ao_x, ao_y, ao_z);
246
- return 2;
247
- }
248
-
249
- // Origin is above or below the triangle. We're growing to a
250
- // tetrahedron next iteration, so shift the existing vertices out
251
- // of slot 0 to make room for the next minkowski_support.
252
- if (v3_dot(abc_x, abc_y, abc_z, ao_x, ao_y, ao_z) > 0) {
253
- // Origin above `d = c; c = b; b = a;` (Kevin Moran). The
254
- // next iteration writes new A at slot 0; the tetrahedron then
255
- // has all four vertices populated with valid simplex history.
256
- simplex[9] = simplex[6]; simplex[10] = simplex[7]; simplex[11] = simplex[8];
257
- simplex[6] = simplex[3]; simplex[7] = simplex[4]; simplex[8] = simplex[5];
258
- simplex[3] = simplex[0]; simplex[4] = simplex[1]; simplex[5] = simplex[2];
259
- search_dir[0] = abc_x;
260
- search_dir[1] = abc_y;
261
- search_dir[2] = abc_z;
262
- } else {
263
- // Origin below — `d = b; b = a;` (C stays). Inverted-winding
264
- // tetrahedron; the face tests in `update_simplex_tetrahedron`
265
- // multiply face_test by face_d_side and compare against 0, so
266
- // they're winding-agnostic.
267
- simplex[9] = simplex[3]; simplex[10] = simplex[4]; simplex[11] = simplex[5];
268
- simplex[3] = simplex[0]; simplex[4] = simplex[1]; simplex[5] = simplex[2];
269
- search_dir[0] = -abc_x;
270
- search_dir[1] = -abc_y;
271
- search_dir[2] = -abc_z;
272
- }
273
- return 3;
274
- }
275
-
276
- /**
277
- * Update simplex for the tetrahedron case (4 points: A, B, C, D).
278
- *
279
- * Tests which face of the tetrahedron is closest to the origin and
280
- * reduces the simplex accordingly. Returns 0 if the origin is inside
281
- * the tetrahedron, otherwise returns the new simplex size (2 = line,
282
- * 3 = triangle) so the main loop can dispatch the next iteration
283
- * correctly. The size after reduction is determined by the recursive
284
- * `update_simplex_triangle` call on the surviving face.
285
- *
286
- * simplex layout: [A(0-2), B(3-5), C(6-8), D(9-11)]
287
- *
288
- * @param {number[]|Float64Array} search_dir output: next search direction (only written on non-enclosure)
289
- * @param {Float64Array} simplex
290
- * @returns {number} 0 if origin is inside, else new simplex size (2 or 3)
291
- */
292
- function update_simplex_tetrahedron(search_dir, simplex) {
293
- const a_x = simplex[0], a_y = simplex[1], a_z = simplex[2];
294
- const b_x = simplex[3], b_y = simplex[4], b_z = simplex[5];
295
- const c_x = simplex[6], c_y = simplex[7], c_z = simplex[8];
296
- const d_x = simplex[9], d_y = simplex[10], d_z = simplex[11];
297
-
298
- // AB, AC, AD vectors
299
- const ab_x = b_x - a_x, ab_y = b_y - a_y, ab_z = b_z - a_z;
300
- const ac_x = c_x - a_x, ac_y = c_y - a_y, ac_z = c_z - a_z;
301
- const ad_x = d_x - a_x, ad_y = d_y - a_y, ad_z = d_z - a_z;
302
-
303
- // AO = origin - A = -A
304
- const ao_x = -a_x, ao_y = -a_y, ao_z = -a_z;
305
-
306
- // Face normals (outward-facing from A's perspective)
307
- // ABC normal
308
- const abc_x = ab_y * ac_z - ab_z * ac_y;
309
- const abc_y = ab_z * ac_x - ab_x * ac_z;
310
- const abc_z = ab_x * ac_y - ab_y * ac_x;
311
-
312
- // ACD normal
313
- const acd_x = ac_y * ad_z - ac_z * ad_y;
314
- const acd_y = ac_z * ad_x - ac_x * ad_z;
315
- const acd_z = ac_x * ad_y - ac_y * ad_x;
316
-
317
- // ADB normal
318
- const adb_x = ad_y * ab_z - ad_z * ab_y;
319
- const adb_y = ad_z * ab_x - ad_x * ab_z;
320
- const adb_z = ad_x * ab_y - ad_y * ab_x;
321
-
322
- // Test each face to see if the origin is on the outside
323
-
324
- // Check face ABC (opposite to D)
325
- const abc_test = v3_dot(abc_x, abc_y, abc_z, ao_x, ao_y, ao_z);
326
- // Make sure normal points away from D
327
- const abc_d_side = v3_dot(abc_x, abc_y, abc_z, ad_x, ad_y, ad_z);
328
-
329
- if (abc_test * abc_d_side < 0) {
330
- // Origin is on the opposite side of ABC from D
331
- // Reduce to triangle ABC: D is dropped
332
- // simplex = [A, B, C] — A(0), B(3), C(6) already in place
333
- return update_simplex_triangle(search_dir, simplex);
334
- }
335
-
336
- // Check face ACD (opposite to B)
337
- const acd_test = v3_dot(acd_x, acd_y, acd_z, ao_x, ao_y, ao_z);
338
- const acd_b_side = v3_dot(acd_x, acd_y, acd_z, ab_x, ab_y, ab_z);
339
-
340
- if (acd_test * acd_b_side < 0) {
341
- // Origin is outside face ACD
342
- // Reduce to triangle ACD: replace B with D
343
- simplex[3] = c_x;
344
- simplex[4] = c_y;
345
- simplex[5] = c_z;
346
- simplex[6] = d_x;
347
- simplex[7] = d_y;
348
- simplex[8] = d_z;
349
-
350
- return update_simplex_triangle(search_dir, simplex);
351
- }
352
-
353
- // Check face ADB (opposite to C)
354
- const adb_test = v3_dot(adb_x, adb_y, adb_z, ao_x, ao_y, ao_z);
355
- const adb_c_side = v3_dot(adb_x, adb_y, adb_z, ac_x, ac_y, ac_z);
356
-
357
- if (adb_test * adb_c_side < 0) {
358
- // Origin is outside face ADB
359
- // Reduce to triangle ADB: replace C with B, B with D
360
- simplex[6] = b_x;
361
- simplex[7] = b_y;
362
- simplex[8] = b_z;
363
- simplex[3] = d_x;
364
- simplex[4] = d_y;
365
- simplex[5] = d_z;
366
-
367
- return update_simplex_triangle(search_dir, simplex);
368
- }
369
-
370
- // Origin is inside the tetrahedron
371
- return 0;
372
- }
1
+ import { v3_dot } from "../../vec3/v3_dot.js";
2
+ import { v3_triple_cross_product } from "../../vec3/v3_triple_cross_product.js";
3
+ import { minkowski_support } from "./minkowski_support.js";
4
+
5
+ const GJK_MAX_ITERATIONS = 64;
6
+
7
+ /**
8
+ * Search-direction scratch. The Minkowski-support call uses its own
9
+ * pair of scratch buffers from {@link minkowski_support}; this one is
10
+ * just for the per-iteration search direction the simplex algorithm
11
+ * mutates in place.
12
+ *
13
+ * Float64 — see the precision sweep that converted the rest of the
14
+ * solver-path arrays.
15
+ */
16
+ const scratch_dir = new Float64Array(3);
17
+
18
+ /**
19
+ * GJK intersection test for two convex shapes.
20
+ *
21
+ * Determines whether two convex shapes overlap by iteratively building a simplex
22
+ * in the Minkowski difference space. If the origin is enclosed by the simplex,
23
+ * the shapes intersect.
24
+ *
25
+ * Adapted from https://github.com/kevinmoran/GJK/blob/master/GJK.h
26
+ *
27
+ * @param {number[]|Float64Array} simplex Working buffer for simplex vertices (4 vec3s). Must have length >= 12.
28
+ * @param {AbstractShape3D} shape_a
29
+ * @param {AbstractShape3D} shape_b
30
+ * @returns {boolean} true if the shapes intersect
31
+ */
32
+ export function gjk(simplex, shape_a, shape_b) {
33
+ // Default initial search direction (1, 0, 0). gjk_core uses the
34
+ // caller's `dir` buffer as both the seed and the working
35
+ // direction, but for this wrapper the seed is fixed and the
36
+ // final direction is discarded.
37
+ scratch_dir[0] = 1;
38
+ scratch_dir[1] = 0;
39
+ scratch_dir[2] = 0;
40
+ return gjk_core(simplex, shape_a, shape_b, scratch_dir);
41
+ }
42
+
43
+ /**
44
+ * Core GJK routine — parameterised on the search-direction buffer.
45
+ * The caller seeds `dir[0..2]` with an initial direction (`(1, 0, 0)`
46
+ * for the {@link gjk} cold-start wrapper), and on return `dir` holds the
47
+ * FINAL search direction the algorithm settled on.
48
+ *
49
+ * @param {number[]|Float64Array} simplex
50
+ * @param {AbstractShape3D} shape_a
51
+ * @param {AbstractShape3D} shape_b
52
+ * @param {Float64Array} dir 3 floats; seed direction on entry, final
53
+ * direction on exit. The buffer is mutated throughout the function.
54
+ * @returns {boolean}
55
+ */
56
+ function gjk_core(simplex, shape_a, shape_b, dir) {
57
+
58
+ // Get initial support point (simplex point C). Uses `dir` (the
59
+ // caller's seed) as the search direction.
60
+ minkowski_support(
61
+ simplex, 6,
62
+ shape_a, shape_b,
63
+ dir[0], dir[1], dir[2]
64
+ );
65
+
66
+ // Search toward the origin from C
67
+ dir[0] = -simplex[6];
68
+ dir[1] = -simplex[7];
69
+ dir[2] = -simplex[8];
70
+
71
+ if (dir[0] === 0 && dir[1] === 0 && dir[2] === 0) {
72
+ // Origin is exactly on the first support point — intersection
73
+ return true;
74
+ }
75
+
76
+ // Get second support point (simplex point B)
77
+ minkowski_support(simplex, 3, shape_a, shape_b, dir[0], dir[1], dir[2]);
78
+
79
+ // B didn't pass the origin — no intersection possible
80
+ if (v3_dot(simplex[3], simplex[4], simplex[5], dir[0], dir[1], dir[2]) < 0) {
81
+ return false;
82
+ }
83
+
84
+ // Line case: compute direction perpendicular to line segment BC toward origin
85
+ // CB = C - B
86
+ const cb_x = simplex[6] - simplex[3];
87
+ const cb_y = simplex[7] - simplex[4];
88
+ const cb_z = simplex[8] - simplex[5];
89
+
90
+ // BO = -B (origin - B)
91
+ const bo_x = -simplex[3];
92
+ const bo_y = -simplex[4];
93
+ const bo_z = -simplex[5];
94
+
95
+ // dir = CB × BO × CB (triple cross product)
96
+ v3_triple_cross_product(dir, 0, cb_x, cb_y, cb_z, bo_x, bo_y, bo_z);
97
+
98
+ // Handle degenerate case where origin is on the line segment
99
+ if (dir[0] === 0 && dir[1] === 0 && dir[2] === 0) {
100
+ // Origin is on the line segment — pick any perpendicular direction.
101
+ // First try CB × (0,0,1) = (cb_y, −cb_x, 0)…
102
+ dir[0] = cb_y;
103
+ dir[1] = -cb_x;
104
+ dir[2] = 0;
105
+
106
+ if (dir[0] === 0 && dir[1] === 0 && dir[2] === 0) {
107
+ // …which is zero iff CB is parallel to (0,0,1); then
108
+ // CB × (0,1,0) = (−cb_z, 0, cb_x) cannot also be zero.
109
+ dir[0] = -cb_z;
110
+ dir[1] = 0;
111
+ dir[2] = cb_x;
112
+ }
113
+ }
114
+
115
+ let simplex_size = 2; // we have B and C
116
+
117
+ for (let iterations = 0; iterations < GJK_MAX_ITERATIONS; iterations++) {
118
+ // Get new support point A
119
+ minkowski_support(simplex, 0, shape_a, shape_b, dir[0], dir[1], dir[2]);
120
+
121
+ const a_x = simplex[0];
122
+ const a_y = simplex[1];
123
+ const a_z = simplex[2];
124
+
125
+ // Check if A passed the origin
126
+ if (v3_dot(a_x, a_y, a_z, dir[0], dir[1], dir[2]) < 0) {
127
+ return false; // no intersection
128
+ }
129
+
130
+ simplex_size++;
131
+
132
+ if (simplex_size === 3) {
133
+ // Triangle case — may reduce to line (size 2) or keep as
134
+ // triangle (size 3) before shifting slots for the next iter.
135
+ simplex_size = update_simplex_triangle(dir, simplex);
136
+ } else {
137
+ // Tetrahedron case — 0 if origin enclosed, else new size
138
+ // after recursive face reduction.
139
+ const result = update_simplex_tetrahedron(dir, simplex);
140
+ if (result === 0) {
141
+ return true;
142
+ }
143
+ simplex_size = result;
144
+ }
145
+ }
146
+
147
+ // Did not converge — assume no intersection
148
+ return false;
149
+ }
150
+
151
+ /**
152
+ * Update simplex for the triangle case (3 points: A, B, C).
153
+ *
154
+ * Determines the Voronoi region of the origin relative to triangle ABC
155
+ * and updates the search direction accordingly. When the origin is
156
+ * closest to a triangle edge the simplex is reduced to a line (return
157
+ * 2). When the origin is above or below the triangle, the existing
158
+ * vertices are shifted (A → B, B → C, C → D for "above";
159
+ * B → D, A → B for "below") so the next iteration's new support
160
+ * point can be written into slot 0 without losing simplex history,
161
+ * and the function returns 3 — the main loop's `simplex_size++` then
162
+ * promotes it to 4 (tetrahedron case) on the next pass.
163
+ *
164
+ * simplex layout: [A(0-2), B(3-5), C(6-8), D(9-11)]
165
+ *
166
+ * @param {number[]|Float64Array} search_dir output: next search direction
167
+ * @param {Float64Array} simplex
168
+ * @returns {number} new simplex size — 2 if reduced to a line,
169
+ * 3 if a triangle was retained (with vertices shifted toward higher
170
+ * slots so the next iteration grows into a tetrahedron)
171
+ */
172
+ /**
173
+ * Defensive fallback for a collapsed search direction: write a direction
174
+ * perpendicular to the edge `(ex, ey, ez)` into `dir`, crossing against the
175
+ * coordinate axis of the edge's smallest-magnitude component (which cannot be
176
+ * near-parallel, so the product cannot vanish for a nonzero edge).
177
+ *
178
+ * In exact arithmetic the triangle-case reductions cannot produce a zero
179
+ * direction — `(AC×AO)×AC = 0` needs `AO ∥ AC`, and then the edge-region test
180
+ * `(ABC×AC)·AO > 0` is exactly 0, routing to the face branch instead. The
181
+ * collapsed states are reachable only through floating-point dust (a wedge
182
+ * dot rounding to a hair above zero while the triple product rounds to zero),
183
+ * where feeding the zero direction to {@link minkowski_support} would return
184
+ * a shape-dependent garbage point and corrupt the simplex. Cost: nothing on
185
+ * the hot path (an exact-zero check that never fires in normal use).
186
+ *
187
+ * @param {number[]|Float64Array} dir
188
+ * @param {number} ex
189
+ * @param {number} ey
190
+ * @param {number} ez
191
+ */
192
+ function perpendicular_to_edge(dir, ex, ey, ez) {
193
+ const px = Math.abs(ex), py = Math.abs(ey), pz = Math.abs(ez);
194
+ if (px <= py && px <= pz) {
195
+ // edge × (1,0,0)
196
+ dir[0] = 0;
197
+ dir[1] = ez;
198
+ dir[2] = -ey;
199
+ } else if (py <= pz) {
200
+ // edge × (0,1,0)
201
+ dir[0] = -ez;
202
+ dir[1] = 0;
203
+ dir[2] = ex;
204
+ } else {
205
+ // edge × (0,0,1)
206
+ dir[0] = ey;
207
+ dir[1] = -ex;
208
+ dir[2] = 0;
209
+ }
210
+ }
211
+
212
+ function update_simplex_triangle(search_dir, simplex) {
213
+ const a_x = simplex[0], a_y = simplex[1], a_z = simplex[2];
214
+ const b_x = simplex[3], b_y = simplex[4], b_z = simplex[5];
215
+ const c_x = simplex[6], c_y = simplex[7], c_z = simplex[8];
216
+
217
+ // AB = B - A
218
+ const ab_x = b_x - a_x;
219
+ const ab_y = b_y - a_y;
220
+ const ab_z = b_z - a_z;
221
+
222
+ // AC = C - A
223
+ const ac_x = c_x - a_x;
224
+ const ac_y = c_y - a_y;
225
+ const ac_z = c_z - a_z;
226
+
227
+ // AO = -A (origin - A)
228
+ const ao_x = -a_x;
229
+ const ao_y = -a_y;
230
+ const ao_z = -a_z;
231
+
232
+ // Normal of triangle ABC
233
+ const abc_x = ab_y * ac_z - ab_z * ac_y;
234
+ const abc_y = ab_z * ac_x - ab_x * ac_z;
235
+ const abc_z = ab_x * ac_y - ab_y * ac_x;
236
+
237
+ // Test edge AC
238
+ // ABC × AC
239
+ const abc_cross_ac_x = abc_y * ac_z - abc_z * ac_y;
240
+ const abc_cross_ac_y = abc_z * ac_x - abc_x * ac_z;
241
+ const abc_cross_ac_z = abc_x * ac_y - abc_y * ac_x;
242
+
243
+ if (v3_dot(abc_cross_ac_x, abc_cross_ac_y, abc_cross_ac_z, ao_x, ao_y, ao_z) > 0) {
244
+ // Origin is on the AC side — reduce to line {A, C}, drop B.
245
+ //
246
+ // Slot management note: every main-loop iteration writes the
247
+ // newest support point into simplex[0..2] (the A slot),
248
+ // OVERWRITING the previous A. For "old A" to survive into the
249
+ // next iteration's triangle, it must be moved into another
250
+ // slot here. Kevin Moran's reference does `b = a;` — A's value
251
+ // is copied into the B slot. C stays where it is. Next iter's
252
+ // new A lands at slot 0; the simplex is then {new A, old A
253
+ // (in B slot), C} a valid 3-vertex triangle.
254
+ //
255
+ // The previous implementation here wrote `simplex[3..5] = C`,
256
+ // which both duplicated C and discarded old A. Combined with
257
+ // the missing simplex-size accounting that kept the main loop
258
+ // calling `update_simplex_tetrahedron` with a stale D slot,
259
+ // this produced false-positive overlap for sphere-vs-sphere
260
+ // configurations placed off-axis. See `gjk.spec.js`'s
261
+ // documented regression block.
262
+ simplex[3] = a_x;
263
+ simplex[4] = a_y;
264
+ simplex[5] = a_z;
265
+
266
+ // New direction: AC × AO × AC
267
+ v3_triple_cross_product(search_dir, 0, ac_x, ac_y, ac_z, ao_x, ao_y, ao_z);
268
+ if (search_dir[0] === 0 && search_dir[1] === 0 && search_dir[2] === 0) {
269
+ perpendicular_to_edge(search_dir, ac_x, ac_y, ac_z); // FP-dust: origin on line AC
270
+ }
271
+ return 2;
272
+ }
273
+
274
+ // Test edge AB
275
+ // AB × ABC
276
+ const ab_cross_abc_x = ab_y * abc_z - ab_z * abc_y;
277
+ const ab_cross_abc_y = ab_z * abc_x - ab_x * abc_z;
278
+ const ab_cross_abc_z = ab_x * abc_y - ab_y * abc_x;
279
+
280
+ if (v3_dot(ab_cross_abc_x, ab_cross_abc_y, ab_cross_abc_z, ao_x, ao_y, ao_z) > 0) {
281
+ // Origin is on the AB side reduce to line {A, B}, drop C.
282
+ // Kevin Moran: `c = a;` A's value into C slot. B stays.
283
+ simplex[6] = a_x;
284
+ simplex[7] = a_y;
285
+ simplex[8] = a_z;
286
+
287
+ // New direction: AB × AO × AB
288
+ v3_triple_cross_product(search_dir, 0, ab_x, ab_y, ab_z, ao_x, ao_y, ao_z);
289
+ if (search_dir[0] === 0 && search_dir[1] === 0 && search_dir[2] === 0) {
290
+ perpendicular_to_edge(search_dir, ab_x, ab_y, ab_z); // FP-dust: origin on line AB
291
+ }
292
+ return 2;
293
+ }
294
+
295
+ // Origin is above or below the triangle. We're growing to a
296
+ // tetrahedron next iteration, so shift the existing vertices out
297
+ // of slot 0 to make room for the next minkowski_support.
298
+ if (v3_dot(abc_x, abc_y, abc_z, ao_x, ao_y, ao_z) > 0) {
299
+ // Origin above `d = c; c = b; b = a;` (Kevin Moran). The
300
+ // next iteration writes new A at slot 0; the tetrahedron then
301
+ // has all four vertices populated with valid simplex history.
302
+ simplex[9] = simplex[6]; simplex[10] = simplex[7]; simplex[11] = simplex[8];
303
+ simplex[6] = simplex[3]; simplex[7] = simplex[4]; simplex[8] = simplex[5];
304
+ simplex[3] = simplex[0]; simplex[4] = simplex[1]; simplex[5] = simplex[2];
305
+ search_dir[0] = abc_x;
306
+ search_dir[1] = abc_y;
307
+ search_dir[2] = abc_z;
308
+ } else {
309
+ // Origin below — `d = b; b = a;` (C stays). Inverted-winding
310
+ // tetrahedron; the face tests in `update_simplex_tetrahedron`
311
+ // multiply face_test by face_d_side and compare against 0, so
312
+ // they're winding-agnostic.
313
+ simplex[9] = simplex[3]; simplex[10] = simplex[4]; simplex[11] = simplex[5];
314
+ simplex[3] = simplex[0]; simplex[4] = simplex[1]; simplex[5] = simplex[2];
315
+ search_dir[0] = -abc_x;
316
+ search_dir[1] = -abc_y;
317
+ search_dir[2] = -abc_z;
318
+ }
319
+ if (search_dir[0] === 0 && search_dir[1] === 0 && search_dir[2] === 0) {
320
+ // Degenerate (collinear) triangle ±ABC is zero. Any direction off
321
+ // the shared line makes progress; ultra-degenerate (coincident points)
322
+ // falls through to a fixed axis.
323
+ perpendicular_to_edge(search_dir, ab_x, ab_y, ab_z);
324
+ if (search_dir[0] === 0 && search_dir[1] === 0 && search_dir[2] === 0) {
325
+ perpendicular_to_edge(search_dir, ac_x, ac_y, ac_z);
326
+ if (search_dir[0] === 0 && search_dir[1] === 0 && search_dir[2] === 0) {
327
+ search_dir[0] = 1;
328
+ }
329
+ }
330
+ }
331
+ return 3;
332
+ }
333
+
334
+ /**
335
+ * Update simplex for the tetrahedron case (4 points: A, B, C, D).
336
+ *
337
+ * Tests which face of the tetrahedron is closest to the origin and
338
+ * reduces the simplex accordingly. Returns 0 if the origin is inside
339
+ * the tetrahedron, otherwise returns the new simplex size (2 = line,
340
+ * 3 = triangle) so the main loop can dispatch the next iteration
341
+ * correctly. The size after reduction is determined by the recursive
342
+ * `update_simplex_triangle` call on the surviving face.
343
+ *
344
+ * simplex layout: [A(0-2), B(3-5), C(6-8), D(9-11)]
345
+ *
346
+ * @param {number[]|Float64Array} search_dir output: next search direction (only written on non-enclosure)
347
+ * @param {Float64Array} simplex
348
+ * @returns {number} 0 if origin is inside, else new simplex size (2 or 3)
349
+ */
350
+ function update_simplex_tetrahedron(search_dir, simplex) {
351
+ const a_x = simplex[0], a_y = simplex[1], a_z = simplex[2];
352
+ const b_x = simplex[3], b_y = simplex[4], b_z = simplex[5];
353
+ const c_x = simplex[6], c_y = simplex[7], c_z = simplex[8];
354
+ const d_x = simplex[9], d_y = simplex[10], d_z = simplex[11];
355
+
356
+ // AB, AC, AD vectors
357
+ const ab_x = b_x - a_x, ab_y = b_y - a_y, ab_z = b_z - a_z;
358
+ const ac_x = c_x - a_x, ac_y = c_y - a_y, ac_z = c_z - a_z;
359
+ const ad_x = d_x - a_x, ad_y = d_y - a_y, ad_z = d_z - a_z;
360
+
361
+ // AO = origin - A = -A
362
+ const ao_x = -a_x, ao_y = -a_y, ao_z = -a_z;
363
+
364
+ // Face normals (outward-facing from A's perspective)
365
+ // ABC normal
366
+ const abc_x = ab_y * ac_z - ab_z * ac_y;
367
+ const abc_y = ab_z * ac_x - ab_x * ac_z;
368
+ const abc_z = ab_x * ac_y - ab_y * ac_x;
369
+
370
+ // ACD normal
371
+ const acd_x = ac_y * ad_z - ac_z * ad_y;
372
+ const acd_y = ac_z * ad_x - ac_x * ad_z;
373
+ const acd_z = ac_x * ad_y - ac_y * ad_x;
374
+
375
+ // ADB normal
376
+ const adb_x = ad_y * ab_z - ad_z * ab_y;
377
+ const adb_y = ad_z * ab_x - ad_x * ab_z;
378
+ const adb_z = ad_x * ab_y - ad_y * ab_x;
379
+
380
+ // Test each face to see if the origin is on the outside
381
+
382
+ // Check face ABC (opposite to D)
383
+ const abc_test = v3_dot(abc_x, abc_y, abc_z, ao_x, ao_y, ao_z);
384
+ // Make sure normal points away from D
385
+ const abc_d_side = v3_dot(abc_x, abc_y, abc_z, ad_x, ad_y, ad_z);
386
+
387
+ if (abc_test * abc_d_side < 0) {
388
+ // Origin is on the opposite side of ABC from D
389
+ // Reduce to triangle ABC: D is dropped
390
+ // simplex = [A, B, C] — A(0), B(3), C(6) already in place
391
+ return update_simplex_triangle(search_dir, simplex);
392
+ }
393
+
394
+ // Check face ACD (opposite to B)
395
+ const acd_test = v3_dot(acd_x, acd_y, acd_z, ao_x, ao_y, ao_z);
396
+ const acd_b_side = v3_dot(acd_x, acd_y, acd_z, ab_x, ab_y, ab_z);
397
+
398
+ if (acd_test * acd_b_side < 0) {
399
+ // Origin is outside face ACD
400
+ // Reduce to triangle ACD: replace B with D
401
+ simplex[3] = c_x;
402
+ simplex[4] = c_y;
403
+ simplex[5] = c_z;
404
+ simplex[6] = d_x;
405
+ simplex[7] = d_y;
406
+ simplex[8] = d_z;
407
+
408
+ return update_simplex_triangle(search_dir, simplex);
409
+ }
410
+
411
+ // Check face ADB (opposite to C)
412
+ const adb_test = v3_dot(adb_x, adb_y, adb_z, ao_x, ao_y, ao_z);
413
+ const adb_c_side = v3_dot(adb_x, adb_y, adb_z, ac_x, ac_y, ac_z);
414
+
415
+ if (adb_test * adb_c_side < 0) {
416
+ // Origin is outside face ADB
417
+ // Reduce to triangle ADB: replace C with B, B with D
418
+ simplex[6] = b_x;
419
+ simplex[7] = b_y;
420
+ simplex[8] = b_z;
421
+ simplex[3] = d_x;
422
+ simplex[4] = d_y;
423
+ simplex[5] = d_z;
424
+
425
+ return update_simplex_triangle(search_dir, simplex);
426
+ }
427
+
428
+ // Origin is inside the tetrahedron
429
+ return 0;
430
+ }