1
0
Fork 0
mirror of https://github.com/bjornbytes/lovr.git synced 2024-07-05 05:53:33 +00:00
lovr/src/headset/webvr.c
2019-05-12 22:23:28 -07:00

70 lines
2.9 KiB
C

#include "headset/headset.h"
#include "graphics/graphics.h"
#include <stdbool.h>
// Provided by resources/lovr.js
extern bool webvr_init(float offset, int msaa);
extern void webvr_destroy(void);
extern bool webvr_getName(char* name, size_t length);
extern HeadsetOrigin webvr_getOriginType(void);
extern void webvr_getDisplayDimensions(uint32_t* width, uint32_t* height);
extern void webvr_getClipDistance(float* near, float* far);
extern void webvr_setClipDistance(float near, float far);
extern void webvr_getBoundsDimensions(float* width, float* depth);
extern const float* webvr_getBoundsGeometry(int* count);
extern bool webvr_getPose(Device device, float* position, float* orientation);
extern bool webvr_getBonePose(Device device, DeviceBone bone, float* position, float* orientation);
extern bool webvr_getVelocity(Device device, float* velocity, float* angularVelocity);
extern bool webvr_getAcceleration(Device device, float* acceleration, float* angularAcceleration);
extern bool webvr_isDown(Device device, DeviceButton button, bool* down);
extern bool webvr_isTouched(Device device, DeviceButton button, bool* touched);
extern bool webvr_getAxis(Device device, DeviceAxis axis, float* value);
extern bool webvr_vibrate(Device device, float strength, float duration, float frequency);
extern struct ModelData* webvr_newModelData(Device device);
extern void webvr_update(float dt);
static struct {
void (*renderCallback)(void*);
void* renderData;
} state;
static void webvr_onAnimationFrame(float* leftView, float* rightView, float* leftProjection, float* rightProjection) {
Camera camera = { .canvas = NULL, .stereo = true };
memcpy(camera.projection[0], leftProjection, 16 * sizeof(float));
memcpy(camera.projection[1], rightProjection, 16 * sizeof(float));
memcpy(camera.viewMatrix[0], leftView, 16 * sizeof(float));
memcpy(camera.viewMatrix[1], rightView, 16 * sizeof(float));
lovrGraphicsSetCamera(&camera, true);
state.renderCallback(state.renderData);
lovrGraphicsSetCamera(NULL, false);
}
void webvr_renderTo(void (*callback)(void*), void* userdata) {
state.renderCallback = callback;
state.renderData = userdata;
}
HeadsetInterface lovrHeadsetWebVRDriver = {
.driverType = DRIVER_WEBVR,
.init = webvr_init,
.destroy = webvr_destroy,
.getName = webvr_getName,
.getOriginType = webvr_getOriginType,
.getDisplayDimensions = webvr_getDisplayDimensions,
.getClipDistance = webvr_getClipDistance,
.setClipDistance = webvr_setClipDistance,
.getBoundsDimensions = webvr_getBoundsDimensions,
.getBoundsGeometry = webvr_getBoundsGeometry,
.getPose = webvr_getPose,
.getBonePose = webvr_getBonePose,
.getVelocity = webvr_getVelocity,
.getAcceleration = webvr_getAcceleration,
.isDown = webvr_isDown,
.isTouched = webvr_isTouched,
.getAxis = webvr_getAxis,
.vibrate = webvr_vibrate,
.newModelData = webvr_newModelData,
.renderTo = webvr_renderTo,
.update = webvr_update
};