Revision a8637a8e43f8023d742727c1463ac01992860940 authored by Alon Zakai on 04 January 2016, 22:57:24 UTC, committed by Alon Zakai on 04 January 2016, 22:57:24 UTC
1 parent 907b627
library_vr.js
var LibraryWebVR = {
$WebVR: {
DEVICE_TYPE_UNKNOWN: 0,
DEVICE_TYPE_HMD: 1,
DEVICE_TYPE_SENSOR: 2,
EYE_LEFT: 0,
EYE_RIGHT: 1,
initialized: false,
ready: false,
devices: [],
deviceHardwareIds: {},
nextHardwareDeviceId: 1,
getDevicesPromise: null,
selectedHMD: null,
selectedHMDId: 0,
init: function() {
if (WebVR.initialized) return;
WebVR.initialized = true;
if (!navigator.getVRDevices) {
WebVR.ready = true;
WebVR.devices = [];
return;
}
navigator.getVRDevices().then(
function(devs) {
WebVR.ready = true;
WebVR.devices = devs;
},
function() {
console.log("Emscripten WebVR getVRDevices() hit error callback");
WebVR.ready = true;
WebVR.devices = [];
}
);
},
getDeviceByID: function(deviceId) {
if (deviceId < 1 || deviceId > WebVR.devices.length) {
console.log("library_vr getDeviceByID invalid device id at: " + stackTrace());
return null;
}
return WebVR.devices[deviceId-1];
}
},
emscripten_vr_init: function() {
WebVR.init();
},
emscripten_vr_ready: function() {
return WebVR.ready ? 1 : 0;
},
emscripten_vr_count_devices: function() {
return WebVR.devices.length;
},
emscripten_vr_get_device_id: function(deviceIndex) {
if (deviceIndex < 0 || deviceIndex >= WebVR.devices.length) {
return -1;
}
// we're doing to treat the device ID the same as the index + 1
return deviceIndex + 1;
},
emscripten_vr_get_device_hwid: function(deviceId) {
var dev = WebVR.getDeviceByID(deviceId);
if (!dev) return -1;
if (!WebVR.deviceHardwareIds[dev.hardwareUnitId]) {
WebVR.deviceHardwareIds[dev.hardwareUnitId] = WebVR.nextHardwareDeviceId++;
}
return WebVR.deviceHardwareIds[dev.hardwareUnitId];
},
emscripten_vr_get_device_name: function(deviceId) {
var dev = WebVR.getDeviceByID(deviceId);
var buffer, devName;
devName = dev ? dev.deviceName : "";
buf = _malloc(devName.length + 1);
writeStringToMemory(devName, buf);
return buf;
},
emscripten_vr_get_device_type: function(deviceId) {
var dev = WebVR.getDeviceByID(deviceId);
if (!dev) return -1;
if (dev instanceof HMDVRDevice) {
return WebVR.DEVICE_TYPE_HMD;
}
if (dev instanceof PositionSensorVRDevice) {
return WebVR.DEVICE_TYPE_SENSOR;
}
return WebVR.DEVICE_TYPE_UNKNOWN;
},
emscripten_vr_select_hmd_device: function(deviceId) {
if (deviceId == 0) {
WebVR.selectedHMD = null;
WebVR.selectedHMDId = 0;
return 1;
}
var dev = WebVR.getDeviceByID(deviceId);
if (!dev || !(dev instanceof HMDVRDevice)) {
console.log("Trying to call emscripten_vr_select_hmd_device on invalid or non-HMD device ID!");
return 0;
}
WebVR.selectedHMD = dev;
WebVR.selectedHMDId = deviceId;
return 1;
},
emscripten_vr_get_selected_hmd_device: function() {
return WebVR.selectedHMDId;
},
emscripten_vr_hmd_get_eye_parameters: function(deviceId, whichEye, eyeParamsPtr) {
if (!eyeParamsPtr) return 0;
var dev = WebVR.getDeviceByID(deviceId);
if (!dev) return 0;
var params = dev.getEyeParameters(whichEye == WebVR.EYE_LEFT ? "left" : "right");
{{{ makeSetValue('eyeParamsPtr', C_STRUCTS.WebVREyeParameters.minimumFieldOfView.upDegrees, 'params.minimumFieldOfView.upDegrees', 'double') }}};
{{{ makeSetValue('eyeParamsPtr', C_STRUCTS.WebVREyeParameters.minimumFieldOfView.downDegrees, 'params.minimumFieldOfView.downDegrees', 'double') }}};
{{{ makeSetValue('eyeParamsPtr', C_STRUCTS.WebVREyeParameters.minimumFieldOfView.leftDegrees, 'params.minimumFieldOfView.leftDegrees', 'double') }}};
{{{ makeSetValue('eyeParamsPtr', C_STRUCTS.WebVREyeParameters.minimumFieldOfView.rightDegrees, 'params.minimumFieldOfView.rightDegrees', 'double') }}};
{{{ makeSetValue('eyeParamsPtr', C_STRUCTS.WebVREyeParameters.maximumFieldOfView.upDegrees, 'params.maximumFieldOfView.upDegrees', 'double') }}};
{{{ makeSetValue('eyeParamsPtr', C_STRUCTS.WebVREyeParameters.maximumFieldOfView.downDegrees, 'params.maximumFieldOfView.downDegrees', 'double') }}};
{{{ makeSetValue('eyeParamsPtr', C_STRUCTS.WebVREyeParameters.maximumFieldOfView.leftDegrees, 'params.maximumFieldOfView.leftDegrees', 'double') }}};
{{{ makeSetValue('eyeParamsPtr', C_STRUCTS.WebVREyeParameters.maximumFieldOfView.rightDegrees, 'params.maximumFieldOfView.rightDegrees', 'double') }}};
{{{ makeSetValue('eyeParamsPtr', C_STRUCTS.WebVREyeParameters.recommendedFieldOfView.upDegrees, 'params.recommendedFieldOfView.upDegrees', 'double') }}};
{{{ makeSetValue('eyeParamsPtr', C_STRUCTS.WebVREyeParameters.recommendedFieldOfView.downDegrees, 'params.recommendedFieldOfView.downDegrees', 'double') }}};
{{{ makeSetValue('eyeParamsPtr', C_STRUCTS.WebVREyeParameters.recommendedFieldOfView.leftDegrees, 'params.recommendedFieldOfView.leftDegrees', 'double') }}};
{{{ makeSetValue('eyeParamsPtr', C_STRUCTS.WebVREyeParameters.recommendedFieldOfView.rightDegrees, 'params.recommendedFieldOfView.rightDegrees', 'double') }}};
{{{ makeSetValue('eyeParamsPtr', C_STRUCTS.WebVREyeParameters.eyeTranslation.x, 'params.eyeTranslation.x', 'double') }}};
{{{ makeSetValue('eyeParamsPtr', C_STRUCTS.WebVREyeParameters.eyeTranslation.y, 'params.eyeTranslation.y', 'double') }}};
{{{ makeSetValue('eyeParamsPtr', C_STRUCTS.WebVREyeParameters.eyeTranslation.z, 'params.eyeTranslation.z', 'double') }}};
{{{ makeSetValue('eyeParamsPtr', C_STRUCTS.WebVREyeParameters.eyeTranslation.w, 'params.eyeTranslation.w', 'double') }}};
{{{ makeSetValue('eyeParamsPtr', C_STRUCTS.WebVREyeParameters.currentFieldOfView.upDegrees, 'params.currentFieldOfView.upDegrees', 'double') }}};
{{{ makeSetValue('eyeParamsPtr', C_STRUCTS.WebVREyeParameters.currentFieldOfView.downDegrees, 'params.currentFieldOfView.downDegrees', 'double') }}};
{{{ makeSetValue('eyeParamsPtr', C_STRUCTS.WebVREyeParameters.currentFieldOfView.leftDegrees, 'params.currentFieldOfView.leftDegrees', 'double') }}};
{{{ makeSetValue('eyeParamsPtr', C_STRUCTS.WebVREyeParameters.currentFieldOfView.rightDegrees, 'params.currentFieldOfView.rightDegrees', 'double') }}};
{{{ makeSetValue('eyeParamsPtr', C_STRUCTS.WebVREyeParameters.renderRect.x, 'params.renderRect.x', 'i32') }}};
{{{ makeSetValue('eyeParamsPtr', C_STRUCTS.WebVREyeParameters.renderRect.y, 'params.renderRect.y', 'i32') }}};
{{{ makeSetValue('eyeParamsPtr', C_STRUCTS.WebVREyeParameters.renderRect.width, 'params.renderRect.width', 'i32') }}};
{{{ makeSetValue('eyeParamsPtr', C_STRUCTS.WebVREyeParameters.renderRect.height, 'params.renderRect.height', 'i32') }}};
return 1;
},
emscripten_vr_hmd_set_fov: function(deviceId, leftFovPtr, rightFovPtr, zNear, zFar) {
if (!leftFovPtr || !rightFovPtr) return 0;
var dev = WebVR.getDeviceByID(deviceId);
if (!dev) return 0;
var leftFov = {
upDegrees: {{{ makeGetValue('leftFovPtr', C_STRUCTS.WebVRFieldOfView.upDegrees, 'double') }}},
downDegrees: {{{ makeGetValue('leftFovPtr', C_STRUCTS.WebVRFieldOfView.downDegrees, 'double') }}},
leftDegrees: {{{ makeGetValue('leftFovPtr', C_STRUCTS.WebVRFieldOfView.leftDegrees, 'double') }}},
rightDegrees: {{{ makeGetValue('leftFovPtr', C_STRUCTS.WebVRFieldOfView.rightDegrees, 'double') }}}
};
var rightFov = {
upDegrees: {{{ makeGetValue('rightFovPtr', C_STRUCTS.WebVRFieldOfView.upDegrees, 'double') }}},
downDegrees: {{{ makeGetValue('rightFovPtr', C_STRUCTS.WebVRFieldOfView.downDegrees, 'double') }}},
leftDegrees: {{{ makeGetValue('rightFovPtr', C_STRUCTS.WebVRFieldOfView.leftDegrees, 'double') }}},
rightDegrees: {{{ makeGetValue('rightFovPtr', C_STRUCTS.WebVRFieldOfView.rightDegrees, 'double') }}}
};
dev.setFieldOfView(leftFov, rightFov, zNear, zFar);
return 1;
},
emscripten_vr_sensor_get_state: function(deviceId, immediate, statePtr) {
if (!statePtr) return 0;
var dev = WebVR.getDeviceByID(deviceId);
if (!dev) return 0;
var state = immediate ? dev.getImmediateState : dev.getState();
{{{ makeSetValue('statePtr', C_STRUCTS.WebVRPositionState.timeStamp, 'state.timeStamp', 'double') }}};
{{{ makeSetValue('statePtr', C_STRUCTS.WebVRPositionState.hasPosition, 'state.hasPosition ? 1 : 0', 'i32') }}};
if (state.hasPosition) {
{{{ makeSetValue('statePtr', C_STRUCTS.WebVRPositionState.position.x, 'state.position.x', 'double') }}};
{{{ makeSetValue('statePtr', C_STRUCTS.WebVRPositionState.position.y, 'state.position.y', 'double') }}};
{{{ makeSetValue('statePtr', C_STRUCTS.WebVRPositionState.position.z, 'state.position.z', 'double') }}};
{{{ makeSetValue('statePtr', C_STRUCTS.WebVRPositionState.linearVelocity.x, 'state.linearVelocity.x', 'double') }}};
{{{ makeSetValue('statePtr', C_STRUCTS.WebVRPositionState.linearVelocity.y, 'state.linearVelocity.y', 'double') }}};
{{{ makeSetValue('statePtr', C_STRUCTS.WebVRPositionState.linearVelocity.z, 'state.linearVelocity.z', 'double') }}};
{{{ makeSetValue('statePtr', C_STRUCTS.WebVRPositionState.linearAcceleration.x, 'state.linearAcceleration.x', 'double') }}};
{{{ makeSetValue('statePtr', C_STRUCTS.WebVRPositionState.linearAcceleration.y, 'state.linearAcceleration.y', 'double') }}};
{{{ makeSetValue('statePtr', C_STRUCTS.WebVRPositionState.linearAcceleration.z, 'state.linearAcceleration.z', 'double') }}};
}
{{{ makeSetValue('statePtr', C_STRUCTS.WebVRPositionState.hasOrientation, 'state.hasOrientation ? 1 : 0', 'i32') }}};
if (state.hasOrientation) {
{{{ makeSetValue('statePtr', C_STRUCTS.WebVRPositionState.orientation.x, 'state.orientation.x', 'double') }}};
{{{ makeSetValue('statePtr', C_STRUCTS.WebVRPositionState.orientation.y, 'state.orientation.y', 'double') }}};
{{{ makeSetValue('statePtr', C_STRUCTS.WebVRPositionState.orientation.z, 'state.orientation.z', 'double') }}};
{{{ makeSetValue('statePtr', C_STRUCTS.WebVRPositionState.orientation.w, 'state.orientation.w', 'double') }}};
{{{ makeSetValue('statePtr', C_STRUCTS.WebVRPositionState.angularVelocity.x, 'state.angularVelocity.x', 'double') }}};
{{{ makeSetValue('statePtr', C_STRUCTS.WebVRPositionState.angularVelocity.y, 'state.angularVelocity.y', 'double') }}};
{{{ makeSetValue('statePtr', C_STRUCTS.WebVRPositionState.angularVelocity.z, 'state.angularVelocity.z', 'double') }}};
{{{ makeSetValue('statePtr', C_STRUCTS.WebVRPositionState.angularVelocity.w, 'state.angularVelocity.w', 'double') }}};
{{{ makeSetValue('statePtr', C_STRUCTS.WebVRPositionState.angularAcceleration.x, 'state.angularAcceleration.x', 'double') }}};
{{{ makeSetValue('statePtr', C_STRUCTS.WebVRPositionState.angularAcceleration.y, 'state.angularAcceleration.y', 'double') }}};
{{{ makeSetValue('statePtr', C_STRUCTS.WebVRPositionState.angularAcceleration.z, 'state.angularAcceleration.z', 'double') }}};
{{{ makeSetValue('statePtr', C_STRUCTS.WebVRPositionState.angularAcceleration.w, 'state.angularAcceleration.w', 'double') }}};
}
return 1;
},
emscripten_vr_sensor_zero: function(deviceId) {
var dev = WebVR.getDeviceByID(deviceId);
if (!dev) return 0;
dev.resetSensor();
return 1;
}
};
autoAddDeps(LibraryWebVR, '$WebVR');
mergeInto(LibraryManager.library, LibraryWebVR);
Computing file changes ...