mirror of https://github.com/bjornbytes/lovr.git
lovr.audio.get/setAbsorption;
I HOPE THIS LETS US DO UNDERWATER EFFECT
This commit is contained in:
parent
2c0875087f
commit
8188e51060
|
@ -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 }
|
||||
};
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue