@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.
- package/README.md +8 -72
- package/editor/particles/effect/ParticleEffectDocument.d.ts +21 -6
- package/editor/particles/effect/ParticleEffectDocument.d.ts.map +1 -1
- package/editor/particles/effect/ParticleEffectDocument.js +38 -17
- package/editor/view/node-graph/NodeGraphClipboard.d.ts +186 -0
- package/editor/view/node-graph/NodeGraphClipboard.d.ts.map +1 -0
- package/editor/view/node-graph/NodeGraphClipboard.js +231 -0
- package/editor/view/node-graph/NodeGraphEditorView.d.ts +59 -1
- package/editor/view/node-graph/NodeGraphEditorView.d.ts.map +1 -1
- package/editor/view/node-graph/NodeGraphEditorView.js +248 -5
- package/editor/view/node-graph/NodeGraphView.d.ts.map +1 -1
- package/editor/view/node-graph/NodeGraphView.js +84 -8
- package/editor/view/node-graph/actions/connection_bind_actions.d.ts +23 -0
- package/editor/view/node-graph/actions/connection_bind_actions.d.ts.map +1 -0
- package/editor/view/node-graph/actions/connection_bind_actions.js +39 -0
- package/editor/view/particles/effect/ParticleCodeEditorView.d.ts.map +1 -1
- package/editor/view/particles/effect/ParticleCodeEditorView.js +4 -3
- package/editor/view/particles/effect/ParticleCurveEditorView.d.ts +20 -0
- package/editor/view/particles/effect/ParticleCurveEditorView.d.ts.map +1 -0
- package/editor/view/particles/effect/ParticleCurveEditorView.js +574 -0
- package/editor/view/particles/effect/ParticleEmitterInspectorView.d.ts.map +1 -1
- package/editor/view/particles/effect/ParticleEmitterInspectorView.js +27 -1
- package/editor/view/particles/effect/ParticleGradientEditorView.d.ts +24 -0
- package/editor/view/particles/effect/ParticleGradientEditorView.d.ts.map +1 -0
- package/editor/view/particles/effect/ParticleGradientEditorView.js +472 -0
- package/editor/view/particles/effect/ParticleGraphEditorView.d.ts +5 -0
- package/editor/view/particles/effect/ParticleGraphEditorView.d.ts.map +1 -1
- package/editor/view/particles/effect/ParticleGraphEditorView.js +61 -31
- package/editor/view/particles/effect/ParticleNodeParametersView.d.ts.map +1 -1
- package/editor/view/particles/effect/ParticleNodeParametersView.js +33 -0
- package/editor/view/particles/effect/particle-editor.css +123 -35
- package/package.json +1 -1
- package/src/core/binary/allocator/OffsetAllocator.d.ts +25 -16
- package/src/core/binary/allocator/OffsetAllocator.d.ts.map +1 -1
- package/src/core/binary/allocator/OffsetAllocator.js +10 -1
- package/src/core/collection/array/typed/float32_array_hash.d.ts +21 -0
- package/src/core/collection/array/typed/float32_array_hash.d.ts.map +1 -0
- package/src/core/collection/array/typed/float32_array_hash.js +38 -0
- package/src/core/graph/csr/CSRGraph.d.ts +8 -1
- package/src/core/graph/csr/CSRGraph.d.ts.map +1 -1
- package/src/core/graph/csr/CSRGraph.js +14 -6
- package/src/core/model/node-graph/visual/layout/LayoutProblem.d.ts +24 -0
- package/src/core/model/node-graph/visual/layout/LayoutProblem.d.ts.map +1 -1
- package/src/core/model/node-graph/visual/layout/LayoutProblem.js +27 -0
- package/src/core/model/node-graph/visual/layout/NodeGraphLayoutOptions.d.ts +26 -0
- package/src/core/model/node-graph/visual/layout/NodeGraphLayoutOptions.d.ts.map +1 -1
- package/src/core/model/node-graph/visual/layout/NodeGraphLayoutOptions.js +28 -0
- package/src/core/model/node-graph/visual/layout/RouteGrid.d.ts +92 -3
- package/src/core/model/node-graph/visual/layout/RouteGrid.d.ts.map +1 -1
- package/src/core/model/node-graph/visual/layout/RouteGrid.js +405 -242
- package/src/core/model/node-graph/visual/layout/RouteSearch.d.ts +50 -5
- package/src/core/model/node-graph/visual/layout/RouteSearch.d.ts.map +1 -1
- package/src/core/model/node-graph/visual/layout/RouteSearch.js +160 -24
- package/src/core/model/node-graph/visual/layout/RouteSet.d.ts +7 -0
- package/src/core/model/node-graph/visual/layout/RouteSet.d.ts.map +1 -1
- package/src/core/model/node-graph/visual/layout/RouteSet.js +8 -0
- package/src/core/model/node-graph/visual/layout/layout_assign_coordinates.js +9 -3
- package/src/core/model/node-graph/visual/layout/layout_build_problem.d.ts.map +1 -1
- package/src/core/model/node-graph/visual/layout/layout_build_problem.js +7 -0
- package/src/core/model/node-graph/visual/layout/layout_insert_lanes.d.ts +9 -3
- package/src/core/model/node-graph/visual/layout/layout_insert_lanes.d.ts.map +1 -1
- package/src/core/model/node-graph/visual/layout/layout_insert_lanes.js +17 -3
- package/src/core/model/node-graph/visual/layout/layout_node_graph.d.ts +9 -6
- package/src/core/model/node-graph/visual/layout/layout_node_graph.d.ts.map +1 -1
- package/src/core/model/node-graph/visual/layout/layout_node_graph.js +49 -7
- package/src/core/model/node-graph/visual/layout/layout_order_layers.d.ts +11 -1
- package/src/core/model/node-graph/visual/layout/layout_order_layers.d.ts.map +1 -1
- package/src/core/model/node-graph/visual/layout/layout_order_layers.js +135 -16
- package/src/core/model/node-graph/visual/layout/route_connections.d.ts +29 -0
- package/src/core/model/node-graph/visual/layout/route_connections.d.ts.map +1 -1
- package/src/core/model/node-graph/visual/layout/route_connections.js +716 -309
- package/src/core/model/node-graph/visual/layout/route_grid_build.d.ts +3 -2
- package/src/core/model/node-graph/visual/layout/route_grid_build.d.ts.map +1 -1
- package/src/core/model/node-graph/visual/layout/route_grid_build.js +7 -15
- package/src/core/model/node-graph/visual/layout/route_nudge.d.ts +6 -0
- package/src/core/model/node-graph/visual/layout/route_nudge.d.ts.map +1 -1
- package/src/core/model/node-graph/visual/layout/route_nudge.js +42 -13
- package/src/engine/animation/AnimationUtils.js +246 -246
- package/src/engine/animation/Animations.js +74 -74
- package/src/engine/control/first-person/FirstPersonPlayerControllerSystem.js +2078 -2078
- package/src/engine/ecs/EventType.d.ts +0 -1
- package/src/engine/ecs/EventType.js +1 -26
- package/src/engine/ecs/ik/ik_write_local_rotation.d.ts +1 -1
- package/src/engine/ecs/ik/ik_write_local_rotation.d.ts.map +1 -1
- package/src/engine/ecs/ik/ik_write_local_rotation.js +3 -7
- package/src/engine/ecs/parent/EntityNode.d.ts.map +1 -1
- package/src/engine/ecs/parent/EntityNode.js +4 -9
- package/src/engine/ecs/terrain/ecs/cling/ClingToTerrainSystem.d.ts.map +1 -1
- package/src/engine/ecs/terrain/ecs/cling/ClingToTerrainSystem.js +360 -364
- package/src/engine/ecs/transform/TRANSFORM64_EVENT_CHANGE.d.ts +41 -0
- package/src/engine/ecs/transform/TRANSFORM64_EVENT_CHANGE.d.ts.map +1 -0
- package/src/engine/ecs/transform/TRANSFORM64_EVENT_CHANGE.js +40 -0
- package/src/engine/ecs/transform/TRANSFORM64_MIGRATION_PLAN_2026_09_04.md +8 -0
- package/src/engine/ecs/transform/t64_announce_change.d.ts +10 -7
- package/src/engine/ecs/transform/t64_announce_change.d.ts.map +1 -1
- package/src/engine/ecs/transform/t64_announce_change.js +12 -12
- package/src/engine/ecs/transform/t64_set_rotation_axis_angle.d.ts +25 -0
- package/src/engine/ecs/transform/t64_set_rotation_axis_angle.d.ts.map +1 -0
- package/src/engine/ecs/transform/t64_set_rotation_axis_angle.js +45 -0
- package/src/engine/ecs/transform-attachment/TRANSFORM_ATTACHMENT_EVENT_CHANGE.d.ts +30 -0
- package/src/engine/ecs/transform-attachment/TRANSFORM_ATTACHMENT_EVENT_CHANGE.d.ts.map +1 -0
- package/src/engine/ecs/transform-attachment/TRANSFORM_ATTACHMENT_EVENT_CHANGE.js +29 -0
- package/src/engine/ecs/transform-attachment/TransformAttachmentSystem.d.ts.map +1 -1
- package/src/engine/ecs/transform-attachment/TransformAttachmentSystem.js +13 -21
- package/src/engine/graphics/ecs/sprite/SpriteSystemPE.d.ts.map +1 -1
- package/src/engine/graphics/ecs/sprite/SpriteSystemPE.js +4 -8
- package/src/engine/graphics3/LightSystem.d.ts.map +1 -1
- package/src/engine/graphics3/LightSystem.js +4 -8
- package/src/engine/graphics3/MeshSystem.d.ts.map +1 -1
- package/src/engine/graphics3/MeshSystem.js +9 -19
- package/src/engine/graphics3/ParticleEmitterSystem.d.ts.map +1 -1
- package/src/engine/graphics3/ParticleEmitterSystem.js +4 -8
- package/src/engine/graphics3/ShadedGeometrySystem.d.ts.map +1 -1
- package/src/engine/graphics3/ShadedGeometrySystem.js +4 -10
- package/src/engine/grid/transform2grid/Transform2GridPositionSystem.d.ts +1 -1
- package/src/engine/grid/transform2grid/Transform2GridPositionSystem.d.ts.map +1 -1
- package/src/engine/grid/transform2grid/Transform2GridPositionSystem.js +4 -8
- package/src/engine/intelligence/behavior/ecs/OrbitingBehavior.js +218 -218
- package/src/engine/physics/ecs/PhysicsSystem.d.ts.map +1 -1
- package/src/engine/physics/ecs/PhysicsSystem.js +2 -5
- package/src/engine/sound/ecs/SoundListenerSystem.d.ts.map +1 -1
- package/src/engine/sound/ecs/SoundListenerSystem.js +6 -8
- package/src/engine/sound/simulation/AcousticSimulator.d.ts +11 -8
- package/src/engine/sound/simulation/AcousticSimulator.d.ts.map +1 -1
- package/src/engine/sound/simulation/AcousticSimulator.js +45 -36
- package/src/engine/sound/simulation/README.md +2 -2
- package/src/engine/sound/simulation/core/OcclusionSolver.d.ts.map +1 -1
- package/src/engine/sound/simulation/core/VolumeField.d.ts +9 -9
- package/src/engine/sound/simulation/core/VolumeField.d.ts.map +1 -1
- package/src/engine/sound/simulation/core/VolumeField.js +29 -13
- package/src/engine/sound/simulation/core/acoustic_occlusion_solve.d.ts +31 -0
- package/src/engine/sound/simulation/core/acoustic_occlusion_solve.d.ts.map +1 -0
- package/src/engine/sound/simulation/core/acoustic_occlusion_solve.js +134 -0
- package/src/engine/sound/simulation/ecs/AcousticSimulationSystem.d.ts +0 -4
- package/src/engine/sound/simulation/ecs/AcousticSimulationSystem.d.ts.map +1 -1
- package/src/engine/sound/simulation/ecs/AcousticSimulationSystem.js +5 -11
- package/src/shade/playground/particle_editor/README.md +43 -2
- package/src/shade/playground/particle_system/particle_prototype.d.ts.map +1 -1
- package/src/shade/playground/particle_system/particle_prototype.js +4 -5
- package/src/shade/playground/particle_system/particle_scene.js +4 -4
- package/src/shade/playground/volumetrics_froxel/main.d.ts.map +1 -1
- package/src/shade/playground/volumetrics_froxel/main.js +6 -1
- package/src/shade/renderer/Renderer.d.ts.map +1 -1
- package/src/shade/renderer/Renderer.js +13 -1
- package/src/shade/renderer/particles/DESIGN.md +104 -19
- package/src/shade/renderer/particles/GPUParticleSystem.d.ts +64 -50
- package/src/shade/renderer/particles/GPUParticleSystem.d.ts.map +1 -1
- package/src/shade/renderer/particles/GPUParticleSystem.js +176 -78
- package/src/shade/renderer/particles/ParticleConstants.d.ts +59 -23
- package/src/shade/renderer/particles/ParticleConstants.d.ts.map +1 -1
- package/src/shade/renderer/particles/ParticleConstants.js +66 -23
- package/src/shade/renderer/particles/ParticleRenderMode.d.ts +19 -0
- package/src/shade/renderer/particles/ParticleRenderMode.d.ts.map +1 -0
- package/src/shade/renderer/particles/ParticleRenderMode.js +33 -0
- package/src/shade/renderer/particles/data/PARTICLE_EMITTER_STRUCT.d.ts.map +1 -1
- package/src/shade/renderer/particles/data/PARTICLE_EMITTER_STRUCT.js +167 -166
- package/src/shade/renderer/particles/data/particle_emitter_record.d.ts +37 -0
- package/src/shade/renderer/particles/data/particle_emitter_record.d.ts.map +1 -0
- package/src/shade/renderer/particles/data/particle_emitter_record.js +109 -0
- package/src/shade/renderer/particles/graph/ParticleGroupBuilder.d.ts +3 -3
- package/src/shade/renderer/particles/graph/ParticleGroupBuilder.js +303 -303
- package/src/shade/renderer/particles/graph/ParticleNodeDescription.d.ts +18 -0
- package/src/shade/renderer/particles/graph/ParticleNodeDescription.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph/ParticleNodeDescription.js +152 -133
- package/src/shade/renderer/particles/graph/ParticleNodeRegistry.d.ts +0 -11
- package/src/shade/renderer/particles/graph/ParticleNodeRegistry.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph/ParticleNodeRegistry.js +720 -621
- package/src/shade/renderer/particles/graph/compile_particle_graph.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph/compile_particle_graph.js +8 -3
- package/src/shade/renderer/particles/graph/flatten_particle_graph.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph/flatten_particle_graph.js +244 -213
- package/src/shade/renderer/particles/graph/groups/particle_builtin_groups.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph/groups/particle_builtin_groups.js +6 -0
- package/src/shade/renderer/particles/graph/groups/particle_groups_geometry.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph/groups/particle_groups_geometry.js +294 -319
- package/src/shade/renderer/particles/graph/groups/particle_groups_noise.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph/groups/particle_groups_noise.js +524 -517
- package/src/shade/renderer/particles/graph/groups/particle_groups_psrdnoise.d.ts +22 -0
- package/src/shade/renderer/particles/graph/groups/particle_groups_psrdnoise.d.ts.map +1 -0
- package/src/shade/renderer/particles/graph/groups/particle_groups_psrdnoise.js +517 -0
- package/src/shade/renderer/particles/graph/groups/simplex_reference.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph/groups/simplex_reference.js +185 -159
- package/src/shade/renderer/particles/graph/make_particle_group.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph/make_particle_group.js +2 -20
- package/src/shade/renderer/particles/graph/particle_compare_ops.d.ts +17 -0
- package/src/shade/renderer/particles/graph/particle_compare_ops.d.ts.map +1 -0
- package/src/shade/renderer/particles/graph/particle_compare_ops.js +22 -0
- package/src/shade/renderer/particles/graph/particle_graph_diagnostic.d.ts +28 -8
- package/src/shade/renderer/particles/graph/particle_graph_diagnostic.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph/particle_graph_diagnostic.js +49 -25
- package/src/shade/renderer/particles/graph/particle_node_parameters.d.ts +40 -0
- package/src/shade/renderer/particles/graph/particle_node_parameters.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph/particle_node_parameters.js +312 -234
- package/src/shade/renderer/particles/graph/particle_node_presentation.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph/particle_node_presentation.js +59 -3
- package/src/shade/renderer/particles/graph/particle_ramp.d.ts +230 -0
- package/src/shade/renderer/particles/graph/particle_ramp.d.ts.map +1 -0
- package/src/shade/renderer/particles/graph/particle_ramp.js +403 -0
- package/src/shade/renderer/particles/graph/validate_particle_graph.d.ts +7 -1
- package/src/shade/renderer/particles/graph/validate_particle_graph.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph/validate_particle_graph.js +66 -10
- package/src/shade/renderer/particles/graph_particles.d.ts +23 -69
- package/src/shade/renderer/particles/graph_particles.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph_particles.js +105 -262
- package/src/shade/renderer/particles/graph_particles_avboit.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph_particles_avboit.js +3 -2
- package/src/shade/renderer/particles/graph_particles_billboard.d.ts +37 -0
- package/src/shade/renderer/particles/graph_particles_billboard.d.ts.map +1 -0
- package/src/shade/renderer/particles/graph_particles_billboard.js +93 -0
- package/src/shade/renderer/particles/isa/InstructionStream.d.ts +51 -22
- package/src/shade/renderer/particles/isa/InstructionStream.d.ts.map +1 -1
- package/src/shade/renderer/particles/isa/InstructionStream.js +98 -38
- package/src/shade/renderer/particles/isa/ParticleProgram.d.ts +49 -8
- package/src/shade/renderer/particles/isa/ParticleProgram.d.ts.map +1 -1
- package/src/shade/renderer/particles/isa/ParticleProgram.js +95 -150
- package/src/shade/renderer/particles/isa/ParticleVMISA.d.ts +306 -64
- package/src/shade/renderer/particles/isa/ParticleVMISA.d.ts.map +1 -1
- package/src/shade/renderer/particles/isa/ParticleVMISA.js +505 -136
- package/src/shade/renderer/particles/isa/particle_assembly.d.ts +36 -12
- package/src/shade/renderer/particles/isa/particle_assembly.d.ts.map +1 -1
- package/src/shade/renderer/particles/isa/particle_assembly.js +354 -139
- package/src/shade/renderer/particles/isa/validate_particle_program.d.ts +9 -0
- package/src/shade/renderer/particles/isa/validate_particle_program.d.ts.map +1 -0
- package/src/shade/renderer/particles/isa/validate_particle_program.js +128 -0
- package/src/shade/renderer/particles/layout/ParticleLayout.d.ts +23 -0
- package/src/shade/renderer/particles/layout/ParticleLayout.d.ts.map +1 -1
- package/src/shade/renderer/particles/layout/ParticleLayout.js +68 -0
- package/src/shade/renderer/particles/optimizer/dag/optimize_particle_program_vector.d.ts +77 -0
- package/src/shade/renderer/particles/optimizer/dag/optimize_particle_program_vector.d.ts.map +1 -0
- package/src/shade/renderer/particles/optimizer/dag/optimize_particle_program_vector.js +219 -0
- package/src/shade/renderer/particles/optimizer/dag/particle_vector_extract.d.ts +83 -0
- package/src/shade/renderer/particles/optimizer/dag/particle_vector_extract.d.ts.map +1 -0
- package/src/shade/renderer/particles/optimizer/dag/particle_vector_extract.js +283 -0
- package/src/shade/renderer/particles/optimizer/dag/particle_vector_graph.d.ts +133 -0
- package/src/shade/renderer/particles/optimizer/dag/particle_vector_graph.d.ts.map +1 -0
- package/src/shade/renderer/particles/optimizer/dag/particle_vector_graph.js +334 -0
- package/src/shade/renderer/particles/optimizer/dag/particle_vector_groups.d.ts +117 -0
- package/src/shade/renderer/particles/optimizer/dag/particle_vector_groups.d.ts.map +1 -0
- package/src/shade/renderer/particles/optimizer/dag/particle_vector_groups.js +70 -0
- package/src/shade/renderer/particles/optimizer/dag/particle_vector_lift.d.ts +97 -0
- package/src/shade/renderer/particles/optimizer/dag/particle_vector_lift.d.ts.map +1 -0
- package/src/shade/renderer/particles/optimizer/dag/particle_vector_lift.js +462 -0
- package/src/shade/renderer/particles/optimizer/dag/particle_vector_lower.d.ts +116 -0
- package/src/shade/renderer/particles/optimizer/dag/particle_vector_lower.d.ts.map +1 -0
- package/src/shade/renderer/particles/optimizer/dag/particle_vector_lower.js +687 -0
- package/src/shade/renderer/particles/optimizer/dag/particle_vector_pack.d.ts +57 -0
- package/src/shade/renderer/particles/optimizer/dag/particle_vector_pack.d.ts.map +1 -0
- package/src/shade/renderer/particles/optimizer/dag/particle_vector_pack.js +860 -0
- package/src/shade/renderer/particles/optimizer/dag/particle_vector_rules.d.ts +115 -0
- package/src/shade/renderer/particles/optimizer/dag/particle_vector_rules.d.ts.map +1 -0
- package/src/shade/renderer/particles/optimizer/dag/particle_vector_rules.js +264 -0
- package/src/shade/renderer/particles/optimizer/optimize_particle_program.d.ts +81 -42
- package/src/shade/renderer/particles/optimizer/optimize_particle_program.d.ts.map +1 -1
- package/src/shade/renderer/particles/optimizer/optimize_particle_program.js +477 -478
- package/src/shade/renderer/particles/optimizer/particle_integer_bounds.d.ts +100 -0
- package/src/shade/renderer/particles/optimizer/particle_integer_bounds.d.ts.map +1 -0
- package/src/shade/renderer/particles/optimizer/particle_integer_bounds.js +236 -0
- package/src/shade/renderer/particles/optimizer/particle_program_analysis.d.ts +139 -59
- package/src/shade/renderer/particles/optimizer/particle_program_analysis.d.ts.map +1 -1
- package/src/shade/renderer/particles/optimizer/particle_program_analysis.js +764 -647
- package/src/shade/renderer/particles/optimizer/particle_program_equivalence.d.ts +40 -7
- package/src/shade/renderer/particles/optimizer/particle_program_equivalence.d.ts.map +1 -1
- package/src/shade/renderer/particles/optimizer/particle_program_equivalence.js +376 -213
- package/src/shade/renderer/particles/optimizer/particle_program_fuzz.d.ts +30 -3
- package/src/shade/renderer/particles/optimizer/particle_program_fuzz.d.ts.map +1 -1
- package/src/shade/renderer/particles/optimizer/particle_program_fuzz.js +337 -223
- package/src/shade/renderer/particles/optimizer/particle_vm_semantics.d.ts +24 -38
- package/src/shade/renderer/particles/optimizer/particle_vm_semantics.d.ts.map +1 -1
- package/src/shade/renderer/particles/optimizer/particle_vm_semantics.js +166 -206
- package/src/shade/renderer/particles/optimizer/pass_allocate_registers.d.ts +99 -0
- package/src/shade/renderer/particles/optimizer/pass_allocate_registers.d.ts.map +1 -0
- package/src/shade/renderer/particles/optimizer/pass_allocate_registers.js +313 -0
- package/src/shade/renderer/particles/optimizer/pass_dedup_constants.d.ts +3 -2
- package/src/shade/renderer/particles/optimizer/pass_dedup_constants.d.ts.map +1 -1
- package/src/shade/renderer/particles/optimizer/pass_dedup_constants.js +198 -197
- package/src/shade/renderer/particles/optimizer/pass_eliminate_dead_code.d.ts.map +1 -1
- package/src/shade/renderer/particles/optimizer/pass_fold_constants.d.ts +19 -0
- package/src/shade/renderer/particles/optimizer/pass_fold_constants.d.ts.map +1 -1
- package/src/shade/renderer/particles/optimizer/pass_fold_constants.js +678 -561
- package/src/shade/renderer/particles/optimizer/pass_inline_constants.d.ts +22 -0
- package/src/shade/renderer/particles/optimizer/pass_inline_constants.d.ts.map +1 -0
- package/src/shade/renderer/particles/optimizer/pass_inline_constants.js +221 -0
- package/src/shade/renderer/particles/optimizer/pass_narrow_widths.d.ts.map +1 -1
- package/src/shade/renderer/particles/optimizer/pass_narrow_widths.js +63 -72
- package/src/shade/renderer/particles/optimizer/pass_pack_registers.d.ts.map +1 -1
- package/src/shade/renderer/particles/optimizer/pass_pack_registers.js +87 -86
- package/src/shade/renderer/particles/optimizer/pass_peephole.d.ts.map +1 -1
- package/src/shade/renderer/particles/optimizer/pass_peephole.js +392 -271
- package/src/shade/renderer/particles/optimizer/pass_propagate_copies.d.ts.map +1 -1
- package/src/shade/renderer/particles/optimizer/pass_propagate_copies.js +361 -268
- package/src/shade/renderer/particles/optimizer/pass_schedule.d.ts +4 -0
- package/src/shade/renderer/particles/optimizer/pass_schedule.d.ts.map +1 -0
- package/src/shade/renderer/particles/optimizer/pass_schedule.js +244 -0
- package/src/shade/renderer/particles/optimizer/pass_share_subexpressions.d.ts.map +1 -1
- package/src/shade/renderer/particles/optimizer/pass_share_subexpressions.js +154 -151
- package/src/shade/renderer/particles/particle_test_fixtures.d.ts +20 -0
- package/src/shade/renderer/particles/particle_test_fixtures.d.ts.map +1 -1
- package/src/shade/renderer/particles/particle_test_fixtures.js +229 -203
- package/src/shade/renderer/particles/runtime/EmitterRegistry.d.ts +99 -25
- package/src/shade/renderer/particles/runtime/EmitterRegistry.d.ts.map +1 -1
- package/src/shade/renderer/particles/runtime/EmitterRegistry.js +438 -286
- package/src/shade/renderer/particles/runtime/GPUParticleEmitterContext.d.ts +109 -0
- package/src/shade/renderer/particles/runtime/GPUParticleEmitterContext.d.ts.map +1 -0
- package/src/shade/renderer/particles/runtime/GPUParticleEmitterContext.js +127 -0
- package/src/shade/renderer/particles/runtime/ParticleEmitter.d.ts +87 -102
- package/src/shade/renderer/particles/runtime/ParticleEmitter.d.ts.map +1 -1
- package/src/shade/renderer/particles/runtime/ParticleEmitter.js +184 -163
- package/src/shade/renderer/particles/runtime/ProgramHeap.d.ts +130 -0
- package/src/shade/renderer/particles/runtime/ProgramHeap.d.ts.map +1 -0
- package/src/shade/renderer/particles/runtime/ProgramHeap.js +595 -0
- package/src/shade/renderer/particles/runtime/ProgramPlacement.d.ts +91 -0
- package/src/shade/renderer/particles/runtime/ProgramPlacement.d.ts.map +1 -0
- package/src/shade/renderer/particles/runtime/ProgramPlacement.js +106 -0
- package/src/shade/renderer/particles/runtime/create_particle_effect.d.ts +5 -2
- package/src/shade/renderer/particles/runtime/create_particle_effect.d.ts.map +1 -1
- package/src/shade/renderer/particles/runtime/create_particle_effect.js +22 -19
- package/src/shade/renderer/particles/shaders/chunk_particle_emit_step.d.ts +28 -0
- package/src/shade/renderer/particles/shaders/chunk_particle_emit_step.d.ts.map +1 -0
- package/src/shade/renderer/particles/shaders/chunk_particle_emit_step.js +136 -0
- package/src/shade/renderer/particles/shaders/chunk_particle_simulate_step.d.ts +35 -0
- package/src/shade/renderer/particles/shaders/chunk_particle_simulate_step.d.ts.map +1 -0
- package/src/shade/renderer/particles/shaders/chunk_particle_simulate_step.js +133 -0
- package/src/shade/renderer/particles/shaders/shader_particle_emit.d.ts +18 -9
- package/src/shade/renderer/particles/shaders/shader_particle_emit.d.ts.map +1 -1
- package/src/shade/renderer/particles/shaders/shader_particle_emit.js +20 -80
- package/src/shade/renderer/particles/shaders/shader_particle_emit_wide.d.ts +33 -0
- package/src/shade/renderer/particles/shaders/shader_particle_emit_wide.d.ts.map +1 -0
- package/src/shade/renderer/particles/shaders/shader_particle_emit_wide.js +114 -0
- package/src/shade/renderer/particles/shaders/shader_particle_simulate.d.ts +8 -0
- package/src/shade/renderer/particles/shaders/shader_particle_simulate.d.ts.map +1 -1
- package/src/shade/renderer/particles/shaders/shader_particle_simulate.js +33 -101
- package/src/shade/renderer/particles/shaders/shader_particle_simulate_wide.d.ts +45 -0
- package/src/shade/renderer/particles/shaders/shader_particle_simulate_wide.d.ts.map +1 -0
- package/src/shade/renderer/particles/shaders/shader_particle_simulate_wide.js +123 -0
- package/src/shade/renderer/particles/sort/graph_particle_sort.d.ts +51 -0
- package/src/shade/renderer/particles/sort/graph_particle_sort.d.ts.map +1 -0
- package/src/shade/renderer/particles/sort/graph_particle_sort.js +120 -0
- package/src/shade/renderer/particles/vm/PARTICLE_VM_CONTEXT_STRUCT.d.ts +6 -0
- package/src/shade/renderer/particles/vm/PARTICLE_VM_CONTEXT_STRUCT.d.ts.map +1 -0
- package/src/shade/renderer/particles/vm/PARTICLE_VM_CONTEXT_STRUCT.js +16 -0
- package/src/shade/renderer/particles/vm/ParticleVMReference.d.ts +4 -1
- package/src/shade/renderer/particles/vm/ParticleVMReference.d.ts.map +1 -1
- package/src/shade/renderer/particles/vm/ParticleVMReference.js +261 -140
- package/src/shade/renderer/particles/vm/chunk_particle_vm.d.ts.map +1 -1
- package/src/shade/renderer/particles/vm/chunk_particle_vm.js +217 -255
- package/src/shade/renderer/particles/vm/chunk_particle_vm_registers_fast.d.ts +43 -0
- package/src/shade/renderer/particles/vm/chunk_particle_vm_registers_fast.d.ts.map +1 -0
- package/src/shade/renderer/particles/vm/chunk_particle_vm_registers_fast.js +55 -0
- package/src/shade/renderer/particles/vm/chunk_particle_vm_registers_wide.d.ts +62 -0
- package/src/shade/renderer/particles/vm/chunk_particle_vm_registers_wide.d.ts.map +1 -0
- package/src/shade/renderer/particles/vm/chunk_particle_vm_registers_wide.js +86 -0
- package/src/shade/renderer/shader/chunk/math/chunk_mod_v3f.d.ts +22 -0
- package/src/shade/renderer/shader/chunk/math/chunk_mod_v3f.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/math/chunk_mod_v3f.js +32 -0
- package/src/shade/renderer/shader/chunk/math/chunk_mod_v4f.d.ts +9 -0
- package/src/shade/renderer/shader/chunk/math/chunk_mod_v4f.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/math/chunk_mod_v4f.js +19 -0
- package/src/shade/renderer/shader/chunk/noise/psrdnoise/README.md +65 -0
- package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise2.d.ts +24 -0
- package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise2.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise2.js +83 -0
- package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise2_hash.d.ts +25 -0
- package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise2_hash.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise2_hash.js +42 -0
- package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise2_kernel.d.ts +31 -0
- package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise2_kernel.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise2_kernel.js +80 -0
- package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise3.d.ts +26 -0
- package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise3.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise3.js +109 -0
- package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise3_kernel.d.ts +38 -0
- package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise3_kernel.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise3_kernel.js +129 -0
- package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise3_permute.d.ts +21 -0
- package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise3_permute.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise3_permute.js +35 -0
- package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise3_skew.d.ts +19 -0
- package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise3_skew.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise3_skew.js +28 -0
- package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise3_unskew.d.ts +13 -0
- package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise3_unskew.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise3_unskew.js +22 -0
- package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_srdnoise2.d.ts +22 -0
- package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_srdnoise2.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_srdnoise2.js +59 -0
- package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_srdnoise3.d.ts +23 -0
- package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_srdnoise3.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_srdnoise3.js +74 -0
- package/src/shade/renderer/volumetrics/ParticipatingMediaVolume.d.ts +7 -0
- package/src/shade/renderer/volumetrics/ParticipatingMediaVolume.d.ts.map +1 -1
- package/src/shade/renderer/volumetrics/ParticipatingMediaVolume.js +7 -0
- package/src/shade/wgsl/emulator/ComputeShaderEmulator.d.ts +34 -1
- package/src/shade/wgsl/emulator/ComputeShaderEmulator.d.ts.map +1 -1
- package/src/shade/wgsl/emulator/ComputeShaderEmulator.js +41 -1
- package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.d.ts +3 -2
- package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.d.ts.map +1 -1
- package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.js +49 -10
- package/src/view/minimap/dom/MinimapCameraView.d.ts.map +1 -1
- package/src/view/minimap/dom/MinimapCameraView.js +4 -9
- package/src/core/model/node-graph/visual/layout/BoxLayoutSpec.d.ts +0 -15
- package/src/core/model/node-graph/visual/layout/BoxLayoutSpec.d.ts.map +0 -1
- package/src/core/model/node-graph/visual/layout/ConnectedBoxLayouter.d.ts +0 -45
- package/src/core/model/node-graph/visual/layout/ConnectedBoxLayouter.d.ts.map +0 -1
- package/src/core/model/node-graph/visual/layout/ConnectionEndpointLayoutSpec.d.ts +0 -24
- package/src/core/model/node-graph/visual/layout/ConnectionEndpointLayoutSpec.d.ts.map +0 -1
- package/src/core/model/node-graph/visual/layout/ConnectionLayoutSpec.d.ts +0 -19
- package/src/core/model/node-graph/visual/layout/ConnectionLayoutSpec.d.ts.map +0 -1
- package/src/engine/ecs/transform/__probe.d.ts +0 -4
- package/src/engine/ecs/transform/__probe.d.ts.map +0 -1
- package/src/engine/ecs/util/hideEntityGracefully.d.ts +0 -9
- package/src/engine/ecs/util/hideEntityGracefully.d.ts.map +0 -1
- package/src/engine/sound/simulation/core/OcclusionSolver.js +0 -112
- package/src/shade/renderer/buffer/table/gpu_database_emulator_image.d.ts +0 -27
- package/src/shade/renderer/buffer/table/gpu_database_emulator_image.d.ts.map +0 -1
- package/src/shade/renderer/particles/cull/chunk_particle_cull.d.ts +0 -14
- package/src/shade/renderer/particles/cull/chunk_particle_cull.d.ts.map +0 -1
- package/src/shade/renderer/particles/data/PARTICLE_EMITTER_LAYOUT.d.ts +0 -156
- package/src/shade/renderer/particles/data/PARTICLE_EMITTER_LAYOUT.d.ts.map +0 -1
- package/src/shade/renderer/particles/runtime/Emitter.d.ts +0 -219
- package/src/shade/renderer/particles/runtime/Emitter.d.ts.map +0 -1
- package/src/shade/renderer/particles/runtime/ParticleSpawnScheduler.d.ts +0 -77
- package/src/shade/renderer/particles/runtime/ParticleSpawnScheduler.d.ts.map +0 -1
- package/src/shade/renderer/particles/runtime/ProgramArena.d.ts +0 -89
- package/src/shade/renderer/particles/runtime/ProgramArena.d.ts.map +0 -1
- package/src/shade/renderer/particles/runtime/ProgramArena.js +0 -155
- package/src/shade/renderer/particles/runtime/emitter_database_image.d.ts +0 -15
- package/src/shade/renderer/particles/runtime/emitter_database_image.d.ts.map +0 -1
- package/src/shade/renderer/particles/runtime/spawn_request_encoding.d.ts +0 -34
- package/src/shade/renderer/particles/runtime/spawn_request_encoding.d.ts.map +0 -1
- package/src/shade/renderer/particles/shaders/chunk_particle_context.d.ts +0 -32
- 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":"
|
|
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 {
|
|
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 {
|
|
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
|
-
*
|
|
278
|
-
*
|
|
279
|
-
* @
|
|
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,
|
|
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
|
|
291
|
-
listener
|
|
292
|
+
source[0], source[1], source[2],
|
|
293
|
+
listener[0], listener[1], listener[2],
|
|
292
294
|
out.airLoss
|
|
293
295
|
);
|
|
294
296
|
|
|
295
|
-
|
|
296
|
-
listener, source,
|
|
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[]}
|
|
307
|
-
* @param {
|
|
308
|
+
* @param {EventInstance[]} live_instances bounded set (≤ voice budget)
|
|
309
|
+
* @param {number[]|Float32Array|Float64Array} listener listener world position, 3 elements
|
|
308
310
|
*/
|
|
309
|
-
apply(
|
|
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
|
|
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 <
|
|
342
|
-
const instance =
|
|
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 {
|
|
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
|
-
|
|
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,
|
|
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(
|
|
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,
|
|
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(
|
|
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 -
|
|
497
|
-
pathGain *= this.#turnGain(listenerProbe, lpx - lhx, lpy - lhy, lpz - lhz,
|
|
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
|
-
|
|
603
|
-
let
|
|
604
|
-
let
|
|
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 {
|
|
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
|
|
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
|
-
|
|
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, `
|
|
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":"
|
|
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 `(
|
|
36
|
-
* `(
|
|
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}
|
|
48
|
-
* @param {number}
|
|
49
|
-
* @param {number}
|
|
50
|
-
* @param {number}
|
|
51
|
-
* @param {number}
|
|
52
|
-
* @param {number}
|
|
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,
|
|
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":"
|
|
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 `(
|
|
88
|
-
* `(
|
|
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}
|
|
100
|
-
* @param {number}
|
|
101
|
-
* @param {number}
|
|
102
|
-
* @param {number}
|
|
103
|
-
* @param {number}
|
|
104
|
-
* @param {number}
|
|
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(
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
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,
|
|
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;
|
|
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 {
|
|
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,
|
|
67
|
+
entity, TRANSFORM64_EVENT_CHANGE, onMove
|
|
74
68
|
);
|
|
75
69
|
|
|
76
|
-
this.data[entity] = { handle, transform, onMove
|
|
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,
|
|
89
|
+
entity, TRANSFORM64_EVENT_CHANGE, record.onMove
|
|
96
90
|
);
|
|
97
91
|
|
|
98
92
|
this.simulator.removeOccluder(record.handle);
|