mirror of https://github.com/bjornbytes/lovr.git
AudioMaterial;
This commit is contained in:
parent
d233d5ccd3
commit
cf4bb36d03
|
@ -75,6 +75,7 @@ typedef struct {
|
|||
|
||||
extern StringEntry lovrArcMode[];
|
||||
extern StringEntry lovrAttributeType[];
|
||||
extern StringEntry lovrAudioMaterial[];
|
||||
extern StringEntry lovrAudioType[];
|
||||
extern StringEntry lovrBlendAlphaMode[];
|
||||
extern StringEntry lovrBlendMode[];
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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() {
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue