diff --git a/core/audio/spatial_audio_player.gd b/core/audio/spatial_audio_player.gd index 21ed584..7cb9f60 100644 --- a/core/audio/spatial_audio_player.gd +++ b/core/audio/spatial_audio_player.gd @@ -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) diff --git a/levels/intro.tscn b/levels/intro.tscn index a199cb3..e9c5215 100644 --- a/levels/intro.tscn +++ b/levels/intro.tscn @@ -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"] diff --git a/player/player.tscn b/player/player.tscn index 618c252..36e778a 100644 --- a/player/player.tscn +++ b/player/player.tscn @@ -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")