@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
@@ -1,78 +1,81 @@
1
- import { v3_quat3_apply } from "../../../core/geom/vec3/v3_quat3_apply.js";
2
- import { ray_sphere_local, ray_box_local, ray_capsule_local } from "./ray_shapes.js";
3
- import { refine_ray_concave } from "./refine_ray_concave.js";
4
-
5
- /**
6
- * Sentinel returned by {@link refine_ray_hit} for a shape it has no exact ray
7
- * test for (composite / arbitrary convex). The caller should keep the
8
- * broadphase AABB result for that leaf rather than treat it as a miss.
9
- * Distinct from `Infinity` (a refined miss) and any finite hit distance.
10
- * @type {number}
11
- */
12
- export const RAY_REFINE_UNSUPPORTED = -1;
13
-
14
- const lo = new Float64Array(3); // ray origin in shape-local frame
15
- const ld = new Float64Array(3); // ray direction in shape-local frame
16
- const ln = new Float64Array(3); // surface normal in shape-local frame
17
-
18
- /**
19
- * Refine a broadphase ray hit against a body's true shape geometry.
20
- *
21
- * Transforms the world ray into the shape's local frame once (rotate by the
22
- * inverse body rotation — a unit direction stays unit, so the hit distance is
23
- * preserved), runs the matching canonical primitive ({@link ray_shapes}), and
24
- * rotates the returned local normal back to world. Spheres are
25
- * rotation-invariant, so they only need the translation.
26
- *
27
- * Handles the convex primitives (sphere / box / capsule). Concave shapes
28
- * (mesh / heightmap) and arbitrary composite convex shapes return
29
- * {@link RAY_REFINE_UNSUPPORTED} — the concave path is wired in separately, and
30
- * composites fall back to the broadphase AABB hit (no regression).
31
- *
32
- * @param {AbstractShape3D} shape
33
- * @param {{x:number,y:number,z:number}} position body world position
34
- * @param {ArrayLike<number>} rotation body world rotation quaternion (x,y,z,w)
35
- * @param {number} ox @param {number} oy @param {number} oz ray origin (world)
36
- * @param {number} dx @param {number} dy @param {number} dz ray dir (world, unit)
37
- * @param {number} tMax
38
- * @param {Float64Array|Vector3} outNormal world surface normal, written on a
39
- * finite hit
40
- * @returns {number} hit distance, `Infinity` on a refined miss, or
41
- * {@link RAY_REFINE_UNSUPPORTED} when the shape has no exact ray test here
42
- */
43
- export function refine_ray_hit(shape, position, rotation, ox, oy, oz, dx, dy, dz, tMax, outNormal) {
44
- if (shape.isSphereShape3D === true) {
45
- // Rotation-invariant: translate into the sphere's frame; the local
46
- // normal is already the world normal.
47
- return ray_sphere_local(outNormal, ox - position.x, oy - position.y, oz - position.z, dx, dy, dz, tMax, shape.radius);
48
- }
49
-
50
- if (shape.isBoxShape3D === true || shape.isCapsuleShape3D === true) {
51
- const qx = rotation[0], qy = rotation[1], qz = rotation[2], qw = rotation[3];
52
- // World → local: rotate by the inverse (conjugate) body rotation.
53
- v3_quat3_apply(lo, 0, ox - position.x, oy - position.y, oz - position.z, -qx, -qy, -qz, qw);
54
- v3_quat3_apply(ld, 0, dx, dy, dz, -qx, -qy, -qz, qw);
55
-
56
- let t;
57
- if (shape.isBoxShape3D === true) {
58
- const h = shape.half_extents;
59
- t = ray_box_local(ln, lo[0], lo[1], lo[2], ld[0], ld[1], ld[2], tMax, h.x, h.y, h.z);
60
- } else {
61
- t = ray_capsule_local(ln, lo[0], lo[1], lo[2], ld[0], ld[1], ld[2], tMax, shape.radius, shape.height * 0.5);
62
- }
63
- if (t === Infinity) return Infinity;
64
-
65
- // Local normal → world: rotate by the body rotation.
66
- v3_quat3_apply(outNormal, 0, ln[0], ln[1], ln[2], qx, qy, qz, qw);
67
- return t;
68
- }
69
-
70
- // Concave (mesh / heightmap): triangle decomposition.
71
- if (shape.is_convex === false) {
72
- return refine_ray_concave(shape, position, rotation, ox, oy, oz, dx, dy, dz, tMax, outNormal);
73
- }
74
-
75
- // Arbitrary composite convex (TransformedShape3D / UnionShape3D / ):
76
- // no exact ray test yet — caller falls back to the broadphase AABB hit.
77
- return RAY_REFINE_UNSUPPORTED;
78
- }
1
+ import { box3_raycast } from "../../../core/geom/3d/box/box3_raycast.js";
2
+ import { capsule_raycast } from "../../../core/geom/3d/capsule/capsule_raycast.js";
3
+ import { sphere_raycast } from "../../../core/geom/3d/sphere/sphere_raycast.js";
4
+ import { v3_quat3_apply } from "../../../core/geom/vec3/v3_quat3_apply.js";
5
+ import { v3_quat3_apply_inverse } from "../../../core/geom/vec3/v3_quat3_apply_inverse.js";
6
+ import { refine_ray_concave } from "./refine_ray_concave.js";
7
+
8
+ /**
9
+ * Sentinel returned by {@link refine_ray_hit} for a shape it has no exact ray
10
+ * test for (composite / arbitrary convex). The caller should keep the
11
+ * broadphase AABB result for that leaf rather than treat it as a miss.
12
+ * Distinct from `Infinity` (a refined miss) and any finite hit distance.
13
+ * @type {number}
14
+ */
15
+ export const RAY_REFINE_UNSUPPORTED = -1;
16
+
17
+ const lo = new Float64Array(3); // ray origin in shape-local frame
18
+ const ld = new Float64Array(3); // ray direction in shape-local frame
19
+ const ln = new Float64Array(3); // surface normal in shape-local frame
20
+
21
+ /**
22
+ * Refine a broadphase ray hit against a body's true shape geometry.
23
+ *
24
+ * Transforms the world ray into the shape's local frame once (rotate by the
25
+ * inverse body rotation — a unit direction stays unit, so the hit distance is
26
+ * preserved), runs the matching canonical primitive ({@link ray_shapes}), and
27
+ * rotates the returned local normal back to world. Spheres are
28
+ * rotation-invariant, so they only need the translation.
29
+ *
30
+ * Handles the convex primitives (sphere / box / capsule). Concave shapes
31
+ * (mesh / heightmap) and arbitrary composite convex shapes return
32
+ * {@link RAY_REFINE_UNSUPPORTED} — the concave path is wired in separately, and
33
+ * composites fall back to the broadphase AABB hit (no regression).
34
+ *
35
+ * @param {AbstractShape3D} shape
36
+ * @param {{x:number,y:number,z:number}} position body world position
37
+ * @param {ArrayLike<number>} rotation body world rotation quaternion (x,y,z,w)
38
+ * @param {number} ox @param {number} oy @param {number} oz ray origin (world)
39
+ * @param {number} dx @param {number} dy @param {number} dz ray dir (world, unit)
40
+ * @param {number} tMax
41
+ * @param {Float64Array|Vector3} outNormal world surface normal, written on a
42
+ * finite hit
43
+ * @returns {number} hit distance, `Infinity` on a refined miss, or
44
+ * {@link RAY_REFINE_UNSUPPORTED} when the shape has no exact ray test here
45
+ */
46
+ export function refine_ray_hit(shape, position, rotation, ox, oy, oz, dx, dy, dz, tMax, outNormal) {
47
+ if (shape.isSphereShape3D === true) {
48
+ // Rotation-invariant: translate into the sphere's frame; the local
49
+ // normal is already the world normal.
50
+ return sphere_raycast(outNormal, 0, ox - position.x, oy - position.y, oz - position.z, dx, dy, dz, tMax, shape.radius);
51
+ }
52
+
53
+ if (shape.isBoxShape3D === true || shape.isCapsuleShape3D === true) {
54
+ const qx = rotation[0], qy = rotation[1], qz = rotation[2], qw = rotation[3];
55
+ // World → local: rotate by the inverse (conjugate) body rotation.
56
+ v3_quat3_apply_inverse(lo, 0, ox - position.x, oy - position.y, oz - position.z, qx, qy, qz, qw);
57
+ v3_quat3_apply_inverse(ld, 0, dx, dy, dz, qx, qy, qz, qw);
58
+
59
+ let t;
60
+ if (shape.isBoxShape3D === true) {
61
+ const h = shape.half_extents;
62
+ t = box3_raycast(ln, 0, lo[0], lo[1], lo[2], ld[0], ld[1], ld[2], tMax, h.x, h.y, h.z);
63
+ } else {
64
+ t = capsule_raycast(ln, 0, lo[0], lo[1], lo[2], ld[0], ld[1], ld[2], tMax, shape.radius, shape.height * 0.5);
65
+ }
66
+ if (t === Infinity) return Infinity;
67
+
68
+ // Local normal → world: rotate by the body rotation.
69
+ v3_quat3_apply(outNormal, 0, ln[0], ln[1], ln[2], qx, qy, qz, qw);
70
+ return t;
71
+ }
72
+
73
+ // Concave (mesh / heightmap): triangle decomposition.
74
+ if (shape.is_convex === false) {
75
+ return refine_ray_concave(shape, position, rotation, ox, oy, oz, dx, dy, dz, tMax, outNormal);
76
+ }
77
+
78
+ // Arbitrary composite convex (TransformedShape3D / UnionShape3D / …):
79
+ // no exact ray test yet — caller falls back to the broadphase AABB hit.
80
+ return RAY_REFINE_UNSUPPORTED;
81
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"SoundEngine.d.ts","sourceRoot":"","sources":["../../../../src/engine/sound/SoundEngine.js"],"names":[],"mappings":";AAAA;;;;GAIG;AACH;IAkBwB,sBAWd;IAUF,sBAA2B;IAiB/B;;;OAGG;IACH,kBAFY,MAAM,CAIjB;IAED;;;;OAIG;IACH,iBAFa,QAAQ,IAAI,CAAC,CAMzB;IAED;;;OAGG;IACH,SAFa,QAAQ,GAAG,CAAC,CAWxB;CACJ"}
1
+ {"version":3,"file":"SoundEngine.d.ts","sourceRoot":"","sources":["../../../../src/engine/sound/SoundEngine.js"],"names":[],"mappings":";AAEA;;;;GAIG;AACH;IAkBwB,sBAWd;IAUF,sBAA2B;IAI3B;;;;OAIG;IACH,OAFU,WAAW,GAAC,IAAI,CAET;IAerB;;;;;;;;;;OAUG;IACH,6CAFa,WAAW,CAQvB;IAED;;;OAGG;IACH,kBAFY,MAAM,CAIjB;IAED;;;;OAIG;IACH,iBAFa,QAAQ,IAAI,CAAC,CAMzB;IAED;;;OAGG;IACH,SAFa,QAAQ,GAAG,CAAC,CAWxB;CACJ;4BA1H2B,wBAAwB"}
@@ -1,3 +1,5 @@
1
+ import { SopraEngine } from "./sopra/SopraEngine.js";
2
+
1
3
  /**
2
4
  *
3
5
  * @author Alex Goldring
@@ -46,6 +48,13 @@ class SoundEngine {
46
48
  gainNode.connect(compressor);
47
49
  compressor.connect(context.destination);
48
50
 
51
+ /**
52
+ * The sopra (FMOD/Wwise-style) engine, created and owned here once the AssetManager-backed
53
+ * buffer provider is available (see {@link createSopra}, called from SoundEmitterSystem).
54
+ * @type {SopraEngine|null}
55
+ */
56
+ this.sopra = null;
57
+
49
58
  // master channel
