From cf4bb36d032fdd9a34d73eddd31158a923439bbf Mon Sep 17 00:00:00 2001 From: bjorn Date: Sun, 28 Feb 2021 15:27:20 -0700 Subject: [PATCH] AudioMaterial; --- src/api/api.h | 1 + src/api/l_audio.c | 20 +++++++++++++-- src/modules/audio/audio.c | 4 +-- src/modules/audio/audio.h | 16 +++++++++++- src/modules/audio/spatializer.h | 2 +- src/modules/audio/spatializer_oculus.c | 2 +- src/modules/audio/spatializer_phonon.c | 35 +++++++++++++++----------- src/modules/audio/spatializer_simple.c | 2 +- 8 files changed, 60 insertions(+), 22 deletions(-) diff --git a/src/api/api.h b/src/api/api.h index f491bac9..b02852e6 100644 --- a/src/api/api.h +++ b/src/api/api.h @@ -75,6 +75,7 @@ typedef struct { extern StringEntry lovrArcMode[]; extern StringEntry lovrAttributeType[]; +extern StringEntry lovrAudioMaterial[]; extern StringEntry lovrAudioType[]; extern StringEntry lovrBlendAlphaMode[]; extern StringEntry lovrBlendMode[]; diff --git a/src/api/l_audio.c b/src/api/l_audio.c index 2fb8793f..1af600c8 100644 --- a/src/api/l_audio.c +++ b/src/api/l_audio.c @@ -6,6 +6,21 @@ #include "core/util.h" #include +StringEntry lovrAudioMaterial[] = { + [MATERIAL_GENERIC] = ENTRY("generic"), + [MATERIAL_BRICK] = ENTRY("brick"), + [MATERIAL_CARPET] = ENTRY("carpet"), + [MATERIAL_CERAMIC] = ENTRY("ceramic"), + [MATERIAL_CONCRETE] = ENTRY("concrete"), + [MATERIAL_GLASS] = ENTRY("glass"), + [MATERIAL_GRAVEL] = ENTRY("gravel"), + [MATERIAL_METAL] = ENTRY("metal"), + [MATERIAL_PLASTER] = ENTRY("plaster"), + [MATERIAL_ROCK] = ENTRY("rock"), + [MATERIAL_WOOD] = ENTRY("wood"), + { 0 } +}; + StringEntry lovrAudioType[] = { [AUDIO_PLAYBACK] = ENTRY("playback"), [AUDIO_CAPTURE] = ENTRY("capture"), @@ -152,8 +167,9 @@ static int l_lovrAudioSetGeometry(lua_State* L) { uint32_t* indices; uint32_t vertexCount, indexCount; bool shouldFree; - luax_readtriangles(L, 1, &vertices, &vertexCount, &indices, &indexCount, &shouldFree); - bool success = lovrAudioSetGeometry(vertices, indices, vertexCount, indexCount); + int index = luax_readtriangles(L, 1, &vertices, &vertexCount, &indices, &indexCount, &shouldFree); + AudioMaterial material = luax_checkenum(L, index, AudioMaterial, "generic"); + bool success = lovrAudioSetGeometry(vertices, indices, vertexCount, indexCount, material); if (shouldFree) { free(vertices); free(indices); diff --git a/src/modules/audio/audio.c b/src/modules/audio/audio.c index 2c2a6849..0e14f38f 100644 --- a/src/modules/audio/audio.c +++ b/src/modules/audio/audio.c @@ -333,8 +333,8 @@ void lovrAudioSetPose(float position[4], float orientation[4]) { state.spatializer->setListenerPose(position, orientation); } -bool lovrAudioSetGeometry(float* vertices, uint32_t* indices, uint32_t vertexCount, uint32_t indexCount) { - return state.spatializer->setGeometry(vertices, indices, vertexCount, indexCount); +bool lovrAudioSetGeometry(float* vertices, uint32_t* indices, uint32_t vertexCount, uint32_t indexCount, AudioMaterial material) { + return state.spatializer->setGeometry(vertices, indices, vertexCount, indexCount, material); } const char* lovrAudioGetSpatializer() { diff --git a/src/modules/audio/audio.h b/src/modules/audio/audio.h index 8e9512cb..13cac931 100644 --- a/src/modules/audio/audio.h +++ b/src/modules/audio/audio.h @@ -11,6 +11,20 @@ struct Sound; typedef struct Source Source; +typedef enum { + MATERIAL_GENERIC, + MATERIAL_BRICK, + MATERIAL_CARPET, + MATERIAL_CERAMIC, + MATERIAL_CONCRETE, + MATERIAL_GLASS, + MATERIAL_GRAVEL, + MATERIAL_METAL, + MATERIAL_PLASTER, + MATERIAL_ROCK, + MATERIAL_WOOD +} AudioMaterial; + typedef enum { AUDIO_PLAYBACK, AUDIO_CAPTURE @@ -39,7 +53,7 @@ float lovrAudioGetVolume(void); void lovrAudioSetVolume(float volume); void lovrAudioGetPose(float position[4], float orientation[4]); void lovrAudioSetPose(float position[4], float orientation[4]); -bool lovrAudioSetGeometry(float* vertices, uint32_t* indices, uint32_t vertexCount, uint32_t indexCount); +bool lovrAudioSetGeometry(float* vertices, uint32_t* indices, uint32_t vertexCount, uint32_t indexCount, AudioMaterial material); const char* lovrAudioGetSpatializer(void); struct Sound* lovrAudioGetCaptureStream(void); diff --git a/src/modules/audio/spatializer.h b/src/modules/audio/spatializer.h index 5a44c390..98ca898f 100644 --- a/src/modules/audio/spatializer.h +++ b/src/modules/audio/spatializer.h @@ -23,7 +23,7 @@ typedef struct { // return value is number of stereo frames written. uint32_t (*tail)(float* scratch, float* output, uint32_t frames); void (*setListenerPose)(float position[4], float orientation[4]); - bool (*setGeometry)(float* vertices, uint32_t* indices, uint32_t vertexCount, uint32_t indexCount); + bool (*setGeometry)(float* vertices, uint32_t* indices, uint32_t vertexCount, uint32_t indexCount, AudioMaterial material); void (*sourceCreate)(Source* source); void (*sourceDestroy)(Source* source); const char* name; diff --git a/src/modules/audio/spatializer_oculus.c b/src/modules/audio/spatializer_oculus.c index 555810d1..49b5c2c1 100644 --- a/src/modules/audio/spatializer_oculus.c +++ b/src/modules/audio/spatializer_oculus.c @@ -279,7 +279,7 @@ static void oculus_spatializer_setListenerPose(float position[4], float orientat ma_mutex_unlock(&state.poseLock); } -bool oculus_setGeometry(float* vertices, uint32_t* indices, uint32_t vertexCount, uint32_t indexCount) { +bool oculus_setGeometry(float* vertices, uint32_t* indices, uint32_t vertexCount, uint32_t indexCount, AudioMaterial material) { return false; } diff --git a/src/modules/audio/spatializer_phonon.c b/src/modules/audio/spatializer_phonon.c index d390eea5..52ce38f1 100644 --- a/src/modules/audio/spatializer_phonon.c +++ b/src/modules/audio/spatializer_phonon.c @@ -294,20 +294,24 @@ void phonon_setListenerPose(float position[4], float orientation[4]) { memcpy(state.listenerOrientation, orientation, sizeof(state.listenerOrientation)); } -bool phonon_setGeometry(float* vertices, uint32_t* indices, uint32_t vertexCount, uint32_t indexCount) { +bool phonon_setGeometry(float* vertices, uint32_t* indices, uint32_t vertexCount, uint32_t indexCount, AudioMaterial material) { if (state.mesh) phonon_iplDestroyStaticMesh(&state.mesh); if (state.scene) phonon_iplDestroyScene(&state.scene); if (state.environment) phonon_iplDestroyEnvironment(&state.environment); if (state.environmentalRenderer) phonon_iplDestroyEnvironment(&state.environmentalRenderer); - IPLMaterial material = (IPLMaterial) { - .lowFreqAbsorption = .2f, - .midFreqAbsorption = .07f, - .highFreqAbsorption = .06f, - .scattering = .05f, - .lowFreqTransmission = .2f, - .midFreqTransmission = .025f, - .highFreqTransmission = .01f + IPLMaterial materials[] = { + [AUDIO_GENERIC] = { .10f, .20f, .30f, .05f, .100f, .050f, .030f }, + [AUDIO_BRICK] = { .03f, .04f, .07f, .05f, .015f, .015f, .015f }, + [AUDIO_CARPET] = { .24f, .69f, .73f, .05f, .020f, .005f, .003f }, + [AUDIO_CERAMIC] = { .01f, .02f, .02f, .05f, .060f, .044f, .011f }, + [AUDIO_CONCRETE] = { .05f, .07f, .08f, .05f, .015f, .002f, .001f }, + [AUDIO_GLASS] = { .06f, .03f, .02f, .05f, .060f, .044f, .011f }, + [AUDIO_GRAVEL] = { .60f, .70f, .80f, .05f, .031f, .012f, .008f }, + [AUDIO_METAL] = { .20f, .07f, .06f, .05f, .200f, .025f, .010f }, + [AUDIO_PLASTER] = { .12f, .06f, .04f, .05f, .056f, .056f, .004f }, + [AUDIO_ROCK] = { .13f, .20f, .24f, .05f, .015f, .002f, .001f }, + [AUDIO_WOOD] = { .11f, .07f, .06f, .05f, .070f, .014f, .005f } }; IPLSimulationSettings settings = (IPLSimulationSettings) { @@ -324,15 +328,18 @@ bool phonon_setGeometry(float* vertices, uint32_t* indices, uint32_t vertexCount .irradianceMinDistance = .1f }; - IPLint32* materials = malloc(indexCount / 3 * sizeof(IPLint32)); - if (!materials) goto fail; - memset(materials, 0, indexCount / 3 * sizeof(IPLint32)); + IPLint32* triangleMaterials = malloc(indexCount / 3 * sizeof(IPLint32)); + if (!triangleMaterials) goto fail; + + for (uint32_t i = 0; i < indexCount / 3; i++) { + triangleMaterials[i] = material; + } IPLerror status; - status = phonon_iplCreateScene(state.context, NULL, IPL_SCENETYPE_PHONON, 1, &material, NULL, NULL, NULL, NULL, NULL, &state.scene); + status = phonon_iplCreateScene(state.context, NULL, IPL_SCENETYPE_PHONON, 1, materials, NULL, NULL, NULL, NULL, NULL, &state.scene); if (status != IPL_STATUS_SUCCESS) goto fail; - status = phonon_iplCreateStaticMesh(state.scene, vertexCount, indexCount / 3, (IPLVector3*) vertices, (IPLTriangle*) indices, materials, &state.mesh); + status = phonon_iplCreateStaticMesh(state.scene, vertexCount, indexCount / 3, (IPLVector3*) vertices, (IPLTriangle*) indices, triangleMaterials, &state.mesh); if (status != IPL_STATUS_SUCCESS) goto fail; status = phonon_iplCreateEnvironment(state.context, NULL, settings, state.scene, NULL, &state.environment); diff --git a/src/modules/audio/spatializer_simple.c b/src/modules/audio/spatializer_simple.c index 6e46a9c7..bec3429a 100644 --- a/src/modules/audio/spatializer_simple.c +++ b/src/modules/audio/spatializer_simple.c @@ -51,7 +51,7 @@ void simple_spatializer_setListenerPose(float position[4], float orientation[4]) mat4_rotateQuat(state.listener, orientation); } -bool simple_setGeometry(float* vertices, uint32_t* indices, uint32_t vertexCount, uint32_t indexCount) { +bool simple_setGeometry(float* vertices, uint32_t* indices, uint32_t vertexCount, uint32_t indexCount, AudioMaterial material) { return false; }