mirror of
https://github.com/bjornbytes/lovr.git
synced 2024-07-05 13:53:38 +00:00
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;
|
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) {
|
static int l_lovrSourceGetFalloff(lua_State* L) {
|
||||||
Source* source = luax_checktype(L, 1, Source);
|
Source* source = luax_checktype(L, 1, Source);
|
||||||
float falloff = lovrSourceGetFalloff(source);
|
float falloff = lovrSourceGetFalloff(source);
|
||||||
|
@ -165,6 +203,8 @@ const luaL_Reg lovrSource[] = {
|
||||||
{ "isSpatial", l_lovrSourceIsSpatial },
|
{ "isSpatial", l_lovrSourceIsSpatial },
|
||||||
{ "getPose", l_lovrSourceGetPose },
|
{ "getPose", l_lovrSourceGetPose },
|
||||||
{ "setPose", l_lovrSourceSetPose },
|
{ "setPose", l_lovrSourceSetPose },
|
||||||
|
{ "getAbsorption", l_lovrSourceGetAbsorption },
|
||||||
|
{ "setAbsorption", l_lovrSourceSetAbsorption },
|
||||||
{ "getFalloff", l_lovrSourceGetFalloff },
|
{ "getFalloff", l_lovrSourceGetFalloff },
|
||||||
{ "setFalloff", l_lovrSourceSetFalloff },
|
{ "setFalloff", l_lovrSourceSetFalloff },
|
||||||
{ NULL, NULL }
|
{ NULL, NULL }
|
||||||
|
|
|
@ -34,6 +34,7 @@ struct Source {
|
||||||
float volume;
|
float volume;
|
||||||
float position[4];
|
float position[4];
|
||||||
float orientation[4];
|
float orientation[4];
|
||||||
|
float absorption[3];
|
||||||
float falloff;
|
float falloff;
|
||||||
bool playing;
|
bool playing;
|
||||||
bool looping;
|
bool looping;
|
||||||
|
@ -484,6 +485,14 @@ void lovrSourceSetPose(Source *source, float position[4], float orientation[4])
|
||||||
ma_mutex_unlock(&state.lock);
|
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) {
|
float lovrSourceGetFalloff(Source* source) {
|
||||||
return source->falloff;
|
return source->falloff;
|
||||||
}
|
}
|
||||||
|
|
|
@ -56,6 +56,8 @@ void lovrSourceSetTime(Source* source, double time, TimeUnit units);
|
||||||
bool lovrSourceIsSpatial(Source* source);
|
bool lovrSourceIsSpatial(Source* source);
|
||||||
void lovrSourceGetPose(Source* source, float position[4], float orientation[4]);
|
void lovrSourceGetPose(Source* source, float position[4], float orientation[4]);
|
||||||
void lovrSourceSetPose(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);
|
float lovrSourceGetFalloff(Source* source);
|
||||||
void lovrSourceSetFalloff(Source* source, float falloff);
|
void lovrSourceSetFalloff(Source* source, float falloff);
|
||||||
intptr_t* lovrSourceGetSpatializerMemoField(Source* source);
|
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, up);
|
||||||
quat_rotate(orientation, right);
|
quat_rotate(orientation, right);
|
||||||
|
|
||||||
|
float absorption[3];
|
||||||
|
lovrSourceGetAbsorption(source, absorption);
|
||||||
float falloff = lovrSourceGetFalloff(source);
|
float falloff = lovrSourceGetFalloff(source);
|
||||||
|
|
||||||
IPLSource iplSource = {
|
IPLSource iplSource = {
|
||||||
|
@ -140,7 +142,8 @@ uint32_t phonon_apply(Source* source, const float* input, float* output, uint32_
|
||||||
.directivity.dipolePower = 0.f,
|
.directivity.dipolePower = 0.f,
|
||||||
.distanceAttenuationModel.type = IPL_DISTANCEATTENUATION_INVERSEDISTANCE,
|
.distanceAttenuationModel.type = IPL_DISTANCEATTENUATION_INVERSEDISTANCE,
|
||||||
.distanceAttenuationModel.minDistance = falloff,
|
.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;
|
IPLDirectOcclusionMode occlusionMode = IPL_DIRECTOCCLUSION_NONE;
|
||||||
|
@ -149,8 +152,8 @@ uint32_t phonon_apply(Source* source, const float* input, float* output, uint32_
|
||||||
|
|
||||||
IPLDirectSoundEffectOptions options = {
|
IPLDirectSoundEffectOptions options = {
|
||||||
.applyDistanceAttenuation = falloff > 0.f ? IPL_TRUE : IPL_FALSE,
|
.applyDistanceAttenuation = falloff > 0.f ? IPL_TRUE : IPL_FALSE,
|
||||||
.applyAirAbsorption = IPL_TRUE,
|
|
||||||
.applyDirectivity = IPL_TRUE,
|
.applyDirectivity = IPL_TRUE,
|
||||||
|
.applyAirAbsorption = (absorption[0] > 0.f || absorption[1] > 0.f || absorption[2] > 0.f) ? IPL_TRUE : IPL_FALSE,
|
||||||
.directOcclusionMode = occlusionMode
|
.directOcclusionMode = occlusionMode
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue