Added a dampening (lowpass) spatial audio effect for obstacles between the player and the audio source
This commit is contained in:
parent
e147517ad2
commit
47c8576f66
3 changed files with 58 additions and 12 deletions
|
@ -1,7 +1,13 @@
|
|||
class_name SpatialAudioStreamPlayer2D
|
||||
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] = [
|
||||
Vector2(-1, 0), # 0 - left
|
||||
|
@ -43,10 +49,10 @@ const REVERB_PAIRS = [
|
|||
[5, 7, REVERB_MULT_90DEG]
|
||||
]
|
||||
const REVERB_PAIRS_SUM_DIVISOR = 2500.0 # i dunno
|
||||
|
||||
var raycasts: Array[RayCast2D] = []
|
||||
|
||||
func create_raycasts():
|
||||
# raycasts used for reverb
|
||||
for v in RAYCAST_VECS:
|
||||
var r = RayCast2D.new()
|
||||
r.target_position = v.normalized() * max_distance
|
||||
|
@ -78,18 +84,53 @@ func determine_reverb_params() -> Array[float]:
|
|||
var wetness = n_coll / 8.0
|
||||
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
|
||||
|
||||
var audio_effect_reverb = AudioEffectReverb.new()
|
||||
var audio_effect_dampen = AudioEffectLowPassFilter.new()
|
||||
|
||||
func update_reverb(room_size: float, wetness: float):
|
||||
audio_effect_reverb.room_size = room_size
|
||||
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
|
||||
|
||||
const BUS_NAME_PREFIX = "Spatial2DBus#"
|
||||
const BUS_EFFECT_POS_REVERB = 0
|
||||
const BUS_EFFECT_POS_LOWPASS = 1
|
||||
var bus_idx: int = -1
|
||||
var bus_name: String = ""
|
||||
|
||||
|
@ -107,6 +148,8 @@ func create_audio_bus_effects():
|
|||
return
|
||||
# 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:
|
||||
var reverb_params = determine_reverb_params()
|
||||
var blocked_amount = determine_distance_amount_blocked()
|
||||
update_reverb(reverb_params[0], reverb_params[1])
|
||||
update_dampening(blocked_amount)
|
||||
|
|
|
@ -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="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"]
|
||||
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)
|
||||
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="next_level" to="." method="_on_next_level_body_entered"]
|
||||
|
|
|
@ -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="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"]
|
||||
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="."]
|
||||
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")
|
||||
|
|
Reference in a new issue