This commit is contained in:
bjornbytes 2018-05-12 23:59:24 -07:00
parent 2b183a49be
commit 389a95c9ce
1 changed files with 75 additions and 48 deletions

View File

@ -8,7 +8,7 @@ var LibraryLOVR = {
HAND_UNKNOWN: 0,
HAND_LEFT: 1,
HAND_RIGHT: 2,
sizeofRef: 16
sizeofRef: 8,
},
$lovr: {
@ -17,16 +17,16 @@ var LibraryLOVR = {
gamepads: {},
initialized: false,
mirrored: true,
ongamepadconnected: null,
ongamepaddisconnected: null,
renderCallback: null,
renderUserdata: null,
ongamepadconnected: 0,
ongamepaddisconnected: 0,
renderCallback: 0,
renderUserdata: 0,
frameData: null,
width: 0,
height: 0,
tempMatA: new Float32Array(16),
tempMatB: new Float32Array(16),
tempQuat: new Float32Array(4),
matA: null,
matB: null,
quat: null,
init: function() {
if (lovr.WebVR.initialized) {
@ -39,6 +39,9 @@ var LibraryLOVR = {
lovr.WebVR.width = canvas.width;
lovr.WebVR.height = canvas.height;
lovr.WebVR.frameData = new VRFrameData();
lovr.WebVR.matA = Module._malloc(64);
lovr.WebVR.matB = Module._malloc(64);
lovr.WebVR.quat = Module._malloc(16);
function findDisplay() {
navigator.getVRDisplays && navigator.getVRDisplays().then(function(displays) {
@ -65,7 +68,7 @@ var LibraryLOVR = {
display.getFrameData(lovr.WebVR.frameData);
if (display.isPresenting && lovr.WebVR.renderCallback) {
Runtime.dynCall('vi', lovr.WebVR.renderCallback, lovr.WebVR.renderUserdata);
Runtime.dynCall('vi', lovr.WebVR.renderCallback, [lovr.WebVR.renderUserdata]);
display.submitFrame();
}
} else {
@ -86,16 +89,18 @@ var LibraryLOVR = {
}
});
window.addEventListener('gamepadconnected', function(gamepad) {
window.addEventListener('gamepadconnected', function(event) {
var gamepad = event.gamepad;
if (display && gamepad.displayId === display.displayId && gamepad.pose) {
gamepads[gamepad.index] = gamepad;
lovr.WebVR.ongamepadconnected && lovr.WebVR.ongamepadconnected(gamepad.index);
lovr.WebVR.ongamepadconnected && Runtime.dynCall('vi', lovr.WebVR.ongamepadconnected, [gamepad.index]);
}
});
window.addEventListener('gamepaddisconnected', function(gamepad) {
window.addEventListener('gamepaddisconnected', function(event) {
var gamepad = event.gamepad;
if (gamepads[gamepad.index]) {
lovr.WebVR.ongamepaddisconnected && lovr.WebVR.ongamepaddisconnected(gamepad.index);
lovr.WebVR.ongamepaddisconnected && Runtime.dynCall('vi', lovr.WebVR.ongamepaddisconnected, [gamepad.index]);
delete gamepads[gamepad.index];
}
});
@ -120,7 +125,7 @@ var LibraryLOVR = {
},
controllerToGamepad: function(controller) {
var index = HEAPU32[(controller + sizeofRef) >> 2];
var index = HEAPU32[(controller + C.sizeofRef) >> 2];
return lovr.WebVR.gamepads[index];
}
}
@ -143,7 +148,7 @@ var LibraryLOVR = {
},
webvrGetOriginType: function() {
return WebVR.display && WebVR.display.stageParameters ? C.ORIGIN_FLOOR : C.ORIGIN_HEAD;
return lovr.WebVR.display && lovr.WebVR.display.stageParameters ? C.ORIGIN_FLOOR : C.ORIGIN_HEAD;
},
webvrIsMirrored: function() {
@ -160,8 +165,12 @@ var LibraryLOVR = {
},
webvrGetClipDistance: function(clipNear, clipFar) {
HEAPF32[clipNear >> 2] = lovr.WebVR.display ? lovr.WebVR.display.depthNear : 0;
HEAPF32[clipFar >> 2] = lovr.WebVR.display ? lovr.WebVR.display.depthFar : 0;
if (lovr.WebVR.display) {
HEAPF32[clipNear >> 2] = lovr.WebVR.display.depthNear;
HEAPF32[clipFar >> 2] = lovr.WebVR.display.depthFar;
} else {
HEAPF32[clipNear >> 2] = HEAPF32[clipFar >> 2] = 0;
}
},
webvrSetClipDistance: function(clipNear, clipFar) {
@ -173,13 +182,19 @@ var LibraryLOVR = {
webvrGetBoundsDimensions: function(width, depth) {
var stage = lovr.WebVR.display && lovr.WebVR.display.stageParameters;
HEAPF32[width >> 2] = stage ? stage.sizeX : 0;
HEAPF32[depth >> 2] = stage ? stage.sizeZ : 0;
if (stage) {
HEAPF32[width >> 2] = stage.sizeX;
HEAPF32[depth >> 2] = stage.sizeZ;
} else {
HEAPF32[width >> 2] = HEAPF32[depth >> 2] = 0;
}
},
webvrGetPose: function(x, y, z, angle, ax, ay, az) {
var sittingToStanding = lovr.WebVR.display && lovr.WebVR.display.stageParameters && lovr.WebVR.display.stageParameters.sittingToStandingTransform;
var pose = lovr.WebVR.frameData.pose;
var matA = lovr.WebVR.matA;
var quat = lovr.WebVR.quat;
if (pose.position) {
HEAPF32[x >> 2] = pose.position[0];
@ -187,20 +202,23 @@ var LibraryLOVR = {
HEAPF32[z >> 2] = pose.position[2];
if (sittingToStanding) {
Module._mat4_transform(sittingToStanding, x, y, z);
HEAPF32.set(sittingToStanding, matA >> 2);
Module._mat4_transform(matA, x, y, z);
}
} else {
HEAPF32[x >> 2] = HEAPF32[y >> 2] = HEAPF32[z >> 2] = 0;
}
if (pose.orientation) {
HEAPF32.set(pose.orientation, quat >> 2);
if (sittingToStanding) {
Module._mat4_set(lovr.WebVR.tempMatA, sittingToStanding);
Module._mat4_rotateQuat(lovr.WebVR.tempMatA, pose.orientation);
Module._quat_fromMat4(lovr.WebVR.tempQuat, lovr.WebVR.tempMatA);
Module._quat_getAngleAxis(lovr.WebVR.tempQuat, angle, ax, ay, az);
HEAPF32.set(sittingToStanding, matA >> 2);
Module._mat4_rotateQuat(matA, quat);
Module._quat_fromMat4(quat, matA);
Module._quat_getAngleAxis(quat, angle, ax, ay, az);
} else {
Module._quat_getAngleAxis(pose.orientation, angle, ax, ay, az);
Module._quat_getAngleAxis(quat, angle, ax, ay, az);
}
} else {
HEAPF32[angle >> 2] = HEAPF32[ax >> 2] = HEAPF32[ay >> 2] = HEAPF32[az >> 2] = 0;
@ -211,31 +229,33 @@ var LibraryLOVR = {
var isLeft = eye === C.EYE_LEFT;
var sittingToStanding = lovr.WebVR.display && lovr.WebVR.display.stageParameters && lovr.WebVR.display.stageParameters.sittingToStandingTransform;
var eyeParameters = lovr.WebVR.display && lovr.WebVR.display.getEyeParameters(isLeft ? 'left' : 'right');
var matA = lovr.WebVR.matA;
var matB = lovr.WebVR.matB;
var quat = lovr.WebVR.quat;
if (sittingToStanding) {
Module._mat4_set(lovr.WebVR.tempMatA, sittingToStanding);
Module._mat4_set(lovr.WebVR.tempMatB, isLeft ? lovr.WebVR.frameData.leftViewMatrix : lovr.WebVR.frameData.rightViewMatrix);
Module._mat4_invert(lovr.WebVR.tempMatB);
Module._mat4_multiply(lovr.WebVR.tempMatA, lovr.WebVR.tempMatB);
Module._mat4_translate(lovr.WebVR.tempMatA, eyeParameters.offset[0], eyeParameters.offset[1], eyeParameters.offset[2]);
HEAPF32.set(sittingToStanding, matA >> 2);
HEAPF32.set(isLeft ? lovr.WebVR.frameData.leftViewMatrix : lovr.WebVR.frameData.rightViewMatrix, matB >> 2);
Module._mat4_invert(matB);
Module._mat4_multiply(matA, matB);
} else {
Module._mat4_set(lovr.WebVR.tempMatA, isLeft ? lovr.WebVR.frameData.leftViewMatrix : lovr.WebVR.frameData.rightViewMatrix);
Module._mat4_invert(lovr.WebVR.tempMatA);
Module._mat4_multiply(lovr.WebVR.tempMatA, lovr.WebVR.tempMatB);
Module._mat4_translate(lovr.WebVR.tempMatA, eyeParameters.offset[0], eyeParameters.offset[1], eyeParameters.offset[2]);
HEAPF32.set(isLeft ? lovr.WebVR.frameData.leftViewMatrix : lovr.WebVR.frameData.rightViewMatrix, matA >> 2);
Module._mat4_invert(matA);
}
HEAPF32[x >> 2] = lovr.WebVR.tempMatA[12];
HEAPF32[y >> 2] = lovr.WebVR.tempMatA[13];
HEAPF32[z >> 2] = lovr.WebVR.tempMatA[14];
Module._mat4_translate(matA, eyeParameters.offset[0], eyeParameters.offset[1], eyeParameters.offset[2]);
HEAPF32[x >> 2] = matA[12];
HEAPF32[y >> 2] = matA[13];
HEAPF32[z >> 2] = matA[14];
Module._quat_fromMat4(lovr.WebVR.tempQuat, lovr.WebVR.tempMatA);
Module._quat_getAngleAxis(lovr.WebVR.tempQuat, angle, ax, ay, az);
Module._quat_fromMat4(quat, matA);
Module._quat_getAngleAxis(quat, angle, ax, ay, az);
},
webvrGetVelocity: function(x, y, z) {
var sittingToStanding = lovr.WebVR.display && lovr.WebVR.display.stageParameters && lovr.WebVR.display.stageParameters.sittingToStandingTransform;
var pose = lovr.WebVR.frameData.pose;
var matA = lovr.WebVR.matA;
if (pose.linearVelocity) {
HEAPF32[x >> 2] = pose.linearVelocity[0];
@ -243,7 +263,8 @@ var LibraryLOVR = {
HEAPF32[z >> 2] = pose.linearVelocity[2];
if (sittingToStanding) {
Module._mat4_transformDirection(sittingToStanding, x, y, z);
HEAPF32.set(sittingToStanding, matA >> 2);
Module._mat4_transformDirection(matA, x, y, z);
}
} else {
HEAPF32[x >> 2] = HEAPF32[y >> 2] = HEAPF32[z >> 2] = 0;
@ -253,6 +274,7 @@ var LibraryLOVR = {
webvrGetAngularVelocity: function(x, y, z) {
var sittingToStanding = lovr.WebVR.display && lovr.WebVR.display.stageParameters && lovr.WebVR.display.stageParameters.sittingToStandingTransform;
var pose = lovr.WebVR.frameData.pose;
var matA = lovr.WebVR.matA;
if (pose.angularVelocity) {
HEAPF32[x >> 2] = pose.angularVelocity[0];
@ -260,7 +282,8 @@ var LibraryLOVR = {
HEAPF32[z >> 2] = pose.angularVelocity[2];
if (sittingToStanding) {
Module._mat4_transformDirection(sittingToStanding, x, y, z);
HEAPF32.set(sittingToStanding, matA >> 2);
Module._mat4_transformDirection(matA, x, y, z);
}
} else {
HEAPF32[x >> 2] = HEAPF32[y >> 2] = HEAPF32[z >> 2] = 0;
@ -281,9 +304,12 @@ var LibraryLOVR = {
webvrControllerGetPose: function(controller, x, y, z, angle, ax, ay, az) {
var gamepad = lovr.WebVR.controllerToGamepad(controller);
var sittingToStanding = lovr.WebVR.display && lovr.WebVR.display.stageParameters && lovr.WebVR.display.stageParameters.sittingToStandingTransform;
var matA = lovr.WebVR.matA;
var quat = lovr.WebVR.quat;
if (!gamepad || !gamepad.pose || !gamepad.pose.position || !gamepad.pose.orientation) {
HEAPF32[x >> 2] = HEAPF32[y >> 2] = HEAPF32[z >> 2] = HEAPF32[angle >> 2] = HEAPF32[ax >> 2] = HEAPF32[ay >> 2] = HEAPF32[az >> 2] = 0;
HEAPF32[x >> 2] = HEAPF32[y >> 2] = HEAPF32[z >> 2] = 0;
HEAPF32[angle >> 2] = HEAPF32[ax >> 2] = HEAPF32[ay >> 2] = HEAPF32[az >> 2] = 0;
return;
}
@ -291,14 +317,15 @@ var LibraryLOVR = {
HEAPF32[y >> 2] = gamepad.pose.position[1];
HEAPF32[z >> 2] = gamepad.pose.position[2];
HEAPF32.set(gamepad.pose.orientation, quat >> 2);
if (sittingToStanding) {
Module._mat4_transform(sittingToStanding, x, y, z);
Module._mat4_set(lovr.WebVR.tempMatA, sittingToStanding);
Module._mat4_rotateQuat(lovr.WebVR.tempMatA, gamepad.pose.orientation);
Module._quat_fromMat4(lovr.WebVR.tempQuat, lovr.WebVR.tempMatA);
Module._quat_getAngleAxis(lovr.WebVR.tempQuat, angle, ax, ay, az);
HEAPF32.set(sittingToStanding, matA >> 2);
Module._mat4_transform(matA, x, y, z);
Module._mat4_rotateQuat(matA, quat);
Module._quat_fromMat4(quat, matA);
Module._quat_getAngleAxis(quat, angle, ax, ay, az);
} else {
Module._quat_getAngleAxis(gamepad.pose.orientation, angle, ax, ay, az);
Module._quat_getAngleAxis(quat, angle, ax, ay, az);
}
},