diff --git a/src/audio/audio.c b/src/audio/audio.c index 8d4a285f..11a0ad3e 100644 --- a/src/audio/audio.c +++ b/src/audio/audio.c @@ -31,8 +31,9 @@ void lovrAudioInit() { state.device = device; state.context = context; vec_init(&state.sources); - vec3_set(state.position, 0, 0, 0); quat_set(state.orientation, 0, 0, 0, -1); + vec3_set(state.position, 0, 0, 0); + vec3_set(state.velocity, 0, 0, 0); atexit(lovrAudioDestroy); } @@ -82,6 +83,12 @@ void lovrAudioGetPosition(float* x, float* y, float* z) { *z = state.position[2]; } +void lovrAudioGetVelocity(float* x, float* y, float* z) { + *x = state.velocity[0]; + *y = state.velocity[1]; + *z = state.velocity[2]; +} + float lovrAudioGetVolume() { float volume; alGetListenerf(AL_GAIN, &volume); @@ -135,6 +142,11 @@ void lovrAudioSetPosition(float x, float y, float z) { alListener3f(AL_POSITION, x, y, z); } +void lovrAudioSetVelocity(float x, float y, float z) { + vec3_set(state.velocity, x, y, z); + alListener3f(AL_VELOCITY, x, y, z); +} + void lovrAudioSetVolume(float volume) { alListenerf(AL_GAIN, volume); } diff --git a/src/audio/audio.h b/src/audio/audio.h index 42fe56dd..406d37ab 100644 --- a/src/audio/audio.h +++ b/src/audio/audio.h @@ -10,8 +10,9 @@ typedef struct { ALCdevice* device; ALCcontext* context; vec_void_t sources; - float position[3]; float orientation[4]; + float position[3]; + float velocity[4]; } AudioState; void lovrAudioInit(); @@ -20,6 +21,7 @@ void lovrAudioUpdate(); void lovrAudioAdd(Source* source); void lovrAudioGetOrientation(float* angle, float* ax, float* ay, float* az); void lovrAudioGetPosition(float* x, float* y, float* z); +void lovrAudioGetVelocity(float* x, float* y, float* z); float lovrAudioGetVolume(); int lovrAudioHas(Source* source); void lovrAudioPause(); @@ -27,5 +29,6 @@ void lovrAudioResume(); void lovrAudioRewind(); void lovrAudioSetOrientation(float angle, float ax, float ay, float az); void lovrAudioSetPosition(float x, float y, float z); +void lovrAudioSetVelocity(float x, float y, float z); void lovrAudioSetVolume(float volume); void lovrAudioStop(); diff --git a/src/lovr.c b/src/lovr.c index f02a3f27..4f2594b3 100644 --- a/src/lovr.c +++ b/src/lovr.c @@ -133,8 +133,9 @@ void lovrInit(lua_State* L, int argc, char** argv) { " if lovr.audio then " " lovr.audio.update() " " if lovr.headset and lovr.headset.isPresent() then " - " lovr.audio.setPosition(lovr.headset.getPosition()) " " lovr.audio.setOrientation(lovr.headset.getOrientation()) " + " lovr.audio.setPosition(lovr.headset.getPosition()) " + " lovr.audio.setVelocity(lovr.headset.getVelocity()) " " end " " end " " if lovr.update then lovr.update(dt) end " diff --git a/src/lovr/audio.c b/src/lovr/audio.c index b9d6dd59..0f87e5a7 100644 --- a/src/lovr/audio.c +++ b/src/lovr/audio.c @@ -9,6 +9,7 @@ const luaL_Reg lovrAudio[] = { { "update", l_lovrAudioUpdate }, { "getOrientation", l_lovrAudioGetOrientation }, { "getPosition", l_lovrAudioGetPosition }, + { "getVelocity", l_lovrAudioGetVelocity }, { "getVolume", l_lovrAudioGetVolume }, { "newSource", l_lovrAudioNewSource }, { "pause", l_lovrAudioPause }, @@ -16,6 +17,7 @@ const luaL_Reg lovrAudio[] = { { "rewind", l_lovrAudioRewind }, { "setOrientation", l_lovrAudioSetOrientation }, { "setPosition", l_lovrAudioSetPosition }, + { "setVelocity", l_lovrAudioSetVelocity }, { "setVolume", l_lovrAudioSetVolume }, { "stop", l_lovrAudioStop }, { NULL, NULL } @@ -58,6 +60,15 @@ int l_lovrAudioGetPosition(lua_State* L) { return 3; } +int l_lovrAudioGetVelocity(lua_State* L) { + float x, y, z; + lovrAudioGetVelocity(&x, &y, &z); + lua_pushnumber(L, x); + lua_pushnumber(L, y); + lua_pushnumber(L, z); + return 3; +} + int l_lovrAudioGetVolume(lua_State* L) { lua_pushnumber(L, lovrAudioGetVolume()); return 1; @@ -114,6 +125,14 @@ int l_lovrAudioSetPosition(lua_State* L) { return 0; } +int l_lovrAudioSetVelocity(lua_State* L) { + float x = luaL_checknumber(L, 1); + float y = luaL_checknumber(L, 2); + float z = luaL_checknumber(L, 3); + lovrAudioSetVelocity(x, y, z); + return 0; +} + int l_lovrAudioSetVolume(lua_State* L) { float volume = luaL_checknumber(L, 1); lovrAudioSetVolume(volume); diff --git a/src/lovr/audio.h b/src/lovr/audio.h index bc73a8af..dfab7bfd 100644 --- a/src/lovr/audio.h +++ b/src/lovr/audio.h @@ -8,6 +8,7 @@ int l_lovrAudioInit(lua_State* L); int l_lovrAudioUpdate(lua_State* L); int l_lovrAudioGetOrientation(lua_State* L); int l_lovrAudioGetPosition(lua_State* L); +int l_lovrAudioGetVelocity(lua_State* L); int l_lovrAudioGetVolume(lua_State* L); int l_lovrAudioNewSource(lua_State* L); int l_lovrAudioPause(lua_State* L); @@ -15,5 +16,6 @@ int l_lovrAudioResume(lua_State* L); int l_lovrAudioRewind(lua_State* L); int l_lovrAudioSetOrientation(lua_State* L); int l_lovrAudioSetPosition(lua_State* L); +int l_lovrAudioSetVelocity(lua_State* L); int l_lovrAudioSetVolume(lua_State* L); int l_lovrAudioStop(lua_State* L);