mirror of https://github.com/bjornbytes/lovr.git
WebVR;
This commit is contained in:
parent
2b183a49be
commit
389a95c9ce
|
@ -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);
|
||||
}
|
||||
},
|
||||
|
||||
|
|
Loading…
Reference in New Issue