summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRémi Verschelde <rverschelde@gmail.com>2023-06-21 10:17:37 +0200
committerRémi Verschelde <rverschelde@gmail.com>2023-06-21 10:17:37 +0200
commit5025d95d41447cf1b85008095638a0a8dffab999 (patch)
tree162c199762fa9612a9c1db9f44ff5ce192d21cba
parent38ae7b58d17b63def71a773c1da6cd17406f81a2 (diff)
parent20ceba9e820695aed4491b732ac743f3b92f93bf (diff)
downloadredot-engine-5025d95d41447cf1b85008095638a0a8dffab999.tar.gz
Merge pull request #69027 from Uxeron/AudioListener2DRotationFix
Fix AudioListener2D ignoring rotation for positional audio
-rw-r--r--scene/2d/audio_stream_player_2d.cpp9
1 files changed, 5 insertions, 4 deletions
diff --git a/scene/2d/audio_stream_player_2d.cpp b/scene/2d/audio_stream_player_2d.cpp
index 8554772288..343dd82b87 100644
--- a/scene/2d/audio_stream_player_2d.cpp
+++ b/scene/2d/audio_stream_player_2d.cpp
@@ -175,13 +175,14 @@ void AudioStreamPlayer2D::_update_panning() {
//screen in global is used for attenuation
AudioListener2D *listener = vp->get_audio_listener_2d();
+ Transform2D full_canvas_transform = vp->get_global_canvas_transform() * vp->get_canvas_transform();
if (listener) {
listener_in_global = listener->get_global_position();
- relative_to_listener = global_pos - listener_in_global;
+ relative_to_listener = (global_pos - listener_in_global).rotated(-listener->get_global_rotation());
+ relative_to_listener *= full_canvas_transform.get_scale(); // Default listener scales with canvas size, do the same here.
} else {
- Transform2D to_listener = vp->get_global_canvas_transform() * vp->get_canvas_transform();
- listener_in_global = to_listener.affine_inverse().xform(screen_size * 0.5);
- relative_to_listener = to_listener.xform(global_pos) - screen_size * 0.5;
+ listener_in_global = full_canvas_transform.affine_inverse().xform(screen_size * 0.5);
+ relative_to_listener = full_canvas_transform.xform(global_pos) - screen_size * 0.5;
}
float dist = global_pos.distance_to(listener_in_global); // Distance to listener, or screen if none.