@woosh/meep-engine 2.155.0 → 2.156.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (475) hide show
  1. package/README.md +1 -1
  2. package/build/bundle-worker-image-decoder.js +1 -1
  3. package/build/bundle-worker-terrain.js +1 -1
  4. package/editor/view/ecs/ComponentControlView.d.ts +0 -9
  5. package/editor/view/ecs/ComponentControlView.js +2 -98
  6. package/package.json +1 -1
  7. package/src/core/binary/32BitEncoder.js +1 -1
  8. package/src/core/binary/to_half_float_uint16.js +3 -3
  9. package/src/core/bvh2/bvh3/ebvh_build_hierarchy_radix.d.ts.map +1 -1
  10. package/src/core/bvh2/bvh3/ebvh_build_hierarchy_radix.js +275 -253
  11. package/src/core/cache/Cache.d.ts.map +1 -1
  12. package/src/core/cache/Cache.js +7 -0
  13. package/src/core/cache/FrequencySketch.d.ts.map +1 -1
  14. package/src/core/cache/FrequencySketch.js +8 -4
  15. package/src/core/clipboard/obtainClipBoard.d.ts +6 -0
  16. package/src/core/clipboard/obtainClipBoard.d.ts.map +1 -0
  17. package/src/core/clipboard/obtainClipBoard.js +29 -0
  18. package/src/core/clipboard/safeClipboardReadText.d.ts +6 -0
  19. package/src/core/clipboard/safeClipboardReadText.d.ts.map +1 -0
  20. package/src/core/clipboard/safeClipboardReadText.js +55 -0
  21. package/src/core/clipboard/safeClipboardWriteText.d.ts +8 -0
  22. package/src/core/clipboard/safeClipboardWriteText.d.ts.map +1 -0
  23. package/src/core/clipboard/safeClipboardWriteText.js +23 -0
  24. package/src/core/collection/array/array_quick_sort_by_lookup_map.js +1 -1
  25. package/src/core/collection/array/array_set_diff_sorting.d.ts.map +1 -1
  26. package/src/core/collection/array/array_set_diff_sorting.js +4 -1
  27. package/src/core/collection/array/array_shuffle.d.ts.map +1 -1
  28. package/src/core/collection/array/array_shuffle.js +30 -27
  29. package/src/core/collection/array/binarySearchLowIndex.d.ts.map +1 -1
  30. package/src/core/collection/array/binarySearchLowIndex.js +4 -3
  31. package/src/core/collection/array/typed/array_buffer_hash.js +1 -1
  32. package/src/core/collection/array/typed/is_typed_array_equals.d.ts.map +1 -1
  33. package/src/core/collection/array/typed/is_typed_array_equals.js +12 -2
  34. package/src/core/collection/heap/BinaryHeap.d.ts.map +1 -1
  35. package/src/core/collection/heap/BinaryHeap.js +12 -2
  36. package/src/core/collection/queue/Deque.d.ts.map +1 -1
  37. package/src/core/collection/queue/Deque.js +10 -8
  38. package/src/core/collection/table/RowFirstTable.d.ts.map +1 -1
  39. package/src/core/collection/table/RowFirstTable.js +4 -2
  40. package/src/core/collection/table/RowFirstTableSpec.js +2 -2
  41. package/src/core/color/operations/color_lerp.d.ts.map +1 -1
  42. package/src/core/color/operations/color_lerp.js +10 -3
  43. package/src/core/color/rgb2uint32.js +1 -1
  44. package/src/core/color/rgbe9995_to_rgb.js +1 -1
  45. package/src/core/function/objectsEqual.d.ts.map +1 -1
  46. package/src/core/function/objectsEqual.js +2 -1
  47. package/src/core/geom/2d/aabb/AABB2.d.ts.map +1 -1
  48. package/src/core/geom/2d/aabb/AABB2.js +12 -11
  49. package/src/core/geom/2d/convex-hull/convex_hull_jarvis_2d.d.ts.map +1 -1
  50. package/src/core/geom/2d/convex-hull/convex_hull_jarvis_2d.js +30 -4
  51. package/src/core/geom/2d/convex-hull/fixed_convex_hull_relaxation.d.ts.map +1 -1
  52. package/src/core/geom/2d/convex-hull/fixed_convex_hull_relaxation.js +6 -2
  53. package/src/core/geom/2d/hash-grid/SpatialHashGrid.d.ts.map +1 -1
  54. package/src/core/geom/2d/hash-grid/SpatialHashGrid.js +388 -386
  55. package/src/core/geom/2d/hash-grid/shg_query_elements_line.d.ts.map +1 -1
  56. package/src/core/geom/2d/hash-grid/shg_query_elements_line.js +8 -3
  57. package/src/core/geom/2d/quad-tree/QuadTreeDatum.d.ts.map +1 -1
  58. package/src/core/geom/2d/quad-tree/QuadTreeDatum.js +9 -1
  59. package/src/core/geom/2d/quad-tree/qt_query_data_nearest_to_point.d.ts +3 -1
  60. package/src/core/geom/2d/quad-tree/qt_query_data_nearest_to_point.d.ts.map +1 -1
  61. package/src/core/geom/2d/quad-tree/qt_query_data_nearest_to_point.js +3 -1
  62. package/src/core/geom/2d/quad-tree-binary/QuadTree.js +714 -714
  63. package/src/core/geom/2d/r-tree/StaticR2Tree.d.ts.map +1 -1
  64. package/src/core/geom/2d/r-tree/StaticR2Tree.js +5 -4
  65. package/src/core/geom/3d/aabb/aabb3_detailed_volume_intersection.d.ts.map +1 -1
  66. package/src/core/geom/3d/aabb/aabb3_detailed_volume_intersection.js +33 -29
  67. package/src/core/geom/3d/aabb/aabb3_near_distance_to_intersection_ray_segment.d.ts.map +1 -1
  68. package/src/core/geom/3d/aabb/aabb3_near_distance_to_intersection_ray_segment.js +3 -1
  69. package/src/core/geom/3d/aabb/aabb3_signed_distance_to_aabb3.d.ts.map +1 -1
  70. package/src/core/geom/3d/aabb/aabb3_signed_distance_to_aabb3.js +10 -7
  71. package/src/core/geom/3d/aabb/aabb3_transformed_compute_plane_side.d.ts.map +1 -1
  72. package/src/core/geom/3d/aabb/aabb3_transformed_compute_plane_side.js +30 -9
  73. package/src/core/geom/3d/aabb/compute_aabb_from_points.js +3 -3
  74. package/src/core/geom/3d/box/box3_raycast.d.ts +37 -0
  75. package/src/core/geom/3d/box/box3_raycast.d.ts.map +1 -0
  76. package/src/core/geom/3d/box/box3_raycast.js +81 -0
  77. package/src/core/geom/3d/capsule/capsule_raycast.d.ts +35 -0
  78. package/src/core/geom/3d/capsule/capsule_raycast.d.ts.map +1 -0
  79. package/src/core/geom/3d/capsule/capsule_raycast.js +93 -0
  80. package/src/core/geom/3d/cone/compute_bounding_cone_of_2_cones.d.ts.map +1 -1
  81. package/src/core/geom/3d/cone/compute_bounding_cone_of_2_cones.js +4 -0
  82. package/src/core/geom/3d/frustum/frustum3_computeNearestPointToPoint.js +1 -1
  83. package/src/core/geom/3d/line/line3_compute_segment_point_distance_eikonal.d.ts.map +1 -1
  84. package/src/core/geom/3d/line/line3_compute_segment_point_distance_eikonal.js +3 -2
  85. package/src/core/geom/3d/mat4/decompose_matrix_4_array.d.ts.map +1 -1
  86. package/src/core/geom/3d/mat4/decompose_matrix_4_array.js +12 -2
  87. package/src/core/geom/3d/mat4/eulerAnglesFromMatrix.js +2 -2
  88. package/src/core/geom/3d/mat4/m4_multiply_alphatensor.d.ts +1 -1
  89. package/src/core/geom/3d/mat4/m4_multiply_alphatensor.d.ts.map +1 -1
  90. package/src/core/geom/3d/mat4/m4_multiply_alphatensor.js +19 -13
  91. package/src/core/geom/3d/octahedra/octahedral_direction_to_uv.d.ts.map +1 -1
  92. package/src/core/geom/3d/octahedra/octahedral_direction_to_uv.js +3 -2
  93. package/src/core/geom/3d/plane/plane3_compute_plane_intersection.js +3 -2
  94. package/src/core/geom/3d/shape/MeshShape3D.d.ts.map +1 -1
  95. package/src/core/geom/3d/shape/MeshShape3D.js +7 -0
  96. package/src/core/geom/3d/shape/UnionShape3D.d.ts.map +1 -1
  97. package/src/core/geom/3d/shape/UnionShape3D.js +3 -2
  98. package/src/core/geom/3d/shape/util/shape3d_voxelize_to_grid.d.ts.map +1 -1
  99. package/src/core/geom/3d/shape/util/shape3d_voxelize_to_grid.js +153 -148
  100. package/src/core/geom/3d/sphere/harmonics/sh3_dering_optimize_positive.d.ts.map +1 -1
  101. package/src/core/geom/3d/sphere/harmonics/sh3_dering_optimize_positive.js +7 -0
  102. package/src/core/geom/3d/sphere/harmonics/sh3_sample_by_direction.d.ts.map +1 -1
  103. package/src/core/geom/3d/sphere/harmonics/sh3_sample_by_direction.js +13 -10
  104. package/src/core/geom/3d/sphere/sphere_projected_sphere_radius_sqr.d.ts +1 -1
  105. package/src/core/geom/3d/sphere/sphere_projected_sphere_radius_sqr.js +2 -2
  106. package/src/core/geom/3d/sphere/sphere_raycast.d.ts +33 -0
  107. package/src/core/geom/3d/sphere/sphere_raycast.d.ts.map +1 -0
  108. package/src/core/geom/3d/sphere/sphere_raycast.js +47 -0
  109. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_tet_get_neighbours.d.ts +24 -0
  110. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_tet_get_neighbours.d.ts.map +1 -0
  111. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_tet_get_neighbours.js +39 -0
  112. package/src/core/geom/3d/tetrahedra/triangle/trace_triangular_depth_map.d.ts.map +1 -1
  113. package/src/core/geom/3d/tetrahedra/triangle/trace_triangular_depth_map.js +4 -2
  114. package/src/core/geom/3d/topology/bounds/computeTriangleClusterNormalBoundingCone.js +3 -3
  115. package/src/core/geom/3d/topology/simplify/decimate_edge_collapse_snap.js +1 -1
  116. package/src/core/geom/3d/topology/tm_vertex_compute_normal.d.ts.map +1 -1
  117. package/src/core/geom/3d/topology/tm_vertex_compute_normal.js +4 -2
  118. package/src/core/geom/3d/util/make_justified_point_grid.d.ts.map +1 -1
  119. package/src/core/geom/3d/util/make_justified_point_grid.js +18 -10
  120. package/src/core/geom/ConicRay.d.ts.map +1 -1
  121. package/src/core/geom/ConicRay.js +11 -13
  122. package/src/core/geom/packing/max-rect/removeRedundantBoxes.d.ts.map +1 -1
  123. package/src/core/geom/packing/max-rect/removeRedundantBoxes.js +19 -4
  124. package/src/core/geom/vec3/v3_orthonormal_matrix_from_normal.d.ts.map +1 -0
  125. package/src/{engine/graphics/sh3/path_tracer/sampling → core/geom/vec3}/v3_orthonormal_matrix_from_normal.js +1 -1
  126. package/src/core/graph/coloring/colorizeGraph.js +2 -2
  127. package/src/core/graph/csr/CSRGraph.d.ts.map +1 -1
  128. package/src/core/graph/csr/CSRGraph.js +325 -319
  129. package/src/core/graph/layout/CircleLayout.d.ts.map +1 -1
  130. package/src/core/graph/layout/CircleLayout.js +8 -6
  131. package/src/core/graph/metis/native/refine/compute_kway_params.d.ts.map +1 -1
  132. package/src/core/graph/metis/native/refine/compute_kway_params.js +139 -138
  133. package/src/core/graph/mn_graph_coarsen.d.ts.map +1 -1
  134. package/src/core/graph/mn_graph_coarsen.js +4 -2
  135. package/src/core/graph/v2/NodeContainer.js +7 -7
  136. package/src/core/localization/LocalizationEngine.js +1 -1
  137. package/src/core/math/bell_membership_function.d.ts.map +1 -1
  138. package/src/core/math/bell_membership_function.js +3 -1
  139. package/src/core/math/complex/complex_add.d.ts +4 -4
  140. package/src/core/math/complex/complex_add.d.ts.map +1 -1
  141. package/src/core/math/complex/complex_add.js +3 -3
  142. package/src/core/math/complex/complex_div.d.ts +4 -4
  143. package/src/core/math/complex/complex_div.d.ts.map +1 -1
  144. package/src/core/math/complex/complex_div.js +3 -3
  145. package/src/core/math/complex/complex_mul.d.ts +4 -4
  146. package/src/core/math/complex/complex_mul.d.ts.map +1 -1
  147. package/src/core/math/complex/complex_mul.js +3 -3
  148. package/src/core/math/complex/complex_sub.d.ts +4 -4
  149. package/src/core/math/complex/complex_sub.d.ts.map +1 -1
  150. package/src/core/math/complex/complex_sub.js +3 -3
  151. package/src/core/math/idct_1d.d.ts +4 -4
  152. package/src/core/math/idct_1d.d.ts.map +1 -1
  153. package/src/core/math/idct_1d.js +3 -3
  154. package/src/core/math/noise/create_simplex_noise_2d.d.ts.map +1 -1
  155. package/src/core/math/noise/create_simplex_noise_2d.js +4 -2
  156. package/src/core/math/noise/sdnoise.d.ts.map +1 -1
  157. package/src/core/math/noise/sdnoise.js +12 -9
  158. package/src/core/math/physics/mie/compute_bhmie_optical_properties.d.ts.map +1 -1
  159. package/src/core/math/physics/mie/compute_bhmie_optical_properties.js +94 -50
  160. package/src/core/math/physics/mie/lorenz_mie_coefs.d.ts +3 -6
  161. package/src/core/math/physics/mie/lorenz_mie_coefs.d.ts.map +1 -1
  162. package/src/core/math/physics/mie/lorenz_mie_coefs.js +180 -157
  163. package/src/core/math/physics/mie/mie_ab_to_optical_properties.d.ts +3 -4
  164. package/src/core/math/physics/mie/mie_ab_to_optical_properties.d.ts.map +1 -1
  165. package/src/core/math/physics/mie/mie_ab_to_optical_properties.js +47 -21
  166. package/src/core/math/random/randomIntegerBetween.d.ts.map +1 -1
  167. package/src/core/math/random/randomIntegerBetween.js +4 -1
  168. package/src/core/math/solveCubic.d.ts.map +1 -1
  169. package/src/core/math/solveCubic.js +95 -82
  170. package/src/core/math/spline/computeCatmullRomSplineUniformDistance.d.ts.map +1 -1
  171. package/src/core/math/spline/computeCatmullRomSplineUniformDistance.js +13 -0
  172. package/src/core/math/statistics/softmax.js +1 -1
  173. package/src/core/model/node-graph/visual/NodeGraphVisualData.d.ts +1 -0
  174. package/src/core/model/node-graph/visual/NodeGraphVisualData.d.ts.map +1 -1
  175. package/src/core/model/node-graph/visual/NodeGraphVisualData.js +2 -1
  176. package/src/core/model/node-graph/visual/NodeVisualData.js +1 -1
  177. package/src/core/model/object/ImmutableObjectPool.d.ts +7 -0
  178. package/src/core/model/object/ImmutableObjectPool.d.ts.map +1 -1
  179. package/src/core/model/object/ImmutableObjectPool.js +20 -10
  180. package/src/core/model/reactive/evaluation/MultiPredicateEvaluator.d.ts.map +1 -1
  181. package/src/core/model/reactive/evaluation/MultiPredicateEvaluator.js +39 -2
  182. package/src/core/model/reactive/model/terminal/ReactiveReference.d.ts.map +1 -1
  183. package/src/core/model/reactive/model/terminal/ReactiveReference.js +2 -0
  184. package/src/core/parser/simple/readHexToken.d.ts.map +1 -1
  185. package/src/core/parser/simple/readHexToken.js +6 -0
  186. package/src/core/primitives/numbers/number_pretty_print.d.ts.map +1 -1
  187. package/src/core/primitives/numbers/number_pretty_print.js +4 -1
  188. package/src/core/primitives/strings/string_jaro_winkler.js +1 -1
  189. package/src/core/process/CompositeProcess.js +1 -1
  190. package/src/core/process/action/AsynchronousDelayAction.d.ts.map +1 -1
  191. package/src/core/process/action/AsynchronousDelayAction.js +3 -0
  192. package/src/core/process/executor/ConcurrentExecutor.d.ts.map +1 -1
  193. package/src/core/process/executor/ConcurrentExecutor.js +3 -2
  194. package/src/core/process/task/util/randomCountTask.d.ts.map +1 -1
  195. package/src/core/process/task/util/randomCountTask.js +3 -1
  196. package/src/core/process/undo/ActionProcessor.d.ts.map +1 -1
  197. package/src/core/process/undo/ActionProcessor.js +5 -3
  198. package/src/core/process/worker/WorkerBuilder.js +3 -3
  199. package/src/engine/animation/curve/AnimationCurve.d.ts.map +1 -1
  200. package/src/engine/animation/curve/AnimationCurve.js +4 -2
  201. package/src/engine/control/first-person/DESIGN.md +1 -1
  202. package/src/engine/control/first-person/FirstPersonMotionPhase.d.ts +55 -0
  203. package/src/engine/control/first-person/FirstPersonMotionPhase.d.ts.map +1 -0
  204. package/src/engine/control/first-person/FirstPersonMotionPhase.js +134 -0
  205. package/src/engine/control/first-person/FirstPersonPlayerController.d.ts +23 -2
  206. package/src/engine/control/first-person/FirstPersonPlayerController.d.ts.map +1 -1
  207. package/src/engine/control/first-person/FirstPersonPlayerController.js +1 -1
  208. package/src/engine/control/first-person/FirstPersonPlayerControllerConfig.d.ts +168 -0
  209. package/src/engine/control/first-person/FirstPersonPlayerControllerConfig.d.ts.map +1 -1
  210. package/src/engine/control/first-person/FirstPersonPlayerControllerConfig.js +115 -0
  211. package/src/engine/control/first-person/FirstPersonPlayerControllerSystem.d.ts +71 -0
  212. package/src/engine/control/first-person/FirstPersonPlayerControllerSystem.d.ts.map +1 -1
  213. package/src/engine/control/first-person/FirstPersonPlayerControllerSystem.js +255 -55
  214. package/src/engine/control/first-person/abilities/LedgeGrab.d.ts +82 -43
  215. package/src/engine/control/first-person/abilities/LedgeGrab.d.ts.map +1 -1
  216. package/src/engine/control/first-person/abilities/LedgeGrab.js +405 -213
  217. package/src/engine/control/first-person/abilities/Mantle.d.ts +6 -0
  218. package/src/engine/control/first-person/abilities/Mantle.d.ts.map +1 -1
  219. package/src/engine/control/first-person/abilities/Mantle.js +104 -45
  220. package/src/engine/control/first-person/abilities/ScrambleUp.d.ts +61 -0
  221. package/src/engine/control/first-person/abilities/ScrambleUp.d.ts.map +1 -0
  222. package/src/engine/control/first-person/abilities/ScrambleUp.js +182 -0
  223. package/src/engine/control/first-person/math/jumpDynamics.d.ts +84 -0
  224. package/src/engine/control/first-person/math/jumpDynamics.d.ts.map +1 -0
  225. package/src/engine/control/first-person/math/jumpDynamics.js +108 -0
  226. package/src/engine/control/first-person/prototype_first_person_controller.js +45 -1
  227. package/src/engine/graphics/camera/testClippingPlaneComputation.js +1 -1
  228. package/src/engine/graphics/ecs/path/tube/prototypeAnimatedPathMask.js +1 -1
  229. package/src/engine/graphics/particles/particular/engine/utils/volume/prototypeParticleVolume.js +1 -1
  230. package/src/engine/graphics/render/buffer/buffers/prototypeNormalFrameBuffer.js +1 -1
  231. package/src/engine/graphics/render/forward_plus/plugin/ptototypeFPPlugin.js +1 -1
  232. package/src/engine/graphics/render/visibility/hiz/prototypeHiZ.js +1 -1
  233. package/src/engine/graphics/sh3/path_tracer/texture/sample_material.js +1 -1
  234. package/src/engine/graphics/shadows/testShadowMapRendering.js +1 -1
  235. package/src/engine/physics/CONSTRAINT_SOLVER_BENCH_LOG.md +208 -0
  236. package/src/engine/physics/CONSTRAINT_SOLVER_IMPROVEMENTS_PLAN.md +364 -0
  237. package/src/engine/physics/PLAN.md +6 -5
  238. package/src/engine/physics/constraint/solve_constraints.d.ts +4 -1
  239. package/src/engine/physics/constraint/solve_constraints.d.ts.map +1 -1
  240. package/src/engine/physics/constraint/solve_constraints.js +147 -33
  241. package/src/engine/physics/ecs/PhysicsSystem.d.ts.map +1 -1
  242. package/src/engine/physics/ecs/PhysicsSystem.js +1750 -1747
  243. package/src/engine/physics/fluid/ecs/FluidSystem.d.ts +3 -3
  244. package/src/engine/physics/gjk/gjk_epa_penetration.d.ts.map +1 -1
  245. package/src/engine/physics/gjk/gjk_epa_penetration.js +5 -9
  246. package/src/engine/physics/narrowphase/convex_convex_manifold.d.ts.map +1 -1
  247. package/src/engine/physics/narrowphase/convex_convex_manifold.js +22 -25
  248. package/src/engine/physics/narrowphase/convex_decomposition.d.ts +32 -13
  249. package/src/engine/physics/narrowphase/convex_decomposition.d.ts.map +1 -1
  250. package/src/engine/physics/narrowphase/convex_decomposition.js +61 -65
  251. package/src/engine/physics/narrowphase/mesh_convex_hull.d.ts.map +1 -1
  252. package/src/engine/physics/narrowphase/mesh_convex_hull.js +13 -8
  253. package/src/engine/physics/narrowphase/refine_ray_concave.d.ts.map +1 -1
  254. package/src/engine/physics/narrowphase/refine_ray_concave.js +5 -3
  255. package/src/engine/physics/narrowphase/refine_ray_hit.d.ts.map +1 -1
  256. package/src/engine/physics/narrowphase/refine_ray_hit.js +81 -78
  257. package/src/engine/sound/SoundEngine.d.ts.map +1 -1
  258. package/src/engine/sound/SoundEngine.js +28 -0
  259. package/src/engine/sound/dB2Volume.d.ts +1 -1
  260. package/src/engine/sound/dB2Volume.d.ts.map +1 -1
  261. package/src/engine/sound/dB2Volume.js +1 -1
  262. package/src/engine/sound/ecs/SoundController.d.ts +4 -0
  263. package/src/engine/sound/ecs/SoundController.d.ts.map +1 -1
  264. package/src/engine/sound/ecs/SoundController.js +4 -0
  265. package/src/engine/sound/ecs/SoundControllerSystem.d.ts +5 -0
  266. package/src/engine/sound/ecs/SoundControllerSystem.d.ts.map +1 -1
  267. package/src/engine/sound/ecs/SoundControllerSystem.js +5 -0
  268. package/src/engine/sound/ecs/audio/AudioEmitter.d.ts +69 -0
  269. package/src/engine/sound/ecs/audio/AudioEmitter.d.ts.map +1 -0
  270. package/src/engine/sound/ecs/audio/AudioEmitter.js +83 -0
  271. package/src/engine/sound/ecs/audio/AudioEmitterSystem.d.ts +97 -0
  272. package/src/engine/sound/ecs/audio/AudioEmitterSystem.d.ts.map +1 -0
  273. package/src/engine/sound/ecs/audio/AudioEmitterSystem.js +238 -0
  274. package/src/engine/sound/ecs/audio/LiveEmitterSet.d.ts +90 -0
  275. package/src/engine/sound/ecs/audio/LiveEmitterSet.d.ts.map +1 -0
  276. package/src/engine/sound/ecs/audio/LiveEmitterSet.js +324 -0
  277. package/src/engine/sound/ecs/audio/SpatialAudioIndex.d.ts +59 -0
  278. package/src/engine/sound/ecs/audio/SpatialAudioIndex.d.ts.map +1 -0
  279. package/src/engine/sound/ecs/audio/SpatialAudioIndex.js +140 -0
  280. package/src/engine/sound/ecs/emitter/SoundEmitter.d.ts +16 -65
  281. package/src/engine/sound/ecs/emitter/SoundEmitter.d.ts.map +1 -1
  282. package/src/engine/sound/ecs/emitter/SoundEmitter.js +19 -224
  283. package/src/engine/sound/ecs/emitter/SoundEmitterComponentContext.d.ts +26 -29
  284. package/src/engine/sound/ecs/emitter/SoundEmitterComponentContext.d.ts.map +1 -1
  285. package/src/engine/sound/ecs/emitter/SoundEmitterComponentContext.js +168 -135
  286. package/src/engine/sound/ecs/emitter/SoundEmitterSystem.d.ts +36 -59
  287. package/src/engine/sound/ecs/emitter/SoundEmitterSystem.d.ts.map +1 -1
  288. package/src/engine/sound/ecs/emitter/SoundEmitterSystem.js +154 -390
  289. package/src/engine/sound/ecs/emitter/SoundTrack.d.ts +20 -23
  290. package/src/engine/sound/ecs/emitter/SoundTrack.d.ts.map +1 -1
  291. package/src/engine/sound/ecs/emitter/SoundTrack.js +34 -152
  292. package/src/engine/sound/sopra/IMPLEMENTATION_PLAN.md +993 -0
  293. package/src/engine/sound/sopra/README.md +643 -7
  294. package/src/engine/sound/sopra/SopraEngine.d.ts +229 -0
  295. package/src/engine/sound/sopra/SopraEngine.d.ts.map +1 -0
  296. package/src/engine/sound/sopra/SopraEngine.js +423 -0
  297. package/src/engine/sound/sopra/asset/AssetManagerBufferProvider.d.ts +26 -0
  298. package/src/engine/sound/sopra/asset/AssetManagerBufferProvider.d.ts.map +1 -0
  299. package/src/engine/sound/sopra/asset/AssetManagerBufferProvider.js +71 -0
  300. package/src/engine/sound/sopra/asset/BufferProvider.d.ts +24 -0
  301. package/src/engine/sound/sopra/asset/BufferProvider.d.ts.map +1 -0
  302. package/src/engine/sound/sopra/asset/BufferProvider.js +29 -0
  303. package/src/engine/sound/sopra/asset/StubBufferProvider.d.ts +31 -0
  304. package/src/engine/sound/sopra/asset/StubBufferProvider.d.ts.map +1 -0
  305. package/src/engine/sound/sopra/asset/StubBufferProvider.js +58 -0
  306. package/src/engine/sound/sopra/definition/BusDefinition.d.ts +83 -0
  307. package/src/engine/sound/sopra/definition/BusDefinition.d.ts.map +1 -0
  308. package/src/engine/sound/sopra/definition/BusDefinition.js +142 -0
  309. package/src/engine/sound/sopra/definition/BusDefinitionSerializationAdapter.d.ts +17 -0
  310. package/src/engine/sound/sopra/definition/BusDefinitionSerializationAdapter.d.ts.map +1 -0
  311. package/src/engine/sound/sopra/definition/BusDefinitionSerializationAdapter.js +54 -0
  312. package/src/engine/sound/sopra/definition/DuckingRule.d.ts +71 -0
  313. package/src/engine/sound/sopra/definition/DuckingRule.d.ts.map +1 -0
  314. package/src/engine/sound/sopra/definition/DuckingRule.js +106 -0
  315. package/src/engine/sound/sopra/definition/DuckingRuleSerializationAdapter.d.ts +18 -0
  316. package/src/engine/sound/sopra/definition/DuckingRuleSerializationAdapter.d.ts.map +1 -0
  317. package/src/engine/sound/sopra/definition/DuckingRuleSerializationAdapter.js +31 -0
  318. package/src/engine/sound/sopra/definition/EventDescription.d.ts +132 -0
  319. package/src/engine/sound/sopra/definition/EventDescription.d.ts.map +1 -0
  320. package/src/engine/sound/sopra/definition/EventDescription.js +259 -0
  321. package/src/engine/sound/sopra/definition/EventDescriptionSerializationAdapter.d.ts +17 -0
  322. package/src/engine/sound/sopra/definition/EventDescriptionSerializationAdapter.d.ts.map +1 -0
  323. package/src/engine/sound/sopra/definition/EventDescriptionSerializationAdapter.js +71 -0
  324. package/src/engine/sound/sopra/definition/MixerSnapshot.d.ts +51 -0
  325. package/src/engine/sound/sopra/definition/MixerSnapshot.d.ts.map +1 -0
  326. package/src/engine/sound/sopra/definition/MixerSnapshot.js +83 -0
  327. package/src/engine/sound/sopra/definition/MixerSnapshotSerializationAdapter.d.ts +18 -0
  328. package/src/engine/sound/sopra/definition/MixerSnapshotSerializationAdapter.d.ts.map +1 -0
  329. package/src/engine/sound/sopra/definition/MixerSnapshotSerializationAdapter.js +39 -0
  330. package/src/engine/sound/sopra/definition/ParameterDefinition.d.ts +72 -0
  331. package/src/engine/sound/sopra/definition/ParameterDefinition.d.ts.map +1 -0
  332. package/src/engine/sound/sopra/definition/ParameterDefinition.js +117 -0
  333. package/src/engine/sound/sopra/definition/ParameterDefinitionSerializationAdapter.d.ts +18 -0
  334. package/src/engine/sound/sopra/definition/ParameterDefinitionSerializationAdapter.d.ts.map +1 -0
  335. package/src/engine/sound/sopra/definition/ParameterDefinitionSerializationAdapter.js +31 -0
  336. package/src/engine/sound/sopra/definition/SopraPanningModel.d.ts +14 -0
  337. package/src/engine/sound/sopra/definition/SopraPanningModel.d.ts.map +1 -0
  338. package/src/engine/sound/sopra/definition/SopraPanningModel.js +20 -0
  339. package/src/engine/sound/sopra/definition/VoiceStealMode.d.ts +10 -0
  340. package/src/engine/sound/sopra/definition/VoiceStealMode.d.ts.map +1 -0
  341. package/src/engine/sound/sopra/definition/VoiceStealMode.js +18 -0
  342. package/src/engine/sound/sopra/definition/clip/AbstractAudioClip.d.ts +93 -0
  343. package/src/engine/sound/sopra/definition/clip/AbstractAudioClip.d.ts.map +1 -0
  344. package/src/engine/sound/sopra/definition/clip/AbstractAudioClip.js +109 -0
  345. package/src/engine/sound/sopra/definition/clip/BlendContainerAudioClip.d.ts +80 -0
  346. package/src/engine/sound/sopra/definition/clip/BlendContainerAudioClip.d.ts.map +1 -0
  347. package/src/engine/sound/sopra/definition/clip/BlendContainerAudioClip.js +181 -0
  348. package/src/engine/sound/sopra/definition/clip/BlendContainerAudioClipSerializationAdapter.d.ts +17 -0
  349. package/src/engine/sound/sopra/definition/clip/BlendContainerAudioClipSerializationAdapter.d.ts.map +1 -0
  350. package/src/engine/sound/sopra/definition/clip/BlendContainerAudioClipSerializationAdapter.js +74 -0
  351. package/src/engine/sound/sopra/definition/clip/ContainerAudioClip.d.ts +34 -0
  352. package/src/engine/sound/sopra/definition/clip/ContainerAudioClip.d.ts.map +1 -0
  353. package/src/engine/sound/sopra/definition/clip/ContainerAudioClip.js +100 -0
  354. package/src/engine/sound/sopra/definition/clip/RandomContainerAudioClip.d.ts +101 -0
  355. package/src/engine/sound/sopra/definition/clip/RandomContainerAudioClip.d.ts.map +1 -0
  356. package/src/engine/sound/sopra/definition/clip/RandomContainerAudioClip.js +230 -0
  357. package/src/engine/sound/sopra/definition/clip/RandomContainerAudioClipSerializationAdapter.d.ts +17 -0
  358. package/src/engine/sound/sopra/definition/clip/RandomContainerAudioClipSerializationAdapter.d.ts.map +1 -0
  359. package/src/engine/sound/sopra/definition/clip/RandomContainerAudioClipSerializationAdapter.js +54 -0
  360. package/src/engine/sound/sopra/definition/clip/SampleAudioClip.d.ts +103 -0
  361. package/src/engine/sound/sopra/definition/clip/SampleAudioClip.d.ts.map +1 -0
  362. package/src/engine/sound/sopra/definition/clip/SampleAudioClip.js +191 -0
  363. package/src/engine/sound/sopra/definition/clip/SampleAudioClipSerializationAdapter.d.ts +18 -0
  364. package/src/engine/sound/sopra/definition/clip/SampleAudioClipSerializationAdapter.d.ts.map +1 -0
  365. package/src/engine/sound/sopra/definition/clip/SampleAudioClipSerializationAdapter.js +39 -0
  366. package/src/engine/sound/sopra/definition/clip/SequenceContainerAudioClip.d.ts +40 -0
  367. package/src/engine/sound/sopra/definition/clip/SequenceContainerAudioClip.d.ts.map +1 -0
  368. package/src/engine/sound/sopra/definition/clip/SequenceContainerAudioClip.js +91 -0
  369. package/src/engine/sound/sopra/definition/clip/SequenceContainerAudioClipSerializationAdapter.d.ts +17 -0
  370. package/src/engine/sound/sopra/definition/clip/SequenceContainerAudioClipSerializationAdapter.d.ts.map +1 -0
  371. package/src/engine/sound/sopra/definition/clip/SequenceContainerAudioClipSerializationAdapter.js +42 -0
  372. package/src/engine/sound/sopra/definition/clip/SilenceAudioClip.d.ts +44 -0
  373. package/src/engine/sound/sopra/definition/clip/SilenceAudioClip.d.ts.map +1 -0
  374. package/src/engine/sound/sopra/definition/clip/SilenceAudioClip.js +77 -0
  375. package/src/engine/sound/sopra/definition/clip/SilenceAudioClipSerializationAdapter.d.ts +18 -0
  376. package/src/engine/sound/sopra/definition/clip/SilenceAudioClipSerializationAdapter.d.ts.map +1 -0
  377. package/src/engine/sound/sopra/definition/clip/SilenceAudioClipSerializationAdapter.js +27 -0
  378. package/src/engine/sound/sopra/definition/clip/SwitchContainerAudioClip.d.ts +65 -0
  379. package/src/engine/sound/sopra/definition/clip/SwitchContainerAudioClip.d.ts.map +1 -0
  380. package/src/engine/sound/sopra/definition/clip/SwitchContainerAudioClip.js +131 -0
  381. package/src/engine/sound/sopra/definition/clip/SwitchContainerAudioClipSerializationAdapter.d.ts +17 -0
  382. package/src/engine/sound/sopra/definition/clip/SwitchContainerAudioClipSerializationAdapter.d.ts.map +1 -0
  383. package/src/engine/sound/sopra/definition/clip/SwitchContainerAudioClipSerializationAdapter.js +41 -0
  384. package/src/engine/sound/sopra/definition/effect/AbstractAudioEffect.d.ts +24 -0
  385. package/src/engine/sound/sopra/definition/effect/AbstractAudioEffect.d.ts.map +1 -0
  386. package/src/engine/sound/sopra/definition/effect/AbstractAudioEffect.js +24 -0
  387. package/src/engine/sound/sopra/definition/effect/CompressorEffect.d.ts +70 -0
  388. package/src/engine/sound/sopra/definition/effect/CompressorEffect.d.ts.map +1 -0
  389. package/src/engine/sound/sopra/definition/effect/CompressorEffect.js +120 -0
  390. package/src/engine/sound/sopra/definition/effect/CompressorEffectSerializationAdapter.d.ts +18 -0
  391. package/src/engine/sound/sopra/definition/effect/CompressorEffectSerializationAdapter.d.ts.map +1 -0
  392. package/src/engine/sound/sopra/definition/effect/CompressorEffectSerializationAdapter.js +31 -0
  393. package/src/engine/sound/sopra/definition/effect/EqEffect.d.ts +74 -0
  394. package/src/engine/sound/sopra/definition/effect/EqEffect.d.ts.map +1 -0
  395. package/src/engine/sound/sopra/definition/effect/EqEffect.js +128 -0
  396. package/src/engine/sound/sopra/definition/effect/EqEffectSerializationAdapter.d.ts +18 -0
  397. package/src/engine/sound/sopra/definition/effect/EqEffectSerializationAdapter.d.ts.map +1 -0
  398. package/src/engine/sound/sopra/definition/effect/EqEffectSerializationAdapter.js +29 -0
  399. package/src/engine/sound/sopra/definition/effect/ReverbEffect.d.ts +49 -0
  400. package/src/engine/sound/sopra/definition/effect/ReverbEffect.d.ts.map +1 -0
  401. package/src/engine/sound/sopra/definition/effect/ReverbEffect.js +101 -0
  402. package/src/engine/sound/sopra/definition/effect/ReverbEffectSerializationAdapter.d.ts +18 -0
  403. package/src/engine/sound/sopra/definition/effect/ReverbEffectSerializationAdapter.d.ts.map +1 -0
  404. package/src/engine/sound/sopra/definition/effect/ReverbEffectSerializationAdapter.js +25 -0
  405. package/src/engine/sound/sopra/legacy/soundEmitterToEventDescription.d.ts +31 -0
  406. package/src/engine/sound/sopra/legacy/soundEmitterToEventDescription.d.ts.map +1 -0
  407. package/src/engine/sound/sopra/legacy/soundEmitterToEventDescription.js +106 -0
  408. package/src/engine/sound/sopra/runtime/BusGraph.d.ts +79 -0
  409. package/src/engine/sound/sopra/runtime/BusGraph.d.ts.map +1 -0
  410. package/src/engine/sound/sopra/runtime/BusGraph.js +227 -0
  411. package/src/engine/sound/sopra/runtime/EventInstance.d.ts +144 -0
  412. package/src/engine/sound/sopra/runtime/EventInstance.d.ts.map +1 -0
  413. package/src/engine/sound/sopra/runtime/EventInstance.js +579 -0
  414. package/src/engine/sound/sopra/runtime/ParameterStore.d.ts +42 -0
  415. package/src/engine/sound/sopra/runtime/ParameterStore.d.ts.map +1 -0
  416. package/src/engine/sound/sopra/runtime/ParameterStore.js +98 -0
  417. package/src/engine/sound/sopra/runtime/SopraPlaybackContext.d.ts +42 -0
  418. package/src/engine/sound/sopra/runtime/SopraPlaybackContext.d.ts.map +1 -0
  419. package/src/engine/sound/sopra/runtime/SopraPlaybackContext.js +68 -0
  420. package/src/engine/sound/sopra/runtime/Voice.d.ts +67 -0
  421. package/src/engine/sound/sopra/runtime/Voice.d.ts.map +1 -0
  422. package/src/engine/sound/sopra/runtime/Voice.js +145 -0
  423. package/src/engine/sound/sopra/runtime/VoiceManager.d.ts +38 -0
  424. package/src/engine/sound/sopra/runtime/VoiceManager.d.ts.map +1 -0
  425. package/src/engine/sound/sopra/runtime/VoiceManager.js +136 -0
  426. package/src/engine/sound/sopra/runtime/VoicePool.d.ts +12 -0
  427. package/src/engine/sound/sopra/runtime/VoicePool.d.ts.map +1 -0
  428. package/src/engine/sound/sopra/runtime/VoicePool.js +17 -0
  429. package/src/engine/sound/sopra/serialization/populateSopraSerializationRegistry.d.ts +11 -0
  430. package/src/engine/sound/sopra/serialization/populateSopraSerializationRegistry.d.ts.map +1 -0
  431. package/src/engine/sound/sopra/serialization/populateSopraSerializationRegistry.js +42 -0
  432. package/src/engine/sound/sopra/serialization/sopraJSON.d.ts +33 -0
  433. package/src/engine/sound/sopra/serialization/sopraJSON.d.ts.map +1 -0
  434. package/src/engine/sound/sopra/serialization/sopraJSON.js +99 -0
  435. package/src/engine/sound/sopra/serialization/sopraSerializationHarness.d.ts +27 -0
  436. package/src/engine/sound/sopra/serialization/sopraSerializationHarness.d.ts.map +1 -0
  437. package/src/engine/sound/sopra/serialization/sopraSerializationHarness.js +49 -0
  438. package/src/engine/sound/sopra/util/MockAudioContext.d.ts +74 -0
  439. package/src/engine/sound/sopra/util/MockAudioContext.d.ts.map +1 -0
  440. package/src/engine/sound/sopra/util/MockAudioContext.js +215 -0
  441. package/src/engine/sound/sopra/util/buildAttenuationCurve.d.ts +15 -0
  442. package/src/engine/sound/sopra/util/buildAttenuationCurve.d.ts.map +1 -0
  443. package/src/engine/sound/sopra/util/buildAttenuationCurve.js +40 -0
  444. package/src/engine/sound/sopra/util/fadeOutAndStop.d.ts +34 -0
  445. package/src/engine/sound/sopra/util/fadeOutAndStop.d.ts.map +1 -0
  446. package/src/engine/sound/sopra/util/fadeOutAndStop.js +60 -0
  447. package/src/engine/sound/volume2dB.d.ts +1 -1
  448. package/src/engine/sound/volume2dB.d.ts.map +1 -1
  449. package/src/engine/sound/volume2dB.js +1 -1
  450. package/src/engine/graphics/sh3/path_tracer/sampling/v3_orthonormal_matrix_from_normal.d.ts.map +0 -1
  451. package/src/engine/physics/narrowphase/ray_shapes.d.ts +0 -66
  452. package/src/engine/physics/narrowphase/ray_shapes.d.ts.map +0 -1
  453. package/src/engine/physics/narrowphase/ray_shapes.js +0 -187
  454. package/src/engine/sound/ecs/emitter/SoundEmitterChannel.d.ts +0 -23
  455. package/src/engine/sound/ecs/emitter/SoundEmitterChannel.d.ts.map +0 -1
  456. package/src/engine/sound/ecs/emitter/SoundEmitterChannel.js +0 -32
  457. package/src/engine/sound/ecs/emitter/SoundTrackNodes.d.ts +0 -18
  458. package/src/engine/sound/ecs/emitter/SoundTrackNodes.d.ts.map +0 -1
  459. package/src/engine/sound/ecs/emitter/SoundTrackNodes.js +0 -18
  460. package/src/engine/sound/sopra/AbstractAudioClip.d.ts +0 -26
  461. package/src/engine/sound/sopra/AbstractAudioClip.d.ts.map +0 -1
  462. package/src/engine/sound/sopra/AbstractAudioClip.js +0 -29
  463. package/src/engine/sound/sopra/ContainerAudioClip.d.ts +0 -12
  464. package/src/engine/sound/sopra/ContainerAudioClip.d.ts.map +0 -1
  465. package/src/engine/sound/sopra/ContainerAudioClip.js +0 -13
  466. package/src/engine/sound/sopra/RandomContainerAudioClip.d.ts +0 -12
  467. package/src/engine/sound/sopra/RandomContainerAudioClip.d.ts.map +0 -1
  468. package/src/engine/sound/sopra/RandomContainerAudioClip.js +0 -15
  469. package/src/engine/sound/sopra/SequenceContainerAudioClip.d.ts +0 -7
  470. package/src/engine/sound/sopra/SequenceContainerAudioClip.d.ts.map +0 -1
  471. package/src/engine/sound/sopra/SequenceContainerAudioClip.js +0 -8
  472. package/src/engine/sound/sopra/SilenceAudioClip.d.ts +0 -13
  473. package/src/engine/sound/sopra/SilenceAudioClip.d.ts.map +0 -1
  474. package/src/engine/sound/sopra/SilenceAudioClip.js +0 -15
  475. /package/src/{engine/graphics/sh3/path_tracer/sampling → core/geom/vec3}/v3_orthonormal_matrix_from_normal.d.ts +0 -0
