Rework dimmable audio stream

This commit is contained in:
2026-02-05 14:45:28 -08:00
parent 36b851254e
commit c6fbc9f553
5 changed files with 88 additions and 18 deletions

View File

@@ -0,0 +1,50 @@
namespace Zennysoft.Game.Implementation;
using Chickensoft.GodotNodeInterfaces;
using Godot;
using Zennysoft.Game.Abstractions;
public partial class DimmableAudioStreamPlayer3D : AudioStreamPlayer3D, IDimmableAudioStreamPlayer
{
#region Constants
// -60 to -80 is considered inaudible for decibels.
public const float VOLUME_DB_INAUDIBLE = -80f;
public const double FADE_DURATION = 3d; // seconds
#endregion Constants
public ITween? FadeTween { get; set; }
public float InitialVolumeDb;
public override void _Ready()
{
InitialVolumeDb = VolumeDb;
VolumeDb = VOLUME_DB_INAUDIBLE;
}
public void FadeIn()
{
SetupFade(InitialVolumeDb, Tween.EaseType.Out);
Play();
}
public void FadeOut()
{
SetupFade(VOLUME_DB_INAUDIBLE, Tween.EaseType.In);
FadeTween!.TweenCallback(Callable.From(Stop));
}
public void SetupFade(float volumeDb, Tween.EaseType ease)
{
FadeTween?.Kill();
FadeTween = GodotInterfaces.Adapt<ITween>(CreateTween());
FadeTween.TweenProperty(
this,
"volume_db",
volumeDb,
FADE_DURATION
).SetTrans(Tween.TransitionType.Circ).SetEase(ease);
}
}

View File

@@ -0,0 +1,5 @@
using Zennysoft.Game.Implementation;
public partial class AmbientSFXPlayer3D : DimmableAudioStreamPlayer3D
{
}

View File

@@ -0,0 +1 @@
uid://b83kye8yinfxs

View File

@@ -1,6 +1,8 @@
using Chickensoft.AutoInject; using Chickensoft.AutoInject;
using Chickensoft.Introspection; using Chickensoft.Introspection;
using Godot; using Godot;
using System.Linq;
using Zennysoft.Game.Abstractions;
using Zennysoft.Ma.Adapter; using Zennysoft.Ma.Adapter;
namespace Zennysoft.Game.Ma; namespace Zennysoft.Game.Ma;
@@ -19,6 +21,8 @@ public partial class Overworld : SpecialFloor, IDungeonFloor
[Node] private Area3D RestoreArea { get; set; } = default!; [Node] private Area3D RestoreArea { get; set; } = default!;
[Node] private Node DimmableAudio { get; set; } = default!;
private Timer RestoreTimer { get; set; } private Timer RestoreTimer { get; set; }
public override void InitializeDungeon() public override void InitializeDungeon()
@@ -32,6 +36,17 @@ public partial class Overworld : SpecialFloor, IDungeonFloor
RestoreTimer.Timeout += RestoreTimer_Timeout; RestoreTimer.Timeout += RestoreTimer_Timeout;
AddChild(RestoreTimer); AddChild(RestoreTimer);
FloorIsLoaded = true; FloorIsLoaded = true;
var dimmableAudio = DimmableAudio.GetChildren().OfType<IDimmableAudioStreamPlayer>();
foreach (var dimmable in dimmableAudio)
dimmable.FadeIn();
}
public override void FadeOutAudio()
{
var dimmableAudio = DimmableAudio.GetChildren().OfType<IDimmableAudioStreamPlayer>();
foreach (var dimmable in dimmableAudio)
dimmable.FadeOut();
} }
private void RestoreTimer_Timeout() private void RestoreTimer_Timeout()

View File

