lovr.headset.getDisplayMask;

This commit is contained in:
bjorn 2019-06-28 00:13:30 -07:00
parent 79a19ef267
commit d87fc56b63
9 changed files with 74 additions and 0 deletions

View File

@ -181,6 +181,30 @@ static int l_lovrHeadsetGetDisplayDimensions(lua_State* L) {
return 2;
}
static int l_lovrHeadsetGetDisplayMask(lua_State* L) {
uint32_t count;
const float* points = lovrHeadsetDriver->getDisplayMask(&count);
if (!points) {
lua_pushnil(L);
return 1;
}
lua_createtable(L, count, 0);
for (uint32_t i = 0; i < count; i += 2) {
lua_createtable(L, 2, 0);
lua_pushnumber(L, points[i + 0]);
lua_rawseti(L, -2, 1);
lua_pushnumber(L, points[i + 1]);
lua_rawseti(L, -2, 2);
lua_rawseti(L, -2, i / 2 + 1);
}
return 1;
}
static int l_lovrHeadsetGetClipDistance(lua_State* L) {
float clipNear, clipFar;
lovrHeadsetDriver->getClipDistance(&clipNear, &clipFar);
@ -579,6 +603,7 @@ static const luaL_Reg lovrHeadset[] = {
{ "getDisplayWidth", l_lovrHeadsetGetDisplayWidth },
{ "getDisplayHeight", l_lovrHeadsetGetDisplayHeight },
{ "getDisplayDimensions", l_lovrHeadsetGetDisplayDimensions },
{ "getDisplayMask", l_lovrHeadsetGetDisplayMask },
{ "getClipDistance", l_lovrHeadsetGetClipDistance },
{ "setClipDistance", l_lovrHeadsetSetClipDistance },
{ "getBoundsWidth", l_lovrHeadsetGetBoundsWidth },

View File

@ -53,6 +53,10 @@ static void desktop_getDisplayDimensions(uint32_t* width, uint32_t* height) {
*height = (uint32_t) h;
}
static const float* desktop_getDisplayMask(uint32_t* count) {
return *count = 0, NULL;
}
static void desktop_getClipDistance(float* clipNear, float* clipFar) {
*clipNear = state.clipNear;
*clipFar = state.clipFar;
@ -209,6 +213,7 @@ HeadsetInterface lovrHeadsetDesktopDriver = {
.getName = desktop_getName,
.getOriginType = desktop_getOriginType,
.getDisplayDimensions = desktop_getDisplayDimensions,
.getDisplayMask = desktop_getDisplayMask,
.getClipDistance = desktop_getClipDistance,
.setClipDistance = desktop_setClipDistance,
.getBoundsDimensions = desktop_getBoundsDimensions,

View File

@ -92,6 +92,7 @@ typedef struct HeadsetInterface {
bool (*getName)(char* name, size_t length);
HeadsetOrigin (*getOriginType)(void);
void (*getDisplayDimensions)(uint32_t* width, uint32_t* height);
const float* (*getDisplayMask)(uint32_t* count);
double (*getDisplayTime)(void);
void (*getClipDistance)(float* clipNear, float* clipFar);
void (*setClipDistance)(float clipNear, float clipFar);

View File

@ -137,6 +137,10 @@ static void oculus_getDisplayDimensions(uint32_t* width, uint32_t* height) {
*height = size.h;
}
static const float* oculus_getDisplayMask(uint32_t* count) {
return *count = 0, NULL;
}
static double oculus_getDisplayTime(void) {
return ovr_GetPredictedDisplayTime(state.session, 0);
}
@ -409,6 +413,7 @@ HeadsetInterface lovrHeadsetOculusDriver = {
.getName = oculus_getName,
.getOriginType = oculus_getOriginType,
.getDisplayDimensions = oculus_getDisplayDimensions,
.getDisplayMask = oculus_getDisplayMask,
.getDisplayTime = oculus_getDisplayTime,
.getClipDistance = oculus_getClipDistance,
.setClipDistance = oculus_setClipDistance,

View File

@ -58,6 +58,10 @@ static void vrapi_getDisplayDimensions(uint32_t* width, uint32_t* height) {
*height = bridgeLovrMobileData.displayDimensions.height;
}
static const float* vrapi_getDisplayMask(uint32_t* count) {
return *count = 0, NULL;
}
static void vrapi_getClipDistance(float* clipNear, float* clipFar) {
// TODO
}
@ -255,6 +259,7 @@ HeadsetInterface lovrHeadsetOculusMobileDriver = {
.getName = vrapi_getName,
.getOriginType = vrapi_getOriginType,
.getDisplayDimensions = vrapi_getDisplayDimensions,
.getDisplayMask = vrapi_getDisplayMask,
.getClipDistance = vrapi_getClipDistance,
.setClipDistance = vrapi_setClipDistance,
.getBoundsDimensions = vrapi_getBoundsDimensions,

View File

@ -86,6 +86,7 @@ static struct {
RenderModel_t* deviceModels[16];
RenderModel_TextureMap_t* deviceTextures[16];
Canvas* canvas;
float* mask;
float boundsGeometry[16];
float clipNear;
float clipFar;
@ -221,6 +222,7 @@ static void openvr_destroy(void) {
state.deviceTextures[i] = NULL;
}
VR_ShutdownInternal();
free(state.mask);
memset(&state, 0, sizeof(state));
}
@ -242,6 +244,24 @@ static void openvr_getDisplayDimensions(uint32_t* width, uint32_t* height) {
state.system->GetRecommendedRenderTargetSize(width, height);
}
static const float* openvr_getDisplayMask(uint32_t* count) {
struct HiddenAreaMesh_t hiddenAreaMesh = state.system->GetHiddenAreaMesh(EVREye_Eye_Left, EHiddenAreaMeshType_k_eHiddenAreaMesh_Standard);
if (hiddenAreaMesh.unTriangleCount == 0) {
return *count = 0, NULL;
}
state.mask = realloc(state.mask, hiddenAreaMesh.unTriangleCount * 3 * 2 * sizeof(float));
lovrAssert(state.mask, "Out of memory");
for (uint32_t i = 0; i < 3 * hiddenAreaMesh.unTriangleCount; i++) {
state.mask[2 * i + 0] = hiddenAreaMesh.pVertexData[i].v[0];
state.mask[2 * i + 1] = hiddenAreaMesh.pVertexData[i].v[1];
}
return *count = hiddenAreaMesh.unTriangleCount * 3 * 2, state.mask;
}
static double openvr_getDisplayTime(void) {
float secondsSinceVsync;
state.system->GetTimeSinceLastVsync(&secondsSinceVsync, NULL);
@ -592,6 +612,7 @@ HeadsetInterface lovrHeadsetOpenVRDriver = {
.getName = openvr_getName,
.getOriginType = openvr_getOriginType,
.getDisplayDimensions = openvr_getDisplayDimensions,
.getDisplayMask = openvr_getDisplayMask,
.getDisplayTime = openvr_getDisplayTime,
.getClipDistance = openvr_getClipDistance,
.setClipDistance = openvr_setClipDistance,

View File

@ -389,6 +389,10 @@ static void openxr_getDisplayDimensions(uint32_t* width, uint32_t* height) {
*height = state.height;
}
static const float* openxr_getDisplayMask(uint32_t* count) {
return *count = 0, NULL;
}
static double openxr_getDisplayTime(void) {
return state.displayTime / 1e9;
}
@ -664,6 +668,7 @@ HeadsetInterface lovrHeadsetOpenXRDriver = {
.getName = openxr_getName,
.getOriginType = openxr_getOriginType,
.getDisplayDimensions = openxr_getDisplayDimensions,
.getDisplayMask = openxr_getDisplayMask,
.getDisplayTime = openxr_getDisplayTime,
.getClipDistance = openxr_getClipDistance,
.setClipDistance = openxr_setClipDistance,

View File

@ -8,6 +8,7 @@ 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 const float* webvr_getDisplayMask(uint32_t* count);
extern void webvr_getClipDistance(float* near, float* far);
extern void webvr_setClipDistance(float near, float far);
extern void webvr_getBoundsDimensions(float* width, float* depth);
@ -51,6 +52,7 @@ HeadsetInterface lovrHeadsetWebVRDriver = {
.getName = webvr_getName,
.getOriginType = webvr_getOriginType,
.getDisplayDimensions = webvr_getDisplayDimensions,
.getDisplayMask = webvr_getDisplayMask,
.getClipDistance = webvr_getClipDistance,
.setClipDistance = webvr_setClipDistance,
.getBoundsDimensions = webvr_getBoundsDimensions,

View File

@ -128,6 +128,11 @@ var LibraryLOVR = {
HEAPU32[height >> 2] = webvr.height;
},
webvr_getDisplayMask: function(count) {
HEAPU32[count >> 2] = 0;
return 0;
},
webvr_getClipDistance: function(clipNear, clipFar) {
HEAPF32[clipNear >> 2] = webvr.display.depthNear;
HEAPF32[clipFar >> 2] = webvr.display.depthFar;