@woosh/meep-engine 2.155.0 → 2.156.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 (475) hide show
  1. package/README.md +1 -1
  2. package/build/bundle-worker-image-decoder.js +1 -1
  3. package/build/bundle-worker-terrain.js +1 -1
  4. package/editor/view/ecs/ComponentControlView.d.ts +0 -9
  5. package/editor/view/ecs/ComponentControlView.js +2 -98
  6. package/package.json +1 -1
  7. package/src/core/binary/32BitEncoder.js +1 -1
  8. package/src/core/binary/to_half_float_uint16.js +3 -3
  9. package/src/core/bvh2/bvh3/ebvh_build_hierarchy_radix.d.ts.map +1 -1
  10. package/src/core/bvh2/bvh3/ebvh_build_hierarchy_radix.js +275 -253
  11. package/src/core/cache/Cache.d.ts.map +1 -1
  12. package/src/core/cache/Cache.js +7 -0
  13. package/src/core/cache/FrequencySketch.d.ts.map +1 -1
  14. package/src/core/cache/FrequencySketch.js +8 -4
  15. package/src/core/clipboard/obtainClipBoard.d.ts +6 -0
  16. package/src/core/clipboard/obtainClipBoard.d.ts.map +1 -0
  17. package/src/core/clipboard/obtainClipBoard.js +29 -0
  18. package/src/core/clipboard/safeClipboardReadText.d.ts +6 -0
  19. package/src/core/clipboard/safeClipboardReadText.d.ts.map +1 -0
  20. package/src/core/clipboard/safeClipboardReadText.js +55 -0
  21. package/src/core/clipboard/safeClipboardWriteText.d.ts +8 -0
  22. package/src/core/clipboard/safeClipboardWriteText.d.ts.map +1 -0
  23. package/src/core/clipboard/safeClipboardWriteText.js +23 -0
  24. package/src/core/collection/array/array_quick_sort_by_lookup_map.js +1 -1
  25. package/src/core/collection/array/array_set_diff_sorting.d.ts.map +1 -1
  26. package/src/core/collection/array/array_set_diff_sorting.js +4 -1
  27. package/src/core/collection/array/array_shuffle.d.ts.map +1 -1
  28. package/src/core/collection/array/array_shuffle.js +30 -27
  29. package/src/core/collection/array/binarySearchLowIndex.d.ts.map +1 -1
  30. package/src/core/collection/array/binarySearchLowIndex.js +4 -3
  31. package/src/core/collection/array/typed/array_buffer_hash.js +1 -1
  32. package/src/core/collection/array/typed/is_typed_array_equals.d.ts.map +1 -1
  33. package/src/core/collection/array/typed/is_typed_array_equals.js +12 -2
  34. package/src/core/collection/heap/BinaryHeap.d.ts.map +1 -1
  35. package/src/core/collection/heap/BinaryHeap.js +12 -2
  36. package/src/core/collection/queue/Deque.d.ts.map +1 -1
  37. package/src/core/collection/queue/Deque.js +10 -8
  38. package/src/core/collection/table/RowFirstTable.d.ts.map +1 -1
  39. package/src/core/collection/table/RowFirstTable.js +4 -2
  40. package/src/core/collection/table/RowFirstTableSpec.js +2 -2
  41. package/src/core/color/operations/color_lerp.d.ts.map +1 -1
  42. package/src/core/color/operations/color_lerp.js +10 -3
  43. package/src/core/color/rgb2uint32.js +1 -1
  44. package/src/core/color/rgbe9995_to_rgb.js +1 -1
  45. package/src/core/function/objectsEqual.d.ts.map +1 -1
  46. package/src/core/function/objectsEqual.js +2 -1
  47. package/src/core/geom/2d/aabb/AABB2.d.ts.map +1 -1
  48. package/src/core/geom/2d/aabb/AABB2.js +12 -11
  49. package/src/core/geom/2d/convex-hull/convex_hull_jarvis_2d.d.ts.map +1 -1
  50. package/src/core/geom/2d/convex-hull/convex_hull_jarvis_2d.js +30 -4
  51. package/src/core/geom/2d/convex-hull/fixed_convex_hull_relaxation.d.ts.map +1 -1
  52. package/src/core/geom/2d/convex-hull/fixed_convex_hull_relaxation.js +6 -2
  53. package/src/core/geom/2d/hash-grid/SpatialHashGrid.d.ts.map +1 -1
  54. package/src/core/geom/2d/hash-grid/SpatialHashGrid.js +388 -386
  55. package/src/core/geom/2d/hash-grid/shg_query_elements_line.d.ts.map +1 -1
  56. package/src/core/geom/2d/hash-grid/shg_query_elements_line.js +8 -3
  57. package/src/core/geom/2d/quad-tree/QuadTreeDatum.d.ts.map +1 -1
  58. package/src/core/geom/2d/quad-tree/QuadTreeDatum.js +9 -1
  59. package/src/core/geom/2d/quad-tree/qt_query_data_nearest_to_point.d.ts +3 -1
  60. package/src/core/geom/2d/quad-tree/qt_query_data_nearest_to_point.d.ts.map +1 -1
  61. package/src/core/geom/2d/quad-tree/qt_query_data_nearest_to_point.js +3 -1
  62. package/src/core/geom/2d/quad-tree-binary/QuadTree.js +714 -714
  63. package/src/core/geom/2d/r-tree/StaticR2Tree.d.ts.map +1 -1
  64. package/src/core/geom/2d/r-tree/StaticR2Tree.js +5 -4
  65. package/src/core/geom/3d/aabb/aabb3_detailed_volume_intersection.d.ts.map +1 -1
  66. package/src/core/geom/3d/aabb/aabb3_detailed_volume_intersection.js +33 -29
  67. package/src/core/geom/3d/aabb/aabb3_near_distance_to_intersection_ray_segment.d.ts.map +1 -1
  68. package/src/core/geom/3d/aabb/aabb3_near_distance_to_intersection_ray_segment.js +3 -1
  69. package/src/core/geom/3d/aabb/aabb3_signed_distance_to_aabb3.d.ts.map +1 -1
  70. package/src/core/geom/3d/aabb/aabb3_signed_distance_to_aabb3.js +10 -7
  71. package/src/core/geom/3d/aabb/aabb3_transformed_compute_plane_side.d.ts.map +1 -1
  72. package/src/core/geom/3d/aabb/aabb3_transformed_compute_plane_side.js +30 -9
  73. package/src/core/geom/3d/aabb/compute_aabb_from_points.js +3 -3
  74. package/src/core/geom/3d/box/box3_raycast.d.ts +37 -0
  75. package/src/core/geom/3d/box/box3_raycast.d.ts.map +1 -0
  76. package/src/core/geom/3d/box/box3_raycast.js +81 -0
  77. package/src/core/geom/3d/capsule/capsule_raycast.d.ts +35 -0
  78. package/src/core/geom/3d/capsule/capsule_raycast.d.ts.map +1 -0
  79. package/src/core/geom/3d/capsule/capsule_raycast.js +93 -0
  80. package/src/core/geom/3d/cone/compute_bounding_cone_of_2_cones.d.ts.map +1 -1
  81. package/src/core/geom/3d/cone/compute_bounding_cone_of_2_cones.js +4 -0
  82. package/src/core/geom/3d/frustum/frustum3_computeNearestPointToPoint.js +1 -1
  83. package/src/core/geom/3d/line/line3_compute_segment_point_distance_eikonal.d.ts.map +1 -1
  84. package/src/core/geom/3d/line/line3_compute_segment_point_distance_eikonal.js +3 -2
  85. package/src/core/geom/3d/mat4/decompose_matrix_4_array.d.ts.map +1 -1
  86. package/src/core/geom/3d/mat4/decompose_matrix_4_array.js +12 -2
  87. package/src/core/geom/3d/mat4/eulerAnglesFromMatrix.js +2 -2
  88. package/src/core/geom/3d/mat4/m4_multiply_alphatensor.d.ts +1 -1
  89. package/src/core/geom/3d/mat4/m4_multiply_alphatensor.d.ts.map +1 -1
  90. package/src/core/geom/3d/mat4/m4_multiply_alphatensor.js +19 -13
  91. package/src/core/geom/3d/octahedra/octahedral_direction_to_uv.d.ts.map +1 -1
  92. package/src/core/geom/3d/octahedra/octahedral_direction_to_uv.js +3 -2
  93. package/src/core/geom/3d/plane/plane3_compute_plane_intersection.js +3 -2
  94. package/src/core/geom/3d/shape/MeshShape3D.d.ts.map +1 -1
  95. package/src/core/geom/3d/shape/MeshShape3D.js +7 -0
  96. package/src/core/geom/3d/shape/UnionShape3D.d.ts.map +1 -1
  97. package/src/core/geom/3d/shape/UnionShape3D.js +3 -2
  98. package/src/core/geom/3d/shape/util/shape3d_voxelize_to_grid.d.ts.map +1 -1
  99. package/src/core/geom/3d/shape/util/shape3d_voxelize_to_grid.js +153 -148
  100. package/src/core/geom/3d/sphere/harmonics/sh3_dering_optimize_positive.d.ts.map +1 -1
  101. package/src/core/geom/3d/sphere/harmonics/sh3_dering_optimize_positive.js +7 -0
  102. package/src/core/geom/3d/sphere/harmonics/sh3_sample_by_direction.d.ts.map +1 -1
  103. package/src/core/geom/3d/sphere/harmonics/sh3_sample_by_direction.js +13 -10
  104. package/src/core/geom/3d/sphere/sphere_projected_sphere_radius_sqr.d.ts +1 -1
  105. package/src/core/geom/3d/sphere/sphere_projected_sphere_radius_sqr.js +2 -2
  106. package/src/core/geom/3d/sphere/sphere_raycast.d.ts +33 -0
  107. package/src/core/geom/3d/sphere/sphere_raycast.d.ts.map +1 -0
  108. package/src/core/geom/3d/sphere/sphere_raycast.js +47 -0
  109. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_tet_get_neighbours.d.ts +24 -0
  110. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_tet_get_neighbours.d.ts.map +1 -0
  111. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_tet_get_neighbours.js +39 -0
  112. package/src/core/geom/3d/tetrahedra/triangle/trace_triangular_depth_map.d.ts.map +1 -1
  113. package/src/core/geom/3d/tetrahedra/triangle/trace_triangular_depth_map.js +4 -2
  114. package/src/core/geom/3d/topology/bounds/computeTriangleClusterNormalBoundingCone.js +3 -3
  115. package/src/core/geom/3d/topology/simplify/decimate_edge_collapse_snap.js +1 -1
  116. package/src/core/geom/3d/topology/tm_vertex_compute_normal.d.ts.map +1 -1
  117. package/src/core/geom/3d/topology/tm_vertex_compute_normal.js +4 -2
  118. package/src/core/geom/3d/util/make_justified_point_grid.d.ts.map +1 -1
  119. package/src/core/geom/3d/util/make_justified_point_grid.js +18 -10
  120. package/src/core/geom/ConicRay.d.ts.map +1 -1
  121. package/src/core/geom/ConicRay.js +11 -13
  122. package/src/core/geom/packing/max-rect/removeRedundantBoxes.d.ts.map +1 -1
  123. package/src/core/geom/packing/max-rect/removeRedundantBoxes.js +19 -4
  124. package/src/core/geom/vec3/v3_orthonormal_matrix_from_normal.d.ts.map +1 -0
  125. package/src/{engine/graphics/sh3/path_tracer/sampling → core/geom/vec3}/v3_orthonormal_matrix_from_normal.js +1 -1
  126. package/src/core/graph/coloring/colorizeGraph.js +2 -2
  127. package/src/core/graph/csr/CSRGraph.d.ts.map +1 -1
  128. package/src/core/graph/csr/CSRGraph.js +325 -319
  129. package/src/core/graph/layout/CircleLayout.d.ts.map +1 -1
  130. package/src/core/graph/layout/CircleLayout.js +8 -6
  131. package/src/core/graph/metis/native/refine/compute_kway_params.d.ts.map +1 -1
  132. package/src/core/graph/metis/native/refine/compute_kway_params.js +139 -138
  133. package/src/core/graph/mn_graph_coarsen.d.ts.map +1 -1
  134. package/src/core/graph/mn_graph_coarsen.js +4 -2
  135. package/src/core/graph/v2/NodeContainer.js +7 -7
  136. package/src/core/localization/LocalizationEngine.js +1 -1
  137. package/src/core/math/bell_membership_function.d.ts.map +1 -1
  138. package/src/core/math/bell_membership_function.js +3 -1
  139. package/src/core/math/complex/complex_add.d.ts +4 -4
  140. package/src/core/math/complex/complex_add.d.ts.map +1 -1
  141. package/src/core/math/complex/complex_add.js +3 -3
  142. package/src/core/math/complex/complex_div.d.ts +4 -4
  143. package/src/core/math/complex/complex_div.d.ts.map +1 -1
  144. package/src/core/math/complex/complex_div.js +3 -3
  145. package/src/core/math/complex/complex_mul.d.ts +4 -4
  146. package/src/core/math/complex/complex_mul.d.ts.map +1 -1
  147. package/src/core/math/complex/complex_mul.js +3 -3
  148. package/src/core/math/complex/complex_sub.d.ts +4 -4
  149. package/src/core/math/complex/complex_sub.d.ts.map +1 -1
  150. package/src/core/math/complex/complex_sub.js +3 -3
  151. package/src/core/math/idct_1d.d.ts +4 -4
  152. package/src/core/math/idct_1d.d.ts.map +1 -1
  153. package/src/core/math/idct_1d.js +3 -3
  154. package/src/core/math/noise/create_simplex_noise_2d.d.ts.map +1 -1
  155. package/src/core/math/noise/create_simplex_noise_2d.js +4 -2
  156. package/src/core/math/noise/sdnoise.d.ts.map +1 -1
  157. package/src/core/math/noise/sdnoise.js +12 -9
  158. package/src/core/math/physics/mie/compute_bhmie_optical_properties.d.ts.map +1 -1
  159. package/src/core/math/physics/mie/compute_bhmie_optical_properties.js +94 -50
  160. package/src/core/math/physics/mie/lorenz_mie_coefs.d.ts +3 -6
  161. package/src/core/math/physics/mie/lorenz_mie_coefs.d.ts.map +1 -1
  162. package/src/core/math/physics/mie/lorenz_mie_coefs.js +180 -157
  163. package/src/core/math/physics/mie/mie_ab_to_optical_properties.d.ts +3 -4
  164. package/src/core/math/physics/mie/mie_ab_to_optical_properties.d.ts.map +1 -1
  165. package/src/core/math/physics/mie/mie_ab_to_optical_properties.js +47 -21
  166. package/src/core/math/random/randomIntegerBetween.d.ts.map +1 -1
  167. package/src/core/math/random/randomIntegerBetween.js +4 -1
  168. package/src/core/math/solveCubic.d.ts.map +1 -1
  169. package/src/core/math/solveCubic.js +95 -82
  170. package/src/core/math/spline/computeCatmullRomSplineUniformDistance.d.ts.map +1 -1
  171. package/src/core/math/spline/computeCatmullRomSplineUniformDistance.js +13 -0
  172. package/src/core/math/statistics/softmax.js +1 -1
  173. package/src/core/model/node-graph/visual/NodeGraphVisualData.d.ts +1 -0
  174. package/src/core/model/node-graph/visual/NodeGraphVisualData.d.ts.map +1 -1
  175. package/src/core/model/node-graph/visual/NodeGraphVisualData.js +2 -1
  176. package/src/core/model/node-graph/visual/NodeVisualData.js +1 -1
  177. package/src/core/model/object/ImmutableObjectPool.d.ts +7 -0
  178. package/src/core/model/object/ImmutableObjectPool.d.ts.map +1 -1
  179. package/src/core/model/object/ImmutableObjectPool.js +20 -10
  180. package/src/core/model/reactive/evaluation/MultiPredicateEvaluator.d.ts.map +1 -1
  181. package/src/core/model/reactive/evaluation/MultiPredicateEvaluator.js +39 -2
  182. package/src/core/model/reactive/model/terminal/ReactiveReference.d.ts.map +1 -1
  183. package/src/core/model/reactive/model/terminal/ReactiveReference.js +2 -0
  184. package/src/core/parser/simple/readHexToken.d.ts.map +1 -1
  185. package/src/core/parser/simple/readHexToken.js +6 -0
  186. package/src/core/primitives/numbers/number_pretty_print.d.ts.map +1 -1
  187. package/src/core/primitives/numbers/number_pretty_print.js +4 -1
  188. package/src/core/primitives/strings/string_jaro_winkler.js +1 -1
  189. package/src/core/process/CompositeProcess.js +1 -1
  190. package/src/core/process/action/AsynchronousDelayAction.d.ts.map +1 -1
  191. package/src/core/process/action/AsynchronousDelayAction.js +3 -0
  192. package/src/core/process/executor/ConcurrentExecutor.d.ts.map +1 -1
  193. package/src/core/process/executor/ConcurrentExecutor.js +3 -2
  194. package/src/core/process/task/util/randomCountTask.d.ts.map +1 -1
  195. package/src/core/process/task/util/randomCountTask.js +3 -1
  196. package/src/core/process/undo/ActionProcessor.d.ts.map +1 -1
  197. package/src/core/process/undo/ActionProcessor.js +5 -3
  198. package/src/core/process/worker/WorkerBuilder.js +3 -3
  199. package/src/engine/animation/curve/AnimationCurve.d.ts.map +1 -1
  200. package/src/engine/animation/curve/AnimationCurve.js +4 -2
  201. package/src/engine/control/first-person/DESIGN.md +1 -1
  202. package/src/engine/control/first-person/FirstPersonMotionPhase.d.ts +55 -0
  203. package/src/engine/control/first-person/FirstPersonMotionPhase.d.ts.map +1 -0
  204. package/src/engine/control/first-person/FirstPersonMotionPhase.js +134 -0
  205. package/src/engine/control/first-person/FirstPersonPlayerController.d.ts +23 -2
  206. package/src/engine/control/first-person/FirstPersonPlayerController.d.ts.map +1 -1
  207. package/src/engine/control/first-person/FirstPersonPlayerController.js +1 -1
  208. package/src/engine/control/first-person/FirstPersonPlayerControllerConfig.d.ts +168 -0
  209. package/src/engine/control/first-person/FirstPersonPlayerControllerConfig.d.ts.map +1 -1
  210. package/src/engine/control/first-person/FirstPersonPlayerControllerConfig.js +115 -0
  211. package/src/engine/control/first-person/FirstPersonPlayerControllerSystem.d.ts +71 -0
  212. package/src/engine/control/first-person/FirstPersonPlayerControllerSystem.d.ts.map +1 -1
  213. package/src/engine/control/first-person/FirstPersonPlayerControllerSystem.js +255 -55
  214. package/src/engine/control/first-person/abilities/LedgeGrab.d.ts +82 -43
  215. package/src/engine/control/first-person/abilities/LedgeGrab.d.ts.map +1 -1
  216. package/src/engine/control/first-person/abilities/LedgeGrab.js +405 -213
  217. package/src/engine/control/first-person/abilities/Mantle.d.ts +6 -0
  218. package/src/engine/control/first-person/abilities/Mantle.d.ts.map +1 -1
  219. package/src/engine/control/first-person/abilities/Mantle.js +104 -45
  220. package/src/engine/control/first-person/abilities/ScrambleUp.d.ts +61 -0
  221. package/src/engine/control/first-person/abilities/ScrambleUp.d.ts.map +1 -0
  222. package/src/engine/control/first-person/abilities/ScrambleUp.js +182 -0
  223. package/src/engine/control/first-person/math/jumpDynamics.d.ts +84 -0
  224. package/src/engine/control/first-person/math/jumpDynamics.d.ts.map +1 -0
  225. package/src/engine/control/first-person/math/jumpDynamics.js +108 -0
  226. package/src/engine/control/first-person/prototype_first_person_controller.js +45 -1
  227. package/src/engine/graphics/camera/testClippingPlaneComputation.js +1 -1
  228. package/src/engine/graphics/ecs/path/tube/prototypeAnimatedPathMask.js +1 -1
  229. package/src/engine/graphics/particles/particular/engine/utils/volume/prototypeParticleVolume.js +1 -1
  230. package/src/engine/graphics/render/buffer/buffers/prototypeNormalFrameBuffer.js +1 -1
  231. package/src/engine/graphics/render/forward_plus/plugin/ptototypeFPPlugin.js +1 -1
  232. package/src/engine/graphics/render/visibility/hiz/prototypeHiZ.js +1 -1
  233. package/src/engine/graphics/sh3/path_tracer/texture/sample_material.js +1 -1
  234. package/src/engine/graphics/shadows/testShadowMapRendering.js +1 -1
  235. package/src/engine/physics/CONSTRAINT_SOLVER_BENCH_LOG.md +208 -0
  236. package/src/engine/physics/CONSTRAINT_SOLVER_IMPROVEMENTS_PLAN.md +364 -0
  237. package/src/engine/physics/PLAN.md +6 -5
  238. package/src/engine/physics/constraint/solve_constraints.d.ts +4 -1
  239. package/src/engine/physics/constraint/solve_constraints.d.ts.map +1 -1
  240. package/src/engine/physics/constraint/solve_constraints.js +147 -33
  241. package/src/engine/physics/ecs/PhysicsSystem.d.ts.map +1 -1
  242. package/src/engine/physics/ecs/PhysicsSystem.js +1750 -1747
  243. package/src/engine/physics/fluid/ecs/FluidSystem.d.ts +3 -3
  244. package/src/engine/physics/gjk/gjk_epa_penetration.d.ts.map +1 -1
  245. package/src/engine/physics/gjk/gjk_epa_penetration.js +5 -9
  246. package/src/engine/physics/narrowphase/convex_convex_manifold.d.ts.map +1 -1
  247. package/src/engine/physics/narrowphase/convex_convex_manifold.js +22 -25
  248. package/src/engine/physics/narrowphase/convex_decomposition.d.ts +32 -13
  249. package/src/engine/physics/narrowphase/convex_decomposition.d.ts.map +1 -1
  250. package/src/engine/physics/narrowphase/convex_decomposition.js +61 -65
  251. package/src/engine/physics/narrowphase/mesh_convex_hull.d.ts.map +1 -1
  252. package/src/engine/physics/narrowphase/mesh_convex_hull.js +13 -8
  253. package/src/engine/physics/narrowphase/refine_ray_concave.d.ts.map +1 -1
  254. package/src/engine/physics/narrowphase/refine_ray_concave.js +5 -3
  255. package/src/engine/physics/narrowphase/refine_ray_hit.d.ts.map +1 -1
  256. package/src/engine/physics/narrowphase/refine_ray_hit.js +81 -78
  257. package/src/engine/sound/SoundEngine.d.ts.map +1 -1
  258. package/src/engine/sound/SoundEngine.js +28 -0
  259. package/src/engine/sound/dB2Volume.d.ts +1 -1
  260. package/src/engine/sound/dB2Volume.d.ts.map +1 -1
  261. package/src/engine/sound/dB2Volume.js +1 -1
  262. package/src/engine/sound/ecs/SoundController.d.ts +4 -0
  263. package/src/engine/sound/ecs/SoundController.d.ts.map +1 -1
  264. package/src/engine/sound/ecs/SoundController.js +4 -0
  265. package/src/engine/sound/ecs/SoundControllerSystem.d.ts +5 -0
  266. package/src/engine/sound/ecs/SoundControllerSystem.d.ts.map +1 -1
  267. package/src/engine/sound/ecs/SoundControllerSystem.js +5 -0
  268. package/src/engine/sound/ecs/audio/AudioEmitter.d.ts +69 -0
  269. package/src/engine/sound/ecs/audio/AudioEmitter.d.ts.map +1 -0
  270. package/src/engine/sound/ecs/audio/AudioEmitter.js +83 -0
  271. package/src/engine/sound/ecs/audio/AudioEmitterSystem.d.ts +97 -0
  272. package/src/engine/sound/ecs/audio/AudioEmitterSystem.d.ts.map +1 -0
  273. package/src/engine/sound/ecs/audio/AudioEmitterSystem.js +238 -0
  274. package/src/engine/sound/ecs/audio/LiveEmitterSet.d.ts +90 -0
  275. package/src/engine/sound/ecs/audio/LiveEmitterSet.d.ts.map +1 -0
  276. package/src/engine/sound/ecs/audio/LiveEmitterSet.js +324 -0
  277. package/src/engine/sound/ecs/audio/SpatialAudioIndex.d.ts +59 -0
  278. package/src/engine/sound/ecs/audio/SpatialAudioIndex.d.ts.map +1 -0
  279. package/src/engine/sound/ecs/audio/SpatialAudioIndex.js +140 -0
  280. package/src/engine/sound/ecs/emitter/SoundEmitter.d.ts +16 -65
  281. package/src/engine/sound/ecs/emitter/SoundEmitter.d.ts.map +1 -1
  282. package/src/engine/sound/ecs/emitter/SoundEmitter.js +19 -224
  283. package/src/engine/sound/ecs/emitter/SoundEmitterComponentContext.d.ts +26 -29
  284. package/src/engine/sound/ecs/emitter/SoundEmitterComponentContext.d.ts.map +1 -1
  285. package/src/engine/sound/ecs/emitter/SoundEmitterComponentContext.js +168 -135
  286. package/src/engine/sound/ecs/emitter/SoundEmitterSystem.d.ts +36 -59
  287. package/src/engine/sound/ecs/emitter/SoundEmitterSystem.d.ts.map +1 -1
  288. package/src/engine/sound/ecs/emitter/SoundEmitterSystem.js +154 -390
  289. package/src/engine/sound/ecs/emitter/SoundTrack.d.ts +20 -23
  290. package/src/engine/sound/ecs/emitter/SoundTrack.d.ts.map +1 -1
  291. package/src/engine/sound/ecs/emitter/SoundTrack.js +34 -152
  292. package/src/engine/sound/sopra/IMPLEMENTATION_PLAN.md +993 -0
  293. package/src/engine/sound/sopra/README.md +643 -7
  294. package/src/engine/sound/sopra/SopraEngine.d.ts +229 -0
  295. package/src/engine/sound/sopra/SopraEngine.d.ts.map +1 -0
  296. package/src/engine/sound/sopra/SopraEngine.js +423 -0
  297. package/src/engine/sound/sopra/asset/AssetManagerBufferProvider.d.ts +26 -0
  298. package/src/engine/sound/sopra/asset/AssetManagerBufferProvider.d.ts.map +1 -0
  299. package/src/engine/sound/sopra/asset/AssetManagerBufferProvider.js +71 -0
  300. package/src/engine/sound/sopra/asset/BufferProvider.d.ts +24 -0
  301. package/src/engine/sound/sopra/asset/BufferProvider.d.ts.map +1 -0
  302. package/src/engine/sound/sopra/asset/BufferProvider.js +29 -0
  303. package/src/engine/sound/sopra/asset/StubBufferProvider.d.ts +31 -0
  304. package/src/engine/sound/sopra/asset/StubBufferProvider.d.ts.map +1 -0
  305. package/src/engine/sound/sopra/asset/StubBufferProvider.js +58 -0
  306. package/src/engine/sound/sopra/definition/BusDefinition.d.ts +83 -0
  307. package/src/engine/sound/sopra/definition/BusDefinition.d.ts.map +1 -0
  308. package/src/engine/sound/sopra/definition/BusDefinition.js +142 -0
  309. package/src/engine/sound/sopra/definition/BusDefinitionSerializationAdapter.d.ts +17 -0
  310. package/src/engine/sound/sopra/definition/BusDefinitionSerializationAdapter.d.ts.map +1 -0
  311. package/src/engine/sound/sopra/definition/BusDefinitionSerializationAdapter.js +54 -0
  312. package/src/engine/sound/sopra/definition/DuckingRule.d.ts +71 -0
  313. package/src/engine/sound/sopra/definition/DuckingRule.d.ts.map +1 -0
  314. package/src/engine/sound/sopra/definition/DuckingRule.js +106 -0
  315. package/src/engine/sound/sopra/definition/DuckingRuleSerializationAdapter.d.ts +18 -0
  316. package/src/engine/sound/sopra/definition/DuckingRuleSerializationAdapter.d.ts.map +1 -0
  317. package/src/engine/sound/sopra/definition/DuckingRuleSerializationAdapter.js +31 -0
  318. package/src/engine/sound/sopra/definition/EventDescription.d.ts +132 -0
  319. package/src/engine/sound/sopra/definition/EventDescription.d.ts.map +1 -0
  320. package/src/engine/sound/sopra/definition/EventDescription.js +259 -0
  321. package/src/engine/sound/sopra/definition/EventDescriptionSerializationAdapter.d.ts +17 -0
  322. package/src/engine/sound/sopra/definition/EventDescriptionSerializationAdapter.d.ts.map +1 -0
  323. package/src/engine/sound/sopra/definition/EventDescriptionSerializationAdapter.js +71 -0
  324. package/src/engine/sound/sopra/definition/MixerSnapshot.d.ts +51 -0
  325. package/src/engine/sound/sopra/definition/MixerSnapshot.d.ts.map +1 -0
  326. package/src/engine/sound/sopra/definition/MixerSnapshot.js +83 -0
  327. package/src/engine/sound/sopra/definition/MixerSnapshotSerializationAdapter.d.ts +18 -0
  328. package/src/engine/sound/sopra/definition/MixerSnapshotSerializationAdapter.d.ts.map +1 -0
  329. package/src/engine/sound/sopra/definition/MixerSnapshotSerializationAdapter.js +39 -0
  330. package/src/engine/sound/sopra/definition/ParameterDefinition.d.ts +72 -0
  331. package/src/engine/sound/sopra/definition/ParameterDefinition.d.ts.map +1 -0
  332. package/src/engine/sound/sopra/definition/ParameterDefinition.js +117 -0
  333. package/src/engine/sound/sopra/definition/ParameterDefinitionSerializationAdapter.d.ts +18 -0
  334. package/src/engine/sound/sopra/definition/ParameterDefinitionSerializationAdapter.d.ts.map +1 -0
  335. package/src/engine/sound/sopra/definition/ParameterDefinitionSerializationAdapter.js +31 -0
  336. package/src/engine/sound/sopra/definition/SopraPanningModel.d.ts +14 -0
  337. package/src/engine/sound/sopra/definition/SopraPanningModel.d.ts.map +1 -0
  338. package/src/engine/sound/sopra/definition/SopraPanningModel.js +20 -0
  339. package/src/engine/sound/sopra/definition/VoiceStealMode.d.ts +10 -0
  340. package/src/engine/sound/sopra/definition/VoiceStealMode.d.ts.map +1 -0
  341. package/src/engine/sound/sopra/definition/VoiceStealMode.js +18 -0
  342. package/src/engine/sound/sopra/definition/clip/AbstractAudioClip.d.ts +93 -0
  343. package/src/engine/sound/sopra/definition/clip/AbstractAudioClip.d.ts.map +1 -0
  344. package/src/engine/sound/sopra/definition/clip/AbstractAudioClip.js +109 -0
  345. package/src/engine/sound/sopra/definition/clip/BlendContainerAudioClip.d.ts +80 -0
  346. package/src/engine/sound/sopra/definition/clip/BlendContainerAudioClip.d.ts.map +1 -0
  347. package/src/engine/sound/sopra/definition/clip/BlendContainerAudioClip.js +181 -0
  348. package/src/engine/sound/sopra/definition/clip/BlendContainerAudioClipSerializationAdapter.d.ts +17 -0
  349. package/src/engine/sound/sopra/definition/clip/BlendContainerAudioClipSerializationAdapter.d.ts.map +1 -0
  350. package/src/engine/sound/sopra/definition/clip/BlendContainerAudioClipSerializationAdapter.js +74 -0
  351. package/src/engine/sound/sopra/definition/clip/ContainerAudioClip.d.ts +34 -0
  352. package/src/engine/sound/sopra/definition/clip/ContainerAudioClip.d.ts.map +1 -0
  353. package/src/engine/sound/sopra/definition/clip/ContainerAudioClip.js +100 -0
  354. package/src/engine/sound/sopra/definition/clip/RandomContainerAudioClip.d.ts +101 -0
  355. package/src/engine/sound/sopra/definition/clip/RandomContainerAudioClip.d.ts.map +1 -0
  356. package/src/engine/sound/sopra/definition/clip/RandomContainerAudioClip.js +230 -0
  357. package/src/engine/sound/sopra/definition/clip/RandomContainerAudioClipSerializationAdapter.d.ts +17 -0
  358. package/src/engine/sound/sopra/definition/clip/RandomContainerAudioClipSerializationAdapter.d.ts.map +1 -0
  359. package/src/engine/sound/sopra/definition/clip/RandomContainerAudioClipSerializationAdapter.js +54 -0
  360. package/src/engine/sound/sopra/definition/clip/SampleAudioClip.d.ts +103 -0
  361. package/src/engine/sound/sopra/definition/clip/SampleAudioClip.d.ts.map +1 -0
  362. package/src/engine/sound/sopra/definition/clip/SampleAudioClip.js +191 -0
  363. package/src/engine/sound/sopra/definition/clip/SampleAudioClipSerializationAdapter.d.ts +18 -0
  364. package/src/engine/sound/sopra/definition/clip/SampleAudioClipSerializationAdapter.d.ts.map +1 -0
  365. package/src/engine/sound/sopra/definition/clip/SampleAudioClipSerializationAdapter.js +39 -0
  366. package/src/engine/sound/sopra/definition/clip/SequenceContainerAudioClip.d.ts +40 -0
  367. package/src/engine/sound/sopra/definition/clip/SequenceContainerAudioClip.d.ts.map +1 -0
  368. package/src/engine/sound/sopra/definition/clip/SequenceContainerAudioClip.js +91 -0
  369. package/src/engine/sound/sopra/definition/clip/SequenceContainerAudioClipSerializationAdapter.d.ts +17 -0
  370. package/src/engine/sound/sopra/definition/clip/SequenceContainerAudioClipSerializationAdapter.d.ts.map +1 -0
  371. package/src/engine/sound/sopra/definition/clip/SequenceContainerAudioClipSerializationAdapter.js +42 -0
  372. package/src/engine/sound/sopra/definition/clip/SilenceAudioClip.d.ts +44 -0
  373. package/src/engine/sound/sopra/definition/clip/SilenceAudioClip.d.ts.map +1 -0
  374. package/src/engine/sound/sopra/definition/clip/SilenceAudioClip.js +77 -0
  375. package/src/engine/sound/sopra/definition/clip/SilenceAudioClipSerializationAdapter.d.ts +18 -0
  376. package/src/engine/sound/sopra/definition/clip/SilenceAudioClipSerializationAdapter.d.ts.map +1 -0
  377. package/src/engine/sound/sopra/definition/clip/SilenceAudioClipSerializationAdapter.js +27 -0
  378. package/src/engine/sound/sopra/definition/clip/SwitchContainerAudioClip.d.ts +65 -0
  379. package/src/engine/sound/sopra/definition/clip/SwitchContainerAudioClip.d.ts.map +1 -0
  380. package/src/engine/sound/sopra/definition/clip/SwitchContainerAudioClip.js +131 -0
  381. package/src/engine/sound/sopra/definition/clip/SwitchContainerAudioClipSerializationAdapter.d.ts +17 -0
  382. package/src/engine/sound/sopra/definition/clip/SwitchContainerAudioClipSerializationAdapter.d.ts.map +1 -0
  383. package/src/engine/sound/sopra/definition/clip/SwitchContainerAudioClipSerializationAdapter.js +41 -0
  384. package/src/engine/sound/sopra/definition/effect/AbstractAudioEffect.d.ts +24 -0
  385. package/src/engine/sound/sopra/definition/effect/AbstractAudioEffect.d.ts.map +1 -0
  386. package/src/engine/sound/sopra/definition/effect/AbstractAudioEffect.js +24 -0
  387. package/src/engine/sound/sopra/definition/effect/CompressorEffect.d.ts +70 -0
  388. package/src/engine/sound/sopra/definition/effect/CompressorEffect.d.ts.map +1 -0
  389. package/src/engine/sound/sopra/definition/effect/CompressorEffect.js +120 -0
  390. package/src/engine/sound/sopra/definition/effect/CompressorEffectSerializationAdapter.d.ts +18 -0
  391. package/src/engine/sound/sopra/definition/effect/CompressorEffectSerializationAdapter.d.ts.map +1 -0
  392. package/src/engine/sound/sopra/definition/effect/CompressorEffectSerializationAdapter.js +31 -0
  393. package/src/engine/sound/sopra/definition/effect/EqEffect.d.ts +74 -0
  394. package/src/engine/sound/sopra/definition/effect/EqEffect.d.ts.map +1 -0
  395. package/src/engine/sound/sopra/definition/effect/EqEffect.js +128 -0
  396. package/src/engine/sound/sopra/definition/effect/EqEffectSerializationAdapter.d.ts +18 -0
  397. package/src/engine/sound/sopra/definition/effect/EqEffectSerializationAdapter.d.ts.map +1 -0
  398. package/src/engine/sound/sopra/definition/effect/EqEffectSerializationAdapter.js +29 -0
  399. package/src/engine/sound/sopra/definition/effect/ReverbEffect.d.ts +49 -0
  400. package/src/engine/sound/sopra/definition/effect/ReverbEffect.d.ts.map +1 -0
  401. package/src/engine/sound/sopra/definition/effect/ReverbEffect.js +101 -0
  402. package/src/engine/sound/sopra/definition/effect/ReverbEffectSerializationAdapter.d.ts +18 -0
  403. package/src/engine/sound/sopra/definition/effect/ReverbEffectSerializationAdapter.d.ts.map +1 -0
  404. package/src/engine/sound/sopra/definition/effect/ReverbEffectSerializationAdapter.js +25 -0
  405. package/src/engine/sound/sopra/legacy/soundEmitterToEventDescription.d.ts +31 -0
  406. package/src/engine/sound/sopra/legacy/soundEmitterToEventDescription.d.ts.map +1 -0
  407. package/src/engine/sound/sopra/legacy/soundEmitterToEventDescription.js +106 -0
  408. package/src/engine/sound/sopra/runtime/BusGraph.d.ts +79 -0
  409. package/src/engine/sound/sopra/runtime/BusGraph.d.ts.map +1 -0
  410. package/src/engine/sound/sopra/runtime/BusGraph.js +227 -0
  411. package/src/engine/sound/sopra/runtime/EventInstance.d.ts +144 -0
  412. package/src/engine/sound/sopra/runtime/EventInstance.d.ts.map +1 -0
  413. package/src/engine/sound/sopra/runtime/EventInstance.js +579 -0
  414. package/src/engine/sound/sopra/runtime/ParameterStore.d.ts +42 -0
  415. package/src/engine/sound/sopra/runtime/ParameterStore.d.ts.map +1 -0
  416. package/src/engine/sound/sopra/runtime/ParameterStore.js +98 -0
  417. package/src/engine/sound/sopra/runtime/SopraPlaybackContext.d.ts +42 -0
  418. package/src/engine/sound/sopra/runtime/SopraPlaybackContext.d.ts.map +1 -0
  419. package/src/engine/sound/sopra/runtime/SopraPlaybackContext.js +68 -0
  420. package/src/engine/sound/sopra/runtime/Voice.d.ts +67 -0
  421. package/src/engine/sound/sopra/runtime/Voice.d.ts.map +1 -0
  422. package/src/engine/sound/sopra/runtime/Voice.js +145 -0
  423. package/src/engine/sound/sopra/runtime/VoiceManager.d.ts +38 -0
  424. package/src/engine/sound/sopra/runtime/VoiceManager.d.ts.map +1 -0
  425. package/src/engine/sound/sopra/runtime/VoiceManager.js +136 -0
  426. package/src/engine/sound/sopra/runtime/VoicePool.d.ts +12 -0
  427. package/src/engine/sound/sopra/runtime/VoicePool.d.ts.map +1 -0
  428. package/src/engine/sound/sopra/runtime/VoicePool.js +17 -0
  429. package/src/engine/sound/sopra/serialization/populateSopraSerializationRegistry.d.ts +11 -0
  430. package/src/engine/sound/sopra/serialization/populateSopraSerializationRegistry.d.ts.map +1 -0
  431. package/src/engine/sound/sopra/serialization/populateSopraSerializationRegistry.js +42 -0
  432. package/src/engine/sound/sopra/serialization/sopraJSON.d.ts +33 -0
  433. package/src/engine/sound/sopra/serialization/sopraJSON.d.ts.map +1 -0
  434. package/src/engine/sound/sopra/serialization/sopraJSON.js +99 -0
  435. package/src/engine/sound/sopra/serialization/sopraSerializationHarness.d.ts +27 -0
  436. package/src/engine/sound/sopra/serialization/sopraSerializationHarness.d.ts.map +1 -0
  437. package/src/engine/sound/sopra/serialization/sopraSerializationHarness.js +49 -0
  438. package/src/engine/sound/sopra/util/MockAudioContext.d.ts +74 -0
  439. package/src/engine/sound/sopra/util/MockAudioContext.d.ts.map +1 -0
  440. package/src/engine/sound/sopra/util/MockAudioContext.js +215 -0
  441. package/src/engine/sound/sopra/util/buildAttenuationCurve.d.ts +15 -0
  442. package/src/engine/sound/sopra/util/buildAttenuationCurve.d.ts.map +1 -0
  443. package/src/engine/sound/sopra/util/buildAttenuationCurve.js +40 -0
  444. package/src/engine/sound/sopra/util/fadeOutAndStop.d.ts +34 -0
  445. package/src/engine/sound/sopra/util/fadeOutAndStop.d.ts.map +1 -0
  446. package/src/engine/sound/sopra/util/fadeOutAndStop.js +60 -0
  447. package/src/engine/sound/volume2dB.d.ts +1 -1
  448. package/src/engine/sound/volume2dB.d.ts.map +1 -1
  449. package/src/engine/sound/volume2dB.js +1 -1
  450. package/src/engine/graphics/sh3/path_tracer/sampling/v3_orthonormal_matrix_from_normal.d.ts.map +0 -1
  451. package/src/engine/physics/narrowphase/ray_shapes.d.ts +0 -66
  452. package/src/engine/physics/narrowphase/ray_shapes.d.ts.map +0 -1
  453. package/src/engine/physics/narrowphase/ray_shapes.js +0 -187
  454. package/src/engine/sound/ecs/emitter/SoundEmitterChannel.d.ts +0 -23
  455. package/src/engine/sound/ecs/emitter/SoundEmitterChannel.d.ts.map +0 -1
  456. package/src/engine/sound/ecs/emitter/SoundEmitterChannel.js +0 -32
  457. package/src/engine/sound/ecs/emitter/SoundTrackNodes.d.ts +0 -18
  458. package/src/engine/sound/ecs/emitter/SoundTrackNodes.d.ts.map +0 -1
  459. package/src/engine/sound/ecs/emitter/SoundTrackNodes.js +0 -18
  460. package/src/engine/sound/sopra/AbstractAudioClip.d.ts +0 -26
  461. package/src/engine/sound/sopra/AbstractAudioClip.d.ts.map +0 -1
  462. package/src/engine/sound/sopra/AbstractAudioClip.js +0 -29
  463. package/src/engine/sound/sopra/ContainerAudioClip.d.ts +0 -12
  464. package/src/engine/sound/sopra/ContainerAudioClip.d.ts.map +0 -1
  465. package/src/engine/sound/sopra/ContainerAudioClip.js +0 -13
  466. package/src/engine/sound/sopra/RandomContainerAudioClip.d.ts +0 -12
  467. package/src/engine/sound/sopra/RandomContainerAudioClip.d.ts.map +0 -1
  468. package/src/engine/sound/sopra/RandomContainerAudioClip.js +0 -15
  469. package/src/engine/sound/sopra/SequenceContainerAudioClip.d.ts +0 -7
  470. package/src/engine/sound/sopra/SequenceContainerAudioClip.d.ts.map +0 -1
  471. package/src/engine/sound/sopra/SequenceContainerAudioClip.js +0 -8
  472. package/src/engine/sound/sopra/SilenceAudioClip.d.ts +0 -13
  473. package/src/engine/sound/sopra/SilenceAudioClip.d.ts.map +0 -1
  474. package/src/engine/sound/sopra/SilenceAudioClip.js +0 -15
  475. /package/src/{engine/graphics/sh3/path_tracer/sampling → core/geom/vec3}/v3_orthonormal_matrix_from_normal.d.ts +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"StaticR2Tree.d.ts","sourceRoot":"","sources":["../../../../../../src/core/geom/2d/r-tree/StaticR2Tree.js"],"names":[],"mappings":"AAoEA;;;GAGG;AACH;IAEI;;;OAGG;IACH,sBAAc;IAEd;;;;OAIG;IACH,+BAAc;IAEd;;;;OAIG;IACH,4BAAwB;IAExB;;;;OAIG;IACH,0BAAsB;IAOtB;;;OAGG;IACH,kBAFW,WAAW,QASrB;IAFG,6BAA0D;IAK9D,6BASC;IAED;;;OAGG;IACH,oBAFW,MAAM,QAchB;IAGD;;;;;;;;OAQG;IACH,mBAPW,MAAM,WACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,QAwBhB;IAED;;;OAGG;IACH,uBAFa,MAAM,CAIlB;IAED;;;;OAIG;IACH,4BAHW,MAAM,GACJ,MAAM,CAQlB;IAGD;;;OAGG;IACH,oBAFW,MAAM,EAAE,QAgFlB;IAED;;;;;OAKG;IACH,sBAYC;IAED;;OAEG;IACH,cAsEC;CACJ"}