@@ -1,4 +1,4 @@
[gd_scene load_steps=557 format=4 uid="uid://dvnc26rebk6o0"] [gd_scene load_steps=558 format=4 uid="uid://dvnc26rebk6o0"]
[ext_resource type="Script" uid="uid://cuhfkyh3d7noa" path="res://src/map/dungeon/code/Overworld.cs" id="1_5hmt3"] [ext_resource type="Script" uid="uid://cuhfkyh3d7noa" path="res://src/map/dungeon/code/Overworld.cs" id="1_5hmt3"]
[ext_resource type="Texture2D" uid="uid://co6h8vyi11sl2" path="res://src/map/overworld/Models/Overworld_CLOUD_RINGS_INNER_63.png" id="2_g6b7b"] [ext_resource type="Texture2D" uid="uid://co6h8vyi11sl2" path="res://src/map/overworld/Models/Overworld_CLOUD_RINGS_INNER_63.png" id="2_g6b7b"]
@@ -86,6 +86,7 @@
[ext_resource type="Texture2D" uid="uid://cpuhjnogiqlm3" path="res://src/map/overworld/Models/Overworld_optimized_Pass 1_leafs3.png" id="64_28ka5"] [ext_resource type="Texture2D" uid="uid://cpuhjnogiqlm3" path="res://src/map/overworld/Models/Overworld_optimized_Pass 1_leafs3.png" id="64_28ka5"]
[ext_resource type="Texture2D" uid="uid://dq63vmmpqlww7" path="res://src/map/overworld/Models/Overworld_optimized_Pass 1_VINE.png" id="65_nhnhu"] [ext_resource type="Texture2D" uid="uid://dq63vmmpqlww7" path="res://src/map/overworld/Models/Overworld_optimized_Pass 1_VINE.png" id="65_nhnhu"]
[ext_resource type="Texture2D" uid="uid://wqbflec631rm" path="res://src/map/overworld/Models/Overworld_optimized_Pass 1_BANYAN_LEAVES.png" id="66_plu1v"] [ext_resource type="Texture2D" uid="uid://wqbflec631rm" path="res://src/map/overworld/Models/Overworld_optimized_Pass 1_BANYAN_LEAVES.png" id="66_plu1v"]
[ext_resource type="Script" uid="uid://b83kye8yinfxs" path="res://src/audio/AmbientSFXPlayer3D.cs" id="66_q7hpd"]
[ext_resource type="Texture2D" uid="uid://ck2milaawr3ef" path="res://src/map/overworld/Models/Overworld_optimized_Pass 1_BANYAN_LEAVES2.png" id="67_shdaj"] [ext_resource type="Texture2D" uid="uid://ck2milaawr3ef" path="res://src/map/overworld/Models/Overworld_optimized_Pass 1_BANYAN_LEAVES2.png" id="67_shdaj"]
[ext_resource type="Texture2D" uid="uid://c38grr8d22ukg" path="res://src/map/assets/Overworld Assetts/cloudscape.png" id="67_uyygh"] [ext_resource type="Texture2D" uid="uid://c38grr8d22ukg" path="res://src/map/assets/Overworld Assetts/cloudscape.png" id="67_uyygh"]
[ext_resource type="Texture2D" uid="uid://c5jloiaiy7iug" path="res://src/map/overworld/Models/Overworld_optimized_Pass 1_BANYAN_LEAVES_3.png" id="68_8o0x4"] [ext_resource type="Texture2D" uid="uid://c5jloiaiy7iug" path="res://src/map/overworld/Models/Overworld_optimized_Pass 1_BANYAN_LEAVES_3.png" id="68_8o0x4"]
@@ -10823,81 +10824,79 @@ material = SubResource("FogMaterial_b6pah")
[node name="Audio" type="Node3D" parent="Node3D"] [node name="Audio" type="Node3D" parent="Node3D"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -350.758, -3.90238, 113.556) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -350.758, -3.90238, 113.556)
[node name="AudioStreamPlayer" type="AudioStreamPlayer" parent="Node3D/Audio"] [node name="DimmableAudio" type="Node3D" parent="Node3D/Audio"]
autoplay = true unique_name_in_owner = true
transform = Transform3D(1.51515, 0, 0, 0, 1.51515, 0, 0, 0, 1.51515, 137.047, -0.658938, -5.82563)
[node name="AUDIO" type="Node3D" parent="Node3D/Audio/AudioStreamPlayer"] [node name="Interior" type="AudioStreamPlayer3D" parent="Node3D/Audio/DimmableAudio"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -203.193, -3.01047, 66.0116)
[node name="Interior" type="AudioStreamPlayer3D" parent="Node3D/Audio/AudioStreamPlayer/AUDIO"]
process_mode = 3 process_mode = 3
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 22.4453, 0, 5.97604) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 22.4453, 0, 5.97604)
stream = ExtResource("2_wbbo3") stream = ExtResource("2_wbbo3")
volume_db = 5.275 volume_db = 5.275
unit_size = 10.55 unit_size = 10.55
max_db = -3.264 max_db = -3.264
autoplay = true
max_distance = 100.0 max_distance = 100.0
bus = &"AMBIENT" bus = &"AMBIENT"
script = ExtResource("66_q7hpd")
[node name="Interior2" type="AudioStreamPlayer3D" parent="Node3D/Audio/AudioStreamPlayer/AUDIO"] [node name="Interior2" type="AudioStreamPlayer3D" parent="Node3D/Audio/DimmableAudio"]
process_mode = 3 process_mode = 3
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -231.692, 6.43338, -92.712) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -231.692, 6.43338, -92.712)
stream = ExtResource("2_wbbo3") stream = ExtResource("2_wbbo3")
volume_db = 5.275 volume_db = 5.275
unit_size = 10.55 unit_size = 10.55
max_db = -3.264 max_db = -3.264
autoplay = true
max_distance = 54.99 max_distance = 54.99
bus = &"AMBIENT" bus = &"AMBIENT"
script = ExtResource("66_q7hpd")
[node name="Ocean" type="AudioStreamPlayer3D" parent="Node3D/Audio/AudioStreamPlayer/AUDIO"] [node name="Ocean" type="AudioStreamPlayer3D" parent="Node3D/Audio/DimmableAudio"]
process_mode = 3 process_mode = 3
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -210.527, -9.55156, -81.5173) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -210.527, -9.55156, -81.5173)
stream = ExtResource("3_pvi8n") stream = ExtResource("3_pvi8n")
volume_db = 8.791 volume_db = 8.791
unit_size = 4.51 unit_size = 4.51
max_db = -13.154 max_db = -13.154
autoplay = true
max_distance = 247.56 max_distance = 247.56
bus = &"AMBIENT" bus = &"AMBIENT"
attenuation_filter_cutoff_hz = 20500.0 attenuation_filter_cutoff_hz = 20500.0
script = ExtResource("66_q7hpd")
[node name="Ocean2" type="AudioStreamPlayer3D" parent="Node3D/Audio/AudioStreamPlayer/AUDIO"] [node name="Ocean2" type="AudioStreamPlayer3D" parent="Node3D/Audio/DimmableAudio"]
process_mode = 3 process_mode = 3
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 109.176, -130.646, -48.6352) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 109.176, -130.646, -48.6352)
stream = ExtResource("3_pvi8n") stream = ExtResource("3_pvi8n")
volume_db = 30.769 volume_db = 30.769
unit_size = 1.77 unit_size = 1.77
max_db = -10.353 max_db = -10.353
autoplay = true
max_distance = 157.54 max_distance = 157.54
max_polyphony = 2 max_polyphony = 2
bus = &"AMBIENT" bus = &"AMBIENT"
attenuation_filter_db = -34.0 attenuation_filter_db = -34.0
script = ExtResource("66_q7hpd")
[node name="Ocean3" type="AudioStreamPlayer3D" parent="Node3D/Audio/AudioStreamPlayer/AUDIO"] [node name="Ocean3" type="AudioStreamPlayer3D" parent="Node3D/Audio/DimmableAudio"]
process_mode = 3 process_mode = 3
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -329.209, -9.13597, -39.3283) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -329.209, -9.13597, -39.3283)
stream = ExtResource("3_pvi8n") stream = ExtResource("3_pvi8n")
volume_db = 30.769 volume_db = 30.769
unit_size = 11.1 unit_size = 11.1
max_db = -5.078 max_db = -5.078
autoplay = true
max_distance = 90.02 max_distance = 90.02
max_polyphony = 2 max_polyphony = 2
bus = &"AMBIENT" bus = &"AMBIENT"
attenuation_filter_cutoff_hz = 691.0 attenuation_filter_cutoff_hz = 691.0
attenuation_filter_db = -34.0 attenuation_filter_db = -34.0
script = ExtResource("66_q7hpd")
[node name="Waterfall" type="AudioStreamPlayer3D" parent="Node3D/Audio/AudioStreamPlayer/AUDIO"] [node name="Waterfall" type="AudioStreamPlayer3D" parent="Node3D/Audio/DimmableAudio"]
process_mode = 3 process_mode = 3
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -107.057, 0, -48.0532) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -107.057, 0, -48.0532)
stream = ExtResource("3_c2gp5") stream = ExtResource("3_c2gp5")
volume_db = 2.774 volume_db = 2.774
autoplay = true
max_distance = 116.36 max_distance = 116.36
bus = &"AMBIENT" bus = &"AMBIENT"
script = ExtResource("66_q7hpd")
[node name="VFX" type="Node3D" parent="Node3D"] [node name="VFX" type="Node3D" parent="Node3D"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -350.758, -3.90238, 113.556) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -350.758, -3.90238, 113.556)