@woosh/meep-engine 3.16.0 → 3.17.1

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 (431) hide show
  1. package/README.md +8 -72
  2. package/editor/particles/effect/ParticleEffectDocument.d.ts +21 -6
  3. package/editor/particles/effect/ParticleEffectDocument.d.ts.map +1 -1
  4. package/editor/particles/effect/ParticleEffectDocument.js +38 -17
  5. package/editor/view/node-graph/NodeGraphClipboard.d.ts +186 -0
  6. package/editor/view/node-graph/NodeGraphClipboard.d.ts.map +1 -0
  7. package/editor/view/node-graph/NodeGraphClipboard.js +231 -0
  8. package/editor/view/node-graph/NodeGraphEditorView.d.ts +59 -1
  9. package/editor/view/node-graph/NodeGraphEditorView.d.ts.map +1 -1
  10. package/editor/view/node-graph/NodeGraphEditorView.js +248 -5
  11. package/editor/view/node-graph/NodeGraphView.d.ts.map +1 -1
  12. package/editor/view/node-graph/NodeGraphView.js +84 -8
  13. package/editor/view/node-graph/actions/connection_bind_actions.d.ts +23 -0
  14. package/editor/view/node-graph/actions/connection_bind_actions.d.ts.map +1 -0
  15. package/editor/view/node-graph/actions/connection_bind_actions.js +39 -0
  16. package/editor/view/particles/effect/ParticleCodeEditorView.d.ts.map +1 -1
  17. package/editor/view/particles/effect/ParticleCodeEditorView.js +4 -3
  18. package/editor/view/particles/effect/ParticleCurveEditorView.d.ts +20 -0
  19. package/editor/view/particles/effect/ParticleCurveEditorView.d.ts.map +1 -0
  20. package/editor/view/particles/effect/ParticleCurveEditorView.js +574 -0
  21. package/editor/view/particles/effect/ParticleEmitterInspectorView.d.ts.map +1 -1
  22. package/editor/view/particles/effect/ParticleEmitterInspectorView.js +27 -1
  23. package/editor/view/particles/effect/ParticleGradientEditorView.d.ts +24 -0
  24. package/editor/view/particles/effect/ParticleGradientEditorView.d.ts.map +1 -0
  25. package/editor/view/particles/effect/ParticleGradientEditorView.js +472 -0
  26. package/editor/view/particles/effect/ParticleGraphEditorView.d.ts +5 -0
  27. package/editor/view/particles/effect/ParticleGraphEditorView.d.ts.map +1 -1
  28. package/editor/view/particles/effect/ParticleGraphEditorView.js +61 -31
  29. package/editor/view/particles/effect/ParticleNodeParametersView.d.ts.map +1 -1
  30. package/editor/view/particles/effect/ParticleNodeParametersView.js +33 -0
  31. package/editor/view/particles/effect/particle-editor.css +123 -35
  32. package/package.json +1 -1
  33. package/src/core/binary/allocator/OffsetAllocator.d.ts +25 -16
  34. package/src/core/binary/allocator/OffsetAllocator.d.ts.map +1 -1
  35. package/src/core/binary/allocator/OffsetAllocator.js +10 -1
  36. package/src/core/collection/array/typed/float32_array_hash.d.ts +21 -0
  37. package/src/core/collection/array/typed/float32_array_hash.d.ts.map +1 -0
  38. package/src/core/collection/array/typed/float32_array_hash.js +38 -0
  39. package/src/core/graph/csr/CSRGraph.d.ts +8 -1
  40. package/src/core/graph/csr/CSRGraph.d.ts.map +1 -1
  41. package/src/core/graph/csr/CSRGraph.js +14 -6
  42. package/src/core/model/node-graph/visual/layout/LayoutProblem.d.ts +24 -0
  43. package/src/core/model/node-graph/visual/layout/LayoutProblem.d.ts.map +1 -1
  44. package/src/core/model/node-graph/visual/layout/LayoutProblem.js +27 -0
  45. package/src/core/model/node-graph/visual/layout/NodeGraphLayoutOptions.d.ts +26 -0
  46. package/src/core/model/node-graph/visual/layout/NodeGraphLayoutOptions.d.ts.map +1 -1
  47. package/src/core/model/node-graph/visual/layout/NodeGraphLayoutOptions.js +28 -0
  48. package/src/core/model/node-graph/visual/layout/RouteGrid.d.ts +92 -3
  49. package/src/core/model/node-graph/visual/layout/RouteGrid.d.ts.map +1 -1
  50. package/src/core/model/node-graph/visual/layout/RouteGrid.js +405 -242
  51. package/src/core/model/node-graph/visual/layout/RouteSearch.d.ts +50 -5
  52. package/src/core/model/node-graph/visual/layout/RouteSearch.d.ts.map +1 -1
  53. package/src/core/model/node-graph/visual/layout/RouteSearch.js +160 -24
  54. package/src/core/model/node-graph/visual/layout/RouteSet.d.ts +7 -0
  55. package/src/core/model/node-graph/visual/layout/RouteSet.d.ts.map +1 -1
  56. package/src/core/model/node-graph/visual/layout/RouteSet.js +8 -0
  57. package/src/core/model/node-graph/visual/layout/layout_assign_coordinates.js +9 -3
  58. package/src/core/model/node-graph/visual/layout/layout_build_problem.d.ts.map +1 -1
  59. package/src/core/model/node-graph/visual/layout/layout_build_problem.js +7 -0
  60. package/src/core/model/node-graph/visual/layout/layout_insert_lanes.d.ts +9 -3
  61. package/src/core/model/node-graph/visual/layout/layout_insert_lanes.d.ts.map +1 -1
  62. package/src/core/model/node-graph/visual/layout/layout_insert_lanes.js +17 -3
  63. package/src/core/model/node-graph/visual/layout/layout_node_graph.d.ts +9 -6
  64. package/src/core/model/node-graph/visual/layout/layout_node_graph.d.ts.map +1 -1
  65. package/src/core/model/node-graph/visual/layout/layout_node_graph.js +49 -7
  66. package/src/core/model/node-graph/visual/layout/layout_order_layers.d.ts +11 -1
  67. package/src/core/model/node-graph/visual/layout/layout_order_layers.d.ts.map +1 -1
  68. package/src/core/model/node-graph/visual/layout/layout_order_layers.js +135 -16
  69. package/src/core/model/node-graph/visual/layout/route_connections.d.ts +29 -0
  70. package/src/core/model/node-graph/visual/layout/route_connections.d.ts.map +1 -1
  71. package/src/core/model/node-graph/visual/layout/route_connections.js +716 -309
  72. package/src/core/model/node-graph/visual/layout/route_grid_build.d.ts +3 -2
  73. package/src/core/model/node-graph/visual/layout/route_grid_build.d.ts.map +1 -1
  74. package/src/core/model/node-graph/visual/layout/route_grid_build.js +7 -15
  75. package/src/core/model/node-graph/visual/layout/route_nudge.d.ts +6 -0
  76. package/src/core/model/node-graph/visual/layout/route_nudge.d.ts.map +1 -1
  77. package/src/core/model/node-graph/visual/layout/route_nudge.js +42 -13
  78. package/src/engine/animation/AnimationUtils.js +246 -246
  79. package/src/engine/animation/Animations.js +74 -74
  80. package/src/engine/control/first-person/FirstPersonPlayerControllerSystem.js +2078 -2078
  81. package/src/engine/ecs/EventType.d.ts +0 -1
  82. package/src/engine/ecs/EventType.js +1 -26
  83. package/src/engine/ecs/ik/ik_write_local_rotation.d.ts +1 -1
  84. package/src/engine/ecs/ik/ik_write_local_rotation.d.ts.map +1 -1
  85. package/src/engine/ecs/ik/ik_write_local_rotation.js +3 -7
  86. package/src/engine/ecs/parent/EntityNode.d.ts.map +1 -1
  87. package/src/engine/ecs/parent/EntityNode.js +4 -9
  88. package/src/engine/ecs/terrain/ecs/cling/ClingToTerrainSystem.d.ts.map +1 -1
  89. package/src/engine/ecs/terrain/ecs/cling/ClingToTerrainSystem.js +360 -364
  90. package/src/engine/ecs/transform/TRANSFORM64_EVENT_CHANGE.d.ts +41 -0
  91. package/src/engine/ecs/transform/TRANSFORM64_EVENT_CHANGE.d.ts.map +1 -0
  92. package/src/engine/ecs/transform/TRANSFORM64_EVENT_CHANGE.js +40 -0
  93. package/src/engine/ecs/transform/TRANSFORM64_MIGRATION_PLAN_2026_09_04.md +8 -0
  94. package/src/engine/ecs/transform/t64_announce_change.d.ts +10 -7
  95. package/src/engine/ecs/transform/t64_announce_change.d.ts.map +1 -1
  96. package/src/engine/ecs/transform/t64_announce_change.js +12 -12
  97. package/src/engine/ecs/transform/t64_set_rotation_axis_angle.d.ts +25 -0
  98. package/src/engine/ecs/transform/t64_set_rotation_axis_angle.d.ts.map +1 -0
  99. package/src/engine/ecs/transform/t64_set_rotation_axis_angle.js +45 -0
  100. package/src/engine/ecs/transform-attachment/TRANSFORM_ATTACHMENT_EVENT_CHANGE.d.ts +30 -0
  101. package/src/engine/ecs/transform-attachment/TRANSFORM_ATTACHMENT_EVENT_CHANGE.d.ts.map +1 -0
  102. package/src/engine/ecs/transform-attachment/TRANSFORM_ATTACHMENT_EVENT_CHANGE.js +29 -0
  103. package/src/engine/ecs/transform-attachment/TransformAttachmentSystem.d.ts.map +1 -1
  104. package/src/engine/ecs/transform-attachment/TransformAttachmentSystem.js +13 -21
  105. package/src/engine/graphics/ecs/sprite/SpriteSystemPE.d.ts.map +1 -1
  106. package/src/engine/graphics/ecs/sprite/SpriteSystemPE.js +4 -8
  107. package/src/engine/graphics3/LightSystem.d.ts.map +1 -1
  108. package/src/engine/graphics3/LightSystem.js +4 -8
  109. package/src/engine/graphics3/MeshSystem.d.ts.map +1 -1
  110. package/src/engine/graphics3/MeshSystem.js +9 -19
  111. package/src/engine/graphics3/ParticleEmitterSystem.d.ts.map +1 -1
  112. package/src/engine/graphics3/ParticleEmitterSystem.js +4 -8
  113. package/src/engine/graphics3/ShadedGeometrySystem.d.ts.map +1 -1
  114. package/src/engine/graphics3/ShadedGeometrySystem.js +4 -10
  115. package/src/engine/grid/transform2grid/Transform2GridPositionSystem.d.ts +1 -1
  116. package/src/engine/grid/transform2grid/Transform2GridPositionSystem.d.ts.map +1 -1
  117. package/src/engine/grid/transform2grid/Transform2GridPositionSystem.js +4 -8
  118. package/src/engine/intelligence/behavior/ecs/OrbitingBehavior.js +218 -218
  119. package/src/engine/physics/ecs/PhysicsSystem.d.ts.map +1 -1
  120. package/src/engine/physics/ecs/PhysicsSystem.js +2 -5
  121. package/src/engine/sound/ecs/SoundListenerSystem.d.ts.map +1 -1
  122. package/src/engine/sound/ecs/SoundListenerSystem.js +6 -8
  123. package/src/engine/sound/simulation/AcousticSimulator.d.ts +11 -8
  124. package/src/engine/sound/simulation/AcousticSimulator.d.ts.map +1 -1
  125. package/src/engine/sound/simulation/AcousticSimulator.js +45 -36
  126. package/src/engine/sound/simulation/README.md +2 -2
  127. package/src/engine/sound/simulation/core/OcclusionSolver.d.ts.map +1 -1
  128. package/src/engine/sound/simulation/core/VolumeField.d.ts +9 -9
  129. package/src/engine/sound/simulation/core/VolumeField.d.ts.map +1 -1
  130. package/src/engine/sound/simulation/core/VolumeField.js +29 -13
  131. package/src/engine/sound/simulation/core/acoustic_occlusion_solve.d.ts +31 -0
  132. package/src/engine/sound/simulation/core/acoustic_occlusion_solve.d.ts.map +1 -0
  133. package/src/engine/sound/simulation/core/acoustic_occlusion_solve.js +134 -0
  134. package/src/engine/sound/simulation/ecs/AcousticSimulationSystem.d.ts +0 -4
  135. package/src/engine/sound/simulation/ecs/AcousticSimulationSystem.d.ts.map +1 -1
  136. package/src/engine/sound/simulation/ecs/AcousticSimulationSystem.js +5 -11
  137. package/src/shade/playground/particle_editor/README.md +43 -2
  138. package/src/shade/playground/particle_system/particle_prototype.d.ts.map +1 -1
  139. package/src/shade/playground/particle_system/particle_prototype.js +4 -5
  140. package/src/shade/playground/particle_system/particle_scene.js +4 -4
  141. package/src/shade/playground/volumetrics_froxel/main.d.ts.map +1 -1
  142. package/src/shade/playground/volumetrics_froxel/main.js +6 -1
  143. package/src/shade/renderer/Renderer.d.ts.map +1 -1
  144. package/src/shade/renderer/Renderer.js +13 -1
  145. package/src/shade/renderer/particles/DESIGN.md +104 -19
  146. package/src/shade/renderer/particles/GPUParticleSystem.d.ts +64 -50
  147. package/src/shade/renderer/particles/GPUParticleSystem.d.ts.map +1 -1
  148. package/src/shade/renderer/particles/GPUParticleSystem.js +176 -78
  149. package/src/shade/renderer/particles/ParticleConstants.d.ts +59 -23
  150. package/src/shade/renderer/particles/ParticleConstants.d.ts.map +1 -1
  151. package/src/shade/renderer/particles/ParticleConstants.js +66 -23
  152. package/src/shade/renderer/particles/ParticleRenderMode.d.ts +19 -0
  153. package/src/shade/renderer/particles/ParticleRenderMode.d.ts.map +1 -0
  154. package/src/shade/renderer/particles/ParticleRenderMode.js +33 -0
  155. package/src/shade/renderer/particles/data/PARTICLE_EMITTER_STRUCT.d.ts.map +1 -1
  156. package/src/shade/renderer/particles/data/PARTICLE_EMITTER_STRUCT.js +167 -166
  157. package/src/shade/renderer/particles/data/particle_emitter_record.d.ts +37 -0
  158. package/src/shade/renderer/particles/data/particle_emitter_record.d.ts.map +1 -0
  159. package/src/shade/renderer/particles/data/particle_emitter_record.js +109 -0
  160. package/src/shade/renderer/particles/graph/ParticleGroupBuilder.d.ts +3 -3
  161. package/src/shade/renderer/particles/graph/ParticleGroupBuilder.js +303 -303
  162. package/src/shade/renderer/particles/graph/ParticleNodeDescription.d.ts +18 -0
  163. package/src/shade/renderer/particles/graph/ParticleNodeDescription.d.ts.map +1 -1
  164. package/src/shade/renderer/particles/graph/ParticleNodeDescription.js +152 -133
  165. package/src/shade/renderer/particles/graph/ParticleNodeRegistry.d.ts +0 -11
  166. package/src/shade/renderer/particles/graph/ParticleNodeRegistry.d.ts.map +1 -1
  167. package/src/shade/renderer/particles/graph/ParticleNodeRegistry.js +720 -621
  168. package/src/shade/renderer/particles/graph/compile_particle_graph.d.ts.map +1 -1
  169. package/src/shade/renderer/particles/graph/compile_particle_graph.js +8 -3
  170. package/src/shade/renderer/particles/graph/flatten_particle_graph.d.ts.map +1 -1
  171. package/src/shade/renderer/particles/graph/flatten_particle_graph.js +244 -213
  172. package/src/shade/renderer/particles/graph/groups/particle_builtin_groups.d.ts.map +1 -1
  173. package/src/shade/renderer/particles/graph/groups/particle_builtin_groups.js +6 -0
  174. package/src/shade/renderer/particles/graph/groups/particle_groups_geometry.d.ts.map +1 -1
  175. package/src/shade/renderer/particles/graph/groups/particle_groups_geometry.js +294 -319
  176. package/src/shade/renderer/particles/graph/groups/particle_groups_noise.d.ts.map +1 -1
  177. package/src/shade/renderer/particles/graph/groups/particle_groups_noise.js +524 -517
  178. package/src/shade/renderer/particles/graph/groups/particle_groups_psrdnoise.d.ts +22 -0
  179. package/src/shade/renderer/particles/graph/groups/particle_groups_psrdnoise.d.ts.map +1 -0
  180. package/src/shade/renderer/particles/graph/groups/particle_groups_psrdnoise.js +517 -0
  181. package/src/shade/renderer/particles/graph/groups/simplex_reference.d.ts.map +1 -1
  182. package/src/shade/renderer/particles/graph/groups/simplex_reference.js +185 -159
  183. package/src/shade/renderer/particles/graph/make_particle_group.d.ts.map +1 -1
  184. package/src/shade/renderer/particles/graph/make_particle_group.js +2 -20
  185. package/src/shade/renderer/particles/graph/particle_compare_ops.d.ts +17 -0
  186. package/src/shade/renderer/particles/graph/particle_compare_ops.d.ts.map +1 -0
  187. package/src/shade/renderer/particles/graph/particle_compare_ops.js +22 -0
  188. package/src/shade/renderer/particles/graph/particle_graph_diagnostic.d.ts +28 -8
  189. package/src/shade/renderer/particles/graph/particle_graph_diagnostic.d.ts.map +1 -1
  190. package/src/shade/renderer/particles/graph/particle_graph_diagnostic.js +49 -25
  191. package/src/shade/renderer/particles/graph/particle_node_parameters.d.ts +40 -0
  192. package/src/shade/renderer/particles/graph/particle_node_parameters.d.ts.map +1 -1
  193. package/src/shade/renderer/particles/graph/particle_node_parameters.js +312 -234
  194. package/src/shade/renderer/particles/graph/particle_node_presentation.d.ts.map +1 -1
  195. package/src/shade/renderer/particles/graph/particle_node_presentation.js +59 -3
  196. package/src/shade/renderer/particles/graph/particle_ramp.d.ts +230 -0
  197. package/src/shade/renderer/particles/graph/particle_ramp.d.ts.map +1 -0
  198. package/src/shade/renderer/particles/graph/particle_ramp.js +403 -0
  199. package/src/shade/renderer/particles/graph/validate_particle_graph.d.ts +7 -1
  200. package/src/shade/renderer/particles/graph/validate_particle_graph.d.ts.map +1 -1
  201. package/src/shade/renderer/particles/graph/validate_particle_graph.js +66 -10
  202. package/src/shade/renderer/particles/graph_particles.d.ts +23 -69
  203. package/src/shade/renderer/particles/graph_particles.d.ts.map +1 -1
  204. package/src/shade/renderer/particles/graph_particles.js +105 -262
  205. package/src/shade/renderer/particles/graph_particles_avboit.d.ts.map +1 -1
  206. package/src/shade/renderer/particles/graph_particles_avboit.js +3 -2
  207. package/src/shade/renderer/particles/graph_particles_billboard.d.ts +37 -0
  208. package/src/shade/renderer/particles/graph_particles_billboard.d.ts.map +1 -0
  209. package/src/shade/renderer/particles/graph_particles_billboard.js +93 -0
  210. package/src/shade/renderer/particles/isa/InstructionStream.d.ts +51 -22
  211. package/src/shade/renderer/particles/isa/InstructionStream.d.ts.map +1 -1
  212. package/src/shade/renderer/particles/isa/InstructionStream.js +98 -38
  213. package/src/shade/renderer/particles/isa/ParticleProgram.d.ts +49 -8
  214. package/src/shade/renderer/particles/isa/ParticleProgram.d.ts.map +1 -1
  215. package/src/shade/renderer/particles/isa/ParticleProgram.js +95 -150
  216. package/src/shade/renderer/particles/isa/ParticleVMISA.d.ts +306 -64
  217. package/src/shade/renderer/particles/isa/ParticleVMISA.d.ts.map +1 -1
  218. package/src/shade/renderer/particles/isa/ParticleVMISA.js +505 -136
  219. package/src/shade/renderer/particles/isa/particle_assembly.d.ts +36 -12
  220. package/src/shade/renderer/particles/isa/particle_assembly.d.ts.map +1 -1
  221. package/src/shade/renderer/particles/isa/particle_assembly.js +354 -139
  222. package/src/shade/renderer/particles/isa/validate_particle_program.d.ts +9 -0
  223. package/src/shade/renderer/particles/isa/validate_particle_program.d.ts.map +1 -0
  224. package/src/shade/renderer/particles/isa/validate_particle_program.js +128 -0
  225. package/src/shade/renderer/particles/layout/ParticleLayout.d.ts +23 -0
  226. package/src/shade/renderer/particles/layout/ParticleLayout.d.ts.map +1 -1
  227. package/src/shade/renderer/particles/layout/ParticleLayout.js +68 -0
  228. package/src/shade/renderer/particles/optimizer/dag/optimize_particle_program_vector.d.ts +77 -0
  229. package/src/shade/renderer/particles/optimizer/dag/optimize_particle_program_vector.d.ts.map +1 -0
  230. package/src/shade/renderer/particles/optimizer/dag/optimize_particle_program_vector.js +219 -0
  231. package/src/shade/renderer/particles/optimizer/dag/particle_vector_extract.d.ts +83 -0
  232. package/src/shade/renderer/particles/optimizer/dag/particle_vector_extract.d.ts.map +1 -0
  233. package/src/shade/renderer/particles/optimizer/dag/particle_vector_extract.js +283 -0
  234. package/src/shade/renderer/particles/optimizer/dag/particle_vector_graph.d.ts +133 -0
  235. package/src/shade/renderer/particles/optimizer/dag/particle_vector_graph.d.ts.map +1 -0
  236. package/src/shade/renderer/particles/optimizer/dag/particle_vector_graph.js +334 -0
  237. package/src/shade/renderer/particles/optimizer/dag/particle_vector_groups.d.ts +117 -0
  238. package/src/shade/renderer/particles/optimizer/dag/particle_vector_groups.d.ts.map +1 -0
  239. package/src/shade/renderer/particles/optimizer/dag/particle_vector_groups.js +70 -0
  240. package/src/shade/renderer/particles/optimizer/dag/particle_vector_lift.d.ts +97 -0
  241. package/src/shade/renderer/particles/optimizer/dag/particle_vector_lift.d.ts.map +1 -0
  242. package/src/shade/renderer/particles/optimizer/dag/particle_vector_lift.js +462 -0
  243. package/src/shade/renderer/particles/optimizer/dag/particle_vector_lower.d.ts +116 -0
  244. package/src/shade/renderer/particles/optimizer/dag/particle_vector_lower.d.ts.map +1 -0
  245. package/src/shade/renderer/particles/optimizer/dag/particle_vector_lower.js +687 -0
  246. package/src/shade/renderer/particles/optimizer/dag/particle_vector_pack.d.ts +57 -0
  247. package/src/shade/renderer/particles/optimizer/dag/particle_vector_pack.d.ts.map +1 -0
  248. package/src/shade/renderer/particles/optimizer/dag/particle_vector_pack.js +860 -0
  249. package/src/shade/renderer/particles/optimizer/dag/particle_vector_rules.d.ts +115 -0
  250. package/src/shade/renderer/particles/optimizer/dag/particle_vector_rules.d.ts.map +1 -0
  251. package/src/shade/renderer/particles/optimizer/dag/particle_vector_rules.js +264 -0
  252. package/src/shade/renderer/particles/optimizer/optimize_particle_program.d.ts +81 -42
  253. package/src/shade/renderer/particles/optimizer/optimize_particle_program.d.ts.map +1 -1
  254. package/src/shade/renderer/particles/optimizer/optimize_particle_program.js +477 -478
  255. package/src/shade/renderer/particles/optimizer/particle_integer_bounds.d.ts +100 -0
  256. package/src/shade/renderer/particles/optimizer/particle_integer_bounds.d.ts.map +1 -0
  257. package/src/shade/renderer/particles/optimizer/particle_integer_bounds.js +236 -0
  258. package/src/shade/renderer/particles/optimizer/particle_program_analysis.d.ts +139 -59
  259. package/src/shade/renderer/particles/optimizer/particle_program_analysis.d.ts.map +1 -1
  260. package/src/shade/renderer/particles/optimizer/particle_program_analysis.js +764 -647
  261. package/src/shade/renderer/particles/optimizer/particle_program_equivalence.d.ts +40 -7
  262. package/src/shade/renderer/particles/optimizer/particle_program_equivalence.d.ts.map +1 -1
  263. package/src/shade/renderer/particles/optimizer/particle_program_equivalence.js +376 -213
  264. package/src/shade/renderer/particles/optimizer/particle_program_fuzz.d.ts +30 -3
  265. package/src/shade/renderer/particles/optimizer/particle_program_fuzz.d.ts.map +1 -1
  266. package/src/shade/renderer/particles/optimizer/particle_program_fuzz.js +337 -223
  267. package/src/shade/renderer/particles/optimizer/particle_vm_semantics.d.ts +24 -38
  268. package/src/shade/renderer/particles/optimizer/particle_vm_semantics.d.ts.map +1 -1
  269. package/src/shade/renderer/particles/optimizer/particle_vm_semantics.js +166 -206
  270. package/src/shade/renderer/particles/optimizer/pass_allocate_registers.d.ts +99 -0
  271. package/src/shade/renderer/particles/optimizer/pass_allocate_registers.d.ts.map +1 -0
  272. package/src/shade/renderer/particles/optimizer/pass_allocate_registers.js +313 -0
  273. package/src/shade/renderer/particles/optimizer/pass_dedup_constants.d.ts +3 -2
  274. package/src/shade/renderer/particles/optimizer/pass_dedup_constants.d.ts.map +1 -1
  275. package/src/shade/renderer/particles/optimizer/pass_dedup_constants.js +198 -197
  276. package/src/shade/renderer/particles/optimizer/pass_eliminate_dead_code.d.ts.map +1 -1
  277. package/src/shade/renderer/particles/optimizer/pass_fold_constants.d.ts +19 -0
  278. package/src/shade/renderer/particles/optimizer/pass_fold_constants.d.ts.map +1 -1
  279. package/src/shade/renderer/particles/optimizer/pass_fold_constants.js +678 -561
  280. package/src/shade/renderer/particles/optimizer/pass_inline_constants.d.ts +22 -0
  281. package/src/shade/renderer/particles/optimizer/pass_inline_constants.d.ts.map +1 -0
  282. package/src/shade/renderer/particles/optimizer/pass_inline_constants.js +221 -0
  283. package/src/shade/renderer/particles/optimizer/pass_narrow_widths.d.ts.map +1 -1
  284. package/src/shade/renderer/particles/optimizer/pass_narrow_widths.js +63 -72
  285. package/src/shade/renderer/particles/optimizer/pass_pack_registers.d.ts.map +1 -1
  286. package/src/shade/renderer/particles/optimizer/pass_pack_registers.js +87 -86
  287. package/src/shade/renderer/particles/optimizer/pass_peephole.d.ts.map +1 -1
  288. package/src/shade/renderer/particles/optimizer/pass_peephole.js +392 -271
  289. package/src/shade/renderer/particles/optimizer/pass_propagate_copies.d.ts.map +1 -1
  290. package/src/shade/renderer/particles/optimizer/pass_propagate_copies.js +361 -268
  291. package/src/shade/renderer/particles/optimizer/pass_schedule.d.ts +4 -0
  292. package/src/shade/renderer/particles/optimizer/pass_schedule.d.ts.map +1 -0
  293. package/src/shade/renderer/particles/optimizer/pass_schedule.js +244 -0
  294. package/src/shade/renderer/particles/optimizer/pass_share_subexpressions.d.ts.map +1 -1
  295. package/src/shade/renderer/particles/optimizer/pass_share_subexpressions.js +154 -151
  296. package/src/shade/renderer/particles/particle_test_fixtures.d.ts +20 -0
  297. package/src/shade/renderer/particles/particle_test_fixtures.d.ts.map +1 -1
  298. package/src/shade/renderer/particles/particle_test_fixtures.js +229 -203
  299. package/src/shade/renderer/particles/runtime/EmitterRegistry.d.ts +99 -25
  300. package/src/shade/renderer/particles/runtime/EmitterRegistry.d.ts.map +1 -1
  301. package/src/shade/renderer/particles/runtime/EmitterRegistry.js +438 -286
  302. package/src/shade/renderer/particles/runtime/GPUParticleEmitterContext.d.ts +109 -0
  303. package/src/shade/renderer/particles/runtime/GPUParticleEmitterContext.d.ts.map +1 -0
  304. package/src/shade/renderer/particles/runtime/GPUParticleEmitterContext.js +127 -0
  305. package/src/shade/renderer/particles/runtime/ParticleEmitter.d.ts +87 -102
  306. package/src/shade/renderer/particles/runtime/ParticleEmitter.d.ts.map +1 -1
  307. package/src/shade/renderer/particles/runtime/ParticleEmitter.js +184 -163
  308. package/src/shade/renderer/particles/runtime/ProgramHeap.d.ts +130 -0
  309. package/src/shade/renderer/particles/runtime/ProgramHeap.d.ts.map +1 -0
  310. package/src/shade/renderer/particles/runtime/ProgramHeap.js +595 -0
  311. package/src/shade/renderer/particles/runtime/ProgramPlacement.d.ts +91 -0
  312. package/src/shade/renderer/particles/runtime/ProgramPlacement.d.ts.map +1 -0
  313. package/src/shade/renderer/particles/runtime/ProgramPlacement.js +106 -0
  314. package/src/shade/renderer/particles/runtime/create_particle_effect.d.ts +5 -2
  315. package/src/shade/renderer/particles/runtime/create_particle_effect.d.ts.map +1 -1
  316. package/src/shade/renderer/particles/runtime/create_particle_effect.js +22 -19
  317. package/src/shade/renderer/particles/shaders/chunk_particle_emit_step.d.ts +28 -0
  318. package/src/shade/renderer/particles/shaders/chunk_particle_emit_step.d.ts.map +1 -0
  319. package/src/shade/renderer/particles/shaders/chunk_particle_emit_step.js +136 -0
  320. package/src/shade/renderer/particles/shaders/chunk_particle_simulate_step.d.ts +35 -0
  321. package/src/shade/renderer/particles/shaders/chunk_particle_simulate_step.d.ts.map +1 -0
  322. package/src/shade/renderer/particles/shaders/chunk_particle_simulate_step.js +133 -0
  323. package/src/shade/renderer/particles/shaders/shader_particle_emit.d.ts +18 -9
  324. package/src/shade/renderer/particles/shaders/shader_particle_emit.d.ts.map +1 -1
  325. package/src/shade/renderer/particles/shaders/shader_particle_emit.js +20 -80
  326. package/src/shade/renderer/particles/shaders/shader_particle_emit_wide.d.ts +33 -0
  327. package/src/shade/renderer/particles/shaders/shader_particle_emit_wide.d.ts.map +1 -0
  328. package/src/shade/renderer/particles/shaders/shader_particle_emit_wide.js +114 -0
  329. package/src/shade/renderer/particles/shaders/shader_particle_simulate.d.ts +8 -0
  330. package/src/shade/renderer/particles/shaders/shader_particle_simulate.d.ts.map +1 -1
  331. package/src/shade/renderer/particles/shaders/shader_particle_simulate.js +33 -101
  332. package/src/shade/renderer/particles/shaders/shader_particle_simulate_wide.d.ts +45 -0
  333. package/src/shade/renderer/particles/shaders/shader_particle_simulate_wide.d.ts.map +1 -0
  334. package/src/shade/renderer/particles/shaders/shader_particle_simulate_wide.js +123 -0
  335. package/src/shade/renderer/particles/sort/graph_particle_sort.d.ts +51 -0
  336. package/src/shade/renderer/particles/sort/graph_particle_sort.d.ts.map +1 -0
  337. package/src/shade/renderer/particles/sort/graph_particle_sort.js +120 -0
  338. package/src/shade/renderer/particles/vm/PARTICLE_VM_CONTEXT_STRUCT.d.ts +6 -0
  339. package/src/shade/renderer/particles/vm/PARTICLE_VM_CONTEXT_STRUCT.d.ts.map +1 -0
  340. package/src/shade/renderer/particles/vm/PARTICLE_VM_CONTEXT_STRUCT.js +16 -0
  341. package/src/shade/renderer/particles/vm/ParticleVMReference.d.ts +4 -1
  342. package/src/shade/renderer/particles/vm/ParticleVMReference.d.ts.map +1 -1
  343. package/src/shade/renderer/particles/vm/ParticleVMReference.js +261 -140
  344. package/src/shade/renderer/particles/vm/chunk_particle_vm.d.ts.map +1 -1
  345. package/src/shade/renderer/particles/vm/chunk_particle_vm.js +217 -255
  346. package/src/shade/renderer/particles/vm/chunk_particle_vm_registers_fast.d.ts +43 -0
  347. package/src/shade/renderer/particles/vm/chunk_particle_vm_registers_fast.d.ts.map +1 -0
  348. package/src/shade/renderer/particles/vm/chunk_particle_vm_registers_fast.js +55 -0
  349. package/src/shade/renderer/particles/vm/chunk_particle_vm_registers_wide.d.ts +62 -0
  350. package/src/shade/renderer/particles/vm/chunk_particle_vm_registers_wide.d.ts.map +1 -0
  351. package/src/shade/renderer/particles/vm/chunk_particle_vm_registers_wide.js +86 -0
  352. package/src/shade/renderer/shader/chunk/math/chunk_mod_v3f.d.ts +22 -0
  353. package/src/shade/renderer/shader/chunk/math/chunk_mod_v3f.d.ts.map +1 -0
  354. package/src/shade/renderer/shader/chunk/math/chunk_mod_v3f.js +32 -0
  355. package/src/shade/renderer/shader/chunk/math/chunk_mod_v4f.d.ts +9 -0
  356. package/src/shade/renderer/shader/chunk/math/chunk_mod_v4f.d.ts.map +1 -0
  357. package/src/shade/renderer/shader/chunk/math/chunk_mod_v4f.js +19 -0
  358. package/src/shade/renderer/shader/chunk/noise/psrdnoise/README.md +65 -0
  359. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise2.d.ts +24 -0
  360. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise2.d.ts.map +1 -0
  361. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise2.js +83 -0
  362. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise2_hash.d.ts +25 -0
  363. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise2_hash.d.ts.map +1 -0
  364. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise2_hash.js +42 -0
  365. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise2_kernel.d.ts +31 -0
  366. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise2_kernel.d.ts.map +1 -0
  367. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise2_kernel.js +80 -0
  368. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise3.d.ts +26 -0
  369. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise3.d.ts.map +1 -0
  370. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise3.js +109 -0
  371. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise3_kernel.d.ts +38 -0
  372. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise3_kernel.d.ts.map +1 -0
  373. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise3_kernel.js +129 -0
  374. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise3_permute.d.ts +21 -0
  375. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise3_permute.d.ts.map +1 -0
  376. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise3_permute.js +35 -0
  377. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise3_skew.d.ts +19 -0
  378. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise3_skew.d.ts.map +1 -0
  379. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise3_skew.js +28 -0
  380. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise3_unskew.d.ts +13 -0
  381. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise3_unskew.d.ts.map +1 -0
  382. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise3_unskew.js +22 -0
  383. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_srdnoise2.d.ts +22 -0
  384. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_srdnoise2.d.ts.map +1 -0
  385. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_srdnoise2.js +59 -0
  386. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_srdnoise3.d.ts +23 -0
  387. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_srdnoise3.d.ts.map +1 -0
  388. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_srdnoise3.js +74 -0
  389. package/src/shade/renderer/volumetrics/ParticipatingMediaVolume.d.ts +7 -0
  390. package/src/shade/renderer/volumetrics/ParticipatingMediaVolume.d.ts.map +1 -1
  391. package/src/shade/renderer/volumetrics/ParticipatingMediaVolume.js +7 -0
  392. package/src/shade/wgsl/emulator/ComputeShaderEmulator.d.ts +34 -1
  393. package/src/shade/wgsl/emulator/ComputeShaderEmulator.d.ts.map +1 -1
  394. package/src/shade/wgsl/emulator/ComputeShaderEmulator.js +41 -1
  395. package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.d.ts +3 -2
  396. package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.d.ts.map +1 -1
  397. package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.js +49 -10
  398. package/src/view/minimap/dom/MinimapCameraView.d.ts.map +1 -1
  399. package/src/view/minimap/dom/MinimapCameraView.js +4 -9
  400. package/src/core/model/node-graph/visual/layout/BoxLayoutSpec.d.ts +0 -15
  401. package/src/core/model/node-graph/visual/layout/BoxLayoutSpec.d.ts.map +0 -1
  402. package/src/core/model/node-graph/visual/layout/ConnectedBoxLayouter.d.ts +0 -45
  403. package/src/core/model/node-graph/visual/layout/ConnectedBoxLayouter.d.ts.map +0 -1
  404. package/src/core/model/node-graph/visual/layout/ConnectionEndpointLayoutSpec.d.ts +0 -24
  405. package/src/core/model/node-graph/visual/layout/ConnectionEndpointLayoutSpec.d.ts.map +0 -1
  406. package/src/core/model/node-graph/visual/layout/ConnectionLayoutSpec.d.ts +0 -19
  407. package/src/core/model/node-graph/visual/layout/ConnectionLayoutSpec.d.ts.map +0 -1
  408. package/src/engine/ecs/transform/__probe.d.ts +0 -4
  409. package/src/engine/ecs/transform/__probe.d.ts.map +0 -1
  410. package/src/engine/ecs/util/hideEntityGracefully.d.ts +0 -9
  411. package/src/engine/ecs/util/hideEntityGracefully.d.ts.map +0 -1
  412. package/src/engine/sound/simulation/core/OcclusionSolver.js +0 -112
  413. package/src/shade/renderer/buffer/table/gpu_database_emulator_image.d.ts +0 -27
  414. package/src/shade/renderer/buffer/table/gpu_database_emulator_image.d.ts.map +0 -1
  415. package/src/shade/renderer/particles/cull/chunk_particle_cull.d.ts +0 -14
  416. package/src/shade/renderer/particles/cull/chunk_particle_cull.d.ts.map +0 -1
  417. package/src/shade/renderer/particles/data/PARTICLE_EMITTER_LAYOUT.d.ts +0 -156
  418. package/src/shade/renderer/particles/data/PARTICLE_EMITTER_LAYOUT.d.ts.map +0 -1
  419. package/src/shade/renderer/particles/runtime/Emitter.d.ts +0 -219
  420. package/src/shade/renderer/particles/runtime/Emitter.d.ts.map +0 -1
  421. package/src/shade/renderer/particles/runtime/ParticleSpawnScheduler.d.ts +0 -77
  422. package/src/shade/renderer/particles/runtime/ParticleSpawnScheduler.d.ts.map +0 -1
  423. package/src/shade/renderer/particles/runtime/ProgramArena.d.ts +0 -89
  424. package/src/shade/renderer/particles/runtime/ProgramArena.d.ts.map +0 -1
  425. package/src/shade/renderer/particles/runtime/ProgramArena.js +0 -155
  426. package/src/shade/renderer/particles/runtime/emitter_database_image.d.ts +0 -15
  427. package/src/shade/renderer/particles/runtime/emitter_database_image.d.ts.map +0 -1
  428. package/src/shade/renderer/particles/runtime/spawn_request_encoding.d.ts +0 -34
  429. package/src/shade/renderer/particles/runtime/spawn_request_encoding.d.ts.map +0 -1
  430. package/src/shade/renderer/particles/shaders/chunk_particle_context.d.ts +0 -32
  431. package/src/shade/renderer/particles/shaders/chunk_particle_context.d.ts.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"AcousticSimulator.d.ts","sourceRoot":"","sources":["../../../../../src/engine/sound/simulation/AcousticSimulator.js"],"names":[],"mappings":"AA0CA;;;;;;;;;GASG;AACH;IACI;;;OAGG;IACH,UAFU,MAAM,CAEF;IAEd;;;OAGG;IACH,WAFU,MAAM,CAEA;IAEhB;;;;;OAKG;IACH,SAFU,OAAO,CAED;IAEhB;;;;;;OAMG;IACH,gBAFU,OAAO,CAEM;IAEvB;;;;OAIG;IACH,eAFU,MAAM,CAEE;IAgGlB,6BAGC;IAZD;;;;OAIG;IACH,0BAEC;IAiBD,gCAEC;IAZD;;;;;OAKG;IACH,6BAEC;IAMD;;;;OAIG;IACH,2CAEC;IAED;;;;;;;OAOG;IACH,yEAHW,YAAY,GAAC,MAAM,EAAE,GACnB,MAAM,CAIlB;IAED;;;OAGG;IACH,6BAHW,MAAM,UACN,YAAY,GAAC,MAAM,EAAE,QAI/B;IAED;;OAEG;IACH,uBAFW,MAAM,QAIhB;IAED;;;OAGG;IACH,8DAEC;IAED;;OAEG;IACH,iDAEC;IAED;;;;OAIG;IACH,sBAEC;IAED;;;;;OAKG;IACH,qBAFW,qBAAmB,IAAI,QAMjC;IAED;;;;;;;;OAQG;IACH,mBAPW,OAAO,UACP,OAAO,gBACP,MAAM,SAEN,mBAAmB,OACnB,gBAAgB,QAkB1B;IAED;;;;;;OAMG;IACH,qBAHW,eAAe,YACf,OAAO,QAuFjB;IAgPD;;;OAGG;IACH,sCAOC;;CACJ;+BA/nB8B,0BAA0B;sCACnB,iCAAiC;wBAN/C,+BAA+B;oCASW,+BAA+B;iCADhE,4BAA4B"}
