@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,452 +1,406 @@
1
- import { assert } from "../../../core/assert.js";
2
- import { BodyKind } from "../ecs/BodyKind.js";
3
-
4
- const DEFAULT_INITIAL_CAPACITY = 16;
5
- const MIN_CAPACITY = 4;
6
-
7
- /**
8
- * Mask for the 8-bit generation field encoded in a packed body id.
9
- * @type {number}
10
- */
11
- const GENERATION_MASK = 0xFF;
12
-
13
- /**
14
- * Bit width of the generation field. The remaining bits are the body index;
15
- * 24-bit indices give us 16M live bodies which is comfortably above the design
16
- * target of "millions".
17
- * @type {number}
18
- */
19
- const GENERATION_BITS = 8;
20
-
21
- /**
22
- * Sentinel returned by {@link BodyStorage#awake_position_of} and friends when a
23
- * body is not in the awake set.
24
- * @type {number}
25
- */
26
- export const BODY_INDEX_ABSENT = -1;
27
-
28
- /**
29
- * Pack a body index and generation into a single integer handle.
30
- *
31
- * @param {number} index
32
- * @param {number} generation
33
- * @returns {number}
34
- */
35
- export function pack_body_id(index, generation) {
36
- return (index << GENERATION_BITS) | (generation & GENERATION_MASK);
37
- }
38
-
39
- /**
40
- *
41
- * @param {number} packed
42
- * @returns {number}
43
- */
44
- export function body_id_index(packed) {
45
- return packed >>> GENERATION_BITS;
46
- }
47
-
48
- /**
49
- *
50
- * @param {number} packed
51
- * @returns {number}
52
- */
53
- export function body_id_generation(packed) {
54
- return packed & GENERATION_MASK;
55
- }
56
-
57
- /**
58
- * Structure-of-arrays pool for rigid bodies.
59
- *
60
- * Owns:
61
- * - per-body identity (entity, generation, kind, flags),
62
- * - a dense list of awake body indices (the simulation hot iteration target),
63
- * - a min-heap of free body indices so reuse order is deterministic regardless
64
- * of how interleaved allocate / free calls have been.
65
- *
66
- * The pool grows by doubling when the high-water mark reaches capacity; arrays
67
- * are replaced wholesale on grow, so callers must not retain references to the
68
- * raw typed arrays across allocate-after-grow boundaries.
69
- *
70
- * Determinism: allocate always reuses the lowest free index. Two pools given the
71
- * same sequence of allocate/free calls observe identical body indices.
72
- *
73
- * @author Alex Goldring
74
- * @copyright Company Named Limited (c) 2026
75
- */
76
- export class BodyStorage {
77
-
78
- /**
79
- *
80
- * @param {number} [initial_capacity]
81
- */
82
- constructor(initial_capacity = DEFAULT_INITIAL_CAPACITY) {
83
- assert.isNonNegativeInteger(initial_capacity, 'initial_capacity');
84
-
85
- const cap = Math.max(MIN_CAPACITY, initial_capacity);
86
-
87
- this.__capacity = cap;
88
- // High-water mark of slot indices ever issued. Slots in [0, count) are
89
- // either currently allocated or sitting on the free heap.
90
- this.__count = 0;
91
-
92
- this.__entities = new Int32Array(cap);
93
- this.__generations = new Uint8Array(cap);
94
- this.__kinds = new Uint8Array(cap);
95
- this.__flags = new Uint32Array(cap);
96
-
97
- // 1 = allocated, 0 = free. Cheaper than scanning the free heap.
98
- this.__alive = new Uint8Array(cap);
99
-
100
- // Awake set: dense list of awake body indices + reverse map.
101
- this.__awake_list = new Uint32Array(cap);
102
- this.__awake_pos = new Int32Array(cap);
103
- this.__awake_count = 0;
104
-
105
- // Min-heap of free body indices for deterministic reuse.
106
- this.__free_heap = new Uint32Array(cap);
107
- this.__free_count = 0;
108
-
109
- // Entity → body-index map (one body per entity). Keeps {@link
110
- // index_of_entity} O(1) instead of an O(N) scan over the slot table on
111
- // every collider attach / detach and joint link. Maintained on
112
- // allocate / free; never grows with the typed arrays (a plain Map).
113
- this.__entity_to_index = new Map();
114
-
115
- // Initialise reverse map to BODY_INDEX_ABSENT.
116
- this.__awake_pos.fill(BODY_INDEX_ABSENT);
117
- }
118
-
119
- /**
120
- * Currently allocated body count (live, regardless of awake/sleeping).
121
- * @returns {number}
122
- */
123
- get size() {
124
- return this.__count - this.__free_count;
125
- }
126
-
127
- /**
128
- * Total slot capacity. Starts at the (power-of-two) default and grows by
129
- * doubling; a caller-supplied non-power-of-two initial capacity is honoured
130
- * as-is, so this is not guaranteed to be a power of two.
131
- * @returns {number}
132
- */
133
- get capacity() {
134
- return this.__capacity;
135
- }
136
-
137
- /**
138
- * Number of awake bodies.
139
- * @returns {number}
140
- */
141
- get awake_count() {
142
- return this.__awake_count;
143
- }
144
-
145
- /**
146
- * High-water mark of slot indices ever issued. Useful when callers maintain
147
- * per-slot side-tables.
148
- * @returns {number}
149
- */
150
- get high_water_mark() {
151
- return this.__count;
152
- }
153
-
154
- /**
155
- * Allocate a body slot for `entity`. The new body starts in the awake set
156
- * with default kind {@link BodyKind.Dynamic} and zero flags; the caller
157
- * may override these via {@link set_kind} / {@link set_flags}.
158
- *
159
- * @param {number} entity
160
- * @returns {number} packed body id
161
- */
162
- allocate(entity) {
163
- let index;
164
-
165
- if (this.__free_count > 0) {
166
- index = this.__heap_pop();
167
- } else {
168
- if (this.__count === this.__capacity) {
169
- this.__grow();
170
- }
171
- index = this.__count++;
172
- }
173
-
174
- this.__entities[index] = entity;
175
- this.__kinds[index] = BodyKind.Dynamic;
176
- this.__flags[index] = 0;
177
- this.__alive[index] = 1;
178
- this.__entity_to_index.set(entity, index);
179
-
180
- // Insert into awake set.
181
- const awake_pos = this.__awake_count++;
182
- this.__awake_list[awake_pos] = index;
183
- this.__awake_pos[index] = awake_pos;
184
-
185
- return pack_body_id(index, this.__generations[index]);
186
- }
187
-
188
- /**
189
- * Release a body slot previously returned by {@link allocate}. Bumps the
190
- * generation so any old packed id becomes stale.
191
- *
192
- * @param {number} packed_body_id
193
- */
194
- free(packed_body_id) {
195
- const index = body_id_index(packed_body_id);
196
-
197
- assert.equal(this.is_valid(packed_body_id), true, 'free() called on stale or unknown body id');
198
-
199
- // Remove from awake set if present.
200
- const awake_pos = this.__awake_pos[index];
201
- if (awake_pos !== BODY_INDEX_ABSENT) {
202
- this.__awake_remove_at(awake_pos);
203
- this.__awake_pos[index] = BODY_INDEX_ABSENT;
204
- }
205
-
206
- this.__alive[index] = 0;
207
-
208
- // Drop the entity → index mapping (the slot still holds the old entity
209
- // value until reallocation, so delete by it now while it's valid).
210
- this.__entity_to_index.delete(this.__entities[index]);
211
-
212
- // Bump generation; wraps mod 256.
213
- this.__generations[index] = (this.__generations[index] + 1) & GENERATION_MASK;
214
-
215
- this.__heap_push(index);
216
- }
217
-
218
- /**
219
- *
220
- * @param {number} packed_body_id
221
- * @returns {boolean}
222
- */
223
- is_valid(packed_body_id) {
224
- const index = body_id_index(packed_body_id);
225
- if (index < 0 || index >= this.__count) {
226
- return false;
227
- }
228
- if (this.__alive[index] !== 1) {
229
- return false;
230
- }
231
- return this.__generations[index] === body_id_generation(packed_body_id);
232
- }
233
-
234
- /**
235
- * @param {number} index body index (NOT a packed id)
236
- * @returns {number} entity for the body, or -1 if the slot is free.
237
- */
238
- entity_at(index) {
239
- if (this.__alive[index] !== 1) {
240
- return -1;
241
- }
242
- return this.__entities[index];
243
- }
244
-
245
- /**
246
- * Body index for `entity`, or {@link BODY_INDEX_ABSENT} if no live body owns
247
- * it. O(1) reverse of {@link entity_at} — the lookup callers use on the
248
- * link / attach / joint paths instead of scanning the slot table.
249
- * @param {number} entity
250
- * @returns {number}
251
- */
252
- index_of_entity(entity) {
253
- const idx = this.__entity_to_index.get(entity);
254
- return idx === undefined ? BODY_INDEX_ABSENT : idx;
255
- }
256
-
257
- /**
258
- * @param {number} index
259
- * @returns {number}
260
- */
261
- generation_at(index) {
262
- return this.__generations[index];
263
- }
264
-
265
- /**
266
- * @param {number} index
267
- * @returns {BodyKind|number}
268
- */
269
- kind_at(index) {
270
- return this.__kinds[index];
271
- }
272
-
273
- /**
274
- * @param {number} index
275
- * @param {BodyKind|number} kind
276
- */
277
- set_kind(index, kind) {
278
- this.__kinds[index] = kind;
279
- }
280
-
281
- /**
282
- * @param {number} index
283
- * @returns {number}
284
- */
285
- flags_at(index) {
286
- return this.__flags[index];
287
- }
288
-
289
- /**
290
- * @param {number} index
291
- * @param {number} flags
292
- */
293
- set_flags(index, flags) {
294
- this.__flags[index] = flags;
295
- }
296
-
297
- /**
298
- * Index of `index` in the awake list, or {@link BODY_INDEX_ABSENT} if asleep.
299
- * @param {number} index
300
- * @returns {number}
301
- */
302
- awake_position_of(index) {
303
- return this.__awake_pos[index];
304
- }
305
-
306
- /**
307
- *
308
- * @param {number} index
309
- * @returns {boolean}
310
- */
311
- is_awake(index) {
312
- return this.__awake_pos[index] !== BODY_INDEX_ABSENT;
313
- }
314
-
315
- /**
316
- * Read the body index at position `i` in the dense awake list (0-based).
317
- * @param {number} i
318
- * @returns {number}
319
- */
320
- awake_at(i) {
321
- return this.__awake_list[i];
322
- }
323
-
324
- /**
325
- * Add `index` to the awake set if not already present.
326
- * @param {number} index
327
- */
328
- mark_awake(index) {
329
- if (this.__awake_pos[index] !== BODY_INDEX_ABSENT) {
330
- return;
331
- }
332
- const pos = this.__awake_count++;
333
- this.__awake_list[pos] = index;
334
- this.__awake_pos[index] = pos;
335
- }
336
-
337
- /**
338
- * Remove `index` from the awake set if present.
339
- * @param {number} index
340
- */
341
- mark_sleeping(index) {
342
- const pos = this.__awake_pos[index];
343
- if (pos === BODY_INDEX_ABSENT) {
344
- return;
345
- }
346
- this.__awake_remove_at(pos);
347
- this.__awake_pos[index] = BODY_INDEX_ABSENT;
348
- }
349
-
350
- /**
351
- * Swap-with-last removal at position `pos` in the dense awake list.
352
- * @private
353
- * @param {number} pos
354
- */
355
- __awake_remove_at(pos) {
356
- const last_pos = --this.__awake_count;
357
- if (pos !== last_pos) {
358
- const swapped_index = this.__awake_list[last_pos];
359
- this.__awake_list[pos] = swapped_index;
360
- this.__awake_pos[swapped_index] = pos;
361
- }
362
- }
363
-
364
- /**
365
- * @private
366
- */
367
- __grow() {
368
- const new_cap = this.__capacity << 1;
369
- this.__capacity = new_cap;
370
-
371
- const grow_int32 = (a) => {
372
- const next = new Int32Array(new_cap);
373
- next.set(a);
374
- return next;
375
- };
376
- const grow_uint8 = (a) => {
377
- const next = new Uint8Array(new_cap);
378
- next.set(a);
379
- return next;
380
- };
381
- const grow_uint32 = (a) => {
382
- const next = new Uint32Array(new_cap);
383
- next.set(a);
384
- return next;
385
- };
386
-
387
- this.__entities = grow_int32(this.__entities);
388
- this.__generations = grow_uint8(this.__generations);
389
- this.__kinds = grow_uint8(this.__kinds);
390
- this.__flags = grow_uint32(this.__flags);
391
- this.__alive = grow_uint8(this.__alive);
392
- this.__awake_list = grow_uint32(this.__awake_list);
393
- this.__free_heap = grow_uint32(this.__free_heap);
394
-
395
- // Awake position has signed sentinel — needs fill on the grown portion.
396
- const next_pos = new Int32Array(new_cap);
397
- next_pos.set(this.__awake_pos);
398
- next_pos.fill(BODY_INDEX_ABSENT, this.__awake_pos.length);
399
- this.__awake_pos = next_pos;
400
- }
401
-
402
- // --- Min-heap of free indices --------------------------------------------
403
-
404
- /**
405
- * @private
406
- * @param {number} index
407
- */
408
- __heap_push(index) {
409
- const heap = this.__free_heap;
410
- let i = this.__free_count++;
411
- heap[i] = index;
412
-
413
- while (i > 0) {
414
- const parent = (i - 1) >>> 1;
415
- if (heap[parent] > heap[i]) {
416
- const tmp = heap[parent];
417
- heap[parent] = heap[i];
418
- heap[i] = tmp;
419
- i = parent;
420
- } else {
421
- break;
422
- }
423
- }
424
- }
425
-
426
- /**
427
- * @private
428
- * @returns {number}
429
- */
430
- __heap_pop() {
431
- const heap = this.__free_heap;
432
- const result = heap[0];
433
- const new_count = --this.__free_count;
434
- if (new_count > 0) {
435
- heap[0] = heap[new_count];
436
- let i = 0;
437
- while (true) {
438
- const l = (i << 1) + 1;
439
- const r = l + 1;
440
- let smallest = i;
441
- if (l < new_count && heap[l] < heap[smallest]) smallest = l;
442
- if (r < new_count && heap[r] < heap[smallest]) smallest = r;
443
- if (smallest === i) break;
444
- const tmp = heap[i];
445
- heap[i] = heap[smallest];
446
- heap[smallest] = tmp;
447
- i = smallest;
448
- }
449
- }
450
- return result;
451
- }
452
- }
1
+ import { assert } from "../../../core/assert.js";
2
+ import { Uint32MinHeap } from "../../../core/collection/Uint32MinHeap.js";
3
+ import { BodyKind } from "../ecs/BodyKind.js";
4
+
5
+ const DEFAULT_INITIAL_CAPACITY = 16;
6
+ const MIN_CAPACITY = 4;
7
+
8
+ /**
9
+ * Mask for the 8-bit generation field encoded in a packed body id.
10
+ * @type {number}
11
+ */
12
+ const GENERATION_MASK = 0xFF;
13
+
14
+ /**
15
+ * Bit width of the generation field. The remaining bits are the body index;
16
+ * 24-bit indices give 16.7M live bodies (the packed id is kept unsigned via
17
+ * `>>> 0` in {@link pack_body_id}, so the full 24-bit index range is usable),
18
+ * comfortably above the design target of "millions".
19
+ * @type {number}
20
+ */
21
+ const GENERATION_BITS = 8;
22
+
23
+ /**
24
+ * Sentinel returned by {@link BodyStorage#awake_position_of} and friends when a
25
+ * body is not in the awake set.
26
+ * @type {number}
27
+ */
28
+ export const BODY_INDEX_ABSENT = -1;
29
+
30
+ /**
31
+ * Pack a body index and generation into a single integer handle.
32
+ *
33
+ * @param {number} index
34
+ * @param {number} generation
35
+ * @returns {number}
36
+ */
37
+ export function pack_body_id(index, generation) {
38
+ // `>>> 0` keeps the packed id UNSIGNED: at index >= 2^23 the shift sets
39
+ // bit 31 and a signed result would break canonical (min, max) pair
40
+ // ordering against the Uint32 ids read back from BVH user data.
41
+ return ((index << GENERATION_BITS) | (generation & GENERATION_MASK)) >>> 0;
42
+ }
43
+
44
+ /**
45
+ *
46
+ * @param {number} packed
47
+ * @returns {number}
48
+ */
49
+ export function body_id_index(packed) {
50
+ return packed >>> GENERATION_BITS;
51
+ }
52
+
53
+ /**
54
+ *
55
+ * @param {number} packed
56
+ * @returns {number}
57
+ */
58
+ export function body_id_generation(packed) {
59
+ return packed & GENERATION_MASK;
60
+ }
61
+
62
+ /**
63
+ * Structure-of-arrays pool for rigid bodies.
64
+ *
65
+ * Owns:
66
+ * - per-body identity (entity, generation, kind, flags),
67
+ * - a dense list of awake body indices (the simulation hot iteration target),
68
+ * - a min-heap of free body indices so reuse order is deterministic regardless
69
+ * of how interleaved allocate / free calls have been.
70
+ *
71
+ * The pool grows by doubling when the high-water mark reaches capacity; arrays
72
+ * are replaced wholesale on grow, so callers must not retain references to the
73
+ * raw typed arrays across allocate-after-grow boundaries.
74
+ *
75
+ * Determinism: allocate always reuses the lowest free index. Two pools given the
76
+ * same sequence of allocate/free calls observe identical body indices.
77
+ *
78
+ * @author Alex Goldring
79
+ * @copyright Company Named Limited (c) 2026
80
+ */
81
+ export class BodyStorage {
82
+
83
+ /**
84
+ *
85
+ * @param {number} [initial_capacity]
86
+ */
87
+ constructor(initial_capacity = DEFAULT_INITIAL_CAPACITY) {
88
+ assert.isNonNegativeInteger(initial_capacity, 'initial_capacity');
89
+
90
+ const cap = Math.max(MIN_CAPACITY, initial_capacity);
91
+
92
+ this.__capacity = cap;
93
+ // High-water mark of slot indices ever issued. Slots in [0, count) are
94
+ // either currently allocated or sitting on the free heap.
95
+ this.__count = 0;
96
+
97
+ this.__entities = new Int32Array(cap);
98
+ this.__generations = new Uint8Array(cap);
99
+ this.__kinds = new Uint8Array(cap);
100
+ this.__flags = new Uint32Array(cap);
101
+
102
+ // 1 = allocated, 0 = free. Cheaper than scanning the free heap.
103
+ this.__alive = new Uint8Array(cap);
104
+
105
+ // Awake set: dense list of awake body indices + reverse map.
106
+ this.__awake_list = new Uint32Array(cap);
107
+ this.__awake_pos = new Int32Array(cap);
108
+ this.__awake_count = 0;
109
+
110
+ // Min-heap of free body indices for deterministic reuse
111
+ // (allocate always takes the lowest free index). Self-growing.
112
+ this.__free = new Uint32MinHeap(cap);
113
+
114
+ // Entity → body-index map (one body per entity). Keeps {@link
115
+ // index_of_entity} O(1) instead of an O(N) scan over the slot table on
116
+ // every collider attach / detach and joint link. Maintained on
117
+ // allocate / free; never grows with the typed arrays (a plain Map).
118
+ this.__entity_to_index = new Map();
119
+
120
+ // Initialise reverse map to BODY_INDEX_ABSENT.
121
+ this.__awake_pos.fill(BODY_INDEX_ABSENT);
122
+ }
123
+
124
+ /**
125
+ * Currently allocated body count (live, regardless of awake/sleeping).
126
+ * @returns {number}
127
+ */
128
+ get size() {
129
+ return this.__count - this.__free.size;
130
+ }
131
+
132
+ /**
133
+ * Total slot capacity. Starts at the (power-of-two) default and grows by
134
+ * doubling; a caller-supplied non-power-of-two initial capacity is honoured
135
+ * as-is, so this is not guaranteed to be a power of two.
136
+ * @returns {number}
137
+ */
138
+ get capacity() {
139
+ return this.__capacity;
140
+ }
141
+
142
+ /**
143
+ * Number of awake bodies.
144
+ * @returns {number}
145
+ */
146
+ get awake_count() {
147
+ return this.__awake_count;
148
+ }
149
+
150
+ /**
151
+ * High-water mark of slot indices ever issued. Useful when callers maintain
152
+ * per-slot side-tables.
153
+ * @returns {number}
154
+ */
155
+ get high_water_mark() {
156
+ return this.__count;
157
+ }
158
+
159
+ /**
160
+ * Allocate a body slot for `entity`. The new body starts in the awake set
161
+ * with default kind {@link BodyKind.Dynamic} and zero flags; the caller
162
+ * may override these via {@link set_kind} / {@link set_flags}.
163
+ *
164
+ * @param {number} entity
165
+ * @returns {number} packed body id
166
+ */
167
+ allocate(entity) {
168
+ let index;
169
+
170
+ if (this.__free.size > 0) {
171
+ index = this.__free.pop();
172
+ } else {
173
+ if (this.__count === this.__capacity) {
174
+ this.__grow();
175
+ }
176
+ index = this.__count++;
177
+ }
178
+
179
+ this.__entities[index] = entity;
180
+ this.__kinds[index] = BodyKind.Dynamic;
181
+ this.__flags[index] = 0;
182
+ this.__alive[index] = 1;
183
+ this.__entity_to_index.set(entity, index);
184
+
185
+ // Insert into awake set.
186
+ const awake_pos = this.__awake_count++;
187
+ this.__awake_list[awake_pos] = index;
188
+ this.__awake_pos[index] = awake_pos;
189
+
190
+ return pack_body_id(index, this.__generations[index]);
191
+ }
192
+
193
+ /**
194
+ * Release a body slot previously returned by {@link allocate}. Bumps the
195
+ * generation so any old packed id becomes stale.
196
+ *
197
+ * @param {number} packed_body_id
198
+ */
199
+ free(packed_body_id) {
200
+ const index = body_id_index(packed_body_id);
201
+
202
+ assert.equal(this.is_valid(packed_body_id), true, 'free() called on stale or unknown body id');
203
+
204
+ // Remove from awake set if present.
205
+ const awake_pos = this.__awake_pos[index];
206
+ if (awake_pos !== BODY_INDEX_ABSENT) {
207
+ this.__awake_remove_at(awake_pos);
208
+ this.__awake_pos[index] = BODY_INDEX_ABSENT;
209
+ }
210
+
211
+ this.__alive[index] = 0;
212
+
213
+ // Drop the entity → index mapping (the slot still holds the old entity
214
+ // value until reallocation, so delete by it now while it's valid).
215
+ this.__entity_to_index.delete(this.__entities[index]);
216
+
217
+ // Bump generation; wraps mod 256.
218
+ this.__generations[index] = (this.__generations[index] + 1) & GENERATION_MASK;
219
+
220
+ this.__free.push(index);
221
+ }
222
+
223
+ /**
224
+ *
225
+ * @param {number} packed_body_id
226
+ * @returns {boolean}
227
+ */
228
+ is_valid(packed_body_id) {
229
+ const index = body_id_index(packed_body_id);
230
+ if (index < 0 || index >= this.__count) {
231
+ return false;
232
+ }
233
+ if (this.__alive[index] !== 1) {
234
+ return false;
235
+ }
236
+ return this.__generations[index] === body_id_generation(packed_body_id);
237
+ }
238
+
239
+ /**
240
+ * @param {number} index body index (NOT a packed id)
241
+ * @returns {number} entity for the body, or -1 if the slot is free.
242
+ */
243
+ entity_at(index) {
244
+ if (this.__alive[index] !== 1) {
245
+ return -1;
246
+ }
247
+ return this.__entities[index];
248
+ }
249
+
250
+ /**
251
+ * Body index for `entity`, or {@link BODY_INDEX_ABSENT} if no live body owns
252
+ * it. O(1) reverse of {@link entity_at} — the lookup callers use on the
253
+ * link / attach / joint paths instead of scanning the slot table.
254
+ * @param {number} entity
255
+ * @returns {number}
256
+ */
257
+ index_of_entity(entity) {
258
+ const idx = this.__entity_to_index.get(entity);
259
+ return idx === undefined ? BODY_INDEX_ABSENT : idx;
260
+ }
261
+
262
+ /**
263
+ * @param {number} index
264
+ * @returns {number}
265
+ */
266
+ generation_at(index) {
267
+ return this.__generations[index];
268
+ }
269
+
270
+ /**
271
+ * @param {number} index
272
+ * @returns {BodyKind|number}
273
+ */
274
+ kind_at(index) {
275
+ return this.__kinds[index];
276
+ }
277
+
278
+ /**
279
+ * @param {number} index
280
+ * @param {BodyKind|number} kind
281
+ */
282
+ set_kind(index, kind) {
283
+ this.__kinds[index] = kind;
284
+ }
285
+
286
+ /**
287
+ * @param {number} index
288
+ * @returns {number}
289
+ */
290
+ flags_at(index) {
291
+ return this.__flags[index];
292
+ }
293
+
294
+ /**
295
+ * @param {number} index
296
+ * @param {number} flags
297
+ */
298
+ set_flags(index, flags) {
299
+ this.__flags[index] = flags;
300
+ }
301
+
302
+ /**
303
+ * Index of `index` in the awake list, or {@link BODY_INDEX_ABSENT} if asleep.
304
+ * @param {number} index
305
+ * @returns {number}
306
+ */
307
+ awake_position_of(index) {
308
+ return this.__awake_pos[index];
309
+ }
310
+
311
+ /**
312
+ *
313
+ * @param {number} index
314
+ * @returns {boolean}
315
+ */
316
+ is_awake(index) {
317
+ return this.__awake_pos[index] !== BODY_INDEX_ABSENT;
318
+ }
319
+
320
+ /**
321
+ * Read the body index at position `i` in the dense awake list (0-based).
322
+ * @param {number} i
323
+ * @returns {number}
324
+ */
325
+ awake_at(i) {
326
+ return this.__awake_list[i];
327
+ }
328
+
329
+ /**
330
+ * Add `index` to the awake set if not already present.
331
+ * @param {number} index
332
+ */
333
+ mark_awake(index) {
334
+ if (this.__awake_pos[index] !== BODY_INDEX_ABSENT) {
335
+ return;
336
+ }
337
+ const pos = this.__awake_count++;
338
+ this.__awake_list[pos] = index;
339
+ this.__awake_pos[index] = pos;
340
+ }
341
+
342
+ /**
343
+ * Remove `index` from the awake set if present.
344
+ * @param {number} index
345
+ */
346
+ mark_sleeping(index) {
347
+ const pos = this.__awake_pos[index];
348
+ if (pos === BODY_INDEX_ABSENT) {
349
+ return;
350
+ }
351
+ this.__awake_remove_at(pos);
352
+ this.__awake_pos[index] = BODY_INDEX_ABSENT;
353
+ }
354
+
355
+ /**
356
+ * Swap-with-last removal at position `pos` in the dense awake list.
357
+ * @private
358
+ * @param {number} pos
359
+ */
360
+ __awake_remove_at(pos) {
361
+ const last_pos = --this.__awake_count;
362
+ if (pos !== last_pos) {
363
+ const swapped_index = this.__awake_list[last_pos];
364
+ this.__awake_list[pos] = swapped_index;
365
+ this.__awake_pos[swapped_index] = pos;
366
+ }
367
+ }
368
+
369
+ /**
370
+ * @private
371
+ */
372
+ __grow() {
373
+ const new_cap = this.__capacity << 1;
374
+ this.__capacity = new_cap;
375
+
376
+ const grow_int32 = (a) => {
377
+ const next = new Int32Array(new_cap);
378
+ next.set(a);
379
+ return next;
380
+ };
381
+ const grow_uint8 = (a) => {
382
+ const next = new Uint8Array(new_cap);
383
+ next.set(a);
384
+ return next;
385
+ };
386
+ const grow_uint32 = (a) => {
387
+ const next = new Uint32Array(new_cap);
388
+ next.set(a);
389
+ return next;
390
+ };
391
+
392
+ this.__entities = grow_int32(this.__entities);
393
+ this.__generations = grow_uint8(this.__generations);
394
+ this.__kinds = grow_uint8(this.__kinds);
395
+ this.__flags = grow_uint32(this.__flags);
396
+ this.__alive = grow_uint8(this.__alive);
397
+ this.__awake_list = grow_uint32(this.__awake_list);
398
+
399
+ // Awake position has signed sentinel — needs fill on the grown portion.
400
+ const next_pos = new Int32Array(new_cap);
401
+ next_pos.set(this.__awake_pos);
402
+ next_pos.fill(BODY_INDEX_ABSENT, this.__awake_pos.length);
403
+ this.__awake_pos = next_pos;
404
+ }
405
+
406
+ }