1
+ {"version":3,"file":"StaticR2Tree.d.ts","sourceRoot":"","sources":["../../../../../../src/core/geom/2d/r-tree/StaticR2Tree.js"],"names":[],"mappings":"AAoEA;;;GAGG;AACH;IAEI;;;OAGG;IACH,sBAAc;IAEd;;;;OAIG;IACH,+BAAc;IAEd;;;;OAIG;IACH,4BAAwB;IAExB;;;;OAIG;IACH,0BAAsB;IAOtB;;;OAGG;IACH,kBAFW,WAAW,QASrB;IAFG,6BAA0D;IAK9D,6BASC;IAED;;;OAGG;IACH,oBAFW,MAAM,QAchB;IAGD;;;;;;;;OAQG;IACH,mBAPW,MAAM,WACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,QAwBhB;IAED;;;OAGG;IACH,uBAFa,MAAM,CAIlB;IAED;;;;OAIG;IACH,4BAHW,MAAM,GACJ,MAAM,CAQlB;IAGD;;;OAGG;IACH,oBAFW,MAAM,EAAE,QAgFlB;IAED;;;;;OAKG;IACH,sBAYC;IAED;;OAEG;IACH,cAuEC;CACJ"}
@@ -28,8 +28,8 @@ function build_normalized_morton_2d(
28
28
 
29
29
  const x0 = data[address];
30
30
  const y0 = data[address + 1];
31
- const x1 = data[address + 3];
32
- const y1 = data[address + 4];
31
+ const x1 = data[address + 2];
32
+ const y1 = data[address + 3];
33
33
 
34
34
  const cx = (x0 + x1) * 0.5;
35
35
  const cy = (y0 + y1) * 0.5;
@@ -345,8 +345,9 @@ export class StaticR2Tree {
345
345
  float32, leaf_offset_1
346
346
  );
347
347
  } else if (leaf_index_0 < node_count_leaf) {
348
- // only left child node is valid
349
- array_copy(float32, leaf_offset_0, float32, offset, 6);
348
+ // only left child node is valid; a 2D box is 4 floats [x0,y0,x1,y1] (copying 6 would spill into
349
+ // the following node's data)
350
+ array_copy(float32, leaf_offset_0, float32, offset, 4);
350
351
  } else {
351
352
  //initialize to 0-size box same position as previous node
352
353
  copy_box_zero_size(this.__data_float32, offset, (offset - BINARY_NODE_SIZE));
@@ -1 +1 @@
1
- {"version":3,"file":"aabb3_detailed_volume_intersection.d.ts","sourceRoot":"","sources":["../../../../../../src/core/geom/3d/aabb/aabb3_detailed_volume_intersection.js"],"names":[],"mappings":"AA8CA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,gEAbW,MAAM,EAAE,sBACR,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,cAEN,MAAM,UADN,MAAM,EAAE,eAER,MAAM,GACJ,MAAM,CAqOlB"}
1
+ {"version":3,"file":"aabb3_detailed_volume_intersection.d.ts","sourceRoot":"","sources":["../../../../../../src/core/geom/3d/aabb/aabb3_detailed_volume_intersection.js"],"names":[],"mappings":"AA8CA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,gEAbW,MAAM,EAAE,sBACR,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,cAEN,MAAM,UADN,MAAM,EAAE,eAER,MAAM,GACJ,MAAM,CAyOlB"}
@@ -242,47 +242,51 @@ export function aabb3_detailed_volume_intersection(
242
242
  const aabb_plane_nz = scratch_aabb_planes[aabb_plane_address + 2];
243
243
  const aabb_plane_constant = scratch_aabb_planes[aabb_plane_address + 3];
244
244
 
245
- for (let frustum_plane_index = 0; frustum_plane_index < 4; frustum_plane_index++) {
245
+ // The 4 frustum side-edges are each the intersection of one +/-x plane (index 0 or 1) with one +/-y
246
+ // plane (index 2 or 3). The previous (i, (i+2)%4) pairing produced only 2 of those 4 edges, each twice
247
+ // (missing the +x/-y and -x/+y edges), so AABB-vs-edge contact points on those edges were never found.
248
+ // Enumerate all four non-parallel pairs explicitly.
249
+ for (let pa = 0; pa < 2; pa++) {
246
250
 
247
- const plane_bit_mask = 1 << frustum_plane_index;
248
-
249
- if ((plane_mask & plane_bit_mask) === 0) {
250
- // non-intersecting plane, ignore
251
+ if ((plane_mask & (1 << pa)) === 0) {
251
252
  continue;
252
253
  }
253
254
 
254
- const cp_0 = frustum_plane_index * 4;
255
-
256
- const next_orthogonal_plane_index = (frustum_plane_index + 2) % 4;
257
- const cp_1 = next_orthogonal_plane_index * 4;
255
+ const cp_0 = pa * 4;
258
256
 
259
- const intersection_exists = plane3_compute_convex_3_plane_intersection(
260
- scratch_v3_array, 0,
261
- aabb_plane_nx, aabb_plane_ny, aabb_plane_nz, aabb_plane_constant,
262
- planes[cp_0], planes[cp_0 + 1], planes[cp_0 + 2], planes[cp_0 + 3],
263
- planes[cp_1], planes[cp_1 + 1], planes[cp_1 + 2], planes[cp_1 + 3]
264
- );
257
+ for (let pb = 2; pb < 4; pb++) {
265
258
 
266
- if (intersection_exists) {
259
+ if ((plane_mask & (1 << pb)) === 0) {
260
+ continue;
261
+ }
267
262
 
268
- const intersection_point_x = scratch_v3_array[0];
269
- const intersection_point_y = scratch_v3_array[1];
270
- const intersection_point_z = scratch_v3_array[2];
263
+ const cp_1 = pb * 4;
271
264
 
272
- const point_within_box = !(
273
- (intersection_point_x + EPSILON) < x0 || (intersection_point_x - EPSILON) > x1
274
- || (intersection_point_y + EPSILON) < y0 || (intersection_point_y - EPSILON) > y1
275
- || (intersection_point_z + EPSILON) < z0 || (intersection_point_z - EPSILON) > z1
265
+ const intersection_exists = plane3_compute_convex_3_plane_intersection(
266
+ scratch_v3_array, 0,
267
+ aabb_plane_nx, aabb_plane_ny, aabb_plane_nz, aabb_plane_constant,
268
+ planes[cp_0], planes[cp_0 + 1], planes[cp_0 + 2], planes[cp_0 + 3],
269
+ planes[cp_1], planes[cp_1 + 1], planes[cp_1 + 2], planes[cp_1 + 3]
276
270
  );
277
271
 
278
- if (point_within_box) {
279
- // point is within the AABB bounds
272
+ if (intersection_exists) {
273
+
274
+ const intersection_point_x = scratch_v3_array[0];
275
+ const intersection_point_y = scratch_v3_array[1];
276
+ const intersection_point_z = scratch_v3_array[2];
280
277
 
281
- // ThreeClippingPlaneComputingBVHVisitor.DEBUG_POINTS_2.send3(scratch_v3.x, scratch_v3.y, scratch_v3.z);
278
+ const point_within_box = !(
279
+ (intersection_point_x + EPSILON) < x0 || (intersection_point_x - EPSILON) > x1
280
+ || (intersection_point_y + EPSILON) < y0 || (intersection_point_y - EPSILON) > y1
281
+ || (intersection_point_z + EPSILON) < z0 || (intersection_point_z - EPSILON) > z1
282
+ );
282
283
 
283
- destination[destination_cursor++] = intersection_point_x;
284
- destination[destination_cursor++] = intersection_point_y;
285
- destination[destination_cursor++] = intersection_point_z;
284
+ if (point_within_box) {
285
+ // point is within the AABB bounds
286
+ destination[destination_cursor++] = intersection_point_x;
287
+ destination[destination_cursor++] = intersection_point_y;
288
+ destination[destination_cursor++] = intersection_point_z;
289
+ }
286
290
  }
287
291
  }
288
292
  }
@@ -1 +1 @@
1
- {"version":3,"file":"aabb3_near_distance_to_intersection_ray_segment.d.ts","sourceRoot":"","sources":["../../../../../../src/core/geom/3d/aabb/aabb3_near_distance_to_intersection_ray_segment.js"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;;GAiBG;AACH,oEAhBW,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,YACN,MAAM,YACN,MAAM,YACN,MAAM,mBACN,MAAM,mBACN,MAAM,mBACN,MAAM,gBACN,MAAM,gBACN,MAAM,GACJ,MAAM,CAgDlB"}
1
+ {"version":3,"file":"aabb3_near_distance_to_intersection_ray_segment.d.ts","sourceRoot":"","sources":["../../../../../../src/core/geom/3d/aabb/aabb3_near_distance_to_intersection_ray_segment.js"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;;GAiBG;AACH,oEAhBW,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,YACN,MAAM,YACN,MAAM,YACN,MAAM,mBACN,MAAM,mBACN,MAAM,mBACN,MAAM,gBACN,MAAM,gBACN,MAAM,GACJ,MAAM,CAkDlB"}
@@ -59,7 +59,9 @@ export function aabb3_near_distance_to_intersection_ray_segment(
59
59
  const t_box_min = Math.max(t_min_x, t_min_y, t_min_z, min_distance);
60
60
  const t_box_max = Math.min(t_max_x, t_max_y, t_max_z, max_distance);
61
61
 
62
- if (t_box_min > t_box_max) {
62
+ // Negated `<=` so a NaN bound (ray parallel to a slab with the origin exactly on that slab's face) is
63
+ // treated as a miss; `t_box_min > t_box_max` would be false for NaN and leak NaN out as the result.
64
+ if (!(t_box_min <= t_box_max)) {
63
65
  // signal a miss
64
66
  return Infinity;
65
67
  }
@@ -1 +1 @@
1
- {"version":3,"file":"aabb3_signed_distance_to_aabb3.d.ts","sourceRoot":"","sources":["../../../../../../src/core/geom/3d/aabb/aabb3_signed_distance_to_aabb3.js"],"names":[],"mappings":"AAAA,+KA2BC"}
1
+ {"version":3,"file":"aabb3_signed_distance_to_aabb3.d.ts","sourceRoot":"","sources":["../../../../../../src/core/geom/3d/aabb/aabb3_signed_distance_to_aabb3.js"],"names":[],"mappings":"AAAA,+KA8BC"}
@@ -16,13 +16,16 @@ export function aabb3_signed_distance_to_aabb3(
16
16
  const dy = Math.max(yp0, yp1);
17
17
  const dz = Math.max(zp0, zp1);
18
18
 
19
- //straight-line distance
20
- let distance = Math.sqrt(dx * dx + dy * dy + dz * dz);
21
-
22
19
  if (dx < 0 && dy < 0 && dz < 0) {
23
- //penetration
24
- return -distance;
25
- } else {
26
- return distance;
20
+ //penetration: boxes overlap on every axis
21
+ return -Math.sqrt(dx * dx + dy * dy + dz * dz);
27
22
  }
23
+
24
+ // Separated on at least one axis. Only the positive (separating) components contribute to the gap;
25
+ // a negative component means the boxes already overlap on that axis and must not inflate the distance.
26
+ const sx = dx > 0 ? dx : 0;
27
+ const sy = dy > 0 ? dy : 0;
28
+ const sz = dz > 0 ? dz : 0;
29
+
30
+ return Math.sqrt(sx * sx + sy * sy + sz * sz);
28
31
  }
@@ -1 +1 @@
1
- {"version":3,"file":"aabb3_transformed_compute_plane_side.d.ts","sourceRoot":"","sources":["../../../../../../src/core/geom/3d/aabb/aabb3_transformed_compute_plane_side.js"],"names":[],"mappings":"AAMA;;;;;;;;;;;;;;;GAeG;AACH,yDAbW,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,kBACN,MAAM,kBACN,MAAM,kBACN,MAAM,gBACN,MAAM,oBACN,MAAM,EAAE,GAAC,YAAY,GACnB,MAAM,CA8ClB"}
1
+ {"version":3,"file":"aabb3_transformed_compute_plane_side.d.ts","sourceRoot":"","sources":["../../../../../../src/core/geom/3d/aabb/aabb3_transformed_compute_plane_side.js"],"names":[],"mappings":"AAMA;;;;;;;;;;;;;;;GAeG;AACH,yDAbW,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,kBACN,MAAM,kBACN,MAAM,kBACN,MAAM,gBACN,MAAM,oBACN,MAAM,EAAE,GAAC,YAAY,GACnB,MAAM,CAmElB"}
@@ -1,8 +1,8 @@
1
1
  import {v3_distance_above_plane} from "../../vec3/v3_distance_above_plane.js";
2
2
  import {aabb3_build_corners} from "./aabb3_build_corners.js";
3
- import {aabb3_matrix4_project_by_corners} from "./aabb3_matrix4_project_by_corners.js";
4
3
 
5
4
  const scratch_corners = new Float32Array(24);
5
+ const scratch_transformed = new Float32Array(24);
6
6
 
7
7
  /**
8
8
  * Figure out which side of a plane an Axis-Aligned Bounding Box lies, after applying transform matrix to it
@@ -33,19 +33,40 @@ export function aabb3_transformed_compute_plane_side(
33
33
  x0, y0, z0, x1, y1, z1
34
34
  );
35
35
 
36
- aabb3_matrix4_project_by_corners(
37
- scratch_corners,
38
- scratch_corners,
39
- transform_matrix
40
- );
36
+ // Transform all 8 corners by the matrix, keeping each transformed corner. We intentionally do NOT use
37
+ // aabb3_matrix4_project_by_corners here: it re-bounds the transformed corners down to a single 6-value
38
+ // AABB written back into the same buffer, which would leave 6 of the 8 classification slots holding stale,
39
+ // untransformed corners.
40
+ const m0 = transform_matrix[0], m1 = transform_matrix[1], m2 = transform_matrix[2], m3 = transform_matrix[3];
41
+ const m4 = transform_matrix[4], m5 = transform_matrix[5], m6 = transform_matrix[6], m7 = transform_matrix[7];
42
+ const m8 = transform_matrix[8], m9 = transform_matrix[9], m10 = transform_matrix[10], m11 = transform_matrix[11];
43
+ const m12 = transform_matrix[12], m13 = transform_matrix[13], m14 = transform_matrix[14], m15 = transform_matrix[15];
44
+
45
+ for (let i = 0; i < 24; i += 3) {
46
+ const _x = scratch_corners[i];
47
+ const _y = scratch_corners[i + 1];
48
+ const _z = scratch_corners[i + 2];
49
+
50
+ const t_x = m0 * _x + m4 * _y + m8 * _z + m12;
51
+ const t_y = m1 * _x + m5 * _y + m9 * _z + m13;
52
+ const t_z = m2 * _x + m6 * _y + m10 * _z + m14;
53
+ const t_w = m3 * _x + m7 * _y + m11 * _z + m15;
54
+
55
+ // perspective divide; harmless (w === 1) for the affine model matrices this is called with.
56
+ const d = 1 / t_w;
57
+
58
+ scratch_transformed[i] = t_x * d;
59
+ scratch_transformed[i + 1] = t_y * d;
60
+ scratch_transformed[i + 2] = t_z * d;
61
+ }
41
62
 
42
63
  let has_above = false, has_below = false;
43
64
 
44
65
  for (let i = 0; i < 8; i++) {
45
66
  const i3 = i * 3;
46
- const x = scratch_corners[i3];
47
- const y = scratch_corners[i3 + 1];
48
- const z = scratch_corners[i3 + 2];
67
+ const x = scratch_transformed[i3];
68
+ const y = scratch_transformed[i3 + 1];
69
+ const z = scratch_transformed[i3 + 2];
49
70
 
50
71
  if (v3_distance_above_plane(x, y, z, plane_normal_x, plane_normal_y, plane_normal_z, plane_offset)) {
51
72
  has_above = true;
@@ -1,5 +1,5 @@
1
- import {min2} from "../../../math/min2.js";
2
- import {max2} from "../../../math/max2.js";
1
+ import { max2 } from "../../../math/max2.js";
2
+ import { min2 } from "../../../math/min2.js";
3
3
 
4
4
  /**
5
5
  * Multidimensional axis-aligned bounding box calculation
@@ -27,7 +27,7 @@ export function compute_aabb_from_points(
27
27
 
28
28
  for (i = 0; i < input_count; i++) {
29
29
 
30
- const offset_0 = input_count + i * d;
30
+ const offset_0 = input_offset + i * d;
31
31
 
32
32
  for (j = 0; j < d; j++) {
33
33
  const v = input[offset_0 + j];
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Ray ↔ box intersection in the box's LOCAL frame: an axis-aligned box centred
3
+ * at the origin spanning `[−hx,hx] × [−hy,hy] × [−hz,hz]` — the canonical pose of
4
+ * `BoxShape3D` (an oriented box transformed into its own frame). Slab method.
5
+ * Returns the hit distance `t` and writes the outward unit FACE normal into
6
+ * `outNormal[outOffset .. outOffset+2]`.
7
+ *
8
+ * Conventions (shared with {@link sphere_raycast} / {@link capsule_raycast}):
9
+ * - the ray direction is assumed UNIT length, so `t` is a true distance;
10
+ * - the first crossing at or after the origin within `tMax` is returned; a ray
11
+ * starting INSIDE the box returns its exit face;
12
+ * - on a miss the function returns `Infinity` and leaves `outNormal` untouched.
13
+ *
14
+ * Distinct from {@link aabb3_raycast}, which takes an arbitrary min/max box and
15
+ * returns a boolean + hit POSITION + a quantized normal. This one serves the
16
+ * raycast/narrowphase need: the entry distance, the EXACT face normal, `tMax`
17
+ * clamping, and origin-inside handling.
18
+ *
19
+ * @param {Float64Array|number[]} outNormal destination for the unit normal
20
+ * @param {number} outOffset offset into `outNormal` (3 floats are written)
21
+ * @param {number} ox ray origin x (local)
22
+ * @param {number} oy ray origin y (local)
23
+ * @param {number} oz ray origin z (local)
24
+ * @param {number} dx ray direction x (local, unit)
25
+ * @param {number} dy ray direction y (local, unit)
26
+ * @param {number} dz ray direction z (local, unit)
27
+ * @param {number} tMax maximum ray distance
28
+ * @param {number} hx half-extent along x
29
+ * @param {number} hy half-extent along y
30
+ * @param {number} hz half-extent along z
31
+ * @returns {number} hit distance `t`, or `Infinity` on a miss
32
+ *
33
+ * @author Alex Goldring
34
+ * @copyright Company Named Limited (c) 2026
35
+ */
36
+ export function box3_raycast(outNormal: Float64Array | number[], outOffset: number, ox: number, oy: number, oz: number, dx: number, dy: number, dz: number, tMax: number, hx: number, hy: number, hz: number): number;
37
+ //# sourceMappingURL=box3_raycast.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"box3_raycast.d.ts","sourceRoot":"","sources":["../../../../../../src/core/geom/3d/box/box3_raycast.js"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,wCAjBW,YAAY,GAAC,MAAM,EAAE,aACrB,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,QACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,GACJ,MAAM,CAkDlB"}
@@ -0,0 +1,81 @@
1
+ /**
2
+ * Ray ↔ box intersection in the box's LOCAL frame: an axis-aligned box centred
3
+ * at the origin spanning `[−hx,hx] × [−hy,hy] × [−hz,hz]` — the canonical pose of
4
+ * `BoxShape3D` (an oriented box transformed into its own frame). Slab method.
5
+ * Returns the hit distance `t` and writes the outward unit FACE normal into
6
+ * `outNormal[outOffset .. outOffset+2]`.
7
+ *
8
+ * Conventions (shared with {@link sphere_raycast} / {@link capsule_raycast}):
9
+ * - the ray direction is assumed UNIT length, so `t` is a true distance;
10
+ * - the first crossing at or after the origin within `tMax` is returned; a ray
11
+ * starting INSIDE the box returns its exit face;
12
+ * - on a miss the function returns `Infinity` and leaves `outNormal` untouched.
13
+ *
14
+ * Distinct from {@link aabb3_raycast}, which takes an arbitrary min/max box and
15
+ * returns a boolean + hit POSITION + a quantized normal. This one serves the
16
+ * raycast/narrowphase need: the entry distance, the EXACT face normal, `tMax`
17
+ * clamping, and origin-inside handling.
18
+ *
19
+ * @param {Float64Array|number[]} outNormal destination for the unit normal
20
+ * @param {number} outOffset offset into `outNormal` (3 floats are written)
21
+ * @param {number} ox ray origin x (local)
22
+ * @param {number} oy ray origin y (local)
23
+ * @param {number} oz ray origin z (local)
24
+ * @param {number} dx ray direction x (local, unit)
25
+ * @param {number} dy ray direction y (local, unit)
26
+ * @param {number} dz ray direction z (local, unit)
27
+ * @param {number} tMax maximum ray distance
28
+ * @param {number} hx half-extent along x
29
+ * @param {number} hy half-extent along y
30
+ * @param {number} hz half-extent along z
31
+ * @returns {number} hit distance `t`, or `Infinity` on a miss
32
+ *
33
+ * @author Alex Goldring
34
+ * @copyright Company Named Limited (c) 2026
35
+ */
36
+ export function box3_raycast(outNormal, outOffset, ox, oy, oz, dx, dy, dz, tMax, hx, hy, hz) {
37
+ let tmin = -Infinity, tmax = Infinity;
38
+ let enterAxis = 0, enterSign = 0, exitAxis = 0, exitSign = 0;
39
+
40
+ // X slab.
41
+ if (dx !== 0) {
42
+ const inv = 1 / dx;
43
+ let tn = (-hx - ox) * inv, tf = (hx - ox) * inv, nsign = -1;
44
+ if (tn > tf) { const tmp = tn; tn = tf; tf = tmp; nsign = 1; }
45
+ if (tn > tmin) { tmin = tn; enterAxis = 0; enterSign = nsign; }
46
+ if (tf < tmax) { tmax = tf; exitAxis = 0; exitSign = -nsign; }
47
+ } else if (ox < -hx || ox > hx) {
48
+ return Infinity;
49
+ }
50
+ // Y slab.
51
+ if (dy !== 0) {
52
+ const inv = 1 / dy;
53
+ let tn = (-hy - oy) * inv, tf = (hy - oy) * inv, nsign = -1;
54
+ if (tn > tf) { const tmp = tn; tn = tf; tf = tmp; nsign = 1; }
55
+ if (tn > tmin) { tmin = tn; enterAxis = 1; enterSign = nsign; }
56
+ if (tf < tmax) { tmax = tf; exitAxis = 1; exitSign = -nsign; }
57
+ } else if (oy < -hy || oy > hy) {
58
+ return Infinity;
59
+ }
60
+ // Z slab.
61
+ if (dz !== 0) {
62
+ const inv = 1 / dz;
63
+ let tn = (-hz - oz) * inv, tf = (hz - oz) * inv, nsign = -1;
64
+ if (tn > tf) { const tmp = tn; tn = tf; tf = tmp; nsign = 1; }
65
+ if (tn > tmin) { tmin = tn; enterAxis = 2; enterSign = nsign; }
66
+ if (tf < tmax) { tmax = tf; exitAxis = 2; exitSign = -nsign; }
67
+ } else if (oz < -hz || oz > hz) {
68
+ return Infinity;
69
+ }
70
+
71
+ if (tmax < tmin || tmax < 0) return Infinity;
72
+
73
+ let t, axis, sign;
74
+ if (tmin >= 0) { t = tmin; axis = enterAxis; sign = enterSign; }
75
+ else { t = tmax; axis = exitAxis; sign = exitSign; } // origin inside the box
76
+
77
+ if (t > tMax) return Infinity;
78
+ outNormal[outOffset] = 0; outNormal[outOffset + 1] = 0; outNormal[outOffset + 2] = 0;
79
+ outNormal[outOffset + axis] = sign;
80
+ return t;
81
+ }
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Ray ↔ capsule intersection in the capsule's LOCAL frame: a capsule along the
3
+ * local Y axis — a cylinder of radius `r` over `y ∈ [−hh, hh]` capped by
4
+ * hemispheres of radius `r` at `(0, ±hh, 0)` — the canonical pose of
5
+ * `CapsuleShape3D` (`hh = height / 2`). Tests the infinite cylinder (clamped to
6
+ * the segment) and the two cap spheres, taking the nearest valid crossing.
7
+ * Returns the hit distance `t` and writes the outward unit surface normal into
8
+ * `outNormal[outOffset .. outOffset+2]`.
9
+ *
10
+ * Conventions (shared with {@link sphere_raycast} / {@link box3_raycast}):
11
+ * - the ray direction is assumed UNIT length, so `t` is a true distance;
12
+ * - the first surface crossing at or after the origin within `tMax` is returned;
13
+ * - on a miss the function returns `Infinity` and leaves `outNormal` untouched.
14
+ *
15
+ * No prior ray-vs-capsule primitive existed in `core/geom`; this fills that gap
16
+ * (useful for picking, sensors, and the raycast narrowphase).
17
+ *
18
+ * @param {Float64Array|number[]} outNormal destination for the unit normal
19
+ * @param {number} outOffset offset into `outNormal` (3 floats are written)
20
+ * @param {number} ox ray origin x (local)
21
+ * @param {number} oy ray origin y (local)
22
+ * @param {number} oz ray origin z (local)
23
+ * @param {number} dx ray direction x (local, unit)
24
+ * @param {number} dy ray direction y (local, unit)
25
+ * @param {number} dz ray direction z (local, unit)
26
+ * @param {number} tMax maximum ray distance
27
+ * @param {number} r capsule radius
28
+ * @param {number} hh half-height of the cylindrical section (`height / 2`)
29
+ * @returns {number} hit distance `t`, or `Infinity` on a miss
30
+ *
31
+ * @author Alex Goldring
32
+ * @copyright Company Named Limited (c) 2026
33
+ */
34
+ export function capsule_raycast(outNormal: Float64Array | number[], outOffset: number, ox: number, oy: number, oz: number, dx: number, dy: number, dz: number, tMax: number, r: number, hh: number): number;
35
+ //# sourceMappingURL=capsule_raycast.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capsule_raycast.d.ts","sourceRoot":"","sources":["../../../../../../src/core/geom/3d/capsule/capsule_raycast.js"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,2CAhBW,YAAY,GAAC,MAAM,EAAE,aACrB,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,QACN,MAAM,KACN,MAAM,MACN,MAAM,GACJ,MAAM,CAgElB"}
@@ -0,0 +1,93 @@
1
+ /**
2
+ * Ray ↔ capsule intersection in the capsule's LOCAL frame: a capsule along the
3
+ * local Y axis — a cylinder of radius `r` over `y ∈ [−hh, hh]` capped by
4
+ * hemispheres of radius `r` at `(0, ±hh, 0)` — the canonical pose of
5
+ * `CapsuleShape3D` (`hh = height / 2`). Tests the infinite cylinder (clamped to
6
+ * the segment) and the two cap spheres, taking the nearest valid crossing.
7
+ * Returns the hit distance `t` and writes the outward unit surface normal into
8
+ * `outNormal[outOffset .. outOffset+2]`.
9
+ *
10
+ * Conventions (shared with {@link sphere_raycast} / {@link box3_raycast}):
11
+ * - the ray direction is assumed UNIT length, so `t` is a true distance;
12
+ * - the first surface crossing at or after the origin within `tMax` is returned;
13
+ * - on a miss the function returns `Infinity` and leaves `outNormal` untouched.
14
+ *
15
+ * No prior ray-vs-capsule primitive existed in `core/geom`; this fills that gap
16
+ * (useful for picking, sensors, and the raycast narrowphase).
17
+ *
18
+ * @param {Float64Array|number[]} outNormal destination for the unit normal
19
+ * @param {number} outOffset offset into `outNormal` (3 floats are written)
20
+ * @param {number} ox ray origin x (local)
21
+ * @param {number} oy ray origin y (local)
22
+ * @param {number} oz ray origin z (local)
23
+ * @param {number} dx ray direction x (local, unit)
24
+ * @param {number} dy ray direction y (local, unit)
25
+ * @param {number} dz ray direction z (local, unit)
26
+ * @param {number} tMax maximum ray distance
27
+ * @param {number} r capsule radius
28
+ * @param {number} hh half-height of the cylindrical section (`height / 2`)
29
+ * @returns {number} hit distance `t`, or `Infinity` on a miss
30
+ *
31
+ * @author Alex Goldring
32
+ * @copyright Company Named Limited (c) 2026
33
+ */
34
+ export function capsule_raycast(outNormal, outOffset, ox, oy, oz, dx, dy, dz, tMax, r, hh) {
35
+ let best = Infinity;
36
+ let nx = 0, ny = 0, nz = 0;
37
+ const r2 = r * r;
38
+ const inv_r = 1 / r;
39
+
40
+ // --- Cylinder side (infinite cylinder about Y, projected to XZ). ---
41
+ const a = dx * dx + dz * dz;
42
+ if (a > 1e-12) {
43
+ const b = ox * dx + oz * dz;
44
+ const c = ox * ox + oz * oz - r2;
45
+ const disc = b * b - a * c;
46
+ if (disc >= 0) {
47
+ const sq = Math.sqrt(disc);
48
+ const inv_a = 1 / a;
49
+ // Both roots; the smaller non-negative one whose hit lies on the
50
+ // cylindrical section is the side contact.
51
+ const roots = (-b - sq) * inv_a;
52
+ const rootf = (-b + sq) * inv_a;
53
+ for (let i = 0; i < 2; i++) {
54
+ const t = i === 0 ? roots : rootf;
55
+ if (t < 0 || t >= best || t > tMax) continue;
56
+ const y = oy + dy * t;
57
+ if (y < -hh || y > hh) continue; // off the cylinder, onto a cap
58
+ best = t;
59
+ const px = ox + dx * t, pz = oz + dz * t;
60
+ nx = px * inv_r; ny = 0; nz = pz * inv_r;
61
+ break; // roots is the nearer; if it qualified we're done
62
+ }
63
+ }
64
+ }
65
+
66
+ // --- Cap spheres at (0, ±hh, 0), each valid only on its outer hemisphere. ---
67
+ for (let cap = 0; cap < 2; cap++) {
68
+ const cy = cap === 0 ? hh : -hh;
69
+ const oyc = oy - cy;
70
+ const bb = ox * dx + oyc * dy + oz * dz;
71
+ const cc = ox * ox + oyc * oyc + oz * oz - r2;
72
+ const disc = bb * bb - cc;
73
+ if (disc < 0) continue;
74
+ const sq = Math.sqrt(disc);
75
+ const tn = -bb - sq, tf = -bb + sq;
76
+ for (let i = 0; i < 2; i++) {
77
+ const t = i === 0 ? tn : tf;
78
+ if (t < 0 || t >= best || t > tMax) continue;
79
+ const hy = oy + dy * t;
80
+ // Only the hemisphere beyond the segment end belongs to this cap.
81
+ if (cap === 0 ? hy < hh : hy > -hh) continue;
82
+ best = t;
83
+ nx = (ox + dx * t) * inv_r;
84
+ ny = (hy - cy) * inv_r;
85
+ nz = (oz + dz * t) * inv_r;
86
+ break;
87
+ }
88
+ }
89
+
90
+ if (best === Infinity) return Infinity;
91
+ outNormal[outOffset] = nx; outNormal[outOffset + 1] = ny; outNormal[outOffset + 2] = nz;
92
+ return best;
93
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"compute_bounding_cone_of_2_cones.d.ts","sourceRoot":"","sources":["../../../../../../src/core/geom/3d/cone/compute_bounding_cone_of_2_cones.js"],"names":[],"mappings":"AAiBA;;;;;GAKG;AACH,mGAqEC"}
1
+ {"version":3,"file":"compute_bounding_cone_of_2_cones.d.ts","sourceRoot":"","sources":["../../../../../../src/core/geom/3d/cone/compute_bounding_cone_of_2_cones.js"],"names":[],"mappings":"AAiBA;;;;;GAKG;AACH,mGAyEC"}
@@ -51,6 +51,10 @@ export function compute_bounding_cone_of_2_cones(result, a, b) {
51
51
 
52
52
  // compute normal vectors bounding each cone in the common plane
53
53
  tangent.crossVectors(a.direction, b.direction);
54
+ // the cross of two unit directions has length sin(angle); quat3_createFromAxisAngle needs a unit axis,
55
+ // otherwise the cone edges are rotated by the wrong angle. The parallel/anti-parallel degenerate cases
56
+ // (|tangent| == 0) are already excluded by the containment early-returns above.
57
+ tangent.normalize();
54
58
 
55
59
  const a_half_angle = a.angle;
56
60
 
@@ -72,7 +72,7 @@ export function frustum3_computeNearestPointToPoint(result, planes, target_x, ta
72
72
  const plane_0_index = scratch_outer_planes[0];
73
73
  const plane_0 = planes[plane_0_index];
74
74
  // point lies outside exactly one plane
75
- plane3_project_point(result, target_x, target_y, target_z, plane_0.normal.z, plane_0.normal.y, plane_0.normal.z, plane_0.constant);
75
+ plane3_project_point(result, target_x, target_y, target_z, plane_0.normal.x, plane_0.normal.y, plane_0.normal.z, plane_0.constant);
76
76
  } else if (outside_plane_count === 2) {
77
77
  // outside two planes, nearest point lies on the intersection line of two planes
78
78
 
@@ -1 +1 @@
1
- {"version":3,"file":"line3_compute_segment_point_distance_eikonal.d.ts","sourceRoot":"","sources":["../../../../../../src/core/geom/3d/line/line3_compute_segment_point_distance_eikonal.js"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,iEAbW,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,GACJ,MAAM,CAiFlB"}
1
+ {"version":3,"file":"line3_compute_segment_point_distance_eikonal.d.ts","sourceRoot":"","sources":["../../../../../../src/core/geom/3d/line/line3_compute_segment_point_distance_eikonal.js"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,iEAbW,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,GACJ,MAAM,CAkFlB"}
@@ -82,8 +82,9 @@ export function line3_compute_segment_point_distance_eikonal(
82
82
  const coef = p / det_sqrt;
83
83
  const s = x_local - y * coef; // Intersection with x-axis
84
84
 
85
- if (s > 0) {
86
- // 5. Valid Eikonal Update
85
+ if (s > 0 && s < L) {
86
+ // 5. Valid Eikonal Update — the characteristic foot must land strictly inside the segment (0, L);
87
+ // an s >= L means the geodesic actually wraps via the far vertex, handled by the fallback below.
87
88
  return u0 + (p * x_local + y * det_sqrt) / q;
88
89
  } else {
89
90
  // 6. Fallback (The path comes strictly from one of the vertices)
@@ -1 +1 @@
1
- {"version":3,"file":"decompose_matrix_4_array.d.ts","sourceRoot":"","sources":["../../../../../../src/core/geom/3d/mat4/decompose_matrix_4_array.js"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,+CALW,MAAM,EAAE,yDA6DlB"}
1
+ {"version":3,"file":"decompose_matrix_4_array.d.ts","sourceRoot":"","sources":["../../../../../../src/core/geom/3d/mat4/decompose_matrix_4_array.js"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,+CALW,MAAM,EAAE,yDAuElB"}
@@ -26,9 +26,19 @@ export function decompose_matrix_4_array(mat4, position, rotation, scale) {
26
26
 
27
27
  const scale_z = v3_length(m31, m32, m33);
28
28
 
29
+ // If the upper-left 3x3 has a negative determinant the matrix encodes a reflection; fold that sign into
30
+ // one scale axis (matching three.js, which negates scale.x) so the extracted rotation is a proper rotation
31
+ // rather than a mirror (which __setFromRotationMatrix would decode incorrectly).
32
+ const det =
33
+ m11 * (m22 * m33 - m23 * m32)
34
+ - m12 * (m21 * m33 - m23 * m31)
35
+ + m13 * (m21 * m32 - m22 * m31);
36
+
37
+ const signed_scale_x = det < 0 ? -scale_x : scale_x;
38
+
29
39
  // extract rotation matrix
30
40
  // take care of potential division by 0 when scale is 0. Result is inexact, but we get don't break the system at least
31
- const is1 = scale_x !== 0 ? 1 / scale_x : 1e7;
41
+ const is1 = signed_scale_x !== 0 ? 1 / signed_scale_x : 1e7;
32
42
  const is2 = scale_y !== 0 ? 1 / scale_y : 1e7;
33
43
  const is3 = scale_z !== 0 ? 1 / scale_z : 1e7;
34
44
 
@@ -53,7 +63,7 @@ export function decompose_matrix_4_array(mat4, position, rotation, scale) {
53
63
  );
54
64
 
55
65
  scale.set(
56
- scale_x,
66
+ signed_scale_x,
57
67
  scale_y,
58
68
  scale_z
59
69
  );
@@ -62,7 +62,7 @@ export function eulerAnglesFromMatrix(
62
62
  if (a0 === a2) {
63
63
  output[0] = atan2(coeff(m4, j, i), coeff(m4, k, i));
64
64
 
65
- if ((odd && output[0] < 0) || ((~odd) && output[0] > 0)) {
65
+ if ((odd && output[0] < 0) || ((!odd) && output[0] > 0)) {
66
66
  if (output[0] > 0) {
67
67
  output[0] -= Math.PI;
68
68
  } else {
@@ -96,7 +96,7 @@ export function eulerAnglesFromMatrix(
96
96
 
97
97
  const c2 = v2_length(coeff(m4, i, i), coeff(m4, i, j));
98
98
 
99
- if ((odd && output[0] < 0) || ((~odd) && output[0] > 0)) {
99
+ if ((odd && output[0] < 0) || ((!odd) && output[0] > 0)) {
100
100
  if (output[0] > 0) {
101
101
  output[0] -= Math.PI;
102
102
  } else {
@@ -7,5 +7,5 @@
7
7
  * @param {number[]|Float32Array} b
8
8
  * @returns {number[]|Float32Array} `out` parameter
9
9
  */
10
- export function m4_multiply_alphatensor(out: number[] | Float32Array, a: number[] | Float32Array, b: number[] | Float32Array): number[] | Float32Array;
10
+ export function m4_multiply_alphatensor(out: number[] | Float32Array, a_in: any, b_in: any): number[] | Float32Array;
11
11
  //# sourceMappingURL=m4_multiply_alphatensor.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"m4_multiply_alphatensor.d.ts","sourceRoot":"","sources":["../../../../../../src/core/geom/3d/mat4/m4_multiply_alphatensor.js"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,6CALW,MAAM,EAAE,GAAC,YAAY,KACrB,MAAM,EAAE,GAAC,YAAY,KACrB,MAAM,EAAE,GAAC,YAAY,GACnB,MAAM,EAAE,GAAC,YAAY,CA8IjC"}
1
+ {"version":3,"file":"m4_multiply_alphatensor.d.ts","sourceRoot":"","sources":["../../../../../../src/core/geom/3d/mat4/m4_multiply_alphatensor.js"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,6CALW,MAAM,EAAE,GAAC,YAAY,yBAGnB,MAAM,EAAE,GAAC,YAAY,CAoJjC"}