AudioMaterial;

This commit is contained in:
bjorn 2021-02-28 15:27:20 -07:00
parent d233d5ccd3
commit cf4bb36d03
8 changed files with 60 additions and 22 deletions

View File

@ -75,6 +75,7 @@ typedef struct {
extern StringEntry lovrArcMode[];
extern StringEntry lovrAttributeType[];
extern StringEntry lovrAudioMaterial[];
extern StringEntry lovrAudioType[];
extern StringEntry lovrBlendAlphaMode[];
extern StringEntry lovrBlendMode[];

View File

@ -6,6 +6,21 @@
#include "core/util.h"
#include <stdlib.h>
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);

View File

@ -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() {

View File

@ -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);

View File

@ -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;

View File

@ -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;
}

View File

@ -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);

View File

@ -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;
}