@@ -0,0 +1,109 @@
1
+ import { combine_hash } from "../../../../../core/collection/array/combine_hash.js";
2
+ import { computeHashFloat } from "../../../../../core/primitives/numbers/computeHashFloat.js";
3
+
4
+ /**
5
+ * Base class for all audio clips.
6
+ *
7
+ * A clip is a pure, serializable DEFINITION node — it holds no WebAudio objects and no playback
8
+ * state. Playback state lives in a transient {@link EventInstance}/{@link Voice}; see the
9
+ * definition/instance split in `sopra/IMPLEMENTATION_PLAN.md`.
10
+ *
11
+ * NOTE: unlike the original stub, there is no `parent` pointer and no `channel` field. Inheritance
12
+ * of gain/pitch is resolved ONCE, top-down, at voice instantiation (uniform control flow — no
13
+ * null=inherit sentinels reach the runtime). Routing is decided by {@link EventDescription.busId}.
14
+ */
15
+ export class AbstractAudioClip {
16
+
17
+ /**
18
+ * Gain offset in decibel, accumulated additively down the clip tree at voice-instantiation time.
19
+ * @type {number}
20
+ */
21
+ gain = 0;
22
+
23
+ /**
24
+ * Pitch offset in cents, accumulated additively down the clip tree at voice-instantiation time.
25
+ * @type {number}
26
+ */
27
+ pitch = 0;
28
+
29
+ /**
30
+ * @protected
31
+ * @param {AbstractAudioClip} other
32
+ */
33
+ copyBaseFrom(other) {
34
+ this.gain = other.gain;
35
+ this.pitch = other.pitch;
36
+ }
37
+
38
+ /**
39
+ * Base equality: the gain/pitch every clip carries. Subclasses override and extend it via
40
+ * `super.equals(other)`.
41
+ * @param {AbstractAudioClip} other
42
+ * @returns {boolean}
43
+ */
44
+ equals(other) {
45
+ return this.gain === other.gain
46
+ && this.pitch === other.pitch;
47
+ }
48
+
49
+ /**
50
+ * Base hash: folds in the gain/pitch every clip carries. Subclasses override and extend it via
51
+ * `super.hash()`.
52
+ * @returns {number}
53
+ */
54
+ hash() {
55
+ return combine_hash(
56
+ computeHashFloat(this.gain),
57
+ computeHashFloat(this.pitch)
58
+ );
59
+ }
60
+
61
+ /**
62
+ * Resolve this clip (and its subtree) into a flat list of timed leaf plays. Overridden by every
63
+ * concrete clip; children are reached via polymorphic dispatch (no type switching). Gain/pitch
64
+ * inheritance is accumulated top-down and resolved here ONCE, so the runtime never sees an
65
+ * inherit sentinel.
66
+ *
67
+ * @param {{durationOf: function(SampleAudioClip):number, playback: SopraPlaybackContext, getParameter: function(string):(number|undefined)}} env
68
+ * `durationOf` returns a sample's buffer duration; `playback` supplies the seeded RNG and
69
+ * random-container history; `getParameter` reads a live RTPC value (used by Switch/Blend
70
+ * containers, read once at plan time), returning `undefined` if unset.
71
+ * @param {number} [gainDb] accumulated gain offset (dB); start with the event's master gain
72
+ * @param {number} [pitchCents] accumulated pitch offset (cents)
73
+ * @param {number} [offset] start time of this clip relative to the timeline origin (seconds)
74
+ * @returns {{plays: {clip: SampleAudioClip, offset: number, gainDb: number, pitchCents: number}[], duration: number}}
75
+ */
76
+ planTimeline(env, gainDb = 0, pitchCents = 0, offset = 0) {
77
+ throw new Error('Implementation must override planTimeline()');
78
+ }
79
+
80
+ /**
81
+ * Append every {@link SampleAudioClip} leaf reachable from this clip (across ALL branches) into
82
+ * `out`. Used to ensure candidate buffers are loaded before the timeline is resolved, so random
83
+ * selection consumes the RNG exactly once. Default: contributes nothing (overridden by sample
84
+ * leaves and containers).
85
+ *
86
+ * @param {SampleAudioClip[]} [out]
87
+ * @returns {SampleAudioClip[]}
88
+ */
89
+ collectSampleClips(out = []) {
90
+ return out;
91
+ }
92
+
93
+ /**
94
+ * Whether this clip (or its subtree) can produce unbounded playback — i.e. an emitter holding it is
95
+ * a persistent source, not a one-shot. Used to decide auto-release/lifetime behaviour. Default
96
+ * false; overridden by looping leaves and containers. Conservative: a container reports looping if
97
+ * ANY reachable child can loop.
98
+ * @returns {boolean}
99
+ */
100
+ loops() {
101
+ return false;
102
+ }
103
+ }
104
+
105
+ /**
106
+ * @readonly
107
+ * @type {boolean}
108
+ */
109
+ AbstractAudioClip.prototype.isAudioClip = true;
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Plays EVERY child whose blend gain is > 0 simultaneously, each scaled by a per-child
3
+ * parameter→linear-gain {@link AnimationCurve} — e.g. weather-layered ambience crossfaded by an
4
+ * "intensity" parameter. Supersedes the dormant `material/` composition concept.
5
+ *
6
+ * v1: the parameter is read ONCE at trigger time (a snapshot mix), not re-blended live as the
7
+ * parameter later sweeps — live per-voice re-blend is a documented follow-up (see IMPLEMENTATION_PLAN
8
+ * §9; it needs per-voice parameter binding). A child with no blend curve is always fully on (gain 1).
9
+ */
10
+ export class BlendContainerAudioClip extends ContainerAudioClip {
11
+ /**
12
+ * @param {AbstractAudioClip[]} [children]
13
+ * @param {{parameter?:string, defaultValue?:number, blends?:AnimationCurve[]}} [options]
14
+ * @returns {BlendContainerAudioClip}
15
+ */
16
+ static from(children?: AbstractAudioClip[], { parameter, defaultValue, blends }?: {
17
+ parameter?: string;
18
+ defaultValue?: number;
19
+ blends?: AnimationCurve[];
20
+ }): BlendContainerAudioClip;
21
+ /**
22
+ * RTPC name whose value drives the per-child blend gains.
23
+ * @type {string}
24
+ */
25
+ parameter: string;
26
+ /**
27
+ * Parameter value used when the parameter is unset.
28
+ * @type {number}
29
+ */
30
+ defaultValue: number;
31
+ /**
32
+ * Per-child blend curves (parameter value → linear gain), parallel to {@link children}. A missing
33
+ * entry means "always fully on".
34
+ * @type {AnimationCurve[]}
35
+ */
36
+ blends: AnimationCurve[];
37
+ planTimeline(env: any, gainDb?: number, pitchCents?: number, offset?: number): {
38
+ plays: {
39
+ clip: SampleAudioClip;
40
+ offset: number;
41
+ gainDb: number;
42
+ pitchCents: number;
43
+ }[];
44
+ duration: number;
45
+ };
46
+ /**
47
+ * @param {BlendContainerAudioClip} other
48
+ * @returns {boolean}
49
+ */
50
+ equals(other: BlendContainerAudioClip): boolean;
51
+ clone(): BlendContainerAudioClip;
52
+ toJSON(): {
53
+ gain: number;
54
+ pitch: number;
55
+ parameter: string;
56
+ defaultValue: number;
57
+ blends: {
58
+ keys: any[];
59
+ }[];
60
+ children: {
61
+ type: string;
62
+ data: any;
63
+ }[];
64
+ };
65
+ fromJSON({ gain, pitch, parameter, defaultValue, blends, children }: {
66
+ gain?: number;
67
+ pitch?: number;
68
+ parameter?: string;
69
+ defaultValue?: number;
70
+ blends?: any[];
71
+ children?: any[];
72
+ }): void;
73
+ #private;
74
+ }
75
+ export namespace BlendContainerAudioClip {
76
+ let typeName: string;
77
+ }
78
+ import { ContainerAudioClip } from "./ContainerAudioClip.js";
79
+ import { AnimationCurve } from "../../../../animation/curve/AnimationCurve.js";
80
+ //# sourceMappingURL=BlendContainerAudioClip.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BlendContainerAudioClip.d.ts","sourceRoot":"","sources":["../../../../../../../src/engine/sound/sopra/definition/clip/BlendContainerAudioClip.js"],"names":[],"mappings":"AAQA;;;;;;;;GAQG;AACH;IAqBI;;;;OAIG;IACH,uBAJW,mBAAmB,wCACnB;QAAC,SAAS,CAAC,EAAC,MAAM,CAAC;QAAC,YAAY,CAAC,EAAC,MAAM,CAAC;QAAC,MAAM,CAAC,EAAC,cAAc,EAAE,CAAA;KAAC,GACjE,uBAAuB,CAWnC;IAjCD;;;OAGG;IACH,WAFU,MAAM,CAED;IAEf;;;OAGG;IACH,cAFU,MAAM,CAEC;IAEjB;;;;OAIG;IACH,QAFU,cAAc,EAAE,CAEd;IAkCZ;;;;;;;;MA+BC;IAED;;;OAGG;IACH,cAHW,uBAAuB,GACrB,OAAO,CAkBnB;IAiBD,iCAaC;IAED;;;;;;;;;;;;MASC;IAED;;;;;;;aAWC;;CACJ;;;;mCA7KkC,yBAAyB;+BAF7B,+CAA+C"}
@@ -0,0 +1,181 @@
1
+ import { combine_hash } from "../../../../../core/collection/array/combine_hash.js";
2
+ import { computeHashFloat } from "../../../../../core/primitives/numbers/computeHashFloat.js";
3
+ import { computeStringHash } from "../../../../../core/primitives/strings/computeStringHash.js";
4
+ import { AnimationCurve } from "../../../../animation/curve/AnimationCurve.js";
5
+ import { volume2dB } from "../../../volume2dB.js";
6
+ import { ContainerAudioClip } from "./ContainerAudioClip.js";
7
+ import { deserializeAudioClipFromJSON, serializeAudioClipToJSON } from "../../serialization/sopraJSON.js";
8
+
9
+ /**
10
+ * Plays EVERY child whose blend gain is > 0 simultaneously, each scaled by a per-child
11
+ * parameter→linear-gain {@link AnimationCurve} — e.g. weather-layered ambience crossfaded by an
12
+ * "intensity" parameter. Supersedes the dormant `material/` composition concept.
13
+ *
14
+ * v1: the parameter is read ONCE at trigger time (a snapshot mix), not re-blended live as the
15
+ * parameter later sweeps — live per-voice re-blend is a documented follow-up (see IMPLEMENTATION_PLAN
16
+ * §9; it needs per-voice parameter binding). A child with no blend curve is always fully on (gain 1).
17
+ */
18
+ export class BlendContainerAudioClip extends ContainerAudioClip {
19
+
20
+ /**
21
+ * RTPC name whose value drives the per-child blend gains.
22
+ * @type {string}
23
+ */
24
+ parameter = "";
25
+
26
+ /**
27
+ * Parameter value used when the parameter is unset.
28
+ * @type {number}
29
+ */
30
+ defaultValue = 0;
31
+
32
+ /**
33
+ * Per-child blend curves (parameter value → linear gain), parallel to {@link children}. A missing
34
+ * entry means "always fully on".
35
+ * @type {AnimationCurve[]}
36
+ */
37
+ blends = [];
38
+
39
+ /**
40
+ * @param {AbstractAudioClip[]} [children]
41
+ * @param {{parameter?:string, defaultValue?:number, blends?:AnimationCurve[]}} [options]
42
+ * @returns {BlendContainerAudioClip}
43
+ */
44
+ static from(children = [], { parameter = "", defaultValue = 0, blends = [] } = {}) {
45
+ const r = new BlendContainerAudioClip();
46
+
47
+ r.addChildren(children);
48
+ r.parameter = parameter;
49
+ r.defaultValue = defaultValue;
50
+ r.blends = blends;
51
+
52
+ return r;
53
+ }
54
+
55
+ /**
56
+ * Linear blend gain for a child at a parameter value (never negative).
57
+ * @param {number} childIndex
58
+ * @param {number} value
59
+ * @returns {number}
60
+ */
61
+ #blendGain(childIndex, value) {
62
+ const curve = this.blends[childIndex];
63
+
64
+ if (curve === undefined) {
65
+ return 1; // no curve -> always fully on
66
+ }
67
+
68
+ return Math.max(0, curve.evaluate(value));
69
+ }
70
+
71
+ planTimeline(env, gainDb = 0, pitchCents = 0, offset = 0) {
72
+ const children = this.children;
73
+ const value = env.getParameter(this.parameter) ?? this.defaultValue;
74
+
75
+ const plays = [];
76
+ let duration = 0;
77
+
78
+ for (let i = 0; i < children.length; i++) {
79
+ const blend = this.#blendGain(i, value);
80
+
81
+ if (blend <= 0) {
82
+ continue; // inaudible at this parameter value
83
+ }
84
+
85
+ const sub = children[i].planTimeline(
86
+ env,
87
+ gainDb + this.gain + volume2dB(blend),
88
+ pitchCents + this.pitch,
89
+ offset
90
+ );
91
+
92
+ for (let j = 0; j < sub.plays.length; j++) {
93
+ plays.push(sub.plays[j]);
94
+ }
95
+
96
+ if (sub.duration > duration) {
97
+ duration = sub.duration;
98
+ }
99
+ }
100
+
101
+ return { plays, duration };
102
+ }
103
+
104
+ /**
105
+ * @param {BlendContainerAudioClip} other
106
+ * @returns {boolean}
107
+ */
108
+ equals(other) {
109
+ if (!super.equals(other) // gain/pitch + children
110
+ || this.parameter !== other.parameter
111
+ || this.defaultValue !== other.defaultValue
112
+ || this.blends.length !== other.blends.length
113
+ ) {
114
+ return false;
115
+ }
116
+
117
+ for (let i = 0; i < this.blends.length; i++) {
118
+ if (!this.blends[i].equals(other.blends[i])) {
119
+ return false;
120
+ }
121
+ }
122
+
123
+ return true;
124
+ }
125
+
126
+ hash() {
127
+ let h = combine_hash(
128
+ super.hash(),
129
+ computeStringHash(this.parameter),
130
+ computeHashFloat(this.defaultValue)
131
+ );
132
+
133
+ const children = this.children;
134
+ for (let i = 0; i < children.length; i++) {
135
+ h = combine_hash(h, children[i].hash());
136
+ }
137
+
138
+ return h;
139
+ }
140
+
141
+ clone() {
142
+ const r = new BlendContainerAudioClip();
143
+
144
+ r.copyBaseFrom(this);
145
+ r.parameter = this.parameter;
146
+ r.defaultValue = this.defaultValue;
147
+ r.blends = this.blends.map(c => c.clone());
148
+
149
+ for (let i = 0; i < this.children.length; i++) {
150
+ r.addChild(this.children[i].clone());
151
+ }
152
+
153
+ return r;
154
+ }
155
+
156
+ toJSON() {
157
+ return {
158
+ gain: this.gain,
159
+ pitch: this.pitch,
160
+ parameter: this.parameter,
161
+ defaultValue: this.defaultValue,
162
+ blends: this.blends.map(c => c.toJSON()),
163
+ children: this.children.map(serializeAudioClipToJSON)
164
+ };
165
+ }
166
+
167
+ fromJSON({ gain = 0, pitch = 0, parameter = "", defaultValue = 0, blends = [], children = [] }) {
168
+ this.gain = gain;
169
+ this.pitch = pitch;
170
+ this.parameter = parameter;
171
+ this.defaultValue = defaultValue;
172
+ this.blends = blends.map(json => {
173
+ const curve = new AnimationCurve();
174
+ curve.fromJSON(json);
175
+ return curve;
176
+ });
177
+ this.children = children.map(deserializeAudioClipFromJSON);
178
+ }
179
+ }
180
+
181
+ BlendContainerAudioClip.typeName = "SopraBlendContainerAudioClip";
@@ -0,0 +1,17 @@
1
+ export class BlendContainerAudioClipSerializationAdapter extends ObjectBasedClassSerializationAdapter {
2
+ klass: typeof BlendContainerAudioClip;
3
+ version: number;
4
+ /**
5
+ * @param {BinaryBuffer} buffer
6
+ * @param {BlendContainerAudioClip} value
7
+ */
8
+ serialize(buffer: BinaryBuffer, value: BlendContainerAudioClip): void;
9
+ /**
10
+ * @param {BinaryBuffer} buffer
11
+ * @param {BlendContainerAudioClip} value
12
+ */
13
+ deserialize(buffer: BinaryBuffer, value: BlendContainerAudioClip): void;
14
+ }
15
+ import { ObjectBasedClassSerializationAdapter } from "../../../../ecs/storage/binary/object/ObjectBasedClassSerializationAdapter.js";
16
+ import { BlendContainerAudioClip } from "./BlendContainerAudioClip.js";
17
+ //# sourceMappingURL=BlendContainerAudioClipSerializationAdapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BlendContainerAudioClipSerializationAdapter.d.ts","sourceRoot":"","sources":["../../../../../../../src/engine/sound/sopra/definition/clip/BlendContainerAudioClipSerializationAdapter.js"],"names":[],"mappings":"AAKA;IACI,sCAAgC;IAChC,gBAAY;IAEZ;;;OAGG;IACH,uCAFW,uBAAuB,QA4BjC;IAED;;;OAGG;IACH,yCAFW,uBAAuB,QA6BjC;CACJ;qDAvEoD,+EAA+E;wCAC5F,8BAA8B"}
@@ -0,0 +1,74 @@
1
+ import { AnimationCurve } from "../../../../animation/curve/AnimationCurve.js";
2
+ import { Keyframe } from "../../../../animation/curve/Keyframe.js";
3
+ import { ObjectBasedClassSerializationAdapter } from "../../../../ecs/storage/binary/object/ObjectBasedClassSerializationAdapter.js";
4
+ import { BlendContainerAudioClip } from "./BlendContainerAudioClip.js";
5
+
6
+ export class BlendContainerAudioClipSerializationAdapter extends ObjectBasedClassSerializationAdapter {
7
+ klass = BlendContainerAudioClip;
8
+ version = 0;
9
+
10
+ /**
11
+ * @param {BinaryBuffer} buffer
12
+ * @param {BlendContainerAudioClip} value
13
+ */
14
+ serialize(buffer, value) {
15
+ buffer.writeFloat32(value.gain);
16
+ buffer.writeFloat32(value.pitch);
17
+ buffer.writeUTF8String(value.parameter);
18
+ buffer.writeFloat32(value.defaultValue);
19
+
20
+ // blend curves (parallel to children) written as inline keyframes (AnimationCurve has no adapter)
21
+ const blends = value.blends;
22
+ buffer.writeUintVar(blends.length);
23
+ for (let i = 0; i < blends.length; i++) {
24
+ const keys = blends[i].keys;
25
+ buffer.writeUintVar(keys.length);
26
+ for (let k = 0; k < keys.length; k++) {
27
+ const kf = keys[k];
28
+ buffer.writeFloat32(kf.time);
29
+ buffer.writeFloat32(kf.value);
30
+ buffer.writeFloat32(kf.inTangent);
31
+ buffer.writeFloat32(kf.outTangent);
32
+ }
33
+ }
34
+
35
+ const children = value.children;
36
+ buffer.writeUintVar(children.length);
37
+ for (let i = 0; i < children.length; i++) {
38
+ this.objectAdapter.serialize(buffer, children[i]);
39
+ }
40
+ }
41
+
42
+ /**
43
+ * @param {BinaryBuffer} buffer
44
+ * @param {BlendContainerAudioClip} value
45
+ */
46
+ deserialize(buffer, value) {
47
+ value.gain = buffer.readFloat32();
48
+ value.pitch = buffer.readFloat32();
49
+ value.parameter = buffer.readUTF8String();
50
+ value.defaultValue = buffer.readFloat32();
51
+
52
+ const blendCount = buffer.readUintVar();
53
+ const blends = [];
54
+ for (let i = 0; i < blendCount; i++) {
55
+ const curve = new AnimationCurve();
56
+ const keyCount = buffer.readUintVar();
57
+ for (let k = 0; k < keyCount; k++) {
58
+ const time = buffer.readFloat32();
59
+ const v = buffer.readFloat32();
60
+ const inTangent = buffer.readFloat32();
61
+ const outTangent = buffer.readFloat32();
62
+ curve.add(Keyframe.from(time, v, inTangent, outTangent));
63
+ }
64
+ blends.push(curve);
65
+ }
66
+ value.blends = blends;
67
+
68
+ const n = buffer.readUintVar();
69
+ value.clearChildren();
70
+ for (let i = 0; i < n; i++) {
71
+ value.addChild(this.objectAdapter.deserialize(buffer));
72
+ }
73
+ }
74
+ }
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Abstract base for clips that hold an ordered set of child clips.
3
+ * Not directly serializable — concrete subclasses ({@link SequenceContainerAudioClip},
4
+ * {@link RandomContainerAudioClip}) define playback semantics.
5
+ */
6
+ export class ContainerAudioClip extends AbstractAudioClip {
7
+ /**
8
+ * @type {AbstractAudioClip[]}
9
+ */
10
+ children: AbstractAudioClip[];
11
+ /**
12
+ *
13
+ * @param {AbstractAudioClip} clip
14
+ * @returns {this}
15
+ */
16
+ addChild(clip: AbstractAudioClip): this;
17
+ /**
18
+ *
19
+ * @param {AbstractAudioClip[]} clips
20
+ * @returns {this}
21
+ */
22
+ addChildren(clips: AbstractAudioClip[]): this;
23
+ clearChildren(): void;
24
+ /**
25
+ * Container equality: the inherited gain/pitch (via `super.equals`) plus a same-length,
26
+ * element-wise child comparison. Concrete subclasses override and extend this via
27
+ * `super.equals(other)`.
28
+ * @param {ContainerAudioClip} other
29
+ * @returns {boolean}
30
+ */
31
+ equals(other: ContainerAudioClip): boolean;
32
+ }
33
+ import { AbstractAudioClip } from "./AbstractAudioClip.js";
34
+ //# sourceMappingURL=ContainerAudioClip.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ContainerAudioClip.d.ts","sourceRoot":"","sources":["../../../../../../../src/engine/sound/sopra/definition/clip/ContainerAudioClip.js"],"names":[],"mappings":"AAGA;;;;GAIG;AACH;IAEI;;OAEG;IACH,UAFU,iBAAiB,EAAE,CAEf;IAEd;;;;OAIG;IACH,eAHW,iBAAiB,GACf,IAAI,CAQhB;IAED;;;;OAIG;IACH,mBAHW,iBAAiB,EAAE,GACjB,IAAI,CAQhB;IAED,sBAEC;IA6BD;;;;;;OAMG;IACH,cAHW,kBAAkB,GAChB,OAAO,CAqBnB;CACJ;kCAlGiC,wBAAwB"}
@@ -0,0 +1,100 @@
1
+ import { assert } from "../../../../../core/assert.js";
2
+ import { AbstractAudioClip } from "./AbstractAudioClip.js";
3
+
4
+ /**
5
+ * Abstract base for clips that hold an ordered set of child clips.
6
+ * Not directly serializable — concrete subclasses ({@link SequenceContainerAudioClip},
7
+ * {@link RandomContainerAudioClip}) define playback semantics.
8
+ */
9
+ export class ContainerAudioClip extends AbstractAudioClip {
10
+
11
+ /**
12
+ * @type {AbstractAudioClip[]}
13
+ */
14
+ children = [];
15
+
16
+ /**
17
+ *
18
+ * @param {AbstractAudioClip} clip
19
+ * @returns {this}
20
+ */
21
+ addChild(clip) {
22
+ assert.equal(clip.isAudioClip, true, 'clip.isAudioClip');
23
+
24
+ this.children.push(clip);
25
+
26
+ return this;
27
+ }
28
+
29
+ /**
30
+ *
31
+ * @param {AbstractAudioClip[]} clips
32
+ * @returns {this}
33
+ */
34
+ addChildren(clips) {
35
+ for (let i = 0; i < clips.length; i++) {
36
+ this.addChild(clips[i]);
37
+ }
38
+
39
+ return this;
40
+ }
41
+
42
+ clearChildren() {
43
+ this.children = [];
44
+ }
45
+
46
+ collectSampleClips(out = []) {
47
+ const children = this.children;
48
+
49
+ for (let i = 0; i < children.length; i++) {
50
+ children[i].collectSampleClips(out);
51
+ }
52
+
53
+ return out;
54
+ }
55
+
56
+ /**
57
+ * Conservative: the container can loop if ANY child can loop (a looping child makes a sequence
58
+ * terminal; a random/switch/blend may pick/play a looping child).
59
+ * @returns {boolean}
60
+ */
61
+ loops() {
62
+ const children = this.children;
63
+
64
+ for (let i = 0; i < children.length; i++) {
65
+ if (children[i].loops()) {
66
+ return true;
67
+ }
68
+ }
69
+
70
+ return false;
71
+ }
72
+
73
+ /**
74
+ * Container equality: the inherited gain/pitch (via `super.equals`) plus a same-length,
75
+ * element-wise child comparison. Concrete subclasses override and extend this via
76
+ * `super.equals(other)`.
77
+ * @param {ContainerAudioClip} other
78
+ * @returns {boolean}
79
+ */
80
+ equals(other) {
81
+ if (!super.equals(other)) {
82
+ return false;
83
+ }
84
+
85
+ const a = this.children;
86
+ const b = other.children;
87
+
88
+ if (a.length !== b.length) {
89
+ return false;
90
+ }
91
+
92
+ for (let i = 0; i < a.length; i++) {
93
+ if (!a[i].equals(b[i])) {
94
+ return false;
95
+ }
96
+ }
97
+
98
+ return true;
99
+ }
100
+ }