Merge pull request #25602 from mcccclean/dont-ignore-listener-nodes
Fix 3D Listener nodes not being used
This commit is contained in:
commit
fb8dce3e2e
1 changed files with 28 additions and 14 deletions
|
@ -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;
|
||||
|
||||
Vector3 local_velocity = camera->get_global_transform().orthonormalized().basis.xform_inv(linear_velocity - camera_velocity);
|
||||
if (listener_is_camera) {
|
||||
listener_velocity = camera->get_doppler_tracked_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;
|
||||
|
|
Loading…
Reference in a new issue