@woosh/meep-engine 2.154.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 (487) 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_array_copy.d.ts +3 -3
  125. package/src/core/geom/vec3/v3_array_copy.d.ts.map +1 -1
  126. package/src/core/geom/vec3/v3_array_copy.js +2 -2
  127. package/src/core/geom/vec3/v3_cross.d.ts +17 -0
  128. package/src/core/geom/vec3/v3_cross.d.ts.map +1 -0
  129. package/src/core/geom/vec3/v3_cross.js +20 -0
  130. package/src/core/geom/vec3/v3_orthonormal_matrix_from_normal.d.ts.map +1 -0
  131. package/src/{engine/graphics/sh3/path_tracer/sampling → core/geom/vec3}/v3_orthonormal_matrix_from_normal.js +1 -1
  132. package/src/core/geom/vec3/v3_subtract.d.ts +16 -0
  133. package/src/core/geom/vec3/v3_subtract.d.ts.map +1 -0
  134. package/src/core/geom/vec3/v3_subtract.js +19 -0
  135. package/src/core/graph/coloring/colorizeGraph.js +2 -2
  136. package/src/core/graph/csr/CSRGraph.d.ts.map +1 -1
  137. package/src/core/graph/csr/CSRGraph.js +325 -319
  138. package/src/core/graph/layout/CircleLayout.d.ts.map +1 -1
  139. package/src/core/graph/layout/CircleLayout.js +8 -6
  140. package/src/core/graph/metis/native/refine/compute_kway_params.d.ts.map +1 -1
  141. package/src/core/graph/metis/native/refine/compute_kway_params.js +139 -138
  142. package/src/core/graph/mn_graph_coarsen.d.ts.map +1 -1
  143. package/src/core/graph/mn_graph_coarsen.js +4 -2
  144. package/src/core/graph/v2/NodeContainer.js +7 -7
  145. package/src/core/localization/LocalizationEngine.js +1 -1
  146. package/src/core/math/bell_membership_function.d.ts.map +1 -1
  147. package/src/core/math/bell_membership_function.js +3 -1
  148. package/src/core/math/complex/complex_add.d.ts +4 -4
  149. package/src/core/math/complex/complex_add.d.ts.map +1 -1
  150. package/src/core/math/complex/complex_add.js +3 -3
  151. package/src/core/math/complex/complex_div.d.ts +4 -4
  152. package/src/core/math/complex/complex_div.d.ts.map +1 -1
  153. package/src/core/math/complex/complex_div.js +3 -3
  154. package/src/core/math/complex/complex_mul.d.ts +4 -4
  155. package/src/core/math/complex/complex_mul.d.ts.map +1 -1
  156. package/src/core/math/complex/complex_mul.js +3 -3
  157. package/src/core/math/complex/complex_sub.d.ts +4 -4
  158. package/src/core/math/complex/complex_sub.d.ts.map +1 -1
  159. package/src/core/math/complex/complex_sub.js +3 -3
  160. package/src/core/math/idct_1d.d.ts +4 -4
  161. package/src/core/math/idct_1d.d.ts.map +1 -1
  162. package/src/core/math/idct_1d.js +3 -3
  163. package/src/core/math/noise/create_simplex_noise_2d.d.ts.map +1 -1
  164. package/src/core/math/noise/create_simplex_noise_2d.js +4 -2
  165. package/src/core/math/noise/sdnoise.d.ts.map +1 -1
  166. package/src/core/math/noise/sdnoise.js +12 -9
  167. package/src/core/math/physics/mie/compute_bhmie_optical_properties.d.ts.map +1 -1
  168. package/src/core/math/physics/mie/compute_bhmie_optical_properties.js +94 -50
  169. package/src/core/math/physics/mie/lorenz_mie_coefs.d.ts +3 -6
  170. package/src/core/math/physics/mie/lorenz_mie_coefs.d.ts.map +1 -1
  171. package/src/core/math/physics/mie/lorenz_mie_coefs.js +180 -157
  172. package/src/core/math/physics/mie/mie_ab_to_optical_properties.d.ts +3 -4
  173. package/src/core/math/physics/mie/mie_ab_to_optical_properties.d.ts.map +1 -1
  174. package/src/core/math/physics/mie/mie_ab_to_optical_properties.js +47 -21
  175. package/src/core/math/random/randomIntegerBetween.d.ts.map +1 -1
  176. package/src/core/math/random/randomIntegerBetween.js +4 -1
  177. package/src/core/math/solveCubic.d.ts.map +1 -1
  178. package/src/core/math/solveCubic.js +95 -82
  179. package/src/core/math/spline/computeCatmullRomSplineUniformDistance.d.ts.map +1 -1
  180. package/src/core/math/spline/computeCatmullRomSplineUniformDistance.js +13 -0
  181. package/src/core/math/statistics/softmax.js +1 -1
  182. package/src/core/model/node-graph/visual/NodeGraphVisualData.d.ts +1 -0
  183. package/src/core/model/node-graph/visual/NodeGraphVisualData.d.ts.map +1 -1
  184. package/src/core/model/node-graph/visual/NodeGraphVisualData.js +2 -1
  185. package/src/core/model/node-graph/visual/NodeVisualData.js +1 -1
  186. package/src/core/model/object/ImmutableObjectPool.d.ts +7 -0
  187. package/src/core/model/object/ImmutableObjectPool.d.ts.map +1 -1
  188. package/src/core/model/object/ImmutableObjectPool.js +20 -10
  189. package/src/core/model/reactive/evaluation/MultiPredicateEvaluator.d.ts.map +1 -1
  190. package/src/core/model/reactive/evaluation/MultiPredicateEvaluator.js +39 -2
  191. package/src/core/model/reactive/model/terminal/ReactiveReference.d.ts.map +1 -1
  192. package/src/core/model/reactive/model/terminal/ReactiveReference.js +2 -0
  193. package/src/core/parser/simple/readHexToken.d.ts.map +1 -1
  194. package/src/core/parser/simple/readHexToken.js +6 -0
  195. package/src/core/primitives/numbers/number_pretty_print.d.ts.map +1 -1
  196. package/src/core/primitives/numbers/number_pretty_print.js +4 -1
  197. package/src/core/primitives/strings/string_jaro_winkler.js +1 -1
  198. package/src/core/process/CompositeProcess.js +1 -1
  199. package/src/core/process/action/AsynchronousDelayAction.d.ts.map +1 -1
  200. package/src/core/process/action/AsynchronousDelayAction.js +3 -0
  201. package/src/core/process/executor/ConcurrentExecutor.d.ts.map +1 -1
  202. package/src/core/process/executor/ConcurrentExecutor.js +3 -2
  203. package/src/core/process/task/util/randomCountTask.d.ts.map +1 -1
  204. package/src/core/process/task/util/randomCountTask.js +3 -1
  205. package/src/core/process/undo/ActionProcessor.d.ts.map +1 -1
  206. package/src/core/process/undo/ActionProcessor.js +5 -3
  207. package/src/core/process/worker/WorkerBuilder.js +3 -3
  208. package/src/engine/animation/curve/AnimationCurve.d.ts.map +1 -1
  209. package/src/engine/animation/curve/AnimationCurve.js +4 -2
  210. package/src/engine/control/first-person/DESIGN.md +1 -1
  211. package/src/engine/control/first-person/FirstPersonMotionPhase.d.ts +55 -0
  212. package/src/engine/control/first-person/FirstPersonMotionPhase.d.ts.map +1 -0
  213. package/src/engine/control/first-person/FirstPersonMotionPhase.js +134 -0
  214. package/src/engine/control/first-person/FirstPersonPlayerController.d.ts +23 -2
  215. package/src/engine/control/first-person/FirstPersonPlayerController.d.ts.map +1 -1
  216. package/src/engine/control/first-person/FirstPersonPlayerController.js +1 -1
  217. package/src/engine/control/first-person/FirstPersonPlayerControllerConfig.d.ts +168 -0
  218. package/src/engine/control/first-person/FirstPersonPlayerControllerConfig.d.ts.map +1 -1
  219. package/src/engine/control/first-person/FirstPersonPlayerControllerConfig.js +115 -0
  220. package/src/engine/control/first-person/FirstPersonPlayerControllerSystem.d.ts +71 -0
  221. package/src/engine/control/first-person/FirstPersonPlayerControllerSystem.d.ts.map +1 -1
  222. package/src/engine/control/first-person/FirstPersonPlayerControllerSystem.js +255 -55
  223. package/src/engine/control/first-person/abilities/LedgeGrab.d.ts +82 -43
  224. package/src/engine/control/first-person/abilities/LedgeGrab.d.ts.map +1 -1
  225. package/src/engine/control/first-person/abilities/LedgeGrab.js +405 -213
  226. package/src/engine/control/first-person/abilities/Mantle.d.ts +6 -0
  227. package/src/engine/control/first-person/abilities/Mantle.d.ts.map +1 -1
  228. package/src/engine/control/first-person/abilities/Mantle.js +104 -45
  229. package/src/engine/control/first-person/abilities/ScrambleUp.d.ts +61 -0
  230. package/src/engine/control/first-person/abilities/ScrambleUp.d.ts.map +1 -0
  231. package/src/engine/control/first-person/abilities/ScrambleUp.js +182 -0
  232. package/src/engine/control/first-person/math/jumpDynamics.d.ts +84 -0
  233. package/src/engine/control/first-person/math/jumpDynamics.d.ts.map +1 -0
  234. package/src/engine/control/first-person/math/jumpDynamics.js +108 -0
  235. package/src/engine/control/first-person/prototype_first_person_controller.js +45 -1
  236. package/src/engine/graphics/camera/testClippingPlaneComputation.js +1 -1
  237. package/src/engine/graphics/ecs/decal/v2/FPDecalSystem.d.ts.map +1 -1
  238. package/src/engine/graphics/ecs/decal/v2/FPDecalSystem.js +8 -0
  239. package/src/engine/graphics/ecs/path/tube/prototypeAnimatedPathMask.js +1 -1
  240. package/src/engine/graphics/particles/particular/engine/utils/volume/prototypeParticleVolume.js +1 -1
  241. package/src/engine/graphics/render/buffer/buffers/prototypeNormalFrameBuffer.js +1 -1
  242. package/src/engine/graphics/render/forward_plus/plugin/ptototypeFPPlugin.js +1 -1
  243. package/src/engine/graphics/render/visibility/hiz/prototypeHiZ.js +1 -1
  244. package/src/engine/graphics/sh3/path_tracer/texture/sample_material.js +1 -1
  245. package/src/engine/graphics/shadows/testShadowMapRendering.js +1 -1
  246. package/src/engine/physics/CONSTRAINT_SOLVER_BENCH_LOG.md +208 -0
  247. package/src/engine/physics/CONSTRAINT_SOLVER_IMPROVEMENTS_PLAN.md +364 -0
  248. package/src/engine/physics/PLAN.md +6 -5
  249. package/src/engine/physics/constraint/solve_constraints.d.ts +4 -1
  250. package/src/engine/physics/constraint/solve_constraints.d.ts.map +1 -1
  251. package/src/engine/physics/constraint/solve_constraints.js +147 -33
  252. package/src/engine/physics/ecs/PhysicsSystem.d.ts.map +1 -1
  253. package/src/engine/physics/ecs/PhysicsSystem.js +1750 -1747
  254. package/src/engine/physics/fluid/ecs/FluidSystem.d.ts +3 -3
  255. package/src/engine/physics/gjk/gjk_epa_penetration.d.ts +12 -8
  256. package/src/engine/physics/gjk/gjk_epa_penetration.d.ts.map +1 -1
  257. package/src/engine/physics/gjk/gjk_epa_penetration.js +447 -158
  258. package/src/engine/physics/narrowphase/convex_convex_manifold.d.ts.map +1 -1
  259. package/src/engine/physics/narrowphase/convex_convex_manifold.js +22 -25
  260. package/src/engine/physics/narrowphase/convex_decomposition.d.ts +32 -13
  261. package/src/engine/physics/narrowphase/convex_decomposition.d.ts.map +1 -1
  262. package/src/engine/physics/narrowphase/convex_decomposition.js +61 -65
  263. package/src/engine/physics/narrowphase/mesh_convex_hull.d.ts.map +1 -1
  264. package/src/engine/physics/narrowphase/mesh_convex_hull.js +13 -8
  265. package/src/engine/physics/narrowphase/refine_ray_concave.d.ts.map +1 -1
  266. package/src/engine/physics/narrowphase/refine_ray_concave.js +5 -3
  267. package/src/engine/physics/narrowphase/refine_ray_hit.d.ts.map +1 -1
  268. package/src/engine/physics/narrowphase/refine_ray_hit.js +81 -78
  269. package/src/engine/sound/SoundEngine.d.ts.map +1 -1
  270. package/src/engine/sound/SoundEngine.js +28 -0
  271. package/src/engine/sound/dB2Volume.d.ts +1 -1
  272. package/src/engine/sound/dB2Volume.d.ts.map +1 -1
  273. package/src/engine/sound/dB2Volume.js +1 -1
  274. package/src/engine/sound/ecs/SoundController.d.ts +4 -0
  275. package/src/engine/sound/ecs/SoundController.d.ts.map +1 -1
  276. package/src/engine/sound/ecs/SoundController.js +4 -0
  277. package/src/engine/sound/ecs/SoundControllerSystem.d.ts +5 -0
  278. package/src/engine/sound/ecs/SoundControllerSystem.d.ts.map +1 -1
  279. package/src/engine/sound/ecs/SoundControllerSystem.js +5 -0
  280. package/src/engine/sound/ecs/audio/AudioEmitter.d.ts +69 -0
  281. package/src/engine/sound/ecs/audio/AudioEmitter.d.ts.map +1 -0
  282. package/src/engine/sound/ecs/audio/AudioEmitter.js +83 -0
  283. package/src/engine/sound/ecs/audio/AudioEmitterSystem.d.ts +97 -0
  284. package/src/engine/sound/ecs/audio/AudioEmitterSystem.d.ts.map +1 -0
  285. package/src/engine/sound/ecs/audio/AudioEmitterSystem.js +238 -0
  286. package/src/engine/sound/ecs/audio/LiveEmitterSet.d.ts +90 -0
  287. package/src/engine/sound/ecs/audio/LiveEmitterSet.d.ts.map +1 -0
  288. package/src/engine/sound/ecs/audio/LiveEmitterSet.js +324 -0
  289. package/src/engine/sound/ecs/audio/SpatialAudioIndex.d.ts +59 -0
  290. package/src/engine/sound/ecs/audio/SpatialAudioIndex.d.ts.map +1 -0
  291. package/src/engine/sound/ecs/audio/SpatialAudioIndex.js +140 -0
  292. package/src/engine/sound/ecs/emitter/SoundEmitter.d.ts +16 -65
  293. package/src/engine/sound/ecs/emitter/SoundEmitter.d.ts.map +1 -1
  294. package/src/engine/sound/ecs/emitter/SoundEmitter.js +19 -224
  295. package/src/engine/sound/ecs/emitter/SoundEmitterComponentContext.d.ts +26 -29
  296. package/src/engine/sound/ecs/emitter/SoundEmitterComponentContext.d.ts.map +1 -1
  297. package/src/engine/sound/ecs/emitter/SoundEmitterComponentContext.js +168 -135
  298. package/src/engine/sound/ecs/emitter/SoundEmitterSystem.d.ts +36 -59
  299. package/src/engine/sound/ecs/emitter/SoundEmitterSystem.d.ts.map +1 -1
  300. package/src/engine/sound/ecs/emitter/SoundEmitterSystem.js +154 -390
  301. package/src/engine/sound/ecs/emitter/SoundTrack.d.ts +20 -23
  302. package/src/engine/sound/ecs/emitter/SoundTrack.d.ts.map +1 -1
  303. package/src/engine/sound/ecs/emitter/SoundTrack.js +34 -152
  304. package/src/engine/sound/sopra/IMPLEMENTATION_PLAN.md +993 -0
  305. package/src/engine/sound/sopra/README.md +643 -7
  306. package/src/engine/sound/sopra/SopraEngine.d.ts +229 -0
  307. package/src/engine/sound/sopra/SopraEngine.d.ts.map +1 -0
  308. package/src/engine/sound/sopra/SopraEngine.js +423 -0
  309. package/src/engine/sound/sopra/asset/AssetManagerBufferProvider.d.ts +26 -0
  310. package/src/engine/sound/sopra/asset/AssetManagerBufferProvider.d.ts.map +1 -0
  311. package/src/engine/sound/sopra/asset/AssetManagerBufferProvider.js +71 -0
  312. package/src/engine/sound/sopra/asset/BufferProvider.d.ts +24 -0
  313. package/src/engine/sound/sopra/asset/BufferProvider.d.ts.map +1 -0
  314. package/src/engine/sound/sopra/asset/BufferProvider.js +29 -0
  315. package/src/engine/sound/sopra/asset/StubBufferProvider.d.ts +31 -0
  316. package/src/engine/sound/sopra/asset/StubBufferProvider.d.ts.map +1 -0
  317. package/src/engine/sound/sopra/asset/StubBufferProvider.js +58 -0
  318. package/src/engine/sound/sopra/definition/BusDefinition.d.ts +83 -0
  319. package/src/engine/sound/sopra/definition/BusDefinition.d.ts.map +1 -0
  320. package/src/engine/sound/sopra/definition/BusDefinition.js +142 -0
  321. package/src/engine/sound/sopra/definition/BusDefinitionSerializationAdapter.d.ts +17 -0
  322. package/src/engine/sound/sopra/definition/BusDefinitionSerializationAdapter.d.ts.map +1 -0
  323. package/src/engine/sound/sopra/definition/BusDefinitionSerializationAdapter.js +54 -0
  324. package/src/engine/sound/sopra/definition/DuckingRule.d.ts +71 -0
  325. package/src/engine/sound/sopra/definition/DuckingRule.d.ts.map +1 -0
  326. package/src/engine/sound/sopra/definition/DuckingRule.js +106 -0
  327. package/src/engine/sound/sopra/definition/DuckingRuleSerializationAdapter.d.ts +18 -0
  328. package/src/engine/sound/sopra/definition/DuckingRuleSerializationAdapter.d.ts.map +1 -0
  329. package/src/engine/sound/sopra/definition/DuckingRuleSerializationAdapter.js +31 -0
  330. package/src/engine/sound/sopra/definition/EventDescription.d.ts +132 -0
  331. package/src/engine/sound/sopra/definition/EventDescription.d.ts.map +1 -0
  332. package/src/engine/sound/sopra/definition/EventDescription.js +259 -0
  333. package/src/engine/sound/sopra/definition/EventDescriptionSerializationAdapter.d.ts +17 -0
  334. package/src/engine/sound/sopra/definition/EventDescriptionSerializationAdapter.d.ts.map +1 -0
  335. package/src/engine/sound/sopra/definition/EventDescriptionSerializationAdapter.js +71 -0
  336. package/src/engine/sound/sopra/definition/MixerSnapshot.d.ts +51 -0
  337. package/src/engine/sound/sopra/definition/MixerSnapshot.d.ts.map +1 -0
  338. package/src/engine/sound/sopra/definition/MixerSnapshot.js +83 -0
  339. package/src/engine/sound/sopra/definition/MixerSnapshotSerializationAdapter.d.ts +18 -0
  340. package/src/engine/sound/sopra/definition/MixerSnapshotSerializationAdapter.d.ts.map +1 -0
  341. package/src/engine/sound/sopra/definition/MixerSnapshotSerializationAdapter.js +39 -0
  342. package/src/engine/sound/sopra/definition/ParameterDefinition.d.ts +72 -0
  343. package/src/engine/sound/sopra/definition/ParameterDefinition.d.ts.map +1 -0
  344. package/src/engine/sound/sopra/definition/ParameterDefinition.js +117 -0
  345. package/src/engine/sound/sopra/definition/ParameterDefinitionSerializationAdapter.d.ts +18 -0
  346. package/src/engine/sound/sopra/definition/ParameterDefinitionSerializationAdapter.d.ts.map +1 -0
  347. package/src/engine/sound/sopra/definition/ParameterDefinitionSerializationAdapter.js +31 -0
  348. package/src/engine/sound/sopra/definition/SopraPanningModel.d.ts +14 -0
  349. package/src/engine/sound/sopra/definition/SopraPanningModel.d.ts.map +1 -0
  350. package/src/engine/sound/sopra/definition/SopraPanningModel.js +20 -0
  351. package/src/engine/sound/sopra/definition/VoiceStealMode.d.ts +10 -0
  352. package/src/engine/sound/sopra/definition/VoiceStealMode.d.ts.map +1 -0
  353. package/src/engine/sound/sopra/definition/VoiceStealMode.js +18 -0
  354. package/src/engine/sound/sopra/definition/clip/AbstractAudioClip.d.ts +93 -0
  355. package/src/engine/sound/sopra/definition/clip/AbstractAudioClip.d.ts.map +1 -0
  356. package/src/engine/sound/sopra/definition/clip/AbstractAudioClip.js +109 -0
  357. package/src/engine/sound/sopra/definition/clip/BlendContainerAudioClip.d.ts +80 -0
  358. package/src/engine/sound/sopra/definition/clip/BlendContainerAudioClip.d.ts.map +1 -0
  359. package/src/engine/sound/sopra/definition/clip/BlendContainerAudioClip.js +181 -0
  360. package/src/engine/sound/sopra/definition/clip/BlendContainerAudioClipSerializationAdapter.d.ts +17 -0
  361. package/src/engine/sound/sopra/definition/clip/BlendContainerAudioClipSerializationAdapter.d.ts.map +1 -0
  362. package/src/engine/sound/sopra/definition/clip/BlendContainerAudioClipSerializationAdapter.js +74 -0
  363. package/src/engine/sound/sopra/definition/clip/ContainerAudioClip.d.ts +34 -0
  364. package/src/engine/sound/sopra/definition/clip/ContainerAudioClip.d.ts.map +1 -0
  365. package/src/engine/sound/sopra/definition/clip/ContainerAudioClip.js +100 -0
  366. package/src/engine/sound/sopra/definition/clip/RandomContainerAudioClip.d.ts +101 -0
  367. package/src/engine/sound/sopra/definition/clip/RandomContainerAudioClip.d.ts.map +1 -0
  368. package/src/engine/sound/sopra/definition/clip/RandomContainerAudioClip.js +230 -0
  369. package/src/engine/sound/sopra/definition/clip/RandomContainerAudioClipSerializationAdapter.d.ts +17 -0
  370. package/src/engine/sound/sopra/definition/clip/RandomContainerAudioClipSerializationAdapter.d.ts.map +1 -0
  371. package/src/engine/sound/sopra/definition/clip/RandomContainerAudioClipSerializationAdapter.js +54 -0
  372. package/src/engine/sound/sopra/definition/clip/SampleAudioClip.d.ts +103 -0
  373. package/src/engine/sound/sopra/definition/clip/SampleAudioClip.d.ts.map +1 -0
  374. package/src/engine/sound/sopra/definition/clip/SampleAudioClip.js +191 -0
  375. package/src/engine/sound/sopra/definition/clip/SampleAudioClipSerializationAdapter.d.ts +18 -0
  376. package/src/engine/sound/sopra/definition/clip/SampleAudioClipSerializationAdapter.d.ts.map +1 -0
  377. package/src/engine/sound/sopra/definition/clip/SampleAudioClipSerializationAdapter.js +39 -0
  378. package/src/engine/sound/sopra/definition/clip/SequenceContainerAudioClip.d.ts +40 -0
  379. package/src/engine/sound/sopra/definition/clip/SequenceContainerAudioClip.d.ts.map +1 -0
  380. package/src/engine/sound/sopra/definition/clip/SequenceContainerAudioClip.js +91 -0
  381. package/src/engine/sound/sopra/definition/clip/SequenceContainerAudioClipSerializationAdapter.d.ts +17 -0
  382. package/src/engine/sound/sopra/definition/clip/SequenceContainerAudioClipSerializationAdapter.d.ts.map +1 -0
  383. package/src/engine/sound/sopra/definition/clip/SequenceContainerAudioClipSerializationAdapter.js +42 -0
  384. package/src/engine/sound/sopra/definition/clip/SilenceAudioClip.d.ts +44 -0
  385. package/src/engine/sound/sopra/definition/clip/SilenceAudioClip.d.ts.map +1 -0
  386. package/src/engine/sound/sopra/definition/clip/SilenceAudioClip.js +77 -0
  387. package/src/engine/sound/sopra/definition/clip/SilenceAudioClipSerializationAdapter.d.ts +18 -0
  388. package/src/engine/sound/sopra/definition/clip/SilenceAudioClipSerializationAdapter.d.ts.map +1 -0
  389. package/src/engine/sound/sopra/definition/clip/SilenceAudioClipSerializationAdapter.js +27 -0
  390. package/src/engine/sound/sopra/definition/clip/SwitchContainerAudioClip.d.ts +65 -0
  391. package/src/engine/sound/sopra/definition/clip/SwitchContainerAudioClip.d.ts.map +1 -0
  392. package/src/engine/sound/sopra/definition/clip/SwitchContainerAudioClip.js +131 -0
  393. package/src/engine/sound/sopra/definition/clip/SwitchContainerAudioClipSerializationAdapter.d.ts +17 -0
  394. package/src/engine/sound/sopra/definition/clip/SwitchContainerAudioClipSerializationAdapter.d.ts.map +1 -0
  395. package/src/engine/sound/sopra/definition/clip/SwitchContainerAudioClipSerializationAdapter.js +41 -0
  396. package/src/engine/sound/sopra/definition/effect/AbstractAudioEffect.d.ts +24 -0
  397. package/src/engine/sound/sopra/definition/effect/AbstractAudioEffect.d.ts.map +1 -0
  398. package/src/engine/sound/sopra/definition/effect/AbstractAudioEffect.js +24 -0
  399. package/src/engine/sound/sopra/definition/effect/CompressorEffect.d.ts +70 -0
  400. package/src/engine/sound/sopra/definition/effect/CompressorEffect.d.ts.map +1 -0
  401. package/src/engine/sound/sopra/definition/effect/CompressorEffect.js +120 -0
  402. package/src/engine/sound/sopra/definition/effect/CompressorEffectSerializationAdapter.d.ts +18 -0
  403. package/src/engine/sound/sopra/definition/effect/CompressorEffectSerializationAdapter.d.ts.map +1 -0
  404. package/src/engine/sound/sopra/definition/effect/CompressorEffectSerializationAdapter.js +31 -0
  405. package/src/engine/sound/sopra/definition/effect/EqEffect.d.ts +74 -0
  406. package/src/engine/sound/sopra/definition/effect/EqEffect.d.ts.map +1 -0
  407. package/src/engine/sound/sopra/definition/effect/EqEffect.js +128 -0
  408. package/src/engine/sound/sopra/definition/effect/EqEffectSerializationAdapter.d.ts +18 -0
  409. package/src/engine/sound/sopra/definition/effect/EqEffectSerializationAdapter.d.ts.map +1 -0
  410. package/src/engine/sound/sopra/definition/effect/EqEffectSerializationAdapter.js +29 -0
  411. package/src/engine/sound/sopra/definition/effect/ReverbEffect.d.ts +49 -0
  412. package/src/engine/sound/sopra/definition/effect/ReverbEffect.d.ts.map +1 -0
  413. package/src/engine/sound/sopra/definition/effect/ReverbEffect.js +101 -0
  414. package/src/engine/sound/sopra/definition/effect/ReverbEffectSerializationAdapter.d.ts +18 -0
  415. package/src/engine/sound/sopra/definition/effect/ReverbEffectSerializationAdapter.d.ts.map +1 -0
  416. package/src/engine/sound/sopra/definition/effect/ReverbEffectSerializationAdapter.js +25 -0
  417. package/src/engine/sound/sopra/legacy/soundEmitterToEventDescription.d.ts +31 -0
  418. package/src/engine/sound/sopra/legacy/soundEmitterToEventDescription.d.ts.map +1 -0
  419. package/src/engine/sound/sopra/legacy/soundEmitterToEventDescription.js +106 -0
  420. package/src/engine/sound/sopra/runtime/BusGraph.d.ts +79 -0
  421. package/src/engine/sound/sopra/runtime/BusGraph.d.ts.map +1 -0
  422. package/src/engine/sound/sopra/runtime/BusGraph.js +227 -0
  423. package/src/engine/sound/sopra/runtime/EventInstance.d.ts +144 -0
  424. package/src/engine/sound/sopra/runtime/EventInstance.d.ts.map +1 -0
  425. package/src/engine/sound/sopra/runtime/EventInstance.js +579 -0
  426. package/src/engine/sound/sopra/runtime/ParameterStore.d.ts +42 -0
  427. package/src/engine/sound/sopra/runtime/ParameterStore.d.ts.map +1 -0
  428. package/src/engine/sound/sopra/runtime/ParameterStore.js +98 -0
  429. package/src/engine/sound/sopra/runtime/SopraPlaybackContext.d.ts +42 -0
  430. package/src/engine/sound/sopra/runtime/SopraPlaybackContext.d.ts.map +1 -0
  431. package/src/engine/sound/sopra/runtime/SopraPlaybackContext.js +68 -0
  432. package/src/engine/sound/sopra/runtime/Voice.d.ts +67 -0
  433. package/src/engine/sound/sopra/runtime/Voice.d.ts.map +1 -0
  434. package/src/engine/sound/sopra/runtime/Voice.js +145 -0
  435. package/src/engine/sound/sopra/runtime/VoiceManager.d.ts +38 -0
  436. package/src/engine/sound/sopra/runtime/VoiceManager.d.ts.map +1 -0
  437. package/src/engine/sound/sopra/runtime/VoiceManager.js +136 -0
  438. package/src/engine/sound/sopra/runtime/VoicePool.d.ts +12 -0
  439. package/src/engine/sound/sopra/runtime/VoicePool.d.ts.map +1 -0
  440. package/src/engine/sound/sopra/runtime/VoicePool.js +17 -0
  441. package/src/engine/sound/sopra/serialization/populateSopraSerializationRegistry.d.ts +11 -0
  442. package/src/engine/sound/sopra/serialization/populateSopraSerializationRegistry.d.ts.map +1 -0
  443. package/src/engine/sound/sopra/serialization/populateSopraSerializationRegistry.js +42 -0
  444. package/src/engine/sound/sopra/serialization/sopraJSON.d.ts +33 -0
  445. package/src/engine/sound/sopra/serialization/sopraJSON.d.ts.map +1 -0
  446. package/src/engine/sound/sopra/serialization/sopraJSON.js +99 -0
  447. package/src/engine/sound/sopra/serialization/sopraSerializationHarness.d.ts +27 -0
  448. package/src/engine/sound/sopra/serialization/sopraSerializationHarness.d.ts.map +1 -0
  449. package/src/engine/sound/sopra/serialization/sopraSerializationHarness.js +49 -0
  450. package/src/engine/sound/sopra/util/MockAudioContext.d.ts +74 -0
  451. package/src/engine/sound/sopra/util/MockAudioContext.d.ts.map +1 -0
  452. package/src/engine/sound/sopra/util/MockAudioContext.js +215 -0
  453. package/src/engine/sound/sopra/util/buildAttenuationCurve.d.ts +15 -0
  454. package/src/engine/sound/sopra/util/buildAttenuationCurve.d.ts.map +1 -0
  455. package/src/engine/sound/sopra/util/buildAttenuationCurve.js +40 -0
  456. package/src/engine/sound/sopra/util/fadeOutAndStop.d.ts +34 -0
  457. package/src/engine/sound/sopra/util/fadeOutAndStop.d.ts.map +1 -0
  458. package/src/engine/sound/sopra/util/fadeOutAndStop.js +60 -0
  459. package/src/engine/sound/volume2dB.d.ts +1 -1
  460. package/src/engine/sound/volume2dB.d.ts.map +1 -1
  461. package/src/engine/sound/volume2dB.js +1 -1
  462. package/src/engine/graphics/sh3/path_tracer/sampling/v3_orthonormal_matrix_from_normal.d.ts.map +0 -1
  463. package/src/engine/physics/narrowphase/ray_shapes.d.ts +0 -66
  464. package/src/engine/physics/narrowphase/ray_shapes.d.ts.map +0 -1
  465. package/src/engine/physics/narrowphase/ray_shapes.js +0 -187
  466. package/src/engine/sound/ecs/emitter/SoundEmitterChannel.d.ts +0 -23
  467. package/src/engine/sound/ecs/emitter/SoundEmitterChannel.d.ts.map +0 -1
  468. package/src/engine/sound/ecs/emitter/SoundEmitterChannel.js +0 -32
  469. package/src/engine/sound/ecs/emitter/SoundTrackNodes.d.ts +0 -18
  470. package/src/engine/sound/ecs/emitter/SoundTrackNodes.d.ts.map +0 -1
  471. package/src/engine/sound/ecs/emitter/SoundTrackNodes.js +0 -18
  472. package/src/engine/sound/sopra/AbstractAudioClip.d.ts +0 -26
  473. package/src/engine/sound/sopra/AbstractAudioClip.d.ts.map +0 -1
  474. package/src/engine/sound/sopra/AbstractAudioClip.js +0 -29
  475. package/src/engine/sound/sopra/ContainerAudioClip.d.ts +0 -12
  476. package/src/engine/sound/sopra/ContainerAudioClip.d.ts.map +0 -1
  477. package/src/engine/sound/sopra/ContainerAudioClip.js +0 -13
  478. package/src/engine/sound/sopra/RandomContainerAudioClip.d.ts +0 -12
  479. package/src/engine/sound/sopra/RandomContainerAudioClip.d.ts.map +0 -1
  480. package/src/engine/sound/sopra/RandomContainerAudioClip.js +0 -15
  481. package/src/engine/sound/sopra/SequenceContainerAudioClip.d.ts +0 -7
  482. package/src/engine/sound/sopra/SequenceContainerAudioClip.d.ts.map +0 -1
  483. package/src/engine/sound/sopra/SequenceContainerAudioClip.js +0 -8
  484. package/src/engine/sound/sopra/SilenceAudioClip.d.ts +0 -13
  485. package/src/engine/sound/sopra/SilenceAudioClip.d.ts.map +0 -1
  486. package/src/engine/sound/sopra/SilenceAudioClip.js +0 -15
  487. /package/src/{engine/graphics/sh3/path_tracer/sampling → core/geom/vec3}/v3_orthonormal_matrix_from_normal.d.ts +0 -0
