@@ -875,26 +875,26 @@ static float applyAttenuation(IPLfloat32 distance, void* userdata) {
875875 if (distance <= source -> innerDistance ) {
876876 return 1.f ;
877877 } else {
878- return MAX (source -> innerDistance / distance , source -> minFalloffVolume );
878+ return MAX (1.f / ( 1.f + MAX ( distance - source -> innerDistance , 0.f )) , source -> minFalloffVolume );
879879 }
880880}
881881
882- static float applyDirectivity (IPLVector3 sourceDirection , void * userdata ) {
882+ static float applyDirectivity (IPLVector3 sourceToListener , void * userdata ) {
883883 Source * source = userdata ;
884884
885- float listenerDirection [3 ];
886- vec3_init (listenerDirection , & state .listenerBasis [state .backbuffer ].origin .x );
887- vec3_sub (listenerDirection , source -> position );
888- vec3_normalize (listenerDirection );
889- float angle = acosf (vec3_dot (& sourceDirection .x , listenerDirection ));
885+ float sourceDirection [3 ];
886+ quat_getDirection (source -> orientation , sourceDirection );
887+ float angle = vec3_angle (sourceDirection , & sourceToListener .x );
890888
891889 if (angle < source -> innerAngle ) {
892890 return 1.f ;
893891 } else if (angle >= source -> outerAngle ) {
894892 return source -> outerAngleVolume ;
895- } else {
893+ } else if ( source -> innerAngle < source -> outerAngle ) {
896894 float t = (angle - source -> innerAngle ) / (source -> outerAngle - source -> innerAngle );
897- return source -> outerAngleVolume + (1.f - source -> outerAngleVolume ) * t ;
895+ return 1.f - (1.f - source -> outerAngleVolume ) * t ;
896+ } else {
897+ return angle < source -> innerAngle ? 1.f : source -> outerAngleVolume ;
898898 }
899899}
900900
@@ -1059,7 +1059,11 @@ static void phonon_update(float dt) {
10591059
10601060 FOREACH_SOURCE (mask , source ) {
10611061 convertPose (source -> position , source -> orientation , & source -> inputs .source );
1062+
1063+ float inverseListenerOrientation [4 ];
1064+ quat_conjugate (quat_init (inverseListenerOrientation , state .orientation ));
10621065 vec3_sub (vec3_init (& source -> relativeDirection [backbuffer ].x , source -> position ), state .position );
1066+ quat_rotate (inverseListenerOrientation , & source -> relativeDirection [backbuffer ].x );
10631067
10641068 source -> inputs .directFlags = 0 ;
10651069 if (vec3_dot (source -> absorption , source -> absorption ) > 1e-5 ) source -> inputs .directFlags |= IPL_DIRECTSIMULATIONFLAGS_AIRABSORPTION ;
0 commit comments