Browse Source

Prefer a viewport's listener over a camera where available

Fix clang formatting issue
Tom McLean 6 years ago
parent
commit
8159ee93a7
1 changed files with 28 additions and 14 deletions
  1. 28 14
      scene/3d/audio_stream_player_3d.cpp

+ 28 - 14
scene/3d/audio_stream_player_3d.cpp

@@ -32,6 +32,7 @@
 #include "core/engine.h"
 #include "scene/3d/area.h"
 #include "scene/3d/camera.h"
+#include "scene/3d/listener.h"
 #include "scene/main/viewport.h"
 
 void AudioStreamPlayer3D::_mix_audio() {
@@ -324,16 +325,25 @@ void AudioStreamPlayer3D::_notification(int p_what) {
 				if (!vp->is_audio_listener())
 					continue;
 
-				Vector3 local_pos = camera->get_global_transform().orthonormalized().affine_inverse().xform(global_pos);
+				bool listener_is_camera = true;
+				Spatial *listener_node = camera;
+
+				Listener *listener = vp->get_listener();
+				if (listener) {
+					listener_node = listener;
+					listener_is_camera = false;
+				}
+
+				Vector3 local_pos = listener_node->get_global_transform().orthonormalized().affine_inverse().xform(global_pos);
 
 				float dist = local_pos.length();
 
 				Vector3 area_sound_pos;
-				Vector3 cam_area_pos;
+				Vector3 listener_area_pos;
 
 				if (area && area->is_using_reverb_bus() && area->get_reverb_uniformity() > 0) {
-					area_sound_pos = space_state->get_closest_point_to_object_volume(area->get_rid(), camera->get_global_transform().origin);
-					cam_area_pos = camera->get_global_transform().affine_inverse().xform(area_sound_pos);
+					area_sound_pos = space_state->get_closest_point_to_object_volume(area->get_rid(), listener_node->get_global_transform().origin);
+					listener_area_pos = listener_node->get_global_transform().affine_inverse().xform(area_sound_pos);
 				}
 
 				if (max_distance > 0) {
@@ -341,10 +351,10 @@ void AudioStreamPlayer3D::_notification(int p_what) {
 					float total_max = max_distance;
 
 					if (area && area->is_using_reverb_bus() && area->get_reverb_uniformity() > 0) {
-						total_max = MAX(total_max, cam_area_pos.length());
+						total_max = MAX(total_max, listener_area_pos.length());
 					}
 					if (total_max > max_distance) {
-						continue; //can't hear this sound in this camera
+						continue; //can't hear this sound in this listener
 					}
 				}
 
@@ -361,8 +371,8 @@ void AudioStreamPlayer3D::_notification(int p_what) {
 				float db_att = (1.0 - MIN(1.0, multiplier)) * attenuation_filter_db;
 
 				if (emission_angle_enabled) {
-					Vector3 camtopos = global_pos - camera->get_global_transform().origin;
-					float c = camtopos.normalized().dot(get_global_transform().basis.get_axis(2).normalized()); //it's z negative
+					Vector3 listenertopos = global_pos - listener_node->get_global_transform().origin;
+					float c = listenertopos.normalized().dot(get_global_transform().basis.get_axis(2).normalized()); //it's z negative
 					float angle = Math::rad2deg(Math::acos(c));
 					if (angle > emission_angle)
 						db_att -= -emission_angle_filter_attenuation_db;
@@ -382,8 +392,8 @@ void AudioStreamPlayer3D::_notification(int p_what) {
 					output.vol[0].l = 1.0 - c;
 					output.vol[0].r = c;
 				} else {
-					Vector3 camtopos = global_pos - camera->get_global_transform().origin;
-					float c = camtopos.normalized().dot(get_global_transform().basis.get_axis(2).normalized()); //it's z negative
+					Vector3 listenertopos = global_pos - listener_node->get_global_transform().origin;
+					float c = listenertopos.normalized().dot(get_global_transform().basis.get_axis(2).normalized()); //it's z negative
 					float angle = Math::rad2deg(Math::acos(c));
 					float av = angle * (flat_pos.x < 0 ? -1 : 1) / 180.0;
 
@@ -449,7 +459,7 @@ void AudioStreamPlayer3D::_notification(int p_what) {
 
 						if (uniformity > 0.0) {
 
-							float distance = cam_area_pos.length();
+							float distance = listener_area_pos.length();
 							float attenuation = Math::db2linear(_get_attenuation_db(distance));
 
 							//float dist_att_db = -20 * Math::log(dist + 0.00001); //logarithmic attenuation, like in real life
@@ -459,7 +469,7 @@ void AudioStreamPlayer3D::_notification(int p_what) {
 
 							if (attenuation < 1.0) {
 								//pan the uniform sound
-								Vector3 rev_pos = cam_area_pos;
+								Vector3 rev_pos = listener_area_pos;
 								rev_pos.y = 0;
 								rev_pos.normalize();
 
@@ -518,9 +528,13 @@ void AudioStreamPlayer3D::_notification(int p_what) {
 
 				if (doppler_tracking != DOPPLER_TRACKING_DISABLED) {
 
-					Vector3 camera_velocity = camera->get_doppler_tracked_velocity();
+					Vector3 listener_velocity;
+
+					if (listener_is_camera) {
+						listener_velocity = camera->get_doppler_tracked_velocity();
+					}
 
-					Vector3 local_velocity = camera->get_global_transform().orthonormalized().basis.xform_inv(linear_velocity - camera_velocity);
+					Vector3 local_velocity = listener_node->get_global_transform().orthonormalized().basis.xform_inv(linear_velocity - listener_velocity);
 
 					if (local_velocity == Vector3()) {
 						output.pitch_scale = 1.0;