Skip to content

Commit 7eee040

Browse files
committed
Effect fixes;
1 parent 33125c8 commit 7eee040

File tree

2 files changed

+25
-13
lines changed

2 files changed

+25
-13
lines changed

src/api/l_audio_source.c

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -229,8 +229,10 @@ static int l_lovrSourceGetCone(lua_State* L) {
229229

230230
static int l_lovrSourceSetCone(lua_State* L) {
231231
Source* source = luax_checktype(L, 1, Source);
232-
if (lua_isnoneornil(L, 2)) {
232+
if (!lua_toboolean(L, 2)) {
233233
lovrSourceSetCone(source, 2.f * (float) M_PI, 2.f * (float) M_PI, 0.f);
234+
} else if (lua_isboolean(L, 2)) {
235+
lovrSourceSetCone(source, 0.f, (float) M_PI, 0.f);
234236
} else {
235237
float innerAngle = luax_checkfloat(L, 2);
236238
float outerAngle = luax_checkfloat(L, 3);
@@ -298,9 +300,15 @@ static int l_lovrSourceGetReverb(lua_State* L) {
298300

299301
static int l_lovrSourceSetReverb(lua_State* L) {
300302
Source* source = luax_checktype(L, 1, Source);
301-
float reverb = luax_optfloat(L, 2, 0.f);
302-
ReverbMode mode = luax_checkenum(L, 3, ReverbMode, "listener");
303-
lovrSourceSetReverb(source, reverb, mode);
303+
if (!lua_toboolean(L, 2)) {
304+
lovrSourceSetReverb(source, 0.f, REVERB_LISTENER);
305+
} else if (lua_isboolean(L, 2)) {
306+
lovrSourceSetReverb(source, 1.f, REVERB_LISTENER);
307+
} else {
308+
float reverb = luax_optfloat(L, 2, 0.f);
309+
ReverbMode mode = luax_checkenum(L, 3, ReverbMode, "listener");
310+
lovrSourceSetReverb(source, reverb, mode);
311+
}
304312
return 0;
305313
}
306314

src/modules/audio/audio.c

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)