mirror of https://github.com/bjornbytes/lovr.git
phonon: Source:get/setAbsorption;
This commit is contained in:
parent
c531243d7d
commit
66e574baac
|
@ -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 }
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in New Issue