1
+ {"version":3,"file":"AcousticSimulator.d.ts","sourceRoot":"","sources":["../../../../../src/engine/sound/simulation/AcousticSimulator.js"],"names":[],"mappings":"AA6CA;;;;;;;;;GASG;AACH;IACI;;;OAGG;IACH,UAFU,MAAM,CAEF;IAEd;;;OAGG;IACH,WAFU,MAAM,CAEA;IAEhB;;;;;OAKG;IACH,SAFU,OAAO,CAED;IAEhB;;;;;;OAMG;IACH,gBAFU,OAAO,CAEM;IAEvB;;;;OAIG;IACH,eAFU,MAAM,CAEE;IA2FlB,6BAGC;IAZD;;;;OAIG;IACH,0BAEC;IAiBD,gCAEC;IAZD;;;;;OAKG;IACH,6BAEC;IAMD;;;;OAIG;IACH,2CAEC;IAED;;;;;;;OAOG;IACH,yEAHW,YAAY,GAAC,MAAM,EAAE,GACnB,MAAM,CAIlB;IAED;;;OAGG;IACH,6BAHW,MAAM,UACN,YAAY,GAAC,MAAM,EAAE,QAI/B;IAED;;OAEG;IACH,uBAFW,MAAM,QAIhB;IAED;;;OAGG;IACH,8DAEC;IAED;;OAEG;IACH,iDAEC;IAED;;;;OAIG;IACH,sBAEC;IAED;;;;;OAKG;IACH,qBAFW,qBAAmB,IAAI,QAMjC;IAED;;;;;;;;;;;;OAYG;IACH,mBAPW,MAAM,EAAE,GAAC,YAAY,GAAC,YAAY,UAClC,MAAM,EAAE,GAAC,YAAY,GAAC,YAAY,iBAClC,MAAM,SAEN,mBAAmB,OACnB,gBAAgB,QAkB1B;IAED;;;;;;OAMG;IACH,sBAHW,eAAe,YACf,MAAM,EAAE,GAAC,YAAY,GAAC,YAAY,QAyF5C;IAqPD;;;OAGG;IACH,sCAOC;;CACJ;+BAroB8B,0BAA0B;sCACnB,iCAAiC;oCAGL,+BAA+B;iCADhE,4BAA4B"}
@@ -1,15 +1,18 @@
1
+ import { assert } from "../../../core/assert.js";
2
+ import {
3
+ line3_compute_segment_closest_point_t
4
+ } from "../../../core/geom/3d/line/line3_compute_segment_closest_point_t.js";
1
5
  import { BinaryElementPool } from "../../../core/geom/3d/topology/struct/binary/BinaryElementPool.js";
