feat: material-aware sound occlusion + early reflections for localization
New Acoustics system (globals/acoustics.gd): - Occlusion: rays from listener to source collect up to 3 occluding bodies; each surface's material adds transmission loss and lowers the lowpass cutoff. A gunshot through wood stays warm (-8dB, 1.4kHz), brick muffles hard (-15dB, 600Hz), concrete harder (-18dB, 450Hz), metal keeps more highs (-11dB, 1kHz), glass barely muffles (-5dB, 2.6kHz). Applied via each AudioStreamPlayer3D's attenuation filter. - Early reflections: loud sounds (gunfire, explosions) probe 8 directions for nearby walls; each close surface plays a quiet, delayed (path/343ms), material-filtered copy from the mirror point — shots audibly slap back off structures so players can triangulate. Sub-30ms echoes are skipped (they perceptually merge with the direct sound). - Surface classification: builder-set acoustic_material meta -> node-name keywords -> metallic-material inference -> concrete default; cached. Integration: - AudioManager.play_3d applies occlusion at fire time and re-filters all playing positional sounds every 0.12s (walking behind a wall mid-sound audibly muffles it); flight loops opt in via "acoustic_occluded" group - Remote players' gunshots were entirely SILENT — rpc_play_fire_effects now plays the right weapon's shot at the shooter's position, occluded and reflected like everything else - Remote players' footsteps were also silent — now positional + occluded, cadence scaled to their speed - Test level tagged: brick arena walls, wooden platforms/obstacles, metal wall-run corridor/rails/dash platforms; dust2 sandstone reads as brick Tests: debug/acoustics_test.gd (12 checks: per-material loss ordering, multi-wall stacking, reflection delay/filter, name classification) — all pass; movement 11/11; smoke 0 failures. Co-Authored-By: Claude Fable 5 <[email protected]>
This commit is contained in:
co-authored by
Claude Fable 5
parent
44460b52ae
commit
a51595e3b9
@@ -72,6 +72,7 @@ func _setup_effects() -> void:
|
||||
flight_sound.max_db = 0.0
|
||||
flight_sound.max_distance = 45.0
|
||||
flight_sound.volume_db = -8.0
|
||||
flight_sound.add_to_group("acoustic_occluded") # muffles behind walls
|
||||
add_child(flight_sound)
|
||||
flight_sound.play()
|
||||
|
||||
|
||||
@@ -29,6 +29,7 @@ func _start_homing_effects() -> void:
|
||||
flight_sound.max_db = 0.0
|
||||
flight_sound.max_distance = 45.0
|
||||
flight_sound.volume_db = -10.0
|
||||
flight_sound.add_to_group("acoustic_occluded") # muffles behind walls
|
||||
add_child(flight_sound)
|
||||
flight_sound.play()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user