Added a dampening (lowpass) spatial audio effect for obstacles between the player and the audio source

This commit is contained in:
ChaoticByte 2024-10-06 00:43:05 +02:00
parent e147517ad2
commit 47c8576f66
No known key found for this signature in database
3 changed files with 58 additions and 12 deletions

View file

@ -1,7 +1,13 @@
class_name SpatialAudioStreamPlayer2D class_name SpatialAudioStreamPlayer2D
extends AudioStreamPlayer2D extends AudioStreamPlayer2D
# DETERMINE REVERB AMOUNT # EXPORTED VARS
@export var lowpass_cutoff_mult: float = 1000
@export var lowpass_cutoff_min: float = 100
@export var dampening_distance_divisor_mult: float = 500
# DETERMINE REVERB EFFECT PARAMETERS
const RAYCAST_VECS: Array[Vector2] = [ const RAYCAST_VECS: Array[Vector2] = [
Vector2(-1, 0), # 0 - left Vector2(-1, 0), # 0 - left
@ -43,10 +49,10 @@ const REVERB_PAIRS = [
[5, 7, REVERB_MULT_90DEG] [5, 7, REVERB_MULT_90DEG]
] ]
const REVERB_PAIRS_SUM_DIVISOR = 2500.0 # i dunno const REVERB_PAIRS_SUM_DIVISOR = 2500.0 # i dunno
var raycasts: Array[RayCast2D] = [] var raycasts: Array[RayCast2D] = []
func create_raycasts(): func create_raycasts():
# raycasts used for reverb
for v in RAYCAST_VECS: for v in RAYCAST_VECS:
var r = RayCast2D.new() var r = RayCast2D.new()
r.target_position = v.normalized() * max_distance r.target_position = v.normalized() * max_distance
@ -78,18 +84,53 @@ func determine_reverb_params() -> Array[float]:
var wetness = n_coll / 8.0 var wetness = n_coll / 8.0
return [room_size, wetness] return [room_size, wetness]
# DETERMINE DAMPENING (LOWPASS) EFFECT PARAMETERS
const N_POINTCASTS_TO_PLAYER: int = 25
const POINTCAST_TO_PLAYER_COLL_MASK: int = 0b00000000_00000000_00000000_00000001
const LOWPASS_CUTOFF_MAX: float = 20000
func determine_distance_amount_blocked() -> float:
# returns how many points (in relation to the amount of points)
# between this and the player are intersecting
# and therefore an obstacle for the sound
var position_player = NodeRegistry.player.global_position
var distance_to_player = self.global_position.distance_to(position_player)
# get n collisions
var n_coll: int = 0
# cast points towards player
var space_state = get_world_2d().direct_space_state
for i in range(N_POINTCASTS_TO_PLAYER):
# linear interpolate between own position and player position
var point_pos = lerp(self.global_position, position_player, i/float(N_POINTCASTS_TO_PLAYER))
var query_params = PhysicsPointQueryParameters2D.new()
query_params.collision_mask = POINTCAST_TO_PLAYER_COLL_MASK
query_params.position = point_pos
var result = space_state.intersect_point(query_params)
if len(result) > 0:
n_coll += 1
return (n_coll*distance_to_player) / (float(N_POINTCASTS_TO_PLAYER)*dampening_distance_divisor_mult)
# AUDIO EFFECTS # AUDIO EFFECTS
var audio_effect_reverb = AudioEffectReverb.new() var audio_effect_reverb = AudioEffectReverb.new()
var audio_effect_dampen = AudioEffectLowPassFilter.new()
func update_reverb(room_size: float, wetness: float): func update_reverb(room_size: float, wetness: float):
audio_effect_reverb.room_size = room_size audio_effect_reverb.room_size = room_size
audio_effect_reverb.wet = wetness audio_effect_reverb.wet = wetness
func update_dampening(distance_blocked: float):
audio_effect_dampen.cutoff_hz = clamp(
lowpass_cutoff_mult / max(0.001, distance_blocked),
lowpass_cutoff_min, LOWPASS_CUTOFF_MAX
)
# AUDIO BUS # AUDIO BUS
const BUS_NAME_PREFIX = "Spatial2DBus#" const BUS_NAME_PREFIX = "Spatial2DBus#"
const BUS_EFFECT_POS_REVERB = 0 const BUS_EFFECT_POS_REVERB = 0
const BUS_EFFECT_POS_LOWPASS = 1
var bus_idx: int = -1 var bus_idx: int = -1
var bus_name: String = "" var bus_name: String = ""
@ -107,6 +148,8 @@ func create_audio_bus_effects():
return return
# reverb # reverb
AudioServer.add_bus_effect(bus_idx, audio_effect_reverb, BUS_EFFECT_POS_REVERB) AudioServer.add_bus_effect(bus_idx, audio_effect_reverb, BUS_EFFECT_POS_REVERB)
# dampeing (lowpass)
AudioServer.add_bus_effect(bus_idx, audio_effect_dampen, BUS_EFFECT_POS_LOWPASS)
# #
@ -117,4 +160,6 @@ func _ready() -> void:
func _physics_process(_delta: float) -> void: func _physics_process(_delta: float) -> void:
var reverb_params = determine_reverb_params() var reverb_params = determine_reverb_params()
var blocked_amount = determine_distance_amount_blocked()
update_reverb(reverb_params[0], reverb_params[1]) update_reverb(reverb_params[0], reverb_params[1])
update_dampening(blocked_amount)

View file

@ -1,7 +1,9 @@
[gd_scene load_steps=3 format=3 uid="uid://c6w7lrydi43ts"] [gd_scene load_steps=5 format=3 uid="uid://c6w7lrydi43ts"]
[ext_resource type="PackedScene" uid="uid://cbynoofsjcl45" path="res://core/polygon/polygon.tscn" id="1_cup10"] [ext_resource type="PackedScene" uid="uid://cbynoofsjcl45" path="res://core/polygon/polygon.tscn" id="1_cup10"]
[ext_resource type="Script" path="res://levels/intro.gd" id="1_pgj82"] [ext_resource type="Script" path="res://levels/intro.gd" id="1_pgj82"]
[ext_resource type="Script" path="res://core/audio/spatial_audio_player.gd" id="3_3eqhh"]
[ext_resource type="AudioStream" uid="uid://cs6l2t3jtags8" path="res://assets/sounds/clock-tick-76039.mp3" id="3_6yss2"]
[node name="Intro" type="Node2D"] [node name="Intro" type="Node2D"]
script = ExtResource("1_pgj82") script = ExtResource("1_pgj82")
@ -30,5 +32,12 @@ color = Color(1, 0.1, 0, 1)
polygon = PackedVector2Array(416, 400, 416, 424, 440, 424, 440, 400) polygon = PackedVector2Array(416, 400, 416, 424, 440, 424, 440, 400)
color = Color(0.484431, 0.687354, 1, 1) color = Color(0.484431, 0.687354, 1, 1)
[node name="SpatialAudioStreamPlayer2D" type="AudioStreamPlayer2D" parent="."]
position = Vector2(768, 328)
stream = ExtResource("3_6yss2")
volume_db = 15.0
autoplay = true
script = ExtResource("3_3eqhh")
[connection signal="body_entered" from="Area2D" to="." method="_on_area_2d_body_entered"] [connection signal="body_entered" from="Area2D" to="." method="_on_area_2d_body_entered"]
[connection signal="body_entered" from="next_level" to="." method="_on_next_level_body_entered"] [connection signal="body_entered" from="next_level" to="." method="_on_next_level_body_entered"]

View file

@ -1,8 +1,6 @@
[gd_scene load_steps=6 format=3 uid="uid://ebb4pfxklatj"] [gd_scene load_steps=4 format=3 uid="uid://ebb4pfxklatj"]
[ext_resource type="Script" path="res://player/player.gd" id="1_fob34"] [ext_resource type="Script" path="res://player/player.gd" id="1_fob34"]
[ext_resource type="AudioStream" uid="uid://cs6l2t3jtags8" path="res://assets/sounds/clock-tick-76039.mp3" id="2_p4pcw"]
[ext_resource type="Script" path="res://core/audio/spatial_audio_player.gd" id="3_yaiah"]
[sub_resource type="OccluderPolygon2D" id="OccluderPolygon2D_p33ik"] [sub_resource type="OccluderPolygon2D" id="OccluderPolygon2D_p33ik"]
polygon = PackedVector2Array(-9, -9, -9, 9, 9, 9, 9, -9) polygon = PackedVector2Array(-9, -9, -9, 9, 9, 9, 9, -9)
@ -38,9 +36,3 @@ target_position = Vector2(0, -8.1)
[node name="Polygon2D" type="Polygon2D" parent="."] [node name="Polygon2D" type="Polygon2D" parent="."]
polygon = PackedVector2Array(-9, -9, -9, 9, 9, 9, 9, -9) polygon = PackedVector2Array(-9, -9, -9, 9, 9, 9, 9, -9)
[node name="SpatialAudioStreamPlayer2D" type="AudioStreamPlayer2D" parent="."]
stream = ExtResource("2_p4pcw")
volume_db = 15.0
autoplay = true
script = ExtResource("3_yaiah")