phonon: Source:get/setAbsorption;

This commit is contained in:
bjorn 2021-02-16 02:54:15 -07:00 committed by Bjorn
parent c531243d7d
commit 66e574baac
4 changed files with 56 additions and 2 deletions

View File

@ -119,6 +119,44 @@ static int l_lovrSourceSetPose(lua_State *L) {
return 0;
}
static int l_lovrSourceGetAbsorption(lua_State* L) {
Source* source = luax_checktype(L, 1, Source);
float absorption[3];
lovrSourceGetAbsorption(source, absorption);
if (absorption[0] == 0.f && absorption[1] == 0.f && absorption[2] == 0.f) {
lua_pushnil(L);
return 1;
}
lua_pushnumber(L, absorption[0]);
lua_pushnumber(L, absorption[1]);
lua_pushnumber(L, absorption[2]);
return 3;
}
static int l_lovrSourceSetAbsorption(lua_State* L) {
Source* source = luax_checktype(L, 1, Source);
float absorption[3] = { 0.f };
switch (lua_type(L, 2)) {
case LUA_TNONE:
case LUA_TNIL:
break;
case LUA_TBOOLEAN:
if (lua_toboolean(L, 2)) {
absorption[0] = .0002f;
absorption[1] = .0017f;
absorption[2] = .0182f;
}
break;
default:
absorption[0] = luax_checkfloat(L, 2);
absorption[1] = luax_checkfloat(L, 3);
absorption[2] = luax_checkfloat(L, 4);
break;
}
lovrSourceSetAbsorption(source, absorption);
return 0;
}
static int l_lovrSourceGetFalloff(lua_State* L) {
Source* source = luax_checktype(L, 1, Source);
float falloff = lovrSourceGetFalloff(source);
@ -165,6 +203,8 @@ const luaL_Reg lovrSource[] = {
{ "isSpatial", l_lovrSourceIsSpatial },
{ "getPose", l_lovrSourceGetPose },
{ "setPose", l_lovrSourceSetPose },
{ "getAbsorption", l_lovrSourceGetAbsorption },
{ "setAbsorption", l_lovrSourceSetAbsorption },
{ "getFalloff", l_lovrSourceGetFalloff },
{ "setFalloff", l_lovrSourceSetFalloff },
{ NULL, NULL }

View File

@ -34,6 +34,7 @@ struct Source {
float volume;
float position[4];
float orientation[4];
float absorption[3];
float falloff;
bool playing;
bool looping;
@ -484,6 +485,14 @@ void lovrSourceSetPose(Source *source, float position[4], float orientation[4])
ma_mutex_unlock(&state.lock);
}
void lovrSourceGetAbsorption(Source* source, float absorption[3]) {
memcpy(absorption, source->absorption, sizeof(source->absorption));
}
void lovrSourceSetAbsorption(Source* source, float absorption[3]) {
memcpy(source->absorption, absorption, sizeof(source->absorption));
}
float lovrSourceGetFalloff(Source* source) {
return source->falloff;
}

View File

@ -56,6 +56,8 @@ void lovrSourceSetTime(Source* source, double time, TimeUnit units);
bool lovrSourceIsSpatial(Source* source);
void lovrSourceGetPose(Source* source, float position[4], float orientation[4]);
void lovrSourceSetPose(Source* source, float position[4], float orientation[4]);
void lovrSourceGetAbsorption(Source* source, float absorption[3]);
void lovrSourceSetAbsorption(Source* source, float absorption[3]);
float lovrSourceGetFalloff(Source* source);
void lovrSourceSetFalloff(Source* source, float falloff);
intptr_t* lovrSourceGetSpatializerMemoField(Source* source);

View File

@ -129,6 +129,8 @@ uint32_t phonon_apply(Source* source, const float* input, float* output, uint32_
quat_rotate(orientation, up);
quat_rotate(orientation, right);
float absorption[3];
lovrSourceGetAbsorption(source, absorption);
float falloff = lovrSourceGetFalloff(source);
IPLSource iplSource = {
@ -140,7 +142,8 @@ uint32_t phonon_apply(Source* source, const float* input, float* output, uint32_
.directivity.dipolePower = 0.f,
.distanceAttenuationModel.type = IPL_DISTANCEATTENUATION_INVERSEDISTANCE,
.distanceAttenuationModel.minDistance = falloff,
.airAbsorptionModel.type = IPL_AIRABSORPTION_DEFAULT
.airAbsorptionModel.type = IPL_AIRABSORPTION_EXPONENTIAL,
.airAbsorptionModel.coefficients = { absorption[0], absorption[1], absorption[2] }
};
IPLDirectOcclusionMode occlusionMode = IPL_DIRECTOCCLUSION_NONE;
@ -149,8 +152,8 @@ uint32_t phonon_apply(Source* source, const float* input, float* output, uint32_
IPLDirectSoundEffectOptions options = {
.applyDistanceAttenuation = falloff > 0.f ? IPL_TRUE : IPL_FALSE,
.applyAirAbsorption = IPL_TRUE,
.applyDirectivity = IPL_TRUE,
.applyAirAbsorption = (absorption[0] > 0.f || absorption[1] > 0.f || absorption[2] > 0.f) ? IPL_TRUE : IPL_FALSE,
.directOcclusionMode = occlusionMode
};