@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,339 +1,344 @@
1
- import { Ray3 } from "../../../core/geom/3d/ray/Ray3.js";
2
- import { PhysicsSurfacePoint } from "../queries/PhysicsSurfacePoint.js";
3
- import { v3_quat3_apply } from "../../../core/geom/vec3/v3_quat3_apply.js";
4
- import { v3_length } from "../../../core/geom/vec3/v3_length.js";
5
- import { world_inverse_inertia_apply } from "../inertia/world_inverse_inertia.js";
6
- import { BodyKind } from "../ecs/BodyKind.js";
7
-
8
- /**
9
- * # Raycast vehicle controller
10
- *
11
- * The vehicle model most games ship: a single rigid-body **chassis** plus a set
12
- * of **raycast wheels**. Each wheel is not a body — it is a downward ray from a
13
- * chassis-local mount point. Every frame, for each wheel, the controller:
14
- *
15
- * 1. casts the suspension ray and, on a ground hit, measures the spring
16
- * compression;
17
- * 2. applies a spring + damper **suspension force** along the contact normal
18
- * (this is what holds the chassis up);
19
- * 3. applies **tyre friction** at the contact patch — a lateral grip impulse
20
- * that resists sideways slide, plus a longitudinal drive / brake impulse,
21
- * the two clamped together to a friction circle `μ·N`.
22
- *
23
- * Steering rotates the steered wheels' forward direction; a drive force is split
24
- * across the driven wheels. It is a *controller on top of the public physics
25
- * API* (`raycast` + `applyForceAt` + `applyImpulseAt`), not a new constraint —
26
- * call {@link update} once per frame **before** `PhysicsSystem.fixedUpdate`, so
27
- * the suspension force it accumulates is integrated by that step and the
28
- * friction impulses act on the current velocity.
29
- *
30
- * The 6-DOF joint (spring linear + motor angular) is the alternative
31
- * "simulated wheel" path; this raycast controller is the lighter, more robust
32
- * default. Suspension-ray accuracy follows `PhysicsSystem.raycast`, which is
33
- * narrowphase-exact for sphere / box / capsule / mesh / heightmap ground.
34
- *
35
- * @author Alex Goldring
36
- * @copyright Company Named Limited (c) 2026
37
- */
38
-
39
- const scratch_v = new Float64Array(3);
40
- const scratch_i = new Float64Array(3);
41
-
42
- /**
43
- * Effective mass denominator for a unit-direction velocity constraint at a
44
- * body-relative point: `invM + (r×d)·Iw⁻¹·(r×d)`.
45
- * @returns {number}
46
- */
47
- function effective_mass(rb, transform, invM, rx, ry, rz, dx, dy, dz) {
48
- let k = invM;
49
- const ii = rb.inverseInertiaLocal;
50
- if (ii.x !== 0 || ii.y !== 0 || ii.z !== 0) {
51
- const cx = ry * dz - rz * dy;
52
- const cy = rz * dx - rx * dz;
53
- const cz = rx * dy - ry * dx;
54
- world_inverse_inertia_apply(scratch_i, 0, ii, transform.rotation, cx, cy, cz);
55
- k += cx * scratch_i[0] + cy * scratch_i[1] + cz * scratch_i[2];
56
- }
57
- return k;
58
- }
59
-
60
- /** Rotate vector `(vx,vy,vz)` about unit axis `(ux,uy,uz)` by `angle`, into `out`. */
61
- function rotate_about(out, vx, vy, vz, ux, uy, uz, angle) {
62
- const c = Math.cos(angle), s = Math.sin(angle);
63
- const dot = ux * vx + uy * vy + uz * vz;
64
- // v·c + (k×v)·s + k·(k·v)·(1−c)
65
- const kxx = uy * vz - uz * vy;
66
- const kxy = uz * vx - ux * vz;
67
- const kxz = ux * vy - uy * vx;
68
- out[0] = vx * c + kxx * s + ux * dot * (1 - c);
69
- out[1] = vy * c + kxy * s + uy * dot * (1 - c);
70
- out[2] = vz * c + kxz * s + uz * dot * (1 - c);
71
- }
72
-
73
-
74
- /**
75
- * One wheel's config + per-frame runtime state. The runtime fields
76
- * (`inContact`, `compression`, contact point/normal, `rotation`, …) are read by
77
- * rendering / gameplay; do not write them.
78
- */
79
- export class Wheel {
80
- constructor() {
81
- // --- config ---
82
- /** Mount point on the chassis, local. @type {Float64Array} */
83
- this.localPosition = new Float64Array(3);
84
- /** Suspension direction (local, unit, points "down"). @type {Float64Array} */
85
- this.localSuspensionDir = Float64Array.from([0, -1, 0]);
86
- /** Forward / rolling direction (local, unit). @type {Float64Array} */
87
- this.localForward = Float64Array.from([0, 0, 1]);
88
- this.suspensionRestLength = 0.5;
89
- this.suspensionStiffness = 100;
90
- this.suspensionDamping = 10;
91
- this.suspensionMaxForce = Infinity;
92
- this.radius = 0.3;
93
- this.friction = 1.2;
94
- this.steered = false;
95
- this.driven = false;
96
-
97
- // --- runtime ---
98
- this.inContact = false;
99
- this.suspensionLength = this.suspensionRestLength;
100
- this.compression = 0;
101
- /** World contact point. @type {Float64Array} */
102
- this.contactPoint = new Float64Array(3);
103
- /** World contact normal. @type {Float64Array} */
104
- this.contactNormal = Float64Array.from([0, 1, 0]);
105
- /** Body id of the surface under the wheel, or −1. */
106
- this.contactBodyId = -1;
107
- /** Current steering angle (rad), set via {@link RaycastVehicle#setSteering}. */
108
- this.steering = 0;
109
- /** Accumulated spin angle (rad) for rendering. */
110
- this.rotation = 0;
111
- /** Forward ground speed at the contact (m/s). */
112
- this.forwardSpeed = 0;
113
- /** Suspension force magnitude applied this frame (N). */
114
- this.suspensionForce = 0;
115
- }
116
- }
117
-
118
- export class RaycastVehicle {
119
- /**
120
- * @param {PhysicsSystem} system
121
- * @param {RigidBody} chassisBody the chassis rigid body (Dynamic)
122
- * @param {Transform} chassisTransform its world transform
123
- */
124
- constructor(system, chassisBody, chassisTransform) {
125
- this.system = system;
126
- this.chassisBody = chassisBody;
127
- this.chassisTransform = chassisTransform;
128
-
129
- /** @type {Wheel[]} */
130
- this.wheels = [];
131
-
132
- this.__driveForce = 0;
133
- this.__brakeForce = 0;
134
- this.__drivenCount = 0;
135
-
136
- this.__ray = new Ray3();
137
- this.__hit = new PhysicsSurfacePoint();
138
- // Exclude the chassis' own colliders from the suspension raycast.
139
- this.__filter = (entity, collider) => collider._bodyId !== this.chassisBody._bodyId;
140
-
141
- // Reused force / impulse / point payloads for the public API calls.
142
- this.__force = { x: 0, y: 0, z: 0 };
143
- this.__point = { x: 0, y: 0, z: 0 };
144
- }
145
-
146
- /**
147
- * Add a wheel. Returns the created {@link Wheel} (also pushed to
148
- * {@link wheels}); set any further config fields on it before stepping.
149
- *
150
- * @param {object} opts
151
- * @param {number[]} opts.localPosition mount point on the chassis, local.
152
- * @param {number[]} [opts.localSuspensionDir] unit "down", default (0,−1,0).
153
- * @param {number[]} [opts.localForward] unit rolling dir, default (0,0,1).
154
- * @param {number} [opts.suspensionRestLength]
155
- * @param {number} [opts.suspensionStiffness] N/m.
156
- * @param {number} [opts.suspensionDamping] N·s/m.
157
- * @param {number} [opts.suspensionMaxForce] N (clamp).
158
- * @param {number} [opts.radius]
159
- * @param {number} [opts.friction] tyre friction coefficient μ.
160
- * @param {boolean} [opts.steered]
161
- * @param {boolean} [opts.driven]
162
- * @returns {Wheel}
163
- */
164
- addWheel(opts) {
165
- const w = new Wheel();
166
- const p = opts.localPosition;
167
- w.localPosition[0] = p[0]; w.localPosition[1] = p[1]; w.localPosition[2] = p[2];
168
- if (opts.localSuspensionDir) {
169
- const d = opts.localSuspensionDir, L = v3_length(d[0], d[1], d[2]) || 1;
170
- w.localSuspensionDir[0] = d[0] / L; w.localSuspensionDir[1] = d[1] / L; w.localSuspensionDir[2] = d[2] / L;
171
- }
172
- if (opts.localForward) {
173
- const f = opts.localForward, L = v3_length(f[0], f[1], f[2]) || 1;
174
- w.localForward[0] = f[0] / L; w.localForward[1] = f[1] / L; w.localForward[2] = f[2] / L;
175
- }
176
- if (opts.suspensionRestLength !== undefined) w.suspensionRestLength = opts.suspensionRestLength;
177
- if (opts.suspensionStiffness !== undefined) w.suspensionStiffness = opts.suspensionStiffness;
178
- if (opts.suspensionDamping !== undefined) w.suspensionDamping = opts.suspensionDamping;
179
- if (opts.suspensionMaxForce !== undefined) w.suspensionMaxForce = opts.suspensionMaxForce;
180
- if (opts.radius !== undefined) w.radius = opts.radius;
181
- if (opts.friction !== undefined) w.friction = opts.friction;
182
- if (opts.steered !== undefined) w.steered = opts.steered;
183
- if (opts.driven !== undefined) w.driven = opts.driven;
184
- w.suspensionLength = w.suspensionRestLength;
185
- this.wheels.push(w);
186
- if (w.driven) this.__drivenCount++;
187
- return w;
188
- }
189
-
190
- /** Set the steering angle (rad) on every steered wheel. */
191
- setSteering(angle) {
192
- for (let i = 0; i < this.wheels.length; i++) {
193
- if (this.wheels[i].steered) this.wheels[i].steering = angle;
194
- }
195
- }
196
-
197
- /** Total engine drive force (N), split evenly across the driven wheels. */
198
- setDriveForce(force) { this.__driveForce = force; }
199
-
200
- /** Brake force (N) per wheel, opposing each wheel's forward motion. */
201
- setBrake(force) { this.__brakeForce = force; }
202
-
203
- /**
204
- * Step the vehicle: cast suspension rays, apply suspension + tyre forces.
205
- * Call once per frame **before** `PhysicsSystem.fixedUpdate(dt)` with the
206
- * same `dt`.
207
- * @param {number} dt
208
- */
209
- update(dt) {
210
- const rb = this.chassisBody;
211
- if (rb.kind !== BodyKind.Dynamic || dt <= 0) return;
212
- const tr = this.chassisTransform;
213
- const invMass = rb.mass > 0 ? 1 / rb.mass : 0;
214
- const q = tr.rotation;
215
- const px = tr.position.x, py = tr.position.y, pz = tr.position.z;
216
- const lv = rb.linearVelocity, av = rb.angularVelocity;
217
- const drivePer = this.__drivenCount > 0 ? this.__driveForce / this.__drivenCount : 0;
218
-
219
- for (let wi = 0; wi < this.wheels.length; wi++) {
220
- const w = this.wheels[wi];
221
-
222
- // World mount point and suspension axis.
223
- v3_quat3_apply(scratch_v, 0, w.localPosition[0], w.localPosition[1], w.localPosition[2], q[0], q[1], q[2], q[3]);
224
- const mx = px + scratch_v[0], my = py + scratch_v[1], mz = pz + scratch_v[2];
225
- v3_quat3_apply(scratch_v, 0, w.localSuspensionDir[0], w.localSuspensionDir[1], w.localSuspensionDir[2], q[0], q[1], q[2], q[3]);
226
- const sdx = scratch_v[0], sdy = scratch_v[1], sdz = scratch_v[2]; // suspension down (unit)
227
-
228
- const maxLen = w.suspensionRestLength + w.radius;
229
- this.__ray.setOrigin(mx, my, mz);
230
- this.__ray.setDirection(sdx, sdy, sdz);
231
- this.__ray.tMax = maxLen;
232
-
233
- const hit = this.system.raycast(this.__ray, this.__hit, this.__filter);
234
- // `raycast` already bounds the hit to ray.tMax (= maxLen) and only
235
- // returns true for t strictly < maxLen, so `__hit.t > maxLen` was dead.
236
- if (!hit) {
237
- // Airborne: suspension fully extended, no force. Reset ALL the
238
- // contact-frame fields including contactBodyId and forwardSpeed,
239
- // which otherwise retain stale last-grounded-frame values.
240
- w.inContact = false;
241
- w.suspensionForce = 0;
242
- w.suspensionLength = w.suspensionRestLength;
243
- w.compression = 0;
244
- w.contactBodyId = -1; // documented no-contact sentinel
245
- w.forwardSpeed = 0;
246
- continue;
247
- }
248
-
249
- const t = this.__hit.t;
250
- w.inContact = true;
251
- w.contactBodyId = this.__hit.body_id;
252
- w.suspensionLength = t - w.radius;
253
- if (w.suspensionLength < 0) w.suspensionLength = 0;
254
- w.compression = w.suspensionRestLength - w.suspensionLength;
255
-
256
- // Contact point along the ray; normal from the hit.
257
- const cx = mx + sdx * t, cy = my + sdy * t, cz = mz + sdz * t;
258
- let nx = this.__hit.normal.x, ny = this.__hit.normal.y, nz = this.__hit.normal.z;
259
- const nlen = v3_length(nx, ny, nz) || 1;
260
- nx /= nlen; ny /= nlen; nz /= nlen;
261
- w.contactPoint[0] = cx; w.contactPoint[1] = cy; w.contactPoint[2] = cz;
262
- w.contactNormal[0] = nx; w.contactNormal[1] = ny; w.contactNormal[2] = nz;
263
-
264
- // Velocity of the chassis at the contact point.
265
- const rx = cx - px, ry = cy - py, rz = cz - pz;
266
- const vptx = lv.x + av.y * rz - av.z * ry;
267
- const vpty = lv.y + av.z * rx - av.x * rz;
268
- const vptz = lv.z + av.x * ry - av.y * rx;
269
-
270
- // --- Suspension: spring + damper along the contact normal ---
271
- const projVel = vptx * nx + vpty * ny + vptz * nz; // closing speed along normal
272
- let susForce = w.suspensionStiffness * w.compression - w.suspensionDamping * projVel;
273
- if (susForce < 0) susForce = 0;
274
- else if (susForce > w.suspensionMaxForce) susForce = w.suspensionMaxForce;
275
- w.suspensionForce = susForce;
276
-
277
- if (susForce !== 0) {
278
- this.__force.x = nx * susForce; this.__force.y = ny * susForce; this.__force.z = nz * susForce;
279
- this.__point.x = cx; this.__point.y = cy; this.__point.z = cz;
280
- this.system.applyForceAt(rb, tr, this.__force, this.__point);
281
- }
282
-
283
- // --- Tyre friction: forward / side basis in the contact plane ---
284
- v3_quat3_apply(scratch_v, 0, w.localForward[0], w.localForward[1], w.localForward[2], q[0], q[1], q[2], q[3]);
285
- let fwx = scratch_v[0], fwy = scratch_v[1], fwz = scratch_v[2];
286
- if (w.steering !== 0) {
287
- // Steer about the suspension-up axis (−suspension dir).
288
- rotate_about(scratch_v, fwx, fwy, fwz, -sdx, -sdy, -sdz, w.steering);
289
- fwx = scratch_v[0]; fwy = scratch_v[1]; fwz = scratch_v[2];
290
- }
291
- // Project forward onto the contact plane, normalise.
292
- let fdotn = fwx * nx + fwy * ny + fwz * nz;
293
- fwx -= fdotn * nx; fwy -= fdotn * ny; fwz -= fdotn * nz;
294
- let fl = v3_length(fwx, fwy, fwz);
295
- if (fl < 1e-6) continue; // degenerate (forward parallel to normal)
296
- fwx /= fl; fwy /= fl; fwz /= fl;
297
- // Side = normal × forward (already unit & in-plane).
298
- const sx = ny * fwz - nz * fwy;
299
- const sy = nz * fwx - nx * fwz;
300
- const sz = nx * fwy - ny * fwx;
301
-
302
- const fwdVel = vptx * fwx + vpty * fwy + vptz * fwz;
303
- const sideVel = vptx * sx + vpty * sy + vptz * sz;
304
- w.forwardSpeed = fwdVel;
305
-
306
- // Lateral grip: impulse that cancels the side velocity.
307
- const denomSide = effective_mass(rb, tr, invMass, rx, ry, rz, sx, sy, sz);
308
- let jSide = denomSide > 0 ? -sideVel / denomSide : 0;
309
-
310
- // Longitudinal: engine drive minus brake (brake never reverses).
311
- let jFwd = w.driven ? drivePer * dt : 0;
312
- if (this.__brakeForce > 0 && fwdVel !== 0) {
313
- const denomFwd = effective_mass(rb, tr, invMass, rx, ry, rz, fwx, fwy, fwz);
314
- const stopImpulse = denomFwd > 0 ? Math.abs(fwdVel) / denomFwd : 0;
315
- const brakeImpulse = Math.min(this.__brakeForce * dt, stopImpulse);
316
- jFwd -= Math.sign(fwdVel) * brakeImpulse;
317
- }
318
-
319
- // Friction circle: clamp the combined tyre impulse to μ·N·dt.
320
- const budget = w.friction * susForce * dt;
321
- const mag = Math.sqrt(jFwd * jFwd + jSide * jSide);
322
- if (mag > budget && mag > 0) {
323
- const scale = budget / mag;
324
- jFwd *= scale; jSide *= scale;
325
- }
326
-
327
- if (jFwd !== 0 || jSide !== 0) {
328
- this.__force.x = fwx * jFwd + sx * jSide;
329
- this.__force.y = fwy * jFwd + sy * jSide;
330
- this.__force.z = fwz * jFwd + sz * jSide;
331
- this.__point.x = cx; this.__point.y = cy; this.__point.z = cz;
332
- this.system.applyImpulseAt(rb, tr, this.__force, this.__point);
333
- }
334
-
335
- // Visual wheel spin from forward ground speed.
336
- if (w.radius > 0) w.rotation += (fwdVel / w.radius) * dt;
337
- }
338
- }
339
- }
1
+ import { Ray3 } from "../../../core/geom/3d/ray/Ray3.js";
2
+ import { PhysicsSurfacePoint } from "../queries/PhysicsSurfacePoint.js";
3
+ import { v3_quat3_apply } from "../../../core/geom/vec3/v3_quat3_apply.js";
4
+ import { v3_length } from "../../../core/geom/vec3/v3_length.js";
5
+ import { angular_effective_mass_raw } from "../inertia/world_inverse_inertia.js";
6
+ import { BodyKind } from "../ecs/BodyKind.js";
7
+
8
+ /**
9
+ * # Raycast vehicle controller
10
+ *
11
+ * The vehicle model most games ship: a single rigid-body **chassis** plus a set
12
+ * of **raycast wheels**. Each wheel is not a body — it is a downward ray from a
13
+ * chassis-local mount point. Every frame, for each wheel, the controller:
14
+ *
15
+ * 1. casts the suspension ray and, on a ground hit, measures the spring
16
+ * compression;
17
+ * 2. applies a spring + damper **suspension force** along the contact normal
18
+ * (this is what holds the chassis up);
19
+ * 3. applies **tyre friction** at the contact patch — a lateral grip impulse
20
+ * that resists sideways slide, plus a longitudinal drive / brake impulse,
21
+ * the two clamped together to a friction circle `μ·N`.
22
+ *
23
+ * Steering rotates the steered wheels' forward direction; a drive force is split
24
+ * across the driven wheels. It is a *controller on top of the public physics
25
+ * API* (`raycast` + `applyForceAt` + `applyImpulseAt`), not a new constraint —
26
+ * call {@link update} once per frame **before** `PhysicsSystem.fixedUpdate`, so
27
+ * the suspension force it accumulates is integrated by that step and the
28
+ * friction impulses act on the current velocity.
29
+ *
30
+ * The 6-DOF joint (spring linear + motor angular) is the alternative
31
+ * "simulated wheel" path; this raycast controller is the lighter, more robust
32
+ * default. Suspension-ray accuracy follows `PhysicsSystem.raycast`, which is
33
+ * narrowphase-exact for sphere / box / capsule / mesh / heightmap ground.
34
+ *
35
+ * @author Alex Goldring
36
+ * @copyright Company Named Limited (c) 2026
37
+ */
38
+
39
+ const scratch_v = new Float64Array(3);
40
+ const scratch_i = new Float64Array(3);
41
+
42
+ /**
43
+ * Effective mass denominator for a unit-direction velocity constraint at a
44
+ * body-relative point: `invM + (r×d)·Iw⁻¹·(r×d)`. The angular term is the
45
+ * shared {@link angular_effective_mass_raw} kernel — the same math the
46
+ * contact/joint solver runs, so the two paths stay bit-identical.
47
+ * @returns {number}
48
+ */
49
+ function effective_mass(rb, transform, invM, rx, ry, rz, dx, dy, dz) {
50
+ let k = invM;
51
+ const ii = rb.inverseInertiaLocal;
52
+ if (ii.x !== 0 || ii.y !== 0 || ii.z !== 0) {
53
+ const q = transform.rotation;
54
+ k += angular_effective_mass_raw(
55
+ ii.x, ii.y, ii.z,
56
+ q.x, q.y, q.z, q.w,
57
+ rx, ry, rz,
58
+ dx, dy, dz,
59
+ scratch_i
60
+ );
61
+ }
62
+ return k;
63
+ }
64
+
65
+ /** Rotate vector `(vx,vy,vz)` about unit axis `(ux,uy,uz)` by `angle`, into `out`. */
66
+ function rotate_about(out, vx, vy, vz, ux, uy, uz, angle) {
67
+ const c = Math.cos(angle), s = Math.sin(angle);
68
+ const dot = ux * vx + uy * vy + uz * vz;
69
+ // c + (k×v)·s + (k·v)·(1c)
70
+ const kxx = uy * vz - uz * vy;
71
+ const kxy = uz * vx - ux * vz;
72
+ const kxz = ux * vy - uy * vx;
73
+ out[0] = vx * c + kxx * s + ux * dot * (1 - c);
74
+ out[1] = vy * c + kxy * s + uy * dot * (1 - c);
75
+ out[2] = vz * c + kxz * s + uz * dot * (1 - c);
76
+ }
77
+
78
+
79
+ /**
80
+ * One wheel's config + per-frame runtime state. The runtime fields
81
+ * (`inContact`, `compression`, contact point/normal, `rotation`, …) are read by
82
+ * rendering / gameplay; do not write them.
83
+ */
84
+ export class Wheel {
85
+ constructor() {
86
+ // --- config ---
87
+ /** Mount point on the chassis, local. @type {Float64Array} */
88
+ this.localPosition = new Float64Array(3);
89
+ /** Suspension direction (local, unit, points "down"). @type {Float64Array} */
90
+ this.localSuspensionDir = Float64Array.from([0, -1, 0]);
91
+ /** Forward / rolling direction (local, unit). @type {Float64Array} */
92
+ this.localForward = Float64Array.from([0, 0, 1]);
93
+ this.suspensionRestLength = 0.5;
94
+ this.suspensionStiffness = 100;
95
+ this.suspensionDamping = 10;
96
+ this.suspensionMaxForce = Infinity;
97
+ this.radius = 0.3;
98
+ this.friction = 1.2;
99
+ this.steered = false;
100
+ this.driven = false;
101
+
102
+ // --- runtime ---
103
+ this.inContact = false;
104
+ this.suspensionLength = this.suspensionRestLength;
105
+ this.compression = 0;
106
+ /** World contact point. @type {Float64Array} */
107
+ this.contactPoint = new Float64Array(3);
108
+ /** World contact normal. @type {Float64Array} */
109
+ this.contactNormal = Float64Array.from([0, 1, 0]);
110
+ /** Body id of the surface under the wheel, or −1. */
111
+ this.contactBodyId = -1;
112
+ /** Current steering angle (rad), set via {@link RaycastVehicle#setSteering}. */
113
+ this.steering = 0;
114
+ /** Accumulated spin angle (rad) for rendering. */
115
+ this.rotation = 0;
116
+ /** Forward ground speed at the contact (m/s). */
117
+ this.forwardSpeed = 0;
118
+ /** Suspension force magnitude applied this frame (N). */
119
+ this.suspensionForce = 0;
120
+ }
121
+ }
122
+
123
+ export class RaycastVehicle {
124
+ /**
125
+ * @param {PhysicsSystem} system
126
+ * @param {RigidBody} chassisBody the chassis rigid body (Dynamic)
127
+ * @param {Transform} chassisTransform its world transform
128
+ */
129
+ constructor(system, chassisBody, chassisTransform) {
130
+ this.system = system;
131
+ this.chassisBody = chassisBody;
132
+ this.chassisTransform = chassisTransform;
133
+
134
+ /** @type {Wheel[]} */
135
+ this.wheels = [];
136
+
137
+ this.__driveForce = 0;
138
+ this.__brakeForce = 0;
139
+ this.__drivenCount = 0;
140
+
141
+ this.__ray = new Ray3();
142
+ this.__hit = new PhysicsSurfacePoint();
143
+ // Exclude the chassis' own colliders from the suspension raycast.
144
+ this.__filter = (entity, collider) => collider._bodyId !== this.chassisBody._bodyId;
145
+
146
+ // Reused force / impulse / point payloads for the public API calls.
147
+ this.__force = { x: 0, y: 0, z: 0 };
148
+ this.__point = { x: 0, y: 0, z: 0 };
149
+ }
150
+
151
+ /**
152
+ * Add a wheel. Returns the created {@link Wheel} (also pushed to
153
+ * {@link wheels}); set any further config fields on it before stepping.
154
+ *
155
+ * @param {object} opts
156
+ * @param {number[]} opts.localPosition mount point on the chassis, local.
157
+ * @param {number[]} [opts.localSuspensionDir] unit "down", default (0,−1,0).
158
+ * @param {number[]} [opts.localForward] unit rolling dir, default (0,0,1).
159
+ * @param {number} [opts.suspensionRestLength]
160
+ * @param {number} [opts.suspensionStiffness] N/m.
161
+ * @param {number} [opts.suspensionDamping] N·s/m.
162
+ * @param {number} [opts.suspensionMaxForce] N (clamp).
163
+ * @param {number} [opts.radius]
164
+ * @param {number} [opts.friction] tyre friction coefficient μ.
165
+ * @param {boolean} [opts.steered]
166
+ * @param {boolean} [opts.driven]
167
+ * @returns {Wheel}
168
+ */
169
+ addWheel(opts) {
170
+ const w = new Wheel();
171
+ const p = opts.localPosition;
172
+ w.localPosition[0] = p[0]; w.localPosition[1] = p[1]; w.localPosition[2] = p[2];
173
+ if (opts.localSuspensionDir) {
174
+ const d = opts.localSuspensionDir, L = v3_length(d[0], d[1], d[2]) || 1;
175
+ w.localSuspensionDir[0] = d[0] / L; w.localSuspensionDir[1] = d[1] / L; w.localSuspensionDir[2] = d[2] / L;
176
+ }
177
+ if (opts.localForward) {
178
+ const f = opts.localForward, L = v3_length(f[0], f[1], f[2]) || 1;
179
+ w.localForward[0] = f[0] / L; w.localForward[1] = f[1] / L; w.localForward[2] = f[2] / L;
180
+ }
181
+ if (opts.suspensionRestLength !== undefined) w.suspensionRestLength = opts.suspensionRestLength;
182
+ if (opts.suspensionStiffness !== undefined) w.suspensionStiffness = opts.suspensionStiffness;
183
+ if (opts.suspensionDamping !== undefined) w.suspensionDamping = opts.suspensionDamping;
184
+ if (opts.suspensionMaxForce !== undefined) w.suspensionMaxForce = opts.suspensionMaxForce;
185
+ if (opts.radius !== undefined) w.radius = opts.radius;
186
+ if (opts.friction !== undefined) w.friction = opts.friction;
187
+ if (opts.steered !== undefined) w.steered = opts.steered;
188
+ if (opts.driven !== undefined) w.driven = opts.driven;
189
+ w.suspensionLength = w.suspensionRestLength;
190
+ this.wheels.push(w);
191
+ if (w.driven) this.__drivenCount++;
192
+ return w;
193
+ }
194
+
195
+ /** Set the steering angle (rad) on every steered wheel. */
196
+ setSteering(angle) {
197
+ for (let i = 0; i < this.wheels.length; i++) {
198
+ if (this.wheels[i].steered) this.wheels[i].steering = angle;
199
+ }
200
+ }
201
+
202
+ /** Total engine drive force (N), split evenly across the driven wheels. */
203
+ setDriveForce(force) { this.__driveForce = force; }
204
+
205
+ /** Brake force (N) per wheel, opposing each wheel's forward motion. */
206
+ setBrake(force) { this.__brakeForce = force; }
207
+
208
+ /**
209
+ * Step the vehicle: cast suspension rays, apply suspension + tyre forces.
210
+ * Call once per frame **before** `PhysicsSystem.fixedUpdate(dt)` with the
211
+ * same `dt`.
212
+ * @param {number} dt
213
+ */
214
+ update(dt) {
215
+ const rb = this.chassisBody;
216
+ if (rb.kind !== BodyKind.Dynamic || dt <= 0) return;
217
+ const tr = this.chassisTransform;
218
+ const invMass = rb.mass > 0 ? 1 / rb.mass : 0;
219
+ const q = tr.rotation;
220
+ const px = tr.position.x, py = tr.position.y, pz = tr.position.z;
221
+ const lv = rb.linearVelocity, av = rb.angularVelocity;
222
+ const drivePer = this.__drivenCount > 0 ? this.__driveForce / this.__drivenCount : 0;
223
+
224
+ for (let wi = 0; wi < this.wheels.length; wi++) {
225
+ const w = this.wheels[wi];
226
+
227
+ // World mount point and suspension axis.
228
+ v3_quat3_apply(scratch_v, 0, w.localPosition[0], w.localPosition[1], w.localPosition[2], q[0], q[1], q[2], q[3]);
229
+ const mx = px + scratch_v[0], my = py + scratch_v[1], mz = pz + scratch_v[2];
230
+ v3_quat3_apply(scratch_v, 0, w.localSuspensionDir[0], w.localSuspensionDir[1], w.localSuspensionDir[2], q[0], q[1], q[2], q[3]);
231
+ const sdx = scratch_v[0], sdy = scratch_v[1], sdz = scratch_v[2]; // suspension down (unit)
232
+
233
+ const maxLen = w.suspensionRestLength + w.radius;
234
+ this.__ray.setOrigin(mx, my, mz);
235
+ this.__ray.setDirection(sdx, sdy, sdz);
236
+ this.__ray.tMax = maxLen;
237
+
238
+ const hit = this.system.raycast(this.__ray, this.__hit, this.__filter);
239
+ // `raycast` already bounds the hit to ray.tMax (= maxLen) and only
240
+ // returns true for t strictly < maxLen, so `__hit.t > maxLen` was dead.
241
+ if (!hit) {
242
+ // Airborne: suspension fully extended, no force. Reset ALL the
243
+ // contact-frame fields — including contactBodyId and forwardSpeed,
244
+ // which otherwise retain stale last-grounded-frame values.
245
+ w.inContact = false;
246
+ w.suspensionForce = 0;
247
+ w.suspensionLength = w.suspensionRestLength;
248
+ w.compression = 0;
249
+ w.contactBodyId = -1; // documented no-contact sentinel
250
+ w.forwardSpeed = 0;
251
+ continue;
252
+ }
253
+
254
+ const t = this.__hit.t;
255
+ w.inContact = true;
256
+ w.contactBodyId = this.__hit.body_id;
257
+ w.suspensionLength = t - w.radius;
258
+ if (w.suspensionLength < 0) w.suspensionLength = 0;
259
+ w.compression = w.suspensionRestLength - w.suspensionLength;
260
+
261
+ // Contact point along the ray; normal from the hit.
262
+ const cx = mx + sdx * t, cy = my + sdy * t, cz = mz + sdz * t;
263
+ let nx = this.__hit.normal.x, ny = this.__hit.normal.y, nz = this.__hit.normal.z;
264
+ const nlen = v3_length(nx, ny, nz) || 1;
265
+ nx /= nlen; ny /= nlen; nz /= nlen;
266
+ w.contactPoint[0] = cx; w.contactPoint[1] = cy; w.contactPoint[2] = cz;
267
+ w.contactNormal[0] = nx; w.contactNormal[1] = ny; w.contactNormal[2] = nz;
268
+
269
+ // Velocity of the chassis at the contact point.
270
+ const rx = cx - px, ry = cy - py, rz = cz - pz;
271
+ const vptx = lv.x + av.y * rz - av.z * ry;
272
+ const vpty = lv.y + av.z * rx - av.x * rz;
273
+ const vptz = lv.z + av.x * ry - av.y * rx;
274
+
275
+ // --- Suspension: spring + damper along the contact normal ---
276
+ const projVel = vptx * nx + vpty * ny + vptz * nz; // closing speed along normal
277
+ let susForce = w.suspensionStiffness * w.compression - w.suspensionDamping * projVel;
278
+ if (susForce < 0) susForce = 0;
279
+ else if (susForce > w.suspensionMaxForce) susForce = w.suspensionMaxForce;
280
+ w.suspensionForce = susForce;
281
+
282
+ if (susForce !== 0) {
283
+ this.__force.x = nx * susForce; this.__force.y = ny * susForce; this.__force.z = nz * susForce;
284
+ this.__point.x = cx; this.__point.y = cy; this.__point.z = cz;
285
+ this.system.applyForceAt(rb, tr, this.__force, this.__point);
286
+ }
287
+
288
+ // --- Tyre friction: forward / side basis in the contact plane ---
289
+ v3_quat3_apply(scratch_v, 0, w.localForward[0], w.localForward[1], w.localForward[2], q[0], q[1], q[2], q[3]);
290
+ let fwx = scratch_v[0], fwy = scratch_v[1], fwz = scratch_v[2];
291
+ if (w.steering !== 0) {
292
+ // Steer about the suspension-up axis (−suspension dir).
293
+ rotate_about(scratch_v, fwx, fwy, fwz, -sdx, -sdy, -sdz, w.steering);
294
+ fwx = scratch_v[0]; fwy = scratch_v[1]; fwz = scratch_v[2];
295
+ }
296
+ // Project forward onto the contact plane, normalise.
297
+ let fdotn = fwx * nx + fwy * ny + fwz * nz;
298
+ fwx -= fdotn * nx; fwy -= fdotn * ny; fwz -= fdotn * nz;
299
+ let fl = v3_length(fwx, fwy, fwz);
300
+ if (fl < 1e-6) continue; // degenerate (forward parallel to normal)
301
+ fwx /= fl; fwy /= fl; fwz /= fl;
302
+ // Side = normal × forward (already unit & in-plane).
303
+ const sx = ny * fwz - nz * fwy;
304
+ const sy = nz * fwx - nx * fwz;
305
+ const sz = nx * fwy - ny * fwx;
306
+
307
+ const fwdVel = vptx * fwx + vpty * fwy + vptz * fwz;
308
+ const sideVel = vptx * sx + vpty * sy + vptz * sz;
309
+ w.forwardSpeed = fwdVel;
310
+
311
+ // Lateral grip: impulse that cancels the side velocity.
312
+ const denomSide = effective_mass(rb, tr, invMass, rx, ry, rz, sx, sy, sz);
313
+ let jSide = denomSide > 0 ? -sideVel / denomSide : 0;
314
+
315
+ // Longitudinal: engine drive minus brake (brake never reverses).
316
+ let jFwd = w.driven ? drivePer * dt : 0;
317
+ if (this.__brakeForce > 0 && fwdVel !== 0) {
318
+ const denomFwd = effective_mass(rb, tr, invMass, rx, ry, rz, fwx, fwy, fwz);
319
+ const stopImpulse = denomFwd > 0 ? Math.abs(fwdVel) / denomFwd : 0;
320
+ const brakeImpulse = Math.min(this.__brakeForce * dt, stopImpulse);
321
+ jFwd -= Math.sign(fwdVel) * brakeImpulse;
322
+ }
323
+
324
+ // Friction circle: clamp the combined tyre impulse to μ·N·dt.
325
+ const budget = w.friction * susForce * dt;
326
+ const mag = Math.sqrt(jFwd * jFwd + jSide * jSide);
327
+ if (mag > budget && mag > 0) {
328
+ const scale = budget / mag;
329
+ jFwd *= scale; jSide *= scale;
330
+ }
331
+
332
+ if (jFwd !== 0 || jSide !== 0) {
333
+ this.__force.x = fwx * jFwd + sx * jSide;
334
+ this.__force.y = fwy * jFwd + sy * jSide;
335
+ this.__force.z = fwz * jFwd + sz * jSide;
336
+ this.__point.x = cx; this.__point.y = cy; this.__point.z = cz;
337
+ this.system.applyImpulseAt(rb, tr, this.__force, this.__point);
338
+ }
339
+
340
+ // Visual wheel spin from forward ground speed.
341
+ if (w.radius > 0) w.rotation += (fwdVel / w.radius) * dt;
342
+ }
343
+ }
344
+ }