diff options
-rw-r--r-- | scene/2d/audio_stream_player_2d.cpp | 9 | ||||
-rw-r--r-- | scene/main/viewport.cpp | 6 | ||||
-rw-r--r-- | scene/resources/world_2d.cpp | 8 | ||||
-rw-r--r-- | scene/resources/world_2d.h | 6 |
4 files changed, 22 insertions, 7 deletions
diff --git a/scene/2d/audio_stream_player_2d.cpp b/scene/2d/audio_stream_player_2d.cpp index 466ffad951..8554772288 100644 --- a/scene/2d/audio_stream_player_2d.cpp +++ b/scene/2d/audio_stream_player_2d.cpp @@ -157,7 +157,6 @@ void AudioStreamPlayer2D::_update_panning() { Vector2 global_pos = get_global_position(); HashSet<Viewport *> viewports = world_2d->get_viewports(); - viewports.insert(get_viewport()); // TODO: This is a mediocre workaround for #50958. Remove when that bug is fixed! volume_vector.resize(4); volume_vector.write[0] = AudioFrame(0, 0); @@ -188,11 +187,11 @@ void AudioStreamPlayer2D::_update_panning() { float dist = global_pos.distance_to(listener_in_global); // Distance to listener, or screen if none. if (dist > max_distance) { - continue; //can't hear this sound in this viewport + continue; // Can't hear this sound in this viewport. } float multiplier = Math::pow(1.0f - dist / max_distance, attenuation); - multiplier *= Math::db_to_linear(volume_db); //also apply player volume! + multiplier *= Math::db_to_linear(volume_db); // Also apply player volume! float pan = relative_to_listener.x / screen_size.x; // Don't let the panning effect extend (too far) beyond the screen. @@ -206,7 +205,9 @@ void AudioStreamPlayer2D::_update_panning() { float l = 1.0 - pan; float r = pan; - volume_vector.write[0] = AudioFrame(l, r) * multiplier; + const AudioFrame &prev_sample = volume_vector[0]; + AudioFrame new_sample = AudioFrame(l, r) * multiplier; + volume_vector.write[0] = AudioFrame(MAX(prev_sample[0], new_sample[0]), MAX(prev_sample[1], new_sample[1])); } for (const Ref<AudioStreamPlayback> &playback : stream_playbacks) { diff --git a/scene/main/viewport.cpp b/scene/main/viewport.cpp index a303cc8820..8ee7f93f5c 100644 --- a/scene/main/viewport.cpp +++ b/scene/main/viewport.cpp @@ -1184,6 +1184,10 @@ void Viewport::set_world_2d(const Ref<World2D> &p_world_2d) { RenderingServer::get_singleton()->viewport_remove_canvas(viewport, current_canvas); } + if (world_2d.is_valid()) { + world_2d->remove_viewport(this); + } + if (p_world_2d.is_valid()) { bool do_propagate = world_2d.is_valid() && is_inside_tree(); world_2d = p_world_2d; @@ -1195,6 +1199,7 @@ void Viewport::set_world_2d(const Ref<World2D> &p_world_2d) { world_2d = Ref<World2D>(memnew(World2D)); } + world_2d->register_viewport(this); _update_audio_listener_2d(); if (is_inside_tree()) { @@ -4387,6 +4392,7 @@ void Viewport::_validate_property(PropertyInfo &p_property) const { Viewport::Viewport() { world_2d = Ref<World2D>(memnew(World2D)); + world_2d->register_viewport(this); viewport = RenderingServer::get_singleton()->viewport_create(); texture_rid = RenderingServer::get_singleton()->viewport_get_texture(viewport); diff --git a/scene/resources/world_2d.cpp b/scene/resources/world_2d.cpp index f371703cba..e52e5d47bb 100644 --- a/scene/resources/world_2d.cpp +++ b/scene/resources/world_2d.cpp @@ -83,6 +83,14 @@ PhysicsDirectSpaceState2D *World2D::get_direct_space_state() { return PhysicsServer2D::get_singleton()->space_get_direct_state(get_space()); } +void World2D::register_viewport(Viewport *p_viewport) { + viewports.insert(p_viewport); +} + +void World2D::remove_viewport(Viewport *p_viewport) { + viewports.erase(p_viewport); +} + World2D::World2D() { canvas = RenderingServer::get_singleton()->canvas_create(); } diff --git a/scene/resources/world_2d.h b/scene/resources/world_2d.h index 0b3b9df7dc..d5e3427344 100644 --- a/scene/resources/world_2d.h +++ b/scene/resources/world_2d.h @@ -52,9 +52,6 @@ protected: static void _bind_methods(); friend class Viewport; - void _register_viewport(Viewport *p_viewport); - void _remove_viewport(Viewport *p_viewport); - public: RID get_canvas() const; RID get_space() const; @@ -62,6 +59,9 @@ public: PhysicsDirectSpaceState2D *get_direct_space_state(); + void register_viewport(Viewport *p_viewport); + void remove_viewport(Viewport *p_viewport); + _FORCE_INLINE_ const HashSet<Viewport *> &get_viewports() { return viewports; } World2D(); |