mirror of https://github.com/bjornbytes/lovr.git
Projection matrices;
This commit is contained in:
parent
f531be3fc5
commit
435d7a9cf8
|
@ -10,24 +10,21 @@
|
||||||
#include <assimp/postprocess.h>
|
#include <assimp/postprocess.h>
|
||||||
#include "../headset/headset.h"
|
#include "../headset/headset.h"
|
||||||
|
|
||||||
typedef struct {
|
static GraphicsState state;
|
||||||
Shader* activeShader;
|
|
||||||
vec_mat4_t transforms;
|
|
||||||
mat4 lastTransform;
|
|
||||||
mat4 projection;
|
|
||||||
mat4 lastProjection;
|
|
||||||
} GraphicsState;
|
|
||||||
|
|
||||||
static GraphicsState graphicsState;
|
|
||||||
|
|
||||||
void lovrGraphicsInit() {
|
void lovrGraphicsInit() {
|
||||||
vec_init(&graphicsState.transforms);
|
vec_init(&state.transforms);
|
||||||
vec_push(&graphicsState.transforms, mat4_init());
|
vec_push(&state.transforms, mat4_init());
|
||||||
graphicsState.lastTransform = mat4_init();
|
|
||||||
memset(graphicsState.lastTransform, 0, 16);
|
state.projection = mat4_init();
|
||||||
graphicsState.projection = mat4_init();
|
state.lastTransform = mat4_init();
|
||||||
graphicsState.lastProjection = mat4_init();
|
state.lastProjection = mat4_init();
|
||||||
memset(graphicsState.lastProjection, 0, 16);
|
|
||||||
|
memset(state.lastTransform, 0, 16);
|
||||||
|
memset(state.lastProjection, 0, 16);
|
||||||
|
|
||||||
|
// TODO customize via lovr.conf
|
||||||
|
lovrGraphicsSetProjection(.1f, 100.f, 67 * M_PI / 180);
|
||||||
}
|
}
|
||||||
|
|
||||||
void lovrGraphicsClear(int color, int depth) {
|
void lovrGraphicsClear(int color, int depth) {
|
||||||
|
@ -55,8 +52,8 @@ void lovrGraphicsPrepare() {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
mat4 transform = vec_last(&graphicsState.transforms);
|
mat4 transform = vec_last(&state.transforms);
|
||||||
mat4 lastTransform = graphicsState.lastTransform;
|
mat4 lastTransform = state.lastTransform;
|
||||||
|
|
||||||
if (memcmp(transform, lastTransform, 16 * sizeof(float))) {
|
if (memcmp(transform, lastTransform, 16 * sizeof(float))) {
|
||||||
int uniformId = lovrShaderGetUniformId(shader, "lovrTransform");
|
int uniformId = lovrShaderGetUniformId(shader, "lovrTransform");
|
||||||
|
@ -64,8 +61,8 @@ void lovrGraphicsPrepare() {
|
||||||
memcpy(lastTransform, transform, 16 * sizeof(float));
|
memcpy(lastTransform, transform, 16 * sizeof(float));
|
||||||
}
|
}
|
||||||
|
|
||||||
mat4 projection = graphicsState.projection;
|
mat4 projection = state.projection;
|
||||||
mat4 lastProjection = graphicsState.lastProjection;
|
mat4 lastProjection = state.lastProjection;
|
||||||
|
|
||||||
if (memcmp(projection, lastProjection, 16 * sizeof(float))) {
|
if (memcmp(projection, lastProjection, 16 * sizeof(float))) {
|
||||||
int uniformId = lovrShaderGetUniformId(shader, "lovrProjection");
|
int uniformId = lovrShaderGetUniformId(shader, "lovrProjection");
|
||||||
|
@ -88,48 +85,55 @@ void lovrGraphicsSetClearColor(float r, float g, float b, float a) {
|
||||||
}
|
}
|
||||||
|
|
||||||
Shader* lovrGraphicsGetShader() {
|
Shader* lovrGraphicsGetShader() {
|
||||||
return graphicsState.activeShader;
|
return state.activeShader;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO default shader
|
// TODO default shader
|
||||||
void lovrGraphicsSetShader(Shader* shader) {
|
void lovrGraphicsSetShader(Shader* shader) {
|
||||||
graphicsState.activeShader = shader;
|
state.activeShader = shader;
|
||||||
glUseProgram(shader->id);
|
glUseProgram(shader->id);
|
||||||
}
|
}
|
||||||
|
|
||||||
void lovrGraphicsSetProjection(float near, float far, float fov, float aspect) {
|
void lovrGraphicsGetProjection(float* near, float* far, float* fov) {
|
||||||
mat4_setProjection(graphicsState.projection, near, far, fov, aspect);
|
float aspect;
|
||||||
|
mat4_getProjection(state.projection, near, far, fov, &aspect);
|
||||||
|
}
|
||||||
|
|
||||||
|
void lovrGraphicsSetProjection(float near, float far, float fov) {
|
||||||
|
int width, height;
|
||||||
|
glfwGetWindowSize(window, &width, &height);
|
||||||
|
mat4_setProjection(state.projection, near, far, fov, (float) width / height);
|
||||||
}
|
}
|
||||||
|
|
||||||
int lovrGraphicsPush() {
|
int lovrGraphicsPush() {
|
||||||
vec_mat4_t* transforms = &graphicsState.transforms;
|
vec_mat4_t* transforms = &state.transforms;
|
||||||
if (transforms->length >= 64) { return 1; }
|
if (transforms->length >= 64) { return 1; }
|
||||||
vec_push(transforms, mat4_copy(vec_last(transforms)));
|
vec_push(transforms, mat4_copy(vec_last(transforms)));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int lovrGraphicsPop() {
|
int lovrGraphicsPop() {
|
||||||
vec_mat4_t* transforms = &graphicsState.transforms;
|
vec_mat4_t* transforms = &state.transforms;
|
||||||
if (transforms->length <= 1) { return 1; }
|
if (transforms->length <= 1) { return 1; }
|
||||||
mat4_deinit(vec_pop(transforms));
|
mat4_deinit(vec_pop(transforms));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void lovrGraphicsOrigin() {
|
void lovrGraphicsOrigin() {
|
||||||
vec_mat4_t* transforms = &graphicsState.transforms;
|
vec_mat4_t* transforms = &state.transforms;
|
||||||
mat4_setIdentity(vec_last(transforms));
|
mat4_setIdentity(vec_last(transforms));
|
||||||
}
|
}
|
||||||
|
|
||||||
void lovrGraphicsTranslate(float x, float y, float z) {
|
void lovrGraphicsTranslate(float x, float y, float z) {
|
||||||
mat4_translate(vec_last(&graphicsState.transforms), x, y, z);
|
mat4_translate(vec_last(&state.transforms), x, y, z);
|
||||||
}
|
}
|
||||||
|
|
||||||
void lovrGraphicsRotate(float w, float x, float y, float z) {
|
void lovrGraphicsRotate(float w, float x, float y, float z) {
|
||||||
mat4_rotate(vec_last(&graphicsState.transforms), w, x, y, z);
|
mat4_rotate(vec_last(&state.transforms), w, x, y, z);
|
||||||
}
|
}
|
||||||
|
|
||||||
void lovrGraphicsScale(float x, float y, float z) {
|
void lovrGraphicsScale(float x, float y, float z) {
|
||||||
mat4_scale(vec_last(&graphicsState.transforms), x, y, z);
|
mat4_scale(vec_last(&state.transforms), x, y, z);
|
||||||
}
|
}
|
||||||
|
|
||||||
Buffer* lovrGraphicsNewBuffer(int size, BufferDrawMode drawMode, BufferUsage usage) {
|
Buffer* lovrGraphicsNewBuffer(int size, BufferDrawMode drawMode, BufferUsage usage) {
|
||||||
|
|
|
@ -6,6 +6,14 @@
|
||||||
#ifndef LOVR_GRAPHICS_TYPES
|
#ifndef LOVR_GRAPHICS_TYPES
|
||||||
#define LOVR_GRAPHICS_TYPES
|
#define LOVR_GRAPHICS_TYPES
|
||||||
typedef vec_t(mat4) vec_mat4_t;
|
typedef vec_t(mat4) vec_mat4_t;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
Shader* activeShader;
|
||||||
|
vec_mat4_t transforms;
|
||||||
|
mat4 lastTransform;
|
||||||
|
mat4 projection;
|
||||||
|
mat4 lastProjection;
|
||||||
|
} GraphicsState;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void lovrGraphicsInit();
|
void lovrGraphicsInit();
|
||||||
|
@ -16,7 +24,8 @@ void lovrGraphicsGetClearColor(float* r, float* g, float* b, float* a);
|
||||||
void lovrGraphicsSetClearColor(float r, float g, float b, float a);
|
void lovrGraphicsSetClearColor(float r, float g, float b, float a);
|
||||||
Shader* lovrGraphicsGetShader();
|
Shader* lovrGraphicsGetShader();
|
||||||
void lovrGraphicsSetShader(Shader* shader);
|
void lovrGraphicsSetShader(Shader* shader);
|
||||||
void lovrGraphicsSetProjection(float near, float far, float fov, float aspect);
|
void lovrGraphicsGetProjection(float* near, float* far, float* fov);
|
||||||
|
void lovrGraphicsSetProjection(float near, float far, float fov);
|
||||||
int lovrGraphicsPush();
|
int lovrGraphicsPush();
|
||||||
int lovrGraphicsPop();
|
int lovrGraphicsPop();
|
||||||
void lovrGraphicsOrigin();
|
void lovrGraphicsOrigin();
|
||||||
|
|
|
@ -7,20 +7,24 @@ void lovrHeadsetInit() {
|
||||||
headset = viveInit();
|
headset = viveInit();
|
||||||
}
|
}
|
||||||
|
|
||||||
void lovrHeadsetGetPosition(float* x, float* y, float* z) {
|
void lovrHeadsetGetAngularVelocity(float* x, float* y, float* z) {
|
||||||
headset->interface->getPosition(headset, x, y, z);
|
headset->interface->getAngularVelocity(headset, x, y, z);
|
||||||
|
}
|
||||||
|
|
||||||
|
void lovrHeadsetGetClipDistance(float* near, float* far) {
|
||||||
|
headset->interface->getClipDistance(headset, near, far);
|
||||||
}
|
}
|
||||||
|
|
||||||
void lovrHeadsetGetOrientation(float* x, float* y, float* z, float* w) {
|
void lovrHeadsetGetOrientation(float* x, float* y, float* z, float* w) {
|
||||||
headset->interface->getOrientation(headset, x, y, z, w);
|
headset->interface->getOrientation(headset, x, y, z, w);
|
||||||
}
|
}
|
||||||
|
|
||||||
void lovrHeadsetGetVelocity(float* x, float* y, float* z) {
|
void lovrHeadsetGetPosition(float* x, float* y, float* z) {
|
||||||
headset->interface->getVelocity(headset, x, y, z);
|
headset->interface->getPosition(headset, x, y, z);
|
||||||
}
|
}
|
||||||
|
|
||||||
void lovrHeadsetGetAngularVelocity(float* x, float* y, float* z) {
|
void lovrHeadsetGetVelocity(float* x, float* y, float* z) {
|
||||||
headset->interface->getAngularVelocity(headset, x, y, z);
|
headset->interface->getVelocity(headset, x, y, z);
|
||||||
}
|
}
|
||||||
|
|
||||||
int lovrHeadsetIsPresent() {
|
int lovrHeadsetIsPresent() {
|
||||||
|
@ -30,3 +34,7 @@ int lovrHeadsetIsPresent() {
|
||||||
void lovrHeadsetRenderTo(headsetRenderCallback callback, void* userdata) {
|
void lovrHeadsetRenderTo(headsetRenderCallback callback, void* userdata) {
|
||||||
headset->interface->renderTo(headset, callback, userdata);
|
headset->interface->renderTo(headset, callback, userdata);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void lovrHeadsetSetClipDistance(float near, float far) {
|
||||||
|
headset->interface->setClipDistance(headset, near, far);
|
||||||
|
}
|
||||||
|
|
|
@ -4,12 +4,14 @@ typedef void (*headsetRenderCallback)(int eyeIndex, void* userdata);
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
void (*getAngularVelocity)(void* headset, float* x, float* y, float* z);
|
void (*getAngularVelocity)(void* headset, float* x, float* y, float* z);
|
||||||
|
void (*getClipDistance)(void* headset, float* near, float* far);
|
||||||
void (*getOrientation)(void* headset, float* x, float* y, float* z, float* w);
|
void (*getOrientation)(void* headset, float* x, float* y, float* z, float* w);
|
||||||
void (*getPosition)(void* headset, float* x, float* y, float* z);
|
void (*getPosition)(void* headset, float* x, float* y, float* z);
|
||||||
const char* (*getType)(void* headset);
|
const char* (*getType)(void* headset);
|
||||||
void (*getVelocity)(void* headset, float* x, float* y, float* z);
|
void (*getVelocity)(void* headset, float* x, float* y, float* z);
|
||||||
int (*isPresent)(void* headset);
|
int (*isPresent)(void* headset);
|
||||||
void (*renderTo)(void* headset, headsetRenderCallback callback, void* userdata);
|
void (*renderTo)(void* headset, headsetRenderCallback callback, void* userdata);
|
||||||
|
void (*setClipDistance)(void* headset, float near, float far);
|
||||||
} HeadsetInterface;
|
} HeadsetInterface;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
@ -20,9 +22,11 @@ typedef struct {
|
||||||
|
|
||||||
void lovrHeadsetInit();
|
void lovrHeadsetInit();
|
||||||
void lovrHeadsetGetAngularVelocity(float* x, float* y, float* z);
|
void lovrHeadsetGetAngularVelocity(float* x, float* y, float* z);
|
||||||
|
void lovrHeadsetGetClipDistance(float* near, float* far);
|
||||||
void lovrHeadsetGetOrientation(float* x, float* y, float* z, float* w);
|
void lovrHeadsetGetOrientation(float* x, float* y, float* z, float* w);
|
||||||
void lovrHeadsetGetPosition(float* x, float* y, float* z);
|
void lovrHeadsetGetPosition(float* x, float* y, float* z);
|
||||||
const char* lovrHeadsetGetType();
|
const char* lovrHeadsetGetType();
|
||||||
void lovrHeadsetGetVelocity(float* x, float* y, float* z);
|
void lovrHeadsetGetVelocity(float* x, float* y, float* z);
|
||||||
int lovrHeadsetIsPresent();
|
int lovrHeadsetIsPresent();
|
||||||
void lovrHeadsetRenderTo(headsetRenderCallback callback, void* userdata);
|
void lovrHeadsetRenderTo(headsetRenderCallback callback, void* userdata);
|
||||||
|
void lovrHeadsetSetClipDistance(float near, float far);
|
||||||
|
|
|
@ -10,6 +10,9 @@ typedef struct {
|
||||||
|
|
||||||
unsigned int deviceIndex;
|
unsigned int deviceIndex;
|
||||||
|
|
||||||
|
float clipNear;
|
||||||
|
float clipFar;
|
||||||
|
|
||||||
uint32_t renderWidth;
|
uint32_t renderWidth;
|
||||||
uint32_t renderHeight;
|
uint32_t renderHeight;
|
||||||
|
|
||||||
|
@ -44,7 +47,7 @@ Headset* viveInit() {
|
||||||
}
|
}
|
||||||
|
|
||||||
EVRInitError vrError;
|
EVRInitError vrError;
|
||||||
uint32_t vrHandle = VR_InitInternal(&vrError, EVRApplicationType_VRApplication_Scene);
|
VR_InitInternal(&vrError, EVRApplicationType_VRApplication_Scene);
|
||||||
|
|
||||||
if (vrError != EVRInitError_VRInitError_None) {
|
if (vrError != EVRInitError_VRInitError_None) {
|
||||||
error("Problem initializing OpenVR");
|
error("Problem initializing OpenVR");
|
||||||
|
@ -127,6 +130,13 @@ void viveGetAngularVelocity(void* headset, float* x, float* y, float* z) {
|
||||||
*z = pose.vAngularVelocity.v[2];
|
*z = pose.vAngularVelocity.v[2];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void viveGetClipDistance(void* headset, float* near, float* far) {
|
||||||
|
Headset* this = (Headset*) headset;
|
||||||
|
ViveState* state = this->state;
|
||||||
|
*near = state->clipNear;
|
||||||
|
*far = state->clipFar;
|
||||||
|
}
|
||||||
|
|
||||||
// TODO convert matrix to quaternion!
|
// TODO convert matrix to quaternion!
|
||||||
void viveGetOrientation(void* headset, float* x, float* y, float *z, float* w) {
|
void viveGetOrientation(void* headset, float* x, float* y, float *z, float* w) {
|
||||||
*x = *y = *z = *w = 0.f;
|
*x = *y = *z = *w = 0.f;
|
||||||
|
@ -184,46 +194,32 @@ int viveIsPresent(void* headset) {
|
||||||
void viveRenderTo(void* headset, headsetRenderCallback callback, void* userdata) {
|
void viveRenderTo(void* headset, headsetRenderCallback callback, void* userdata) {
|
||||||
Headset* this = headset;
|
Headset* this = headset;
|
||||||
ViveState* state = this->state;
|
ViveState* state = this->state;
|
||||||
|
float headMatrix[16], eyeMatrix[16], projectionMatrix[16];
|
||||||
|
float (*matrix)[4];
|
||||||
|
EGraphicsAPIConvention graphicsConvention = EGraphicsAPIConvention_API_OpenGL;
|
||||||
TrackedDevicePose_t pose;
|
TrackedDevicePose_t pose;
|
||||||
|
|
||||||
state->vrCompositor->WaitGetPoses(&pose, 1, NULL, 0);
|
state->vrCompositor->WaitGetPoses(&pose, 1, NULL, 0);
|
||||||
|
matrix = pose.mDeviceToAbsoluteTracking.m;
|
||||||
float (*m)[4];
|
mat4_invert(mat4_fromMat34(headMatrix, matrix));
|
||||||
m = pose.mDeviceToAbsoluteTracking.m;
|
|
||||||
float headMatrix[16] = {
|
|
||||||
m[0][0], m[1][0], m[2][0], 0.0,
|
|
||||||
m[0][1], m[1][1], m[2][1], 0.0,
|
|
||||||
m[0][2], m[1][2], m[2][2], 0.0,
|
|
||||||
m[0][3], m[1][3], m[2][3], 1.0
|
|
||||||
};
|
|
||||||
|
|
||||||
mat4_invert(headMatrix);
|
|
||||||
|
|
||||||
for (int i = 0; i < 2; i++) {
|
for (int i = 0; i < 2; i++) {
|
||||||
EVREye eye = (i == 0) ? EVREye_Eye_Left : EVREye_Eye_Right;
|
EVREye eye = (i == 0) ? EVREye_Eye_Left : EVREye_Eye_Right;
|
||||||
|
|
||||||
m = state->vrSystem->GetEyeToHeadTransform(eye).m;
|
matrix = state->vrSystem->GetEyeToHeadTransform(eye).m;
|
||||||
float eyeMatrix[16] = {
|
mat4_invert(mat4_fromMat34(eyeMatrix, matrix));
|
||||||
m[0][0], m[1][0], m[2][0], 0.0,
|
|
||||||
m[0][1], m[1][1], m[2][1], 0.0,
|
|
||||||
m[0][2], m[1][2], m[2][2], 0.0,
|
|
||||||
m[0][3], m[1][3], m[2][3], 1.0
|
|
||||||
};
|
|
||||||
|
|
||||||
m = state->vrSystem->GetProjectionMatrix(eye, 0.1f, 30.0f, EGraphicsAPIConvention_API_OpenGL).m;
|
float near = state->clipNear;
|
||||||
float projectionMatrix[16] = {
|
float far = state->clipFar;
|
||||||
m[0][0], m[1][0], m[2][0], m[3][0],
|
matrix = state->vrSystem->GetProjectionMatrix(eye, near, far, graphicsConvention).m;
|
||||||
m[0][1], m[1][1], m[2][1], m[3][1],
|
mat4_fromMat44(projectionMatrix, matrix);
|
||||||
m[0][2], m[1][2], m[2][2], m[3][2],
|
|
||||||
m[0][3], m[1][3], m[2][3], m[3][3]
|
|
||||||
};
|
|
||||||
|
|
||||||
Shader* shader = lovrGraphicsGetShader();
|
Shader* shader = lovrGraphicsGetShader();
|
||||||
if (shader) {
|
if (shader) {
|
||||||
int lovrTransformId = lovrShaderGetUniformId(shader, "lovrTransform");
|
int lovrTransformId = lovrShaderGetUniformId(shader, "lovrTransform");
|
||||||
int lovrProjectionId = lovrShaderGetUniformId(shader, "lovrProjection");
|
int lovrProjectionId = lovrShaderGetUniformId(shader, "lovrProjection");
|
||||||
mat4 m = mat4_multiply(mat4_multiply(projectionMatrix, mat4_invert(eyeMatrix)), headMatrix);
|
mat4 transformMatrix = mat4_multiply(eyeMatrix, headMatrix);
|
||||||
lovrShaderSendFloatMat4(shader, lovrTransformId, m);
|
lovrShaderSendFloatMat4(shader, lovrTransformId, transformMatrix);
|
||||||
lovrShaderSendFloatMat4(shader, lovrProjectionId, projectionMatrix);
|
lovrShaderSendFloatMat4(shader, lovrProjectionId, projectionMatrix);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -243,8 +239,16 @@ void viveRenderTo(void* headset, headsetRenderCallback callback, void* userdata)
|
||||||
glBindFramebuffer(GL_READ_FRAMEBUFFER, 0);
|
glBindFramebuffer(GL_READ_FRAMEBUFFER, 0);
|
||||||
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
|
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
|
||||||
|
|
||||||
Texture_t eyeTexture = { (void*) state->resolveTexture, EGraphicsAPIConvention_API_OpenGL, EColorSpace_ColorSpace_Gamma };
|
Texture_t eyeTexture = { (void*) state->resolveTexture, graphicsConvention, EColorSpace_ColorSpace_Gamma };
|
||||||
EVRSubmitFlags flags = EVRSubmitFlags_Submit_Default;
|
EVRSubmitFlags flags = EVRSubmitFlags_Submit_Default;
|
||||||
state->vrCompositor->Submit(eye, &eyeTexture, NULL, flags);
|
state->vrCompositor->Submit(eye, &eyeTexture, NULL, flags);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void viveSetClipDistance(void* headset, float near, float far) {
|
||||||
|
Headset* this = (Headset*) headset;
|
||||||
|
ViveState* state = this->state;
|
||||||
|
state->clipNear = near;
|
||||||
|
state->clipFar = far;
|
||||||
|
// TODO recompute matrix (only if we're rendering?)
|
||||||
|
}
|
||||||
|
|
|
@ -4,9 +4,11 @@ typedef char bool;
|
||||||
|
|
||||||
Headset* viveInit();
|
Headset* viveInit();
|
||||||
void viveGetAngularVelocity(void* headset, float* x, float* y, float* z);
|
void viveGetAngularVelocity(void* headset, float* x, float* y, float* z);
|
||||||
|
void viveGetClipDistance(void* headset, float* near, float* far);
|
||||||
void viveGetOrientation(void* headset, float* x, float* y, float* z, float* w);
|
void viveGetOrientation(void* headset, float* x, float* y, float* z, float* w);
|
||||||
void viveGetPosition(void* headset, float* x, float* y, float* z);
|
void viveGetPosition(void* headset, float* x, float* y, float* z);
|
||||||
const char* viveGetType(void* headset);
|
const char* viveGetType(void* headset);
|
||||||
void viveGetVelocity(void* headset, float* x, float* y, float* z);
|
void viveGetVelocity(void* headset, float* x, float* y, float* z);
|
||||||
int viveIsPresent(void* headset);
|
int viveIsPresent(void* headset);
|
||||||
void viveRenderTo(void* headset, headsetRenderCallback callback, void* userdata);
|
void viveRenderTo(void* headset, headsetRenderCallback callback, void* userdata);
|
||||||
|
void viveSetClipDistance(void* headset, float near, float far);
|
||||||
|
|
|
@ -11,6 +11,7 @@ const luaL_Reg lovrGraphics[] = {
|
||||||
{ "getClearColor", l_lovrGraphicsGetClearColor },
|
{ "getClearColor", l_lovrGraphicsGetClearColor },
|
||||||
{ "setClearColor", l_lovrGraphicsSetClearColor },
|
{ "setClearColor", l_lovrGraphicsSetClearColor },
|
||||||
{ "setShader", l_lovrGraphicsSetShader },
|
{ "setShader", l_lovrGraphicsSetShader },
|
||||||
|
{ "getProjection", l_lovrGraphicsGetProjection },
|
||||||
{ "setProjection", l_lovrGraphicsSetProjection },
|
{ "setProjection", l_lovrGraphicsSetProjection },
|
||||||
{ "push", l_lovrGraphicsPush },
|
{ "push", l_lovrGraphicsPush },
|
||||||
{ "pop", l_lovrGraphicsPop },
|
{ "pop", l_lovrGraphicsPop },
|
||||||
|
@ -91,12 +92,20 @@ int l_lovrGraphicsSetShader(lua_State* L) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int l_lovrGraphicsGetProjection(lua_State* L) {
|
||||||
|
float near, far, fov;
|
||||||
|
lovrGraphicsGetProjection(&near, &far, &fov);
|
||||||
|
lua_pushnumber(L, near);
|
||||||
|
lua_pushnumber(L, far);
|
||||||
|
lua_pushnumber(L, fov);
|
||||||
|
return 3;
|
||||||
|
}
|
||||||
|
|
||||||
int l_lovrGraphicsSetProjection(lua_State* L) {
|
int l_lovrGraphicsSetProjection(lua_State* L) {
|
||||||
float near = luaL_checknumber(L, 1);
|
float near = luaL_checknumber(L, 1);
|
||||||
float far = luaL_checknumber(L, 2);
|
float far = luaL_checknumber(L, 2);
|
||||||
float fov = luaL_checknumber(L, 3);
|
float fov = luaL_checknumber(L, 3);
|
||||||
float aspect = luaL_checknumber(L, 4);
|
lovrGraphicsSetProjection(near, far, fov);
|
||||||
lovrGraphicsSetProjection(near, far, fov, aspect);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -14,6 +14,7 @@ int l_lovrGraphicsGetClearColor(lua_State* L);
|
||||||
int l_lovrGraphicsSetClearColor(lua_State* L);
|
int l_lovrGraphicsSetClearColor(lua_State* L);
|
||||||
int l_lovrGraphicsGetShader(lua_State* L);
|
int l_lovrGraphicsGetShader(lua_State* L);
|
||||||
int l_lovrGraphicsSetShader(lua_State* L);
|
int l_lovrGraphicsSetShader(lua_State* L);
|
||||||
|
int l_lovrGraphicsGetProjection(lua_State* L);
|
||||||
int l_lovrGraphicsSetProjection(lua_State* L);
|
int l_lovrGraphicsSetProjection(lua_State* L);
|
||||||
int l_lovrGraphicsPush(lua_State* L);
|
int l_lovrGraphicsPush(lua_State* L);
|
||||||
int l_lovrGraphicsPop(lua_State* L);
|
int l_lovrGraphicsPop(lua_State* L);
|
||||||
|
|
|
@ -10,12 +10,14 @@ void renderHelper(int eyeIndex, void* userdata) {
|
||||||
}
|
}
|
||||||
|
|
||||||
const luaL_Reg lovrHeadset[] = {
|
const luaL_Reg lovrHeadset[] = {
|
||||||
{ "getPosition", l_lovrHeadsetGetPosition },
|
|
||||||
{ "getOrientation", l_lovrHeadsetGetPosition },
|
|
||||||
{ "getVelocity", l_lovrHeadsetGetVelocity },
|
|
||||||
{ "getAngularVelocity", l_lovrHeadsetGetAngularVelocity },
|
{ "getAngularVelocity", l_lovrHeadsetGetAngularVelocity },
|
||||||
|
{ "getClipDistance", l_lovrHeadsetGetClipDistance },
|
||||||
|
{ "getOrientation", l_lovrHeadsetGetPosition },
|
||||||
|
{ "getPosition", l_lovrHeadsetGetPosition },
|
||||||
|
{ "getVelocity", l_lovrHeadsetGetVelocity },
|
||||||
{ "isPresent", l_lovrHeadsetIsPresent },
|
{ "isPresent", l_lovrHeadsetIsPresent },
|
||||||
{ "renderTo", l_lovrHeadsetRenderTo },
|
{ "renderTo", l_lovrHeadsetRenderTo },
|
||||||
|
{ "setClipDistance", l_lovrHeadsetSetClipDistance },
|
||||||
{ NULL, NULL }
|
{ NULL, NULL }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -35,6 +37,14 @@ int l_lovrHeadsetGetAngularVelocity(lua_State* L) {
|
||||||
return 3;
|
return 3;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int l_lovrHeadsetGetClipDistance(lua_State* L) {
|
||||||
|
float near, far;
|
||||||
|
lovrHeadsetGetClipDistance(&near, &far);
|
||||||
|
lua_pushnumber(L, near);
|
||||||
|
lua_pushnumber(L, far);
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
|
||||||
int l_lovrHeadsetGetOrientation(lua_State* L) {
|
int l_lovrHeadsetGetOrientation(lua_State* L) {
|
||||||
float x, y, z, w;
|
float x, y, z, w;
|
||||||
lovrHeadsetGetOrientation(&x, &y, &z, &w);
|
lovrHeadsetGetOrientation(&x, &y, &z, &w);
|
||||||
|
@ -73,3 +83,11 @@ int l_lovrHeadsetRenderTo(lua_State* L) {
|
||||||
lovrHeadsetRenderTo(renderHelper, L);
|
lovrHeadsetRenderTo(renderHelper, L);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int l_lovrHeadsetSetClipDistance(lua_State* L) {
|
||||||
|
float near = luaL_checknumber(L, 1);
|
||||||
|
float far = luaL_checknumber(L, 2);
|
||||||
|
lovrHeadsetSetClipDistance(near, far);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -4,9 +4,11 @@
|
||||||
|
|
||||||
extern const luaL_Reg lovrHeadset[];
|
extern const luaL_Reg lovrHeadset[];
|
||||||
int l_lovrHeadsetInit(lua_State* L);
|
int l_lovrHeadsetInit(lua_State* L);
|
||||||
int l_lovrHeadsetGetPosition(lua_State* L);
|
|
||||||
int l_lovrHeadsetGetOrientation(lua_State* L);
|
|
||||||
int l_lovrHeadsetGetVelocity(lua_State* L);
|
|
||||||
int l_lovrHeadsetGetAngularVelocity(lua_State* L);
|
int l_lovrHeadsetGetAngularVelocity(lua_State* L);
|
||||||
|
int l_lovrHeadsetGetClipDistance(lua_State* L);
|
||||||
|
int l_lovrHeadsetGetOrientation(lua_State* L);
|
||||||
|
int l_lovrHeadsetGetPosition(lua_State* L);
|
||||||
|
int l_lovrHeadsetGetVelocity(lua_State* L);
|
||||||
int l_lovrHeadsetIsPresent(lua_State* L);
|
int l_lovrHeadsetIsPresent(lua_State* L);
|
||||||
int l_lovrHeadsetRenderTo(lua_State* L);
|
int l_lovrHeadsetRenderTo(lua_State* L);
|
||||||
|
int l_lovrHeadsetSetClipDistance(lua_State* L);
|
||||||
|
|
44
src/matrix.c
44
src/matrix.c
|
@ -21,6 +21,46 @@ mat4 mat4_copy(mat4 source) {
|
||||||
return matrix;
|
return matrix;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mat4 mat4_fromMat34(mat4 matrix, float (*source)[4]) {
|
||||||
|
matrix[0] = source[0][0];
|
||||||
|
matrix[1] = source[1][0];
|
||||||
|
matrix[2] = source[2][0];
|
||||||
|
matrix[3] = 0.f;
|
||||||
|
matrix[4] = source[0][1];
|
||||||
|
matrix[5] = source[1][1];
|
||||||
|
matrix[6] = source[2][1];
|
||||||
|
matrix[7] = 0.f;
|
||||||
|
matrix[8] = source[0][2];
|
||||||
|
matrix[9] = source[1][2];
|
||||||
|
matrix[10] = source[2][2];
|
||||||
|
matrix[11] = 0.f;
|
||||||
|
matrix[12] = source[0][3];
|
||||||
|
matrix[13] = source[1][3];
|
||||||
|
matrix[14] = source[2][3];
|
||||||
|
matrix[15] = 1.f;
|
||||||
|
return matrix;
|
||||||
|
}
|
||||||
|
|
||||||
|
mat4 mat4_fromMat44(mat4 matrix, float (*source)[4]) {
|
||||||
|
matrix[0] = source[0][0];
|
||||||
|
matrix[1] = source[1][0];
|
||||||
|
matrix[2] = source[2][0];
|
||||||
|
matrix[3] = source[3][0];
|
||||||
|
matrix[4] = source[0][1];
|
||||||
|
matrix[5] = source[1][1];
|
||||||
|
matrix[6] = source[2][1];
|
||||||
|
matrix[7] = source[3][1];
|
||||||
|
matrix[8] = source[0][2];
|
||||||
|
matrix[9] = source[1][2];
|
||||||
|
matrix[10] = source[2][2];
|
||||||
|
matrix[11] = source[3][2];
|
||||||
|
matrix[12] = source[0][3];
|
||||||
|
matrix[13] = source[1][3];
|
||||||
|
matrix[14] = source[2][3];
|
||||||
|
matrix[15] = source[3][3];
|
||||||
|
return matrix;
|
||||||
|
}
|
||||||
|
|
||||||
void mat4_deinit(mat4 matrix) {
|
void mat4_deinit(mat4 matrix) {
|
||||||
free(matrix);
|
free(matrix);
|
||||||
}
|
}
|
||||||
|
@ -77,6 +117,10 @@ mat4 mat4_setProjection(mat4 matrix, float near, float far, float fov, float asp
|
||||||
return matrix;
|
return matrix;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void mat4_getProjection(mat4 matrix, float* near, float* far, float* fov, float* aspect) {
|
||||||
|
*near = *far = *fov = *aspect = 0.f;
|
||||||
|
}
|
||||||
|
|
||||||
mat4 mat4_translate(mat4 matrix, float x, float y, float z) {
|
mat4 mat4_translate(mat4 matrix, float x, float y, float z) {
|
||||||
float translation[16];
|
float translation[16];
|
||||||
mat4_setTranslation(translation, x, y, z);
|
mat4_setTranslation(translation, x, y, z);
|
||||||
|
|
|
@ -3,11 +3,14 @@ typedef float* mat4;
|
||||||
mat4 mat4_init();
|
mat4 mat4_init();
|
||||||
void mat4_deinit(mat4 matrix);
|
void mat4_deinit(mat4 matrix);
|
||||||
mat4 mat4_copy(mat4 source);
|
mat4 mat4_copy(mat4 source);
|
||||||
|
mat4 mat4_fromMat34(mat4 matrix, float (*source)[4]);
|
||||||
|
mat4 mat4_fromMat44(mat4 matrix, float (*source)[4]);
|
||||||
mat4 mat4_setIdentity(mat4 matrix);
|
mat4 mat4_setIdentity(mat4 matrix);
|
||||||
mat4 mat4_setTranslation(mat4 matrix, float x, float y, float z);
|
mat4 mat4_setTranslation(mat4 matrix, float x, float y, float z);
|
||||||
mat4 mat4_setRotation(mat4 matrix, float w, float x, float y, float z);
|
mat4 mat4_setRotation(mat4 matrix, float w, float x, float y, float z);
|
||||||
mat4 mat4_setScale(mat4 matrix, float x, float y, float z);
|
mat4 mat4_setScale(mat4 matrix, float x, float y, float z);
|
||||||
mat4 mat4_setProjection(mat4 matrix, float near, float far, float fov, float aspect);
|
mat4 mat4_setProjection(mat4 matrix, float near, float far, float fov, float aspect);
|
||||||
|
void mat4_getProjection(mat4 matrix, float* near, float* far, float* fov, float* aspect);
|
||||||
mat4 mat4_translate(mat4 matrix, float x, float y, float z);
|
mat4 mat4_translate(mat4 matrix, float x, float y, float z);
|
||||||
mat4 mat4_rotate(mat4 matrix, float w, float x, float y, float z);
|
mat4 mat4_rotate(mat4 matrix, float w, float x, float y, float z);
|
||||||
mat4 mat4_scale(mat4 matrix, float x, float y, float z);
|
mat4 mat4_scale(mat4 matrix, float x, float y, float z);
|
||||||
|
|
Loading…
Reference in New Issue