6
+ import { v3_length } from "../../../core/geom/vec3/v3_length.js";
2
7
  import { Vector3 } from "../../../core/geom/Vector3.js";
3
- import { seededRandom } from "../../../core/math/random/seededRandom.js";
4
8
  import { INVALID_NODE } from "../../../core/graph/csr/csr_graph_build_distance_field.js";
5
- import { line3_compute_segment_closest_point_t } from "../../../core/geom/3d/line/line3_compute_segment_closest_point_t.js";
6
- import { v3_length } from "../../../core/geom/vec3/v3_length.js";
9
+ import { seededRandom } from "../../../core/math/random/seededRandom.js";
7
10
  import { AcousticMedium } from "./core/AcousticMedium.js";
8
11
  import { AcousticOccluderIndex } from "./core/AcousticOccluderIndex.js";
9
12
  import { AcousticRegionIndex } from "./core/AcousticRegionIndex.js";
10
13
  import { AcousticSolution } from "./core/AcousticSolution.js";
11
14
  import { ACOUSTIC_SOURCE_STATE_FLOATS, AcousticSourceState } from "./core/AcousticSourceState.js";
12
- import { OcclusionSolver } from "./core/OcclusionSolver.js";
15
+ import { acoustic_occlusion_solve } from "./core/acoustic_occlusion_solve.js";
13
16
  import { VolumeField } from "./core/VolumeField.js";