@@ -7,7 +7,13 @@
7
7
  * @param {number[]|Float32Array} b
8
8
  * @returns {number[]|Float32Array} `out` parameter
9
9
  */
10
- export function m4_multiply_alphatensor(out, a, b) {
10
+ export function m4_multiply_alphatensor(out, a_in, b_in) {
11
+ // The AlphaTensor factorization transcribed below computes the transpose of (b_in * a_in). To return
12
+ // out = a_in * b_in we feed the operands swapped (the a* locals read b_in, the b* locals read a_in) and
13
+ // write each computed element to its transposed output slot.
14
+ const a = b_in;
15
+ const b = a_in;
16
+
11
17
  // read out matricies
12
18
  const a11 = a[0];
13
19
  const a13 = a[2];
@@ -112,38 +118,38 @@ export function m4_multiply_alphatensor(out, a, b) {
112
118
  const c14 = -h16 + h17 - h20 - h21 + h22 - h23 + h25 + h26 - h29 - h32 - h33 + h34 + h38 - h41 + h42 + h43
113
119
 
114
120
  out[0] = c11;
115
- out[1] = c12;
116
- out[2] = c13;
117
- out[3] = c14;
121
+ out[4] = c12;
122
+ out[8] = c13;
123
+ out[12] = c14;
118
124
 
119
125
  const c21 = -h7 + h8 - h10 + h11 - h14 + h15 + h16 - h17 + h18 + h21 - h31 + h33 - h35 - h36
120
126
  const c22 = h7 - h8 + h10 - h11 - h15 - h16 + h17 - h18 - h21 + h22 - h23 + h26 - h33 + h44
121
127
  const c23 = -h7 + h8 + h11 + h12 - h16 + h17 - h20 - h21 - h29 - h33 + h34 + h36 + h38 + h46
122
128
  const c24 = -h7 + h8 + h11 + h12 - h16 + h17 - h20 - h21 + h22 - h23 + h25 + h26 - h29 - h33 + h34 + h38
123
129
 
124
- out[4] = c21;
130
+ out[1] = c21;
125
131
  out[5] = c22;
126
- out[6] = c23;
127
- out[7] = c24;
132
+ out[9] = c23;
133
+ out[13] = c24;
128
134
 
129
135
  const c31 = h1 - h2 + h3 - h5 + h33 - h34 + h37 - h40
130
136
  const c32 = h17 - h18 - h19 - h21 - h23 + h24 + h26 - h33 + h34 - h37 + h40 - h43 + h44 + h45 - h47 + h49
131
137
  const c33 = h4 + h5 - h29 - h33 + h34 + h40
132
138
  const c34 = -h21 + h26 - h27 + h28 - h29 - h32 - h33 + h34 + h40 - h47
133
139
 
134
- out[8] = c31;
135
- out[9] = c32;
140
+ out[2] = c31;
141
+ out[6] = c32;
136
142
  out[10] = c33;
137
- out[11] = c34;
143
+ out[14] = c34;
138
144
 
139
145
  const c41 = h8 - h10 + h11 - h13 + h17 - h18 - h19 - h21 + h31 - h33 + h34 + h35 + h36 - h37 - h39 + h40
140
146
  const c42 = -h8 + h10 - h11 + h13 - h17 + h18 + h19 + h21 + h23 - h24 - h26 + h33 - h34 + h37 - h40 - h44
141
147
  const c43 = h11 + h21 - h28 + h29 + h30 + h33 - h34 - h35 - h36 + h39 - h40 + h48
142
148
  const c44 = h11 + h21 - h26 + h27 - h28 + h29 + h33 - h34 - h40 + h48
143
149
 
144
- out[12] = c41;
145
- out[13] = c42;
146
- out[14] = c43;
150
+ out[3] = c41;
151
+ out[7] = c42;
152
+ out[11] = c43;
147
153
  out[15] = c44;
148
154
 
149
155
  return out;
@@ -1 +1 @@
1
- {"version":3,"file":"octahedral_direction_to_uv.d.ts","sourceRoot":"","sources":["../../../../../../src/core/geom/3d/octahedra/octahedral_direction_to_uv.js"],"names":[],"mappings":"AAIA;;;;;;GAMG;AACH,mDALW,MAAM,EAAE,cACR,MAAM,gBACN,MAAM,EAAE,aACR,MAAM,QAsChB"}
1
+ {"version":3,"file":"octahedral_direction_to_uv.d.ts","sourceRoot":"","sources":["../../../../../../src/core/geom/3d/octahedra/octahedral_direction_to_uv.js"],"names":[],"mappings":"AAIA;;;;;;GAMG;AACH,mDALW,MAAM,EAAE,cACR,MAAM,gBACN,MAAM,EAAE,aACR,MAAM,QAuChB"}
@@ -43,6 +43,7 @@ export function octahedral_direction_to_uv(
43
43
  octahedron_z = octant_z * (1 - absolute_x);
44
44
  }
45
45
 
46
- out_uv[out_offset + 0] = octahedron_x;
47
- out_uv[out_offset + 1] = octahedron_z;
46
+ // map octahedron coordinates from [-1,1] into [0,1] UV space; this exactly inverts the decode's `*2 - 1`.
47
+ out_uv[out_offset + 0] = octahedron_x * 0.5 + 0.5;
48
+ out_uv[out_offset + 1] = octahedron_z * 0.5 + 0.5;
48
49
  }
@@ -64,13 +64,14 @@ function solveIntersectingPoint(zeroCoord, A, B, p1, p2, result) {
64
64
 
65
65
  const a1 = nP1[A];
66
66
  const b1 = nP1[B];
67
- const d1 = p1.constant;
67
+ // plane equation is dot(normal, p) + constant = 0, so the linear-system RHS is -constant
68
+ const d1 = -p1.constant;
68
69
 
69
70
  const nP2 = p2.normal;
70
71
 
71
72
  const a2 = nP2[A];
72
73
  const b2 = nP2[B];
73
- const d2 = p2.constant;
74
+ const d2 = -p2.constant;
74
75
 
75
76
  const A0 = ((b2 * d1) - (b1 * d2)) / ((a1 * b2 - a2 * b1));
76
77
  const B0 = ((a1 * d2) - (a2 * d1)) / ((a1 * b2 - a2 * b1));
@@ -1 +1 @@
1
- {"version":3,"file":"MeshShape3D.d.ts","sourceRoot":"","sources":["../../../../../../src/core/geom/3d/shape/MeshShape3D.js"],"names":[],"mappings":"AAOA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AACH;IAKQ;;;;;OAKG;IACH,WAFU,YAAY,CAEc;IAEpC;;;;OAIG;IACH,SAFU,WAAW,CAEY;IAEjC;;;;;;;OAOG;IACH,UAFU,eAAe,CAEY;IAErC;;;;;;;;OAQG;IACH,eAFU,YAAY,CAEkB;IAExC;;;;;;OAMG;IACH,SAFU,GAAG,CAEW;IAExB;;;;;OAKG;IACH,eAAkD;IAElD;;;;;OAKG;IACH,iBAAiB;IAEjB;;;;OAIG;IACH,uBAAuB;IAW3B,wCAIC;IAED;;;;;OAKG;IACH,yBAmDC;IAED;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,gBANW,MAAM,EAAE,GAAC,YAAY,iBACrB,MAAM,eACN,MAAM,eACN,MAAM,eACN,MAAM,QA0BhB;IAED;;;;;;;;;;;;;;;;OAgBG;IACH,sBAHW,MAAM,EAAE,GAAC,YAAY,GACnB,OAAO,CAkCnB;IAED;;;;;;;;;OASG;IACH,iCAHW,MAAM,EAAE,GAAC,YAAY,aACrB,MAAM,EAAE,GAAC,YAAY,QA4C/B;IAED;;;;;;;;OAQG;IACH,gCAHW,MAAM,EAAE,GAAC,YAAY,GACnB,MAAM,CAsClB;IAED;;;;;;;;;OASG;IACH,sCAJW,MAAM,EAAE,GAAC,YAAY,iBACrB,MAAM,gBACK,MAAM,QAuB3B;IAED;;;;;;OAMG;IACH,0CAJW,MAAM,EAAE,GAAC,YAAY,SACrB,MAAM,EAAE,GAAC,YAAY,GACnB,MAAM,CAiBlB;IAED;;;;;;OAMG;IACH,cAHW,WAAW,GACT,OAAO,CAanB;IAkBL;;;;OAIG;IACH,wBAFU,OAAO,CAEkB;CAPlC;gCAje+B,sBAAsB;gCADtB,kCAAkC;oBAJ9C,2BAA2B"}
1
+ {"version":3,"file":"MeshShape3D.d.ts","sourceRoot":"","sources":["../../../../../../src/core/geom/3d/shape/MeshShape3D.js"],"names":[],"mappings":"AAOA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AACH;IAKQ;;;;;OAKG;IACH,WAFU,YAAY,CAEc;IAEpC;;;;OAIG;IACH,SAFU,WAAW,CAEY;IAEjC;;;;;;;OAOG;IACH,UAFU,eAAe,CAEY;IAErC;;;;;;;;OAQG;IACH,eAFU,YAAY,CAEkB;IAExC;;;;;;OAMG;IACH,SAFU,GAAG,CAEW;IAExB;;;;;OAKG;IACH,eAAkD;IAElD;;;;;OAKG;IACH,iBAAiB;IAEjB;;;;OAIG;IACH,uBAAuB;IAW3B,wCAIC;IAED;;;;;OAKG;IACH,yBAmDC;IAED;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,gBANW,MAAM,EAAE,GAAC,YAAY,iBACrB,MAAM,eACN,MAAM,eACN,MAAM,eACN,MAAM,QA0BhB;IAED;;;;;;;;;;;;;;;;OAgBG;IACH,sBAHW,MAAM,EAAE,GAAC,YAAY,GACnB,OAAO,CAyCnB;IAED;;;;;;;;;OASG;IACH,iCAHW,MAAM,EAAE,GAAC,YAAY,aACrB,MAAM,EAAE,GAAC,YAAY,QA4C/B;IAED;;;;;;;;OAQG;IACH,gCAHW,MAAM,EAAE,GAAC,YAAY,GACnB,MAAM,CAsClB;IAED;;;;;;;;;OASG;IACH,sCAJW,MAAM,EAAE,GAAC,YAAY,iBACrB,MAAM,gBACK,MAAM,QAuB3B;IAED;;;;;;OAMG;IACH,0CAJW,MAAM,EAAE,GAAC,YAAY,SACrB,MAAM,EAAE,GAAC,YAAY,GACnB,MAAM,CAiBlB;IAED;;;;;;OAMG;IACH,cAHW,WAAW,GACT,OAAO,CAanB;IAkBL;;;;OAIG;IACH,wBAFU,OAAO,CAEkB;CAPlC;gCAxe+B,sBAAsB;gCADtB,kCAAkC;oBAJ9C,2BAA2B"}
@@ -273,6 +273,13 @@ export class MeshShape3D extends AbstractShape3D {
273
273
  scratch_query_aabb[0] = px; scratch_query_aabb[1] = py; scratch_query_aabb[2] = pz;
274
274
  scratch_query_aabb[3] = px; scratch_query_aabb[4] = py; scratch_query_aabb[5] = pz;
275
275
 
276
+ // Ensure the shared (module-static) candidate buffer can hold every possible hit. A single point can
277
+ // overlap at most `count` tet AABBs, so this is a guaranteed-safe upper bound; without it the query
278
+ // silently truncates at the fixed 64-slot size and contains_point can miss the containing tet.
279
+ if (scratch_candidates.length < this.tet_mesh.count) {
280
+ scratch_candidates = new Uint32Array(this.tet_mesh.count);
281
+ }
282
+
276
283
  const n = bvh_query_user_data_overlaps_aabb(
277
284
  scratch_candidates, 0, this.tet_bvh, scratch_query_aabb
278
285
  );
@@ -1 +1 @@
1
- {"version":3,"file":"UnionShape3D.d.ts","sourceRoot":"","sources":["../../../../../../src/core/geom/3d/shape/UnionShape3D.js"],"names":[],"mappings":"AA2BA;IAqII;;;;OAIG;IACH,sBAHW,eAAe,EAAE,GACf,YAAY,CAYxB;IAhJG;;;OAGG;IACH,UAFU,eAAe,EAAE,CAET;IAElB;;;;;OAKG;IACH,kCAAmC;IAEnC,qBAAsB;IACtB,qBAAuB;IACvB,uBAAyB;IAG7B,wCAgCC;IAED;;;OAGG;IACH,mCAkBC;IAED;;;OAGG;IACH,2CA8CC;IA2DD,mEAEC;IAED,6CAaC;IAED,oCAYC;IAED,kFAoDC;IAED,qGAyBC;IAED;;;;OAIG;IACH,cAHW,YAAY,GACV,OAAO,CAKnB;CAcJ;gCAxV+B,sBAAsB"}
1
+ {"version":3,"file":"UnionShape3D.d.ts","sourceRoot":"","sources":["../../../../../../src/core/geom/3d/shape/UnionShape3D.js"],"names":[],"mappings":"AA2BA;IAsII;;;;OAIG;IACH,sBAHW,eAAe,EAAE,GACf,YAAY,CAYxB;IAjJG;;;OAGG;IACH,UAFU,eAAe,EAAE,CAET;IAElB;;;;;OAKG;IACH,kCAAmC;IAEnC,qBAAsB;IACtB,qBAAuB;IACvB,uBAAyB;IAG7B,wCAgCC;IAED;;;OAGG;IACH,mCAkBC;IAED;;;OAGG;IACH,2CA+CC;IA2DD,mEAEC;IAED,6CAaC;IAED,oCAYC;IAED,kFAoDC;IAED,qGAyBC;IAED;;;;OAIG;IACH,cAHW,YAAY,GACV,OAAO,CAKnB;CAcJ;gCAzV+B,sBAAsB"}
@@ -135,7 +135,7 @@ export class UnionShape3D extends AbstractShape3D {
135
135
 
136
136
  const child_0 = children[target_child_index];
137
137
 
138
- for (j = 0; j < VOLUME_OVERLAP_ESTIMATION_SUB_TAPS; j++, i++) {
138
+ for (j = 0; j < VOLUME_OVERLAP_ESTIMATION_SUB_TAPS; j++) {
139
139
 
140
140
  child_0.sample_random_point_in_volume(scratch_array, 0, random);
141
141
 
@@ -155,7 +155,8 @@ export class UnionShape3D extends AbstractShape3D {
155
155
  }
156
156
  }
157
157
 
158
- this.__volume_overlap_fraction = tap_overlaps / (VOLUME_OVERLAP_ESTIMATION_TAPS);
158
+ // total samples taken = outer taps * sub-taps (the inner loop no longer corrupts the outer counter)
159
+ this.__volume_overlap_fraction = tap_overlaps / (VOLUME_OVERLAP_ESTIMATION_TAPS * VOLUME_OVERLAP_ESTIMATION_SUB_TAPS);
159
160
  }
160
161
 
161
162
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"shape3d_voxelize_to_grid.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/geom/3d/shape/util/shape3d_voxelize_to_grid.js"],"names":[],"mappings":"AAaA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0DG;AACH,gFAVW,YAAY,GAAC,MAAM,EAAE,iBAErB,YAAY,GAAC,MAAM,EAAE,QAErB,UAAU,MAEV,MAAM,MACN,MAAM,MACN,MAAM,QA6EhB"}
1
+ {"version":3,"file":"shape3d_voxelize_to_grid.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/geom/3d/shape/util/shape3d_voxelize_to_grid.js"],"names":[],"mappings":"AAaA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0DG;AACH,gFAVW,YAAY,GAAC,MAAM,EAAE,iBAErB,YAAY,GAAC,MAAM,EAAE,QAErB,UAAU,MAEV,MAAM,MACN,MAAM,MACN,MAAM,QAkFhB"}
@@ -1,148 +1,153 @@
1
- import { assert } from "../../../../assert.js";
2
- import { v3_length } from "../../../vec3/v3_length.js";
3
- import { v3_matrix4_multiply } from "../../../vec3/v3_matrix4_multiply.js";
4
- import { aabb3_matrix4_project } from "../../aabb/aabb3_matrix4_project.js";
5
-
6
- // Reusable per-call scratch — keeps the function allocation-free under repeat
7
- // invocations (which is the expected pattern: re-voxelize the scene every frame
8
- // before stepping a simulation).
9
- const _scratch_aabb_world = new Float32Array(6);
10
- const _scratch_aabb_grid = new Float32Array(6);
11
- const _scratch_grid_pt = new Float32Array(3);
12
- const _scratch_world_pt = new Float32Array(3);
13
-
14
- /**
15
- * Rasterize an {@link AbstractShape3D} into a cell-centered Uint8 grid mask.
16
- *
17
- * For each integer cell `(i, j, k)` in `[0, rx) × [0, ry) × [0, rz)`, the cell's
18
- * center is recovered as the world-space point `grid_to_world * (i, j, k)`. If
19
- * that point lies inside the shape — or close enough to its surface (see below)
20
- * — the corresponding cell in `grid` is written as `1`.
21
- *
22
- * The grid is **not** cleared first. Cells outside the shape (and outside its
23
- * proximity band) are left exactly as they were, which lets the caller compose
24
- * multiple shapes into the same buffer by calling this function repeatedly. The
25
- * caller is responsible for `grid.fill(0)` if a fresh mask is desired.
26
- *
27
- * **Proximity test.** A cell whose centre is outside the shape is still marked
28
- * solid if `signed_distance_at_point(centre) < half_cell_diagonal`. This catches
29
- * features that pass through a cell without containing its centre — e.g. a thin
30
- * sheet bisecting a cubic cell at 45°. The threshold is the largest possible
31
- * distance from a cell's centre to any point inside the cell, so any shape that
32
- * intersects the cell at all is captured. Cheap fast path: `contains_point` is
33
- * tested first (no sqrt for most shapes); the more expensive signed-distance
34
- * call only runs for cells whose centre is outside.
35
- *
36
- * **Volume guard.** If the shape's total volume is less than half the volume of
37
- * a single cell, the function returns immediately without writing anything. A
38
- * shape that small can't be meaningfully represented as a unit-cell solid — the
39
- * obstacle would end up perceptibly larger than the shape itself. Callers with
40
- * sub-cell shapes should either refine the grid or use a different
41
- * representation (e.g. a point-velocity effector).
42
- *
43
- * **Coord space.** `shape.contains_point` / `signed_distance_at_point` are
44
- * called with **world** coordinates. For shapes that have their own local frame
45
- * (e.g. `UnitSphereShape3D` centred at the origin), wrap them in a
46
- * {@link TransformedShape3D} so they sit at the right world position before
47
- * passing in. The voxelizer is otherwise agnostic to how the shape interprets
48
- * its inputs.
49
- *
50
- * **Grid orientation.** `world_to_grid` and `grid_to_world` are full 4×4
51
- * column-major affines, so the grid can be translated, scaled, or rotated in
52
- * world space; the algorithm makes no axis-aligned assumption. Cell size per
53
- * axis is recovered from the column lengths of `grid_to_world`, which is exact
54
- * for orthogonal grids and an overestimate of cell volume for skewed ones — the
55
- * latter only widens the volume-guard threshold, which is conservative.
56
- *
57
- * Designed to feed e.g. a fluid simulator's solid mask, but lives outside any
58
- * specific package: anything that needs "rasterize a shape into a cell-centered
59
- * boolean grid" can use it.
60
- *
61
- * @param {AbstractShape3D} shape shape to voxelize; `contains_point` and
62
- * `signed_distance_at_point` are invoked with world-space points.
63
- * @param {Float32Array|number[]} world_to_grid column-major 4×4 affine;
64
- * world point → grid (cell-index) coords.
65
- * @param {Float32Array|number[]} grid_to_world column-major 4×4 affine;
66
- * grid (cell-index) coords → world cell center.
67
- * @param {Uint8Array} grid output mask, length must be ≥ `rx * ry * rz`.
68
- * Cells that don't pass the test are left untouched.
69
- * @param {number} rx positive integer.
70
- * @param {number} ry positive integer.
71
- * @param {number} rz positive integer.
72
- */
73
- export function shape3d_voxelize_to_grid(shape, world_to_grid, grid_to_world, grid, rx, ry, rz) {
74
- assert.defined(shape, "shape");
75
- assert.isArrayLike(world_to_grid, "world_to_grid");
76
- assert.greaterThanOrEqual(world_to_grid.length, 16, "world_to_grid.length");
77
- assert.isArrayLike(grid_to_world, "grid_to_world");
78
- assert.greaterThanOrEqual(grid_to_world.length, 16, "grid_to_world.length");
79
- assert.defined(grid, "grid");
80
- assert.isPositiveInteger(rx, "rx");
81
- assert.isPositiveInteger(ry, "ry");
82
- assert.isPositiveInteger(rz, "rz");
83
- assert.greaterThanOrEqual(grid.length, rx * ry * rz, "grid.length");
84
-
85
- // Recover per-axis cell size from the column lengths of grid_to_world. For
86
- // an axis-aligned uniform grid these are just the cell spacings; for an
87
- // oriented grid they're the post-rotation lengths, which still bound the
88
- // cell extent correctly.
89
- const cs_x = v3_length(grid_to_world[0], grid_to_world[1], grid_to_world[2]);
90
- const cs_y = v3_length(grid_to_world[4], grid_to_world[5], grid_to_world[6]);
91
- const cs_z = v3_length(grid_to_world[8], grid_to_world[9], grid_to_world[10]);
92
- const cell_volume = cs_x * cs_y * cs_z;
93
-
94
- // Volume guard. See docstring — sub-cell shapes are skipped wholesale.
95
- if (shape.volume < cell_volume * 0.5) {
96
- return;
97
- }
98
-
99
- // Proximity threshold = half the cell diagonal in world units. Any shape
100
- // whose surface comes within this radius of a cell centre might intersect
101
- // the cell; this is the tightest threshold that won't miss grazing
102
- // features.
103
- const proximity_threshold = Math.sqrt(cs_x * cs_x + cs_y * cs_y + cs_z * cs_z) * 0.5;
104
-
105
- // Restrict iteration to the shape's bounding box transformed into grid
106
- // space, with a 1-cell expansion to cover the proximity band (the band is
107
- // at most ~0.87 cells wide, so +1 cell on each side fully contains it).
108
- shape.compute_bounding_box(_scratch_aabb_world);
109
- aabb3_matrix4_project(_scratch_aabb_grid, _scratch_aabb_world, world_to_grid);
110
-
111
- const i_min = Math.max(0, Math.floor(_scratch_aabb_grid[0]) - 1);
112
- const j_min = Math.max(0, Math.floor(_scratch_aabb_grid[1]) - 1);
113
- const k_min = Math.max(0, Math.floor(_scratch_aabb_grid[2]) - 1);
114
- const i_max = Math.min(rx - 1, Math.ceil(_scratch_aabb_grid[3]) + 1);
115
- const j_max = Math.min(ry - 1, Math.ceil(_scratch_aabb_grid[4]) + 1);
116
- const k_max = Math.min(rz - 1, Math.ceil(_scratch_aabb_grid[5]) + 1);
117
-
118
- // Bounding box lies entirely outside the grid → nothing to do.
119
- if (i_min > i_max || j_min > j_max || k_min > k_max) {
120
- return;
121
- }
122
-
123
- const rx_ry = rx * ry;
124
- const grid_pt = _scratch_grid_pt;
125
- const world_pt = _scratch_world_pt;
126
-
127
- for (let k = k_min; k <= k_max; k++) {
128
- grid_pt[2] = k;
129
- const k_offset = k * rx_ry;
130
- for (let j = j_min; j <= j_max; j++) {
131
- grid_pt[1] = j;
132
- const j_offset = k_offset + j * rx;
133
- for (let i = i_min; i <= i_max; i++) {
134
- grid_pt[0] = i;
135
- v3_matrix4_multiply(world_pt, 0, grid_pt, 0, grid_to_world);
136
-
137
- // contains_point is the cheap fast path (no sqrt for most
138
- // shapes). Only fall through to signed_distance for cells whose
139
- // centre is outside the shape, where we still might mark them
140
- // for the proximity rule.
141
- if (shape.contains_point(world_pt)
142
- || shape.signed_distance_at_point(world_pt) < proximity_threshold) {
143
- grid[j_offset + i] = 1;
144
- }
145
- }
146
- }
147
- }
148
- }
1
+ import { assert } from "../../../../assert.js";
2
+ import { v3_length } from "../../../vec3/v3_length.js";
3
+ import { v3_matrix4_multiply } from "../../../vec3/v3_matrix4_multiply.js";
4
+ import { aabb3_matrix4_project } from "../../aabb/aabb3_matrix4_project.js";
5
+
6
+ // Reusable per-call scratch — keeps the function allocation-free under repeat
7
+ // invocations (which is the expected pattern: re-voxelize the scene every frame
8
+ // before stepping a simulation).
9
+ const _scratch_aabb_world = new Float32Array(6);
10
+ const _scratch_aabb_grid = new Float32Array(6);
11
+ const _scratch_grid_pt = new Float32Array(3);
12
+ const _scratch_world_pt = new Float32Array(3);
13
+
14
+ /**
15
+ * Rasterize an {@link AbstractShape3D} into a cell-centered Uint8 grid mask.
16
+ *
17
+ * For each integer cell `(i, j, k)` in `[0, rx) × [0, ry) × [0, rz)`, the cell's
18
+ * center is recovered as the world-space point `grid_to_world * (i, j, k)`. If
19
+ * that point lies inside the shape — or close enough to its surface (see below)
20
+ * — the corresponding cell in `grid` is written as `1`.
21
+ *
22
+ * The grid is **not** cleared first. Cells outside the shape (and outside its
23
+ * proximity band) are left exactly as they were, which lets the caller compose
24
+ * multiple shapes into the same buffer by calling this function repeatedly. The
25
+ * caller is responsible for `grid.fill(0)` if a fresh mask is desired.
26
+ *
27
+ * **Proximity test.** A cell whose centre is outside the shape is still marked
28
+ * solid if `signed_distance_at_point(centre) < half_cell_diagonal`. This catches
29
+ * features that pass through a cell without containing its centre — e.g. a thin
30
+ * sheet bisecting a cubic cell at 45°. The threshold is the largest possible
31
+ * distance from a cell's centre to any point inside the cell, so any shape that
32
+ * intersects the cell at all is captured. Cheap fast path: `contains_point` is
33
+ * tested first (no sqrt for most shapes); the more expensive signed-distance
34
+ * call only runs for cells whose centre is outside.
35
+ *
36
+ * **Volume guard.** If the shape's total volume is less than half the volume of
37
+ * a single cell, the function returns immediately without writing anything. A
38
+ * shape that small can't be meaningfully represented as a unit-cell solid — the
39
+ * obstacle would end up perceptibly larger than the shape itself. Callers with
40
+ * sub-cell shapes should either refine the grid or use a different
41
+ * representation (e.g. a point-velocity effector).
42
+ *
43
+ * **Coord space.** `shape.contains_point` / `signed_distance_at_point` are
44
+ * called with **world** coordinates. For shapes that have their own local frame
45
+ * (e.g. `UnitSphereShape3D` centred at the origin), wrap them in a
46
+ * {@link TransformedShape3D} so they sit at the right world position before
47
+ * passing in. The voxelizer is otherwise agnostic to how the shape interprets
48
+ * its inputs.
49
+ *
50
+ * **Grid orientation.** `world_to_grid` and `grid_to_world` are full 4×4
51
+ * column-major affines, so the grid can be translated, scaled, or rotated in
52
+ * world space; the algorithm makes no axis-aligned assumption. Cell size per
53
+ * axis is recovered from the column lengths of `grid_to_world`, which is exact
54
+ * for orthogonal grids and an overestimate of cell volume for skewed ones — the
55
+ * latter only widens the volume-guard threshold, which is conservative.
56
+ *
57
+ * Designed to feed e.g. a fluid simulator's solid mask, but lives outside any
58
+ * specific package: anything that needs "rasterize a shape into a cell-centered
59
+ * boolean grid" can use it.
60
+ *
61
+ * @param {AbstractShape3D} shape shape to voxelize; `contains_point` and
62
+ * `signed_distance_at_point` are invoked with world-space points.
63
+ * @param {Float32Array|number[]} world_to_grid column-major 4×4 affine;
64
+ * world point → grid (cell-index) coords.
65
+ * @param {Float32Array|number[]} grid_to_world column-major 4×4 affine;
66
+ * grid (cell-index) coords → world cell center.
67
+ * @param {Uint8Array} grid output mask, length must be ≥ `rx * ry * rz`.
68
+ * Cells that don't pass the test are left untouched.
69
+ * @param {number} rx positive integer.
70
+ * @param {number} ry positive integer.
71
+ * @param {number} rz positive integer.
72
+ */
73
+ export function shape3d_voxelize_to_grid(shape, world_to_grid, grid_to_world, grid, rx, ry, rz) {
74
+ assert.defined(shape, "shape");
75
+ assert.isArrayLike(world_to_grid, "world_to_grid");
76
+ assert.greaterThanOrEqual(world_to_grid.length, 16, "world_to_grid.length");
77
+ assert.isArrayLike(grid_to_world, "grid_to_world");
78
+ assert.greaterThanOrEqual(grid_to_world.length, 16, "grid_to_world.length");
79
+ assert.defined(grid, "grid");
80
+ assert.isPositiveInteger(rx, "rx");
81
+ assert.isPositiveInteger(ry, "ry");
82
+ assert.isPositiveInteger(rz, "rz");
83
+ assert.greaterThanOrEqual(grid.length, rx * ry * rz, "grid.length");
84
+
85
+ // Recover per-axis cell size from the column lengths of grid_to_world. For
86
+ // an axis-aligned uniform grid these are just the cell spacings; for an
87
+ // oriented grid they're the post-rotation lengths, which still bound the
88
+ // cell extent correctly.
89
+ const cs_x = v3_length(grid_to_world[0], grid_to_world[1], grid_to_world[2]);
90
+ const cs_y = v3_length(grid_to_world[4], grid_to_world[5], grid_to_world[6]);
91
+ const cs_z = v3_length(grid_to_world[8], grid_to_world[9], grid_to_world[10]);
92
+ const cell_volume = cs_x * cs_y * cs_z;
93
+
94
+ // Volume guard. See docstring — sub-cell shapes are skipped wholesale.
95
+ if (shape.volume < cell_volume * 0.5) {
96
+ return;
97
+ }
98
+
99
+ // Proximity threshold = half the cell diagonal in world units. Any shape
100
+ // whose surface comes within this radius of a cell centre might intersect
101
+ // the cell; this is the tightest threshold that won't miss grazing
102
+ // features.
103
+ const proximity_threshold = Math.sqrt(cs_x * cs_x + cs_y * cs_y + cs_z * cs_z) * 0.5;
104
+
105
+ // Restrict iteration to the shape's bounding box transformed into grid space, expanded by the proximity
106
+ // band. The band is `proximity_threshold` WORLD units wide, which is a different number of cells along each
107
+ // axis when the grid is anisotropic/skewed, so pad per-axis by ceil(threshold / cell_size). A fixed +1 cell
108
+ // under-covers the band along thin axes and would miss grazing features there.
109
+ shape.compute_bounding_box(_scratch_aabb_world);
110
+ aabb3_matrix4_project(_scratch_aabb_grid, _scratch_aabb_world, world_to_grid);
111
+
112
+ const pad_i = Math.ceil(proximity_threshold / cs_x);
113
+ const pad_j = Math.ceil(proximity_threshold / cs_y);
114
+ const pad_k = Math.ceil(proximity_threshold / cs_z);
115
+
116
+ const i_min = Math.max(0, Math.floor(_scratch_aabb_grid[0]) - pad_i);
117
+ const j_min = Math.max(0, Math.floor(_scratch_aabb_grid[1]) - pad_j);
118
+ const k_min = Math.max(0, Math.floor(_scratch_aabb_grid[2]) - pad_k);
119
+ const i_max = Math.min(rx - 1, Math.ceil(_scratch_aabb_grid[3]) + pad_i);
120
+ const j_max = Math.min(ry - 1, Math.ceil(_scratch_aabb_grid[4]) + pad_j);
121
+ const k_max = Math.min(rz - 1, Math.ceil(_scratch_aabb_grid[5]) + pad_k);
122
+
123
+ // Bounding box lies entirely outside the grid → nothing to do.
124
+ if (i_min > i_max || j_min > j_max || k_min > k_max) {
125
+ return;
126
+ }
127
+
128
+ const rx_ry = rx * ry;
129
+ const grid_pt = _scratch_grid_pt;
130
+ const world_pt = _scratch_world_pt;
131
+
132
+ for (let k = k_min; k <= k_max; k++) {
133
+ grid_pt[2] = k;
134
+ const k_offset = k * rx_ry;
135
+ for (let j = j_min; j <= j_max; j++) {
136
+ grid_pt[1] = j;
137
+ const j_offset = k_offset + j * rx;
138
+ for (let i = i_min; i <= i_max; i++) {
139
+ grid_pt[0] = i;
140
+ v3_matrix4_multiply(world_pt, 0, grid_pt, 0, grid_to_world);
141
+
142
+ // contains_point is the cheap fast path (no sqrt for most
143
+ // shapes). Only fall through to signed_distance for cells whose
144
+ // centre is outside the shape, where we still might mark them
145
+ // for the proximity rule.
146
+ if (shape.contains_point(world_pt)
147
+ || shape.signed_distance_at_point(world_pt) < proximity_threshold) {
148
+ grid[j_offset + i] = 1;
149
+ }
150
+ }
151
+ }
152
+ }
153
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"sh3_dering_optimize_positive.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/geom/3d/sphere/harmonics/sh3_dering_optimize_positive.js"],"names":[],"mappings":"AA0SA;;;;;;;GAOG;AACH,qDANW,MAAM,EAAE,GAAC,YAAY,GAAC,YAAY,iBAClC,MAAM,aACN,MAAM,EAAE,GAAC,YAAY,GAAC,YAAY,oBAClC,MAAM,oBACN,MAAM,QAIhB"}
1
+ {"version":3,"file":"sh3_dering_optimize_positive.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/geom/3d/sphere/harmonics/sh3_dering_optimize_positive.js"],"names":[],"mappings":"AAiTA;;;;;;;GAOG;AACH,qDANW,MAAM,EAAE,GAAC,YAAY,GAAC,YAAY,iBAClC,MAAM,aACN,MAAM,EAAE,GAAC,YAAY,GAAC,YAAY,oBAClC,MAAM,oBACN,MAAM,QAIhB"}
@@ -249,6 +249,13 @@ function windowSH(
249
249
 
250
250
  const m = 0.5 * (l + r);
251
251
 
252
+ // Re-window the ORIGINAL coefficients on every iteration. windowing() mutates scratch_sh3 in
253
+ // place, so without re-filling we would cumulatively window an already-windowed buffer; the
254
+ // reference (Filament) windows a fresh copy each time (pass-by-value).
255
+ for (let b = 0; b < numBands * numBands; b++) {
256
+ scratch_sh3[b] = input[input_offset + b * channel_count + channel];
257
+ }
258
+
252
259
  windowing(scratch_sh3, m, numBands);
253
260
 
254
261
  if (sh3_min(scratch_sh3) < 0) {
@@ -1 +1 @@
1
- {"version":3,"file":"sh3_sample_by_direction.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/geom/3d/sphere/harmonics/sh3_sample_by_direction.js"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;GAaG;AACH,gDARW,MAAM,EAAE,iBACR,MAAM,aACN,MAAM,EAAE,oBACR,MAAM,mBACN,MAAM,aACN,MAAM,EAAE,oBACR,MAAM,QAmChB"}
1
+ {"version":3,"file":"sh3_sample_by_direction.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/geom/3d/sphere/harmonics/sh3_sample_by_direction.js"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;GAaG;AACH,gDARW,MAAM,EAAE,iBACR,MAAM,aACN,MAAM,EAAE,oBACR,MAAM,mBACN,MAAM,aACN,MAAM,EAAE,oBACR,MAAM,QAsChB"}
@@ -27,22 +27,25 @@ export function sh3_sample_by_direction(
27
27
  let channel_value;
28
28
 
29
29
  for (let i = 0; i < dimension_count; i++) {
30
- const offset = harmonics_offset + dimension_count * i;
30
+ // coefficients are interleaved by band: the value for (band k, dimension i) lives at
31
+ // harmonics_offset + dimension_count * k + i (matching sh3_sample_irradiance_by_direction /
32
+ // sh3_vector_accumulate). The previous `dimension_count * i + band` indexing overlapped channels.
33
+ const base = harmonics_offset + i;
31
34
 
32
35
  // band 0
33
- channel_value = harmonics[offset] * SH3_COEFFICIENTS[0];
36
+ channel_value = harmonics[base] * SH3_COEFFICIENTS[0];
34
37
 
35
38
  // band 1
36
- channel_value += harmonics[offset + 1] * SH3_COEFFICIENTS[1] * y;
37
- channel_value += harmonics[offset + 2] * SH3_COEFFICIENTS[2] * z;
38
- channel_value += harmonics[offset + 3] * SH3_COEFFICIENTS[3] * x;
39
+ channel_value += harmonics[base + dimension_count] * SH3_COEFFICIENTS[1] * y;
40
+ channel_value += harmonics[base + dimension_count * 2] * SH3_COEFFICIENTS[2] * z;
41
+ channel_value += harmonics[base + dimension_count * 3] * SH3_COEFFICIENTS[3] * x;
39
42
 
40
43
  // band 2
41
- channel_value += harmonics[offset + 4] * SH3_COEFFICIENTS[4] * (x * y);
42
- channel_value += harmonics[offset + 5] * SH3_COEFFICIENTS[5] * (y * z);
43
- channel_value += harmonics[offset + 6] * SH3_COEFFICIENTS[6] * (3.0 * z * z - 1.0);
44
- channel_value += harmonics[offset + 7] * SH3_COEFFICIENTS[7] * (x * z);
45
- channel_value += harmonics[offset + 8] * SH3_COEFFICIENTS[8] * (x * x - y * y);
44
+ channel_value += harmonics[base + dimension_count * 4] * SH3_COEFFICIENTS[4] * (x * y);
45
+ channel_value += harmonics[base + dimension_count * 5] * SH3_COEFFICIENTS[5] * (y * z);
46
+ channel_value += harmonics[base + dimension_count * 6] * SH3_COEFFICIENTS[6] * (3.0 * z * z - 1.0);
47
+ channel_value += harmonics[base + dimension_count * 7] * SH3_COEFFICIENTS[7] * (x * z);
48
+ channel_value += harmonics[base + dimension_count * 8] * SH3_COEFFICIENTS[8] * (x * x - y * y);
46
49
 
47
50
  // write out
48
51
  result[result_offset + i] = channel_value;
@@ -1,5 +1,5 @@
1
1
  /**
2
- *
2
+ * @see sphere_project
3
3
  * @param {number} fl
4
4
  * @param {number[]} matrix
5
5
  * @param {number[]} sph
@@ -3,7 +3,7 @@ import { v4_multiply_mat4 } from "../../vec4/v4_multiply_mat4.js";
3
3
 
4
4
  const v4 = [];
5
5
  /**
6
- *
6
+ * @see sphere_project
7
7
  * @param {number} fl
8
8
  * @param {number[]} matrix
9
9
  * @param {number[]} sph
@@ -31,7 +31,7 @@ export function sphere_projected_sphere_radius_sqr(fl, matrix, sph) {
31
31
  const y = v4_y;
32
32
  const z = v4_z;
33
33
 
34
- const z2 = z * x;
34
+ const z2 = z * z;
35
35
 
36
36
  const l2 = v3_dot(x, y, z, x, y, z);
37
37
 
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Ray ↔ sphere intersection in the sphere's LOCAL frame: the sphere is centred
3
+ * at the origin with radius `r`, and the ray is expressed in that frame. Returns
4
+ * the hit distance `t` along the ray and writes the outward unit surface normal
5
+ * into `outNormal[outOffset .. outOffset+2]`.
6
+ *
7
+ * Conventions (shared with {@link box3_raycast} / {@link capsule_raycast}):
8
+ * - the ray direction is assumed UNIT length, so `t` is a true distance;
9
+ * - the first surface crossing at or after the origin within `tMax` is
10
+ * returned; a ray starting INSIDE the sphere returns its exit crossing;
11
+ * - on a miss the function returns `Infinity` and leaves `outNormal` untouched.
12
+ *
13
+ * Distinct from {@link sphere_intersects_ray}, which is a boolean predicate;
14
+ * this yields the distance and the surface normal — what a raycast query /
15
+ * narrowphase needs.
16
+ *
17
+ * @param {Float64Array|number[]} outNormal destination for the unit normal
18
+ * @param {number} outOffset offset into `outNormal` (3 floats are written)
19
+ * @param {number} ox ray origin x (local)
20
+ * @param {number} oy ray origin y (local)
21
+ * @param {number} oz ray origin z (local)
22
+ * @param {number} dx ray direction x (local, unit)
23
+ * @param {number} dy ray direction y (local, unit)
24
+ * @param {number} dz ray direction z (local, unit)
25
+ * @param {number} tMax maximum ray distance
26
+ * @param {number} r sphere radius
27
+ * @returns {number} hit distance `t`, or `Infinity` on a miss
28
+ *
29
+ * @author Alex Goldring
30
+ * @copyright Company Named Limited (c) 2026
31
+ */
32
+ export function sphere_raycast(outNormal: Float64Array | number[], outOffset: number, ox: number, oy: number, oz: number, dx: number, dy: number, dz: number, tMax: number, r: number): number;
33
+ //# sourceMappingURL=sphere_raycast.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sphere_raycast.d.ts","sourceRoot":"","sources":["../../../../../../src/core/geom/3d/sphere/sphere_raycast.js"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,0CAfW,YAAY,GAAC,MAAM,EAAE,aACrB,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,QACN,MAAM,KACN,MAAM,GACJ,MAAM,CAoBlB"}