lovr.audio.get/setAbsorption;

I HOPE THIS LETS US DO UNDERWATER EFFECT
This commit is contained in:
bjorn 2021-03-03 15:40:27 -07:00
parent 2c0875087f
commit 8188e51060
4 changed files with 41 additions and 0 deletions

View File

@ -199,6 +199,24 @@ static int l_lovrAudioGetCaptureStream(lua_State* L) {
return 1;
}
static int l_lovrAudioGetAbsorption(lua_State* L) {
float absorption[3];
lovrAudioGetAbsorption(absorption);
lua_pushnumber(L, absorption[0]);
lua_pushnumber(L, absorption[1]);
lua_pushnumber(L, absorption[2]);
return 3;
}
static int l_lovrAudioSetAbsorption(lua_State* L) {
float absorption[3];
absorption[0] = luax_checkfloat(L, 1);
absorption[1] = luax_checkfloat(L, 2);
absorption[2] = luax_checkfloat(L, 3);
lovrAudioSetAbsorption(absorption);
return 0;
}
static int l_lovrAudioNewSource(lua_State* L) {
Sound* sound = luax_totype(L, 1, Sound);
@ -246,6 +264,8 @@ static const luaL_Reg lovrAudio[] = {
{ "setGeometry", l_lovrAudioSetGeometry },
{ "getSpatializer", l_lovrAudioGetSpatializer },
{ "getCaptureStream", l_lovrAudioGetCaptureStream },
{ "getAbsorption", l_lovrAudioGetAbsorption },
{ "setAbsorption", l_lovrAudioSetAbsorption },
{ "newSource", l_lovrAudioNewSource },
{ NULL, NULL }
};

View File

@ -58,6 +58,7 @@ static struct {
uint32_t leftoverOffset;
uint32_t leftoverFrames;
float leftovers[BUFFER_SIZE * 2];
float absorption[3];
} state;
// Device callbacks
@ -217,6 +218,11 @@ bool lovrAudioInit(const char* spatializer) {
}
lovrAssert(state.spatializer, "Must have at least one spatializer");
// SteamAudio's default frequency-dependent absorption coefficients for air
state.absorption[0] = .0002f;
state.absorption[1] = .0017f;
state.absorption[1] = .0182f;
arr_init(&state.converters, realloc);
return state.initialized = true;
}
@ -340,6 +346,16 @@ Sound* lovrAudioGetCaptureStream() {
return state.captureStream;
}
void lovrAudioGetAbsorption(float absorption[3]) {
memcpy(absorption, state.absorption, 3 * sizeof(float));
}
void lovrAudioSetAbsorption(float absorption[3]) {
ma_mutex_lock(&state.lock);
memcpy(state.absorption, absorption, 3 * sizeof(float));
ma_mutex_unlock(&state.lock);
}
// Source
Source* lovrSourceCreate(Sound* sound, bool spatial) {

View File

@ -65,6 +65,8 @@ void lovrAudioSetPose(float position[4], float orientation[4]);
bool lovrAudioSetGeometry(float* vertices, uint32_t* indices, uint32_t vertexCount, uint32_t indexCount, AudioMaterial material);
const char* lovrAudioGetSpatializer(void);
struct Sound* lovrAudioGetCaptureStream(void);
void lovrAudioGetAbsorption(float absorption[3]);
void lovrAudioSetAbsorption(float absorption[3]);
// Source

View File

@ -219,10 +219,13 @@ uint32_t phonon_apply(Source* source, const float* input, float* output, uint32_
.ahead = (IPLVector3) { z[0], z[1], z[2] },
.up = (IPLVector3) { y[0], y[1], y[2] },
.right = (IPLVector3) { x[0], x[1], x[2] },
.airAbsorptionModel.type = IPL_AIRABSORPTION_EXPONENTIAL,
.directivity.dipoleWeight = weight,
.directivity.dipolePower = power
};
lovrAudioGetAirAbsorption(iplSource.airAbsorptionModel.coefficients);
IPLDirectOcclusionMode occlusion = IPL_DIRECTOCCLUSION_NONE;
IPLDirectOcclusionMethod volumetric = IPL_DIRECTOCCLUSION_RAYCAST;
float radius = 0.f;