50
59
  Object.defineProperties(this, {
51
60
  volume: {
@@ -59,6 +68,25 @@ class SoundEngine {
59
68
  });
60
69
  }
61
70
 
71
+ /**
72
+ * Create and own the sopra engine, built on this SoundEngine's existing AudioContext + master
73
+ * destination (never a second context). Wired in by the sound systems, which supply an
74
+ * AssetManager-backed buffer provider.
75
+ *
76
+ * Idempotent: the SopraEngine is a singleton on the SoundEngine, so the first caller creates it and
77
+ * later callers reuse it (the `bufferProvider` of later calls is ignored). This lets multiple
78
+ * systems — e.g. the legacy SoundEmitterSystem and the native AudioEmitterSystem — share one engine.
79
+ * @param {BufferProvider} bufferProvider
80
+ * @returns {SopraEngine}
81
+ */
82
+ createSopra(bufferProvider) {
83
+ if (this.sopra === null) {
84
+ this.sopra = new SopraEngine(this.context, this.destination, bufferProvider);
85
+ }
86
+
87
+ return this.sopra;
88
+ }
89
+
62
90
  /**
63
91
  *
64
92
  * @return {number}
@@ -3,5 +3,5 @@
3
3
  * @param {number} dB
4
4
  * @returns {number}
5
5
  */
6
- declare function dB2Volume(dB: number): number;
6
+ export function dB2Volume(dB: number): number;
7
7
  //# sourceMappingURL=dB2Volume.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"dB2Volume.d.ts","sourceRoot":"","sources":["../../../../src/engine/sound/dB2Volume.js"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,+BAHW,MAAM,GACJ,MAAM,CAIlB"}
1
+ {"version":3,"file":"dB2Volume.d.ts","sourceRoot":"","sources":["../../../../src/engine/sound/dB2Volume.js"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,8BAHW,MAAM,GACJ,MAAM,CAIlB"}
@@ -3,6 +3,6 @@
3
3
  * @param {number} dB
4
4
  * @returns {number}
5
5
  */
6
- function dB2Volume(dB) {
6
+ export function dB2Volume(dB) {
7
7
  return Math.pow(10, 0.05 * dB);
8
8
  }
@@ -16,6 +16,10 @@ export class SoundControllerSerializationAdapter extends BinaryClassSerializatio
16
16
  */
17
17
  deserialize(buffer: BinaryBuffer, value: SoundController): void;
18
18
  }
19
+ /**
20
+ * @deprecated Legacy sound controller — superseded by the native audio path ({@link AudioEmitter} and
21
+ * the forthcoming `AudioEventTrigger`). Retained for existing callers during the strangler migration.
22
+ */
19
23
  declare class SoundController {
20
24
  /**
21
25
  *
@@ -1 +1 @@
1
- {"version":3,"file":"SoundController.d.ts","sourceRoot":"","sources":["../../../../../src/engine/sound/ecs/SoundController.js"],"names":[],"mappings":";AAkJA;;IACI,8BAAwB;IACxB,gBAAY;IAEZ;;;;OAIG;IACH,uCAFW,eAAe,QAIzB;IAED;;;;OAIG;IACH,yCAFW,eAAe,QAIzB;CACJ;AAnDD;IACI;;;;OAIG;IACH,0BAKC;IAJG,iBAAuB;IAM3B,0BAEC;IAED,cAEC;CACJ;;;;;gDAvI+C,6DAA6D;iBAD5F,uCAAuC;AAGxD;IAEQ;;;OAGG;IACH,QAFU,MAAM,MAAM,CAAC,CAEP;IAChB;;;OAGG;IACH,YAFU,SAAO,IAAI,CAEC;IACtB;;;OAGG;IACH,WAFU,SAAO,IAAI,CAEA;IACrB;;;OAGG;IACH,MAFU,OAAO,CAEA;IACjB;;;OAGG;IACH,QAFU,MAAM,CAED;IACf;;;OAGG;IACH,SAFU,SAAO,IAAI,CAEF;IAGvB;;;;;;;MASC;IAED,0BAyBC;IAxBG,SAAmB;IA0BvB;;;OAGG;IACH,2CAcC;IAED;;;OAGG;IACH,6CAcC;CACJ"}
1
+ {"version":3,"file":"SoundController.d.ts","sourceRoot":"","sources":["../../../../../src/engine/sound/ecs/SoundController.js"],"names":[],"mappings":";AAsJA;;IACI,8BAAwB;IACxB,gBAAY;IAEZ;;;;OAIG;IACH,uCAFW,eAAe,QAIzB;IAED;;;;OAIG;IACH,yCAFW,eAAe,QAIzB;CACJ;AAvDD;;;GAGG;AACH;IACI;;;;OAIG;IACH,0BAKC;IAJG,iBAAuB;IAM3B,0BAEC;IAED,cAEC;CACJ;;;;;gDA3I+C,6DAA6D;iBAD5F,uCAAuC;AAGxD;IAEQ;;;OAGG;IACH,QAFU,MAAM,MAAM,CAAC,CAEP;IAChB;;;OAGG;IACH,YAFU,SAAO,IAAI,CAEC;IACtB;;;OAGG;IACH,WAFU,SAAO,IAAI,CAEA;IACrB;;;OAGG;IACH,MAFU,OAAO,CAEA;IACjB;;;OAGG;IACH,QAFU,MAAM,CAED;IACf;;;OAGG;IACH,SAFU,SAAO,IAAI,CAEF;IAGvB;;;;;;;MASC;IAED,0BAyBC;IAxBG,SAAmB;IA0BvB;;;OAGG;IACH,2CAcC;IAED;;;OAGG;IACH,6CAcC;CACJ"}
@@ -114,6 +114,10 @@ class Rule {
114
114
  }
115
115
  }
116
116
 
117
+ /**
118
+ * @deprecated Legacy sound controller — superseded by the native audio path ({@link AudioEmitter} and
119
+ * the forthcoming `AudioEventTrigger`). Retained for existing callers during the strangler migration.
120
+ */
117
121
  class SoundController {
118
122
  /**
119
123
  *
@@ -1,4 +1,9 @@
1
1
  export default SoundControllerSystem;
2
+ /**
3
+ * @deprecated Legacy sound-controller system — superseded by the native audio path
4
+ * ({@link AudioEmitterSystem} and the forthcoming `AudioEventTrigger`). Retained for existing callers
5
+ * during the strangler migration.
6
+ */
2
7
  declare class SoundControllerSystem extends System<any, any, any, any, any> {
3
8
  constructor();
4
9
  dependencies: (typeof SoundController)[];
@@ -1 +1 @@
1
- {"version":3,"file":"SoundControllerSystem.d.ts","sourceRoot":"","sources":["../../../../../src/engine/sound/ecs/SoundControllerSystem.js"],"names":[],"mappings":";AAyBA;IACI,cAUC;IARG,yCAAqC;IAGrC,oEAEC;IAED,gBAAkB;IAGtB;;;;OAIG;IACH,gBAHW,eAAe,UACf,MAAM,QAsDhB;IAED,0CAUC;CACJ;uBA1GsB,qBAAqB;4BAGhB,sBAAsB;6BAFrB,2BAA2B;4CAFZ,oDAAoD"}
1
+ {"version":3,"file":"SoundControllerSystem.d.ts","sourceRoot":"","sources":["../../../../../src/engine/sound/ecs/SoundControllerSystem.js"],"names":[],"mappings":";AAyBA;;;;GAIG;AACH;IACI,cAUC;IARG,yCAAqC;IAGrC,oEAEC;IAED,gBAAkB;IAGtB;;;;OAIG;IACH,gBAHW,eAAe,UACf,MAAM,QAsDhB;IAED,0CAUC;CACJ;uBA/GsB,qBAAqB;4BAGhB,sBAAsB;6BAFrB,2BAA2B;4CAFZ,oDAAoD"}
@@ -23,6 +23,11 @@ function pickTackFromRule(rule) {
23
23
  return tracks[index];
24
24
  }
25
25
 
26
+ /**
27
+ * @deprecated Legacy sound-controller system — superseded by the native audio path
28
+ * ({@link AudioEmitterSystem} and the forthcoming `AudioEventTrigger`). Retained for existing callers
29
+ * during the strangler migration.
30
+ */
26
31
  class SoundControllerSystem extends System {
27
32
  constructor() {
28
33
  super();
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Native ECS sound component (the user-facing replacement for the legacy `SoundEmitter`). Unlike
3
+ * `SoundEmitter` — which holds a list of tracks that get *translated* into sopra events — an
4
+ * `AudioEmitter` OWNS its authored sopra {@link EventDescription} directly (full clip graph: samples /
5
+ * sequence / random / switch / blend; effects; bus routing; 3D / attenuation; voice config). It is the
6
+ * ECS-native data container the engine's data model makes possible (no FMOD-style global bank needed).
7
+ *
8
+ * Played + spatialised by {@link AudioEmitterSystem}; the entity's {@link Transform} supplies position.
9
+ */
10
+ export class AudioEmitter {
11
+ /**
12
+ * @param {*} json
13
+ * @returns {AudioEmitter}
14
+ */
15
+ static fromJSON(json: any): AudioEmitter;
16
+ /**
17
+ * The authored event this emitter plays.
18
+ * @type {EventDescription}
19
+ */
20
+ event: EventDescription;
21
+ /**
22
+ * Live volume multiplier applied on top of the event's own gain (carried by the instance gain).
23
+ * @type {Vector1}
24
+ */
25
+ volume: Vector1;
26
+ /**
27
+ * Play automatically when the component links to an entity (e.g. looping ambience). A finite event
28
+ * self-releases when it finishes; a looping event persists until unlink.
29
+ * @type {boolean}
30
+ */
31
+ autoplay: boolean;
32
+ /**
33
+ * @param {AudioEmitter} other
34
+ * @returns {boolean}
35
+ */
36
+ equals(other: AudioEmitter): boolean;
37
+ hash(): number;
38
+ toJSON(): {
39
+ event: {
40
+ label: string;
41
+ rootClip: {
42
+ type: string;
43
+ data: any;
44
+ };
45
+ busId: string;
46
+ gainDb: number;
47
+ is3D: boolean;
48
+ panningModel: number;
49
+ distanceMin: number;
50
+ distanceMax: number;
51
+ attenuation: {
52
+ keys: any[];
53
+ };
54
+ maxInstances: number;
55
+ priority: number;
56
+ stealMode: number;
57
+ virtualThresholdDb: number;
58
+ };
59
+ volume: number;
60
+ autoplay: boolean;
61
+ };
62
+ fromJSON(json: any): void;
63
+ }
64
+ export namespace AudioEmitter {
65
+ let typeName: string;
66
+ }
67
+ import { EventDescription } from "../../sopra/definition/EventDescription.js";
68
+ import Vector1 from "../../../../core/geom/Vector1.js";
69
+ //# sourceMappingURL=AudioEmitter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AudioEmitter.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/sound/ecs/audio/AudioEmitter.js"],"names":[],"mappings":"AAKA;;;;;;;;GAQG;AACH;IAyDI;;;OAGG;IACH,4BAFa,YAAY,CAMxB;IA/DD;;;OAGG;IACH,OAFU,gBAAgB,CAEK;IAE/B;;;OAGG;IACH,QAFU,OAAO,CAEO;IAExB;;;;OAIG;IACH,UAFU,OAAO,CAED;IAEhB;;;OAGG;IACH,cAHW,YAAY,GACV,OAAO,CAMnB;IAED,eAMC;IAED;;;;;;;;;;;;;;;;;;;;;;;MAMC;IAED,0BAQC;CAWJ;;;;iCA7EgC,4CAA4C;oBAFzD,kCAAkC"}
@@ -0,0 +1,83 @@
1
+ import { combine_hash } from "../../../../core/collection/array/combine_hash.js";
2
+ import Vector1 from "../../../../core/geom/Vector1.js";
3
+ import { computeHashFloat } from "../../../../core/primitives/numbers/computeHashFloat.js";
4
+ import { EventDescription } from "../../sopra/definition/EventDescription.js";
5
+
6
+ /**
7
+ * Native ECS sound component (the user-facing replacement for the legacy `SoundEmitter`). Unlike
8
+ * `SoundEmitter` — which holds a list of tracks that get *translated* into sopra events — an
9
+ * `AudioEmitter` OWNS its authored sopra {@link EventDescription} directly (full clip graph: samples /
10
+ * sequence / random / switch / blend; effects; bus routing; 3D / attenuation; voice config). It is the
11
+ * ECS-native data container the engine's data model makes possible (no FMOD-style global bank needed).
12
+ *
13
+ * Played + spatialised by {@link AudioEmitterSystem}; the entity's {@link Transform} supplies position.
14
+ */
15
+ export class AudioEmitter {
16
+
17
+ /**
18
+ * The authored event this emitter plays.
19
+ * @type {EventDescription}
20
+ */
21
+ event = new EventDescription();
22
+
23
+ /**
24
+ * Live volume multiplier applied on top of the event's own gain (carried by the instance gain).
25
+ * @type {Vector1}
26
+ */
27
+ volume = new Vector1(1);
28
+
29
+ /**
30
+ * Play automatically when the component links to an entity (e.g. looping ambience). A finite event
31
+ * self-releases when it finishes; a looping event persists until unlink.
32
+ * @type {boolean}
33
+ */
34
+ autoplay = true;
35
+
36
+ /**
37
+ * @param {AudioEmitter} other
38
+ * @returns {boolean}
39
+ */
40
+ equals(other) {
41
+ return this.autoplay === other.autoplay
42
+ && this.volume.getValue() === other.volume.getValue()
43
+ && this.event.equals(other.event);
44
+ }
45
+
46
+ hash() {
47
+ return combine_hash(
48
+ this.event.hash(),
49
+ this.autoplay ? 1 : 0,
50
+ computeHashFloat(this.volume.getValue())
51
+ );
52
+ }
53
+
54
+ toJSON() {
55
+ return {
56
+ event: this.event.toJSON(),
57
+ volume: this.volume.toJSON(),
58
+ autoplay: this.autoplay
59
+ };
60
+ }
61
+
62
+ fromJSON(json) {
63
+ if (json.event !== undefined) {
64
+ this.event.fromJSON(json.event);
65
+ }
66
+ if (json.volume !== undefined) {
67
+ this.volume.fromJSON(json.volume);
68
+ }
69
+ this.autoplay = json.autoplay !== undefined ? json.autoplay : true;
70
+ }
71
+
72
+ /**
73
+ * @param {*} json
74
+ * @returns {AudioEmitter}
75
+ */
76
+ static fromJSON(json) {
77
+ const r = new AudioEmitter();
78
+ r.fromJSON(json);
79
+ return r;
80
+ }
81
+ }
82
+
83
+ AudioEmitter.typeName = "AudioEmitter";
@@ -0,0 +1,97 @@
1
+ /**
2
+ * Drives {@link AudioEmitter} components through the shared sopra engine — the native counterpart to
3
+ * the legacy `SoundEmitterSystem`. Each emitter owns its {@link EventDescription} directly (no track
4
+ * translation); the entity's {@link Transform} feeds position; `volume` changes plumb to the instance
5
+ * gain. Each frame it forwards the listener pose, refreshes the spatial live set, and ticks sopra.
6
+ *
7
+ * **Two play paths**, chosen once at {@link link} (routing is fixed for the lifetime of the link —
8
+ * mutating `autoplay`/`is3D` afterward does nothing without an unlink/relink):
9
+ * - **Spatially managed** (`autoplay && is3D && looping`): registered with a {@link LiveEmitterSet} and
10
+ * left *dormant* until a refresh promotes the nearest in-range emitters up to a global voice budget —
11
+ * this is what lets the system carry far more emitters than can sound at once (the 100k-bird case). A
12
+ * dormant emitter costs only a BVH leaf; no instance, no nodes, no per-frame work. NOTE: for a crowd
13
+ * of content-equal managed events to all sound, their `maxInstances` must be ≥ the live budget — they
14
+ * share one sopra polyphony bucket (keyed by event content), so a lower cap gates the budget. Only
15
+ * *looping* events are managed: the live set models a persistent source whose phase is reconstructed
16
+ * on (re-)promotion — meaningless for a finite one-shot, and a dead one-shot would otherwise keep
17
+ * re-promoting and occupying a budget slot — so finite events take the direct path.
18
+ * - **Direct** (any other `autoplay` event — 2D sounds, or finite 3D one-shots): played immediately on
19
+ * link, stopped on unlink. 2D sounds (music, ambience beds) have nothing to cull by distance; a finite
20
+ * 3D one-shot still spatializes (its instance attenuates by position) and self-releases when it ends.
21
+ *
22
+ * Non-autoplay emitters are inert: neither played nor registered, awaiting a future explicit trigger.
23
+ *
24
+ * Shares the single {@link SopraEngine} owned by {@link SoundEngine} (created on demand, idempotent),
25
+ * so it coexists with the legacy `SoundEmitterSystem` during the strangler migration.
26
+ */
27
+ export class AudioEmitterSystem extends System<any, any, any, any, any> {
28
+ /**
29
+ * @param {AssetManager} assetManager
30
+ * @param {SoundEngine} soundEngine owns the AudioContext + master destination + sopra engine
31
+ * @param {{budget?:number, liveStickiness?:number, fadeOutSeconds?:number}} [liveEmitterSetOptions]
32
+ * forwarded to the {@link LiveEmitterSet} that manages 3D emitters
33
+ */
34
+ constructor(assetManager: AssetManager, soundEngine: SoundEngine, liveEmitterSetOptions?: {
35
+ budget?: number;
36
+ liveStickiness?: number;
37
+ fadeOutSeconds?: number;
38
+ });
39
+ dependencies: (typeof Transform | typeof AudioEmitter)[];
40
+ /**
41
+ * @type {SoundEngine}
42
+ */
43
+ soundEngine: SoundEngine;
44
+ /**
45
+ * @type {AudioContext}
46
+ */
47
+ webAudioContext: AudioContext;
48
+ /**
49
+ * @type {AssetManager}
50
+ */
51
+ assetManager: AssetManager;
52
+ /**
53
+ * The shared sopra engine (idempotent create — reused if the legacy system already made it).
54
+ * @type {SopraEngine}
55
+ */
56
+ sopra: SopraEngine;
57
+ /**
58
+ * Spatial lifecycle for 3D ("managed") emitters: BVH cull → promote nearest-in-range up to the
59
+ * budget, demote the rest. 2D emitters bypass this and play directly.
60
+ * @type {LiveEmitterSet}
61
+ */
62
+ liveSet: LiveEmitterSet;
63
+ /**
64
+ * Per-entity records: { emitter, transform, managed, instance, onVolume }. For a managed (3D)
65
+ * emitter the playing instance lives in {@link liveSet} (record.instance stays null); for a
66
+ * direct (2D) emitter it is held here.
67
+ * @type {object[]}
68
+ */
69
+ data: object[];
70
+ /**
71
+ * @param {AudioEmitter} emitter
72
+ * @param {Transform} transform
73
+ * @param {number} entity
74
+ */
75
+ link(emitter: AudioEmitter, transform: Transform, entity: number): void;
76
+ /**
77
+ * @param {AudioEmitter} emitter
78
+ * @param {Transform} transform
79
+ * @param {number} entity
80
+ */
81
+ unlink(emitter: AudioEmitter, transform: Transform, entity: number): void;
82
+ /**
83
+ * The currently-playing instance for an entity, or null. For a managed (3D) emitter this is the live
84
+ * instance only while it is promoted (null while dormant or out of range); for a direct (2D) emitter
85
+ * it is the instance held since link.
86
+ * @param {number} entity
87
+ * @returns {EventInstance|null}
88
+ */
89
+ instanceFor(entity: number): EventInstance | null;
90
+ update(timeDelta: any): void;
91
+ #private;
92
+ }
93
+ import { System } from "../../../ecs/System.js";
94
+ import { Transform } from "../../../ecs/transform/Transform.js";
95
+ import { AudioEmitter } from "./AudioEmitter.js";
96
+ import { LiveEmitterSet } from "./LiveEmitterSet.js";
97
+ //# sourceMappingURL=AudioEmitterSystem.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AudioEmitterSystem.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/sound/ecs/audio/AudioEmitterSystem.js"],"names":[],"mappings":"AAWA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH;IACI;;;;;OAKG;IACH,0FAHW;QAAC,MAAM,CAAC,EAAC,MAAM,CAAC;QAAC,cAAc,CAAC,EAAC,MAAM,CAAC;QAAC,cAAc,CAAC,EAAC,MAAM,CAAA;KAAC,EAiD1E;IA3CG,yDAA6C;IAE7C;;OAEG;IACH,yBAA8B;IAE9B;;OAEG;IACH,iBAFU,YAAY,CAEoB;IAE1C;;OAEG;IACH,2BAAgC;IAQhC;;;OAGG;IACH,mBAAkF;IAElF;;;;OAIG;IACH,SAFU,cAAc,CAE4C;IAEpE;;;;;OAKG;IACH,MAFU,MAAM,EAAE,CAEJ;IAGlB;;;;OAIG;IACH,cAJW,YAAY,aACZ,SAAS,UACT,MAAM,QAuBhB;IAED;;;;OAIG;IACH,gBAJW,YAAY,aACZ,SAAS,UACT,MAAM,QAmBhB;IAED;;;;;;OAMG;IACH,oBAHW,MAAM,GACJ,gBAAc,IAAI,CAe9B;IAuCD,6BAiCC;;CACJ;uBA3OsB,wBAAwB;0BACrB,qCAAqC;6BAKlC,mBAAmB;+BACjB,qBAAqB"}