14
17
  import { ProbeFieldPathingSolution } from "./probe/ProbeFieldPathingSolution.js";
15
18
  import { ProbeVisibilityRecheck } from "./probe/ProbeVisibilityRecheck.js";
@@ -105,11 +108,6 @@ export class AcousticSimulator {
105
108
  */
106
109
  #volumeField = new VolumeField(AcousticMedium.from(DEFAULT_AIR_ABSORPTION));
107
110
 
108
- /**
109
- * @type {OcclusionSolver}
110
- */
111
- #occlusionSolver = new OcclusionSolver();
112
-
113
111
  /**
114
112
  * Live-instance → its temporal-state record id in {@link #statePool}. The state DATA lives in the
115
113
  * pool (flat floats); this map only holds the id relation. Audio events are highly transient (a
@@ -274,26 +272,30 @@ export class AcousticSimulator {
274
272
 
275
273
  /**
276
274
  * Compute the full acoustic solution for a source at `source`, given `listener`, into `out`.
277
- * @param {Vector3} listener
278
- * @param {Vector3} source
279
- * @param {number} sourceRadius apparent radius of the source (per-source; 0 = point source). For
275
+ *
276
+ * Both positions are read BY INDEX rather than through `.x/.y/.z`: they are live views over
277
+ * {@link Transform64} buffers (plain `Float64Array`s, no component accessors). A {@link Vector3}
278
+ * is a `Float64Array` subclass whose `[0..2]` alias `x/y/z`, so indexing reads both shapes.
279
+ * @param {number[]|Float32Array|Float64Array} listener listener world position, 3 elements
280
+ * @param {number[]|Float32Array|Float64Array} source source world position, 3 elements
281
+ * @param {number} source_radius apparent radius of the source (per-source; 0 = point source). For
280
282
  * volumetric (fractional) occlusion.
281
283
  * @param {AcousticSourceState} state per-source temporal accumulation (mutated)
282
284
  * @param {AcousticSolution} out
283
285
  */
284
- solveFor(listener, source, sourceRadius, state, out) {
286
+ solveFor(listener, source, source_radius, state, out) {
285
287
  out.reset();
286
288
 
287
289
  // air absorption integrated over the actual source→listener path (distance-dependent, per band)
288
290
  this.#volumeField.integrateAbsorption(
289
291
  this.#region_index,
290
- source.x, source.y, source.z,
291
- listener.x, listener.y, listener.z,
292
+ source[0], source[1], source[2],
293
+ listener[0], listener[1], listener[2],
292
294
  out.airLoss
293
295
  );
294
296
 
295
- this.#occlusionSolver.solve(
296
- listener, source, sourceRadius,
297
+ acoustic_occlusion_solve(
298
+ listener, source, source_radius,
297
299
  this.#occluder_index, this.rayCount, this.smoothing, this.#random,
298
300
  state, out
299
301
  );
@@ -303,10 +305,12 @@ export class AcousticSimulator {
303
305
  * Solve + push the result to every live instance. Each instance must expose a `position` (Vector3)
304
306
  * and `setAcoustic(solution)`. Called once per frame by the `AudioEmitterSystem`, between the live-set
305
307
  * refresh and the sopra tick.
306
- * @param {EventInstance[]} liveInstances bounded set (≤ voice budget)
307
- * @param {Vector3} listener
308
+ * @param {EventInstance[]} live_instances bounded set (≤ voice budget)
309
+ * @param {number[]|Float32Array|Float64Array} listener listener world position, 3 elements
308
310
  */
309
- apply(liveInstances, listener) {
311
+ apply(live_instances, listener) {
312
+ assert.defined(listener, 'listener');
313
+
310
314
  const live = this.#liveScratch;
311
315
  live.clear();
312
316
 
@@ -328,7 +332,7 @@ export class AcousticSimulator {
328
332
  }
329
333
  // Snap to the nearest probe the listener can SEE — never one occluded by a wall/floor (a different
330
334
  // acoustic region), which would route a spurious cross-occluder detour or none at all.
331
- const listenerProbe = this.#probeField.nearestVisibleIndex(listener.x, listener.y, listener.z, this.#occluder_index);
335
+ const listenerProbe = this.#probeField.nearestVisibleIndex(listener[0], listener[1], listener[2], this.#occluder_index);
332
336
  if (listenerProbe >= 0) {
333
337
  this.#pathingSolution.computeExitField(this.#probeField.visibilityGraph, listenerProbe);
334
338
  exitFieldReady = true;
@@ -338,8 +342,8 @@ export class AcousticSimulator {
338
342
  const pool = this.#statePool;
339
343
  const cursor = this.#stateCursor;
340
344
 
341
- for (let i = 0; i < liveInstances.length; i++) {
342
- const instance = liveInstances[i];
345
+ for (let i = 0; i < live_instances.length; i++) {
346
+ const instance = live_instances[i];
343
347
 
344
348
  live.add(instance);
345
349
 
@@ -414,14 +418,18 @@ export class AcousticSimulator {
414
418
  * the first hop (the corner it leaks through), not the blocked listener.
415
419
  * @param {AcousticSolution} solution (occlusion already solved)
416
420
  * @param {EventInstance} instance the source (position + attenuation + orientation + directivity)
417
- * @param {Vector3} listener the listener world position (the leak's far endpoint)
421
+ * @param {number[]|Float32Array|Float64Array} listener the listener world position (the leak's far endpoint)
418
422
  */
419
423
  #applyPath(solution, instance, listener) {
420
424
  const field = this.#probeField;
421
425
  const pathingSolution = this.#pathingSolution;
422
426
  const source = instance.position;
423
427
 
424
- const sourceProbe = field.nearestVisibleIndex(source.x, source.y, source.z, this.#occluder_index);
428
+ // both endpoints are live Transform64 translation views (bare Float64Arrays) — read by index
429
+ const source_x = source[0], source_y = source[1], source_z = source[2];
430
+ const listener_x = listener[0], listener_y = listener[1], listener_z = listener[2];
431
+
432
+ const sourceProbe = field.nearestVisibleIndex(source_x, source_y, source_z, this.#occluder_index);
425
433
 
426
434
  if (sourceProbe < 0) {
427
435
  return;
@@ -450,14 +458,14 @@ export class AcousticSimulator {
450
458
  // to the probe vertex: (a) avoids the spurious there-and-back bend a probe sitting just past the
451
459
  // endpoint would fold into the route (the transfer gate would wrongly refuse it), and (b) lets the
452
460
  // attachment legs count toward the routed distance, so a standoff / oblique endpoint attenuates.
453
- const tS = line3_compute_segment_closest_point_t(spx, spy, spz, fhx, fhy, fhz, source.x, source.y, source.z);
461
+ const tS = line3_compute_segment_closest_point_t(spx, spy, spz, fhx, fhy, fhz, source_x, source_y, source_z);
454
462
  const sX = spx + (fhx - spx) * tS, sY = spy + (fhy - spy) * tS, sZ = spz + (fhz - spz) * tS;
455
- const sourceLeg = Math.hypot(source.x - sX, source.y - sY, source.z - sZ);
463
+ const sourceLeg = Math.hypot(source_x - sX, source_y - sY, source_z - sZ);
456
464
  const firstEdgeLen = Math.hypot(fhx - spx, fhy - spy, fhz - spz);
457
465
 
458
- const tL = line3_compute_segment_closest_point_t(lhx, lhy, lhz, lpx, lpy, lpz, listener.x, listener.y, listener.z);
466
+ const tL = line3_compute_segment_closest_point_t(lhx, lhy, lhz, lpx, lpy, lpz, listener_x, listener_y, listener_z);
459
467
  const lX = lhx + (lpx - lhx) * tL, lY = lhy + (lpy - lhy) * tL, lZ = lhz + (lpz - lhz) * tL;
460
- const listenerLeg = Math.hypot(listener.x - lX, listener.y - lY, listener.z - lZ);
468
+ const listenerLeg = Math.hypot(listener_x - lX, listener_y - lY, listener_z - lZ);
461
469
  const lastEdgeLen = Math.hypot(lpx - lhx, lpy - lhy, lpz - lhz);
462
470
 
463
471
  // Corridor span between the two virtual attach points. A SINGLE-edge route (firstHop IS the listener's
@@ -493,8 +501,8 @@ export class AcousticSimulator {
493
501
  // endpoint ON the corridor passes straight through (degenerate leg → gain 1), one off to the side or
494
502
  // behind it bends and attenuates. (Interior turns: Phase 0b.)
495
503
  if (field.hasTransfer) {
496
- pathGain *= this.#turnGain(sourceProbe, sX - source.x, sY - source.y, sZ - source.z, fhx - spx, fhy - spy, fhz - spz);
497
- pathGain *= this.#turnGain(listenerProbe, lpx - lhx, lpy - lhy, lpz - lhz, listener.x - lX, listener.y - lY, listener.z - lZ);
504
+ pathGain *= this.#turnGain(sourceProbe, sX - source_x, sY - source_y, sZ - source_z, fhx - spx, fhy - spy, fhz - spz);
505
+ pathGain *= this.#turnGain(listenerProbe, lpx - lhx, lpy - lhy, lpz - lhz, listener_x - lX, listener_y - lY, listener_z - lZ);
498
506
  }
499
507
 
500
508
  // Walk the leaked polyline (source-probe → … → listener-probe) once, now that the leak is audible:
@@ -599,9 +607,10 @@ export class AcousticSimulator {
599
607
  #directivityGainToward(instance, tx, ty, tz) {
600
608
  const source = instance.position;
601
609
 
602
- let dx = tx - source.x;
603
- let dy = ty - source.y;
604
- let dz = tz - source.z;
610
+ // a live Transform64 translation view (a bare Float64Array) — read by index
611
+ let dx = tx - source[0];
612
+ let dy = ty - source[1];
613
+ let dz = tz - source[2];
605
614
 
606
615
  const len = v3_length(dx, dy, dz);
607
616
 
@@ -625,10 +634,10 @@ export class AcousticSimulator {
625
634
  * Fill `solution.directivityGain` — the source's radiation toward the LISTENER (the direct path).
626
635
  * @param {AcousticSolution} solution (occlusion already solved; `directivityGain` written)
627
636
  * @param {EventInstance} instance the source — position + orientation + directivity
628
- * @param {Vector3} listener
637
+ * @param {number[]|Float32Array|Float64Array} listener listener world position, 3 elements
629
638
  */
630
639
  #applyDirectivity(solution, instance, listener) {
631
- solution.directivityGain = this.#directivityGainToward(instance, listener.x, listener.y, listener.z);
640
+ solution.directivityGain = this.#directivityGainToward(instance, listener[0], listener[1], listener[2]);
632
641
  }
633
642
 
634
643
  /**
@@ -49,7 +49,7 @@ simulation/
49
49
  AcousticOccluderIndex.js dynamic ray index — a TLAS BVH over OccluderBody shapes (exact shape.raycast)
50
50
  OccluderBody.js one occluder: shape + material + world transform (+ cached inverse / AABB)
51
51
  RayHit.js reusable closest-hit result (caller-allocated): point + normal + t + material
52
- OcclusionSolver.js volumetric occlusion + transmission for one source (temporally smoothed)
52
+ acoustic_occlusion_solve.js volumetric occlusion + transmission for one source (temporally smoothed)
53
53
  VolumeField.js blends AcousticVolume regions into a medium at a point + integrates air
54
54
  absorption along the source→listener path (distance-dependent, per band)
55
55
  AcousticVolumeRegion.js a shape + medium + transition band (boundary blend)
@@ -197,7 +197,7 @@ real-time-direct / baked-indirect split.
197
197
 
198
198
  ## The simulation, in one paragraph each
199
199
 
200
- **Occlusion + transmission.** For each live source, `OcclusionSolver` shoots `rayCount` rays from the
200
+ **Occlusion + transmission.** For each live source, `acoustic_occlusion_solve` shoots `rayCount` rays from the
201
201
  listener toward points spread over the source's sphere (Fibonacci distribution, randomly re-oriented per
202
202
  tick). The fraction blocked is the occlusion; the blocked rays' material `transmission` (3 bands) is what
203
203
  leaks through. The result is folded into a temporal EMA, so a low ray count integrates over frames and
@@ -1 +1 @@
1
- {"version":3,"file":"OcclusionSolver.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/sound/simulation/core/OcclusionSolver.js"],"names":[],"mappings":"AAeA;;;;;;;;;;;;;GAaG;AACH;IACI;;;;;;;;;;OAUG;IACH,wDARW,MAAM,0CAEN,MAAM,aACN,MAAM,gBACK,MAAM,2DAyE3B;CACJ"}
1
+ {"version":3,"file":"OcclusionSolver.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/sound/simulation/core/OcclusionSolver.js"],"names":[],"mappings":"AAgBA;;;;;;;;;;;;;GAaG;AACH;IACI;;;;;;;;;;OAUG;IACH,wDARW,MAAM,0CAEN,MAAM,aACN,MAAM,gBACK,MAAM,2DA4F3B;CACJ"}
@@ -32,8 +32,8 @@ export class VolumeField {
32
32
  */
33
33
  sample(regionIndex: AcousticRegionIndex, x: number, y: number, z: number, out: AcousticMedium): void;
34
34
  /**
35
- * Integrate per-band air absorption along the segment from the source `(sx, sy, sz)` to the listener
36
- * `(lx, ly, lz)`, through the blended media, into `outLoss` (per-band **total dB** attenuation over the
35
+ * Integrate per-band air absorption along the segment from the source `(source_x, source_y, source_z)` to the listener
36
+ * `(listener_x, listener_y, listener_z)`, through the blended media, into `outLoss` (per-band **total dB** attenuation over the
37
37
  * path). Each `AcousticMedium.airAbsorption` is in dB per metre, so the line integral `∫ α ds` gives the
38
38
  * total dB lost per band — i.e. distance-dependent atmospheric absorption (highs accumulate loss faster,
39
39
  * so they die over distance while lows carry), plus extra loss along whatever painted region the path
@@ -44,15 +44,15 @@ export class VolumeField {
44
44
  * midpoints, blending the medium at each via {@link sample}. Allocation-free (module scratch).
45
45
  *
46
46
  * @param {AcousticRegionIndex} regionIndex
47
- * @param {number} sx source position x
48
- * @param {number} sy source position y
49
- * @param {number} sz source position z
50
- * @param {number} lx listener position x
51
- * @param {number} ly listener position y
52
- * @param {number} lz listener position z
47
+ * @param {number} source_x source position x
48
+ * @param {number} source_y source position y
49
+ * @param {number} source_z source position z
50
+ * @param {number} listener_x listener position x
51
+ * @param {number} listener_y listener position y
52
+ * @param {number} listener_z listener position z
53
53
  * @param {Float32Array} outLoss `[low, mid, high]` total dB attenuation over the path
54
54
  */
55
- integrateAbsorption(regionIndex: AcousticRegionIndex, sx: number, sy: number, sz: number, lx: number, ly: number, lz: number, outLoss: Float32Array): void;
55
+ integrateAbsorption(regionIndex: AcousticRegionIndex, source_x: number, source_y: number, source_z: number, listener_x: number, listener_y: number, listener_z: number, outLoss: Float32Array): void;
56
56
  #private;
57
57
  }
58
58
  import { AcousticMedium } from "./AcousticMedium.js";
@@ -1 +1 @@
1
- {"version":3,"file":"VolumeField.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/sound/simulation/core/VolumeField.js"],"names":[],"mappings":"AAaA;;;;;GAKG;AACH;IAMI;;OAEG;IACH,4BAFW,cAAc,EAIxB;IASD;;OAEG;IACH,uCAEC;IAZD;;OAEG;IACH,oCAEC;IASD;;;;;;;;;;;;OAYG;IACH,4CALW,MAAM,KACN,MAAM,KACN,MAAM,OACN,cAAc,QA0BxB;IAED;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,0DARW,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,WACN,YAAY,QA2CtB;;CACJ;+BApJ8B,qBAAqB"}
1
+ {"version":3,"file":"VolumeField.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/sound/simulation/core/VolumeField.js"],"names":[],"mappings":"AAcA;;;;;GAKG;AACH;IAMI;;OAEG;IACH,4BAFW,cAAc,EAIxB;IASD;;OAEG;IACH,uCAEC;IAZD;;OAEG;IACH,oCAEC;IASD;;;;;;;;;;;;OAYG;IACH,4CALW,MAAM,KACN,MAAM,KACN,MAAM,OACN,cAAc,QA0BxB;IAED;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,gEARW,MAAM,YACN,MAAM,YACN,MAAM,cACN,MAAM,cACN,MAAM,cACN,MAAM,WACN,YAAY,QA0DtB;;CACJ;+BAnK8B,qBAAqB"}
@@ -1,3 +1,4 @@
1
+ import { assert } from "../../../../core/assert.js";
1
2
  import { AcousticMedium } from "./AcousticMedium.js";
2
3
 
3
4
  // Samples along a source→listener segment for the air-absorption line integral (midpoint rule). The
@@ -84,8 +85,8 @@ export class VolumeField {
84
85
  }
85
86
 
86
87
  /**
87
- * Integrate per-band air absorption along the segment from the source `(sx, sy, sz)` to the listener
88
- * `(lx, ly, lz)`, through the blended media, into `outLoss` (per-band **total dB** attenuation over the
88
+ * Integrate per-band air absorption along the segment from the source `(source_x, source_y, source_z)` to the listener
89
+ * `(listener_x, listener_y, listener_z)`, through the blended media, into `outLoss` (per-band **total dB** attenuation over the
89
90
  * path). Each `AcousticMedium.airAbsorption` is in dB per metre, so the line integral `∫ α ds` gives the
90
91
  * total dB lost per band — i.e. distance-dependent atmospheric absorption (highs accumulate loss faster,
91
92
  * so they die over distance while lows carry), plus extra loss along whatever painted region the path
@@ -96,18 +97,33 @@ export class VolumeField {
96
97
  * midpoints, blending the medium at each via {@link sample}. Allocation-free (module scratch).
97
98
  *
98
99
  * @param {AcousticRegionIndex} regionIndex
99
- * @param {number} sx source position x
100
- * @param {number} sy source position y
101
- * @param {number} sz source position z
102
- * @param {number} lx listener position x
103
- * @param {number} ly listener position y
104
- * @param {number} lz listener position z
100
+ * @param {number} source_x source position x
101
+ * @param {number} source_y source position y
102
+ * @param {number} source_z source position z
103
+ * @param {number} listener_x listener position x
104
+ * @param {number} listener_y listener position y
105
+ * @param {number} listener_z listener position z
105
106
  * @param {Float32Array} outLoss `[low, mid, high]` total dB attenuation over the path
106
107
  */
107
- integrateAbsorption(regionIndex, sx, sy, sz, lx, ly, lz, outLoss) {
108
- const dx = lx - sx;
109
- const dy = ly - sy;
110
- const dz = lz - sz;
108
+ integrateAbsorption(
109
+ regionIndex,
110
+ source_x, source_y, source_z,
111
+ listener_x, listener_y, listener_z,
112
+ outLoss
113
+ ) {
114
+
115
+ assert.isNumber(source_x, 'source_x');
116
+ assert.isNumber(source_y, 'source_y');
117
+ assert.isNumber(source_z, 'source_z');
118
+
119
+ assert.isNumber(listener_x, 'listener_x');
120
+ assert.isNumber(listener_y, 'listener_y');
121
+ assert.isNumber(listener_z, 'listener_z');
122
+
123
+ const dx = listener_x - source_x;
124
+ const dy = listener_y - source_y;
125
+ const dz = listener_z - source_z;
126
+
111
127
  const distance = Math.sqrt(dx * dx + dy * dy + dz * dz);
112
128
 
113
129
  if (distance === 0) {
@@ -134,7 +150,7 @@ export class VolumeField {
134
150
 
135
151
  for (let i = 0; i < AIR_INTEGRAL_SAMPLES; i++) {
136
152
  const t = (i + 0.5) / AIR_INTEGRAL_SAMPLES;
137
- this.sample(regionIndex, sx + dx * t, sy + dy * t, sz + dz * t, STEP_MEDIUM);
153
+ this.sample(regionIndex, source_x + dx * t, source_y + dy * t, source_z + dz * t, STEP_MEDIUM);
138
154
 
139
155
  const air = STEP_MEDIUM.airAbsorption;
140
156
  low += air[0];
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Computes per-source occlusion + transmission by shooting rays from the listener toward points spread
3
+ * over the source's sphere and counting how many are blocked by the {@link AcousticOccluderIndex}.
4
+ *
5
+ * - Volumetric (not boolean): occlusion is the FRACTION of blocked rays, so partially-hidden sources
6
+ * attenuate smoothly instead of popping on/off.
7
+ * - Transmission: blocked rays accumulate their occluder's per-band transmission; the average is the
8
+ * energy that leaks through.
9
+ * - Temporal: the fibonacci sample set is randomly re-oriented each tick (seeded), and the result is
10
+ * folded into an {@link AcousticSourceState} via EMA — so a low per-tick ray count integrates over
11
+ * frames and the output stays frame-stable.
12
+ *
13
+ * Both positions are read BY INDEX, never as `.x/.y/.z`: production hands us live views over
14
+ * {@link Transform64} buffers (plain `Float64Array`s, which carry no component accessors), while a
15
+ * {@link Vector3} is itself a `Float64Array` subclass whose `[0..2]` alias `x/y/z`. Indexing is the one
16
+ * form that reads both.
17
+ *
18
+ * Pure: geometry in, numbers out. No WebAudio, no ECS, no allocation.
19
+ *
20
+ * @param {number[]|Float32Array|Float64Array} listener listener world position, 3 elements
21
+ * @param {number[]|Float32Array|Float64Array} source source world position, 3 elements
22
+ * @param {number} source_radius apparent radius of the source (0 = point source → boolean occlusion)
23
+ * @param {AcousticOccluderIndex} index
24
+ * @param {number} ray_count rays shot this tick (≥ 1)
25
+ * @param {number} smoothing EMA factor in (0, 1] — 1 = no smoothing
26
+ * @param {function():number} random seeded RNG; decorrelates the sample set per call
27
+ * @param {AcousticSourceState} state per-source temporal accumulation (mutated)
28
+ * @param {AcousticSolution} out occlusion + transmission written here (medium untouched)
29
+ */
30
+ export function acoustic_occlusion_solve(listener: number[] | Float32Array | Float64Array, source: number[] | Float32Array | Float64Array, source_radius: number, index: AcousticOccluderIndex, ray_count: number, smoothing: number, random: () => number, state: AcousticSourceState, out: AcousticSolution): void;
31
+ //# sourceMappingURL=acoustic_occlusion_solve.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"acoustic_occlusion_solve.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/sound/simulation/core/acoustic_occlusion_solve.js"],"names":[],"mappings":"AAgBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,mDAVW,MAAM,EAAE,GAAC,YAAY,GAAC,YAAY,UAClC,MAAM,EAAE,GAAC,YAAY,GAAC,YAAY,iBAClC,MAAM,2CAEN,MAAM,aACN,MAAM,gBACK,MAAM,2DA4F3B"}
@@ -0,0 +1,134 @@
1
+ import { assert } from "../../../../core/assert.js";
2
+ import { Ray3 } from "../../../../core/geom/3d/ray/Ray3.js";
3
+ import { sphere_fibonacci_point } from "../../../../core/geom/3d/sphere/sphere_fibonacci_point.js";
4
+ import { random_orthonormal_basis } from "../../../../core/geom/random/random_orthonormal_basis.js";
5
+ import { v3_matrix3_rotate } from "../../../../core/geom/vec3/v3_matrix3_rotate.js";
6
+ import { RayHit } from "./RayHit.js";
7
+
8
+ // module-static scratch — reused across calls so a solve allocates nothing. Typed throughout (the
9
+ // vectors carry direction cosines / band ratios, so Float64 native precision is free here).
10
+ const RAY = new Ray3();
11
+ const HIT = new RayHit();
12
+ const FIBONACCI = new Float64Array(3);
13
+ const DIRECTION = new Float64Array(3);
14
+ const ROTATION = new Float64Array(9);
15
+ const TRANSMISSION = new Float64Array(3);
16
+
17
+ /**
18
+ * Computes per-source occlusion + transmission by shooting rays from the listener toward points spread
19
+ * over the source's sphere and counting how many are blocked by the {@link AcousticOccluderIndex}.
20
+ *
21
+ * - Volumetric (not boolean): occlusion is the FRACTION of blocked rays, so partially-hidden sources
22
+ * attenuate smoothly instead of popping on/off.
23
+ * - Transmission: blocked rays accumulate their occluder's per-band transmission; the average is the
24
+ * energy that leaks through.
25
+ * - Temporal: the fibonacci sample set is randomly re-oriented each tick (seeded), and the result is
26
+ * folded into an {@link AcousticSourceState} via EMA — so a low per-tick ray count integrates over
27
+ * frames and the output stays frame-stable.
28
+ *
29
+ * Both positions are read BY INDEX, never as `.x/.y/.z`: production hands us live views over
30
+ * {@link Transform64} buffers (plain `Float64Array`s, which carry no component accessors), while a
31
+ * {@link Vector3} is itself a `Float64Array` subclass whose `[0..2]` alias `x/y/z`. Indexing is the one
32
+ * form that reads both.
33
+ *
34
+ * Pure: geometry in, numbers out. No WebAudio, no ECS, no allocation.
35
+ *
36
+ * @param {number[]|Float32Array|Float64Array} listener listener world position, 3 elements
37
+ * @param {number[]|Float32Array|Float64Array} source source world position, 3 elements
38
+ * @param {number} source_radius apparent radius of the source (0 = point source → boolean occlusion)
39
+ * @param {AcousticOccluderIndex} index
40
+ * @param {number} ray_count rays shot this tick (≥ 1)
41
+ * @param {number} smoothing EMA factor in (0, 1] — 1 = no smoothing
42
+ * @param {function():number} random seeded RNG; decorrelates the sample set per call
43
+ * @param {AcousticSourceState} state per-source temporal accumulation (mutated)
44
+ * @param {AcousticSolution} out occlusion + transmission written here (medium untouched)
45
+ */
46
+ export function acoustic_occlusion_solve(
47
+ listener,
48
+ source,
49
+ source_radius,
50
+ index,
51
+ ray_count,
52
+ smoothing,
53
+ random,
54
+ state,
55
+ out
56
+ ) {
57
+
58
+ // a per-tick random orientation for the fibonacci set (decorrelation over frames)
59
+ random_orthonormal_basis(ROTATION, 0, random);
60
+
61
+ const listener_x = listener[0];
62
+ const listener_y = listener[1];
63
+ const listener_z = listener[2];
64
+
65
+ assert.isNumber(listener_x, 'listener_x');
66
+ assert.isNumber(listener_y, 'listener_y');
67
+ assert.isNumber(listener_z, 'listener_z');
68
+
69
+ const source_x = source[0];
70
+ const source_y = source[1];
71
+ const source_z = source[2];
72
+
73
+ assert.isNumber(source_x, 'source_x');
74
+ assert.isNumber(source_y, 'source_y');
75
+ assert.isNumber(source_z, 'source_z');
76
+
77
+ let blocked = 0;
78
+ let t0 = 0;
79
+ let t1 = 0;
80
+ let t2 = 0;
81
+
82
+ for (let i = 0; i < ray_count; i++) {
83
+ sphere_fibonacci_point(FIBONACCI, 0, i, ray_count);
84
+ v3_matrix3_rotate(DIRECTION, 0, FIBONACCI[0], FIBONACCI[1], FIBONACCI[2], ROTATION);
85
+
86
+ // a sample point spread over the source's sphere
87
+ const px = source_x + DIRECTION[0] * source_radius;
88
+ const py = source_y + DIRECTION[1] * source_radius;
89
+ const pz = source_z + DIRECTION[2] * source_radius;
90
+
91
+ const dx = px - listener_x;
92
+ const dy = py - listener_y;
93
+ const dz = pz - listener_z;
94
+
95
+ const distance = Math.sqrt(dx * dx + dy * dy + dz * dz);
96
+
97
+ if (distance <= 1e-6) {
98
+ // listener sitting on the source — treat as unoccluded for this ray
99
+ continue;
100
+ }
101
+
102
+ const inv = 1 / distance;
103
+
104
+ RAY.setOrigin(listener_x, listener_y, listener_z);
105
+ RAY.setDirection(dx * inv, dy * inv, dz * inv);
106
+ RAY.tMax = distance;
107
+
108
+ if (index.closestHit(RAY, HIT)) {
109
+ blocked++;
110
+
111
+ const transmission = HIT.material.transmission;
112
+ t0 += transmission[0];
113
+ t1 += transmission[1];
114
+ t2 += transmission[2];
115
+ }
116
+ }
117
+
118
+ const occlusion = blocked / ray_count;
119
+
120
+ // instantaneous transmission = average blocker transmission; transparent when nothing blocked
121
+ if (blocked > 0) {
122
+ const inv = 1 / blocked;
123
+ TRANSMISSION[0] = t0 * inv;
124
+ TRANSMISSION[1] = t1 * inv;
125
+ TRANSMISSION[2] = t2 * inv;
126
+ } else {
127
+ TRANSMISSION[0] = 1;
128
+ TRANSMISSION[1] = 1;
129
+ TRANSMISSION[2] = 1;
130
+ }
131
+
132
+ state.integrate(occlusion, TRANSMISSION, smoothing);
133
+ state.writeTo(out);
134
+ }
@@ -12,10 +12,6 @@ export class AcousticSimulationSystem extends System<any> {
12
12
  * @param {AcousticSimulator} simulator the shared simulation engine
13
13
  */
14
14
  constructor(simulator: AcousticSimulator);
15
- /**
16
- * @param {EntityManager} entityManager
17
- */
18
- startup(entityManager: EntityManager): void;
19
15
  dependencies: (typeof Transform64 | typeof Collider | typeof AcousticBody)[];
20
16
  /**
21
17
  * Per-entity records: { handle, transform, onMove }.
@@ -1 +1 @@
1
- {"version":3,"file":"AcousticSimulationSystem.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/sound/simulation/ecs/AcousticSimulationSystem.js"],"names":[],"mappings":"AAMA;;;;;;;;GAQG;AACH;IAwBI;;OAEG;IACH,0CASC;IA3BD;;OAEG;IACH,4CAEC;IAED,6EAAqD;IAErD;;;OAGG;IACH,MAFU,MAAM,EAAE,CAER;IASN;;OAEG;IACH,6BAA0B;IAI9B;;;;;OAKG;IACH,WALW,YAAY,YACZ,QAAQ,aACR,WAAW,UACX,MAAM,QAmBhB;IAED;;;;;OAKG;IACH,aALW,YAAY,YACZ,QAAQ,aACR,WAAW,UACX,MAAM,QAgBhB;CACJ;uBAnGsB,wBAAwB;4BACnB,uCAAuC;yBAC1C,kCAAkC;6BAC9B,mBAAmB"}
1
+ {"version":3,"file":"AcousticSimulationSystem.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/sound/simulation/ecs/AcousticSimulationSystem.js"],"names":[],"mappings":"AAMA;;;;;;;;GAQG;AACH;IAwBI;;OAEG;IACH,0CASC;IApBD,6EAAqD;IAErD;;;OAGG;IACH,MAFU,MAAM,EAAE,CAER;IASN;;OAEG;IACH,6BAA0B;IAI9B;;;;;OAKG;IACH,WALW,YAAY,YACZ,QAAQ,aACR,WAAW,UACX,MAAM,QAahB;IAED;;;;;OAKG;IACH,aALW,YAAY,YACZ,QAAQ,aACR,WAAW,UACX,MAAM,QAgBhB;CACJ;uBA7FsB,wBAAwB;4BACnB,uCAAuC;yBAC1C,kCAAkC;6BAC9B,mBAAmB"}
@@ -2,7 +2,7 @@ import { System } from "../../../ecs/System.js";
2
2
  import { Transform64 } from "../../../ecs/transform/Transform64.js";
3
3
  import { Collider } from "../../../physics/ecs/Collider.js";
4
4
  import { AcousticBody } from "./AcousticBody.js";
5
- import { EventType } from "../../../ecs/EventType.js";
5
+ import { TRANSFORM64_EVENT_CHANGE } from "../../../ecs/transform/TRANSFORM64_EVENT_CHANGE.js";
6
6
 
7
7
  /**
8
8
  * Feeds {@link AcousticBody} occluders into the shared {@link AcousticSimulator}, reactively. On link it
@@ -25,7 +25,7 @@ export class AcousticSimulationSystem extends System {
25
25
  /**
26
26
  * @param {EntityManager} entityManager
27
27
  */
28
- startup(entityManager) {
28
+ async startup(entityManager) {
29
29
  this.entityManager = entityManager;
30
30
  }
31
31
 
@@ -63,17 +63,11 @@ export class AcousticSimulationSystem extends System {
63
63
 
64
64
  const onMove = () => this.simulator.setOccluderTransform(handle, transform.matrix);
65
65
 
66
- const on_transform_changed = event => {
67
- if (event.klass === Transform64) {
68
- onMove();
69
- }
70
- };
71
-
72
66
  this.entityManager.dataset.addEntityEventListener(
73
- entity, EventType.ComponentChanged, on_transform_changed
67
+ entity, TRANSFORM64_EVENT_CHANGE, onMove
74
68
  );
75
69
 
76
- this.data[entity] = { handle, transform, onMove, on_transform_changed };
70
+ this.data[entity] = { handle, transform, onMove };
77
71
  }
78
72
 
79
73
  /**
@@ -92,7 +86,7 @@ export class AcousticSimulationSystem extends System {
92
86
  delete this.data[entity];
93
87
 
94
88
  this.entityManager.dataset.removeEntityEventListener(
95
- entity, EventType.ComponentChanged, record.on_transform_changed
89
+ entity, TRANSFORM64_EVENT_CHANGE, record.onMove
96
90
  );
97
91
 
98
92
  this.simulator.removeOccluder(record.handle);