ShadowEditor/ShadowEditor.Web/assets/js/vr/HelioWebXRPolyfill.js
2019-08-03 16:16:07 +08:00

191 lines
4.0 KiB
JavaScript

/**
* @author mvilledieu / http://github.com/mvilledieu
*/
if ( /(Helio)/g.test( navigator.userAgent ) && "xr" in navigator ) {
console.log( "Helio WebXR Polyfill (Lumin 0.97.0)" );
const isHelio96 = navigator.userAgent.includes("Chrome/73");
// WebXRManager - XR.supportSession() Polyfill - WebVR.js line 147
if (
"supportsSession" in navigator.xr === false &&
"supportsSessionMode" in navigator.xr
) {
navigator.xr.supportsSession = function ( sessionType ) {
// Force using immersive-ar
return navigator.xr.supportsSessionMode( 'immersive-ar' );
};
}
if ( "requestSession" in navigator.xr ) {
const tempRequestSession = navigator.xr.requestSession.bind( navigator.xr );
navigator.xr.requestSession = function ( sessionType ) {
return new Promise( function ( resolve, reject ) {
const sessionType = (isHelio96 ? {
mode: 'immersive-ar' // Force using immersive-ar
} : 'immersive-ar');
tempRequestSession( sessionType )
.then( function ( session ) {
// WebXRManager - xrFrame.getPose() Polyfill - line 279
const tempRequestAnimationFrame = session.requestAnimationFrame.bind(
session
);
session.requestAnimationFrame = function ( callback ) {
return tempRequestAnimationFrame( function ( time, frame ) {
// WebXRManager - xrFrame.getViewerPose() Polyfill - line 279
// Transforms view.viewMatrix to view.transform.inverse.matrix
const tempGetViewerPose = frame.getViewerPose.bind( frame );
frame.getViewerPose = function ( referenceSpace ) {
const pose = tempGetViewerPose( referenceSpace );
pose.views.forEach( function ( view ) {
view.transform = {
inverse: {
matrix: view.viewMatrix
}
};
} );
return pose;
};
// WebXRManager - xrFrame.getPose() Polyfill - line 259
const tempGetPose = (isHelio96 ? null : frame.getPose.bind( frame ));
frame.getPose = function ( targetRaySpace, referenceSpace ) {
if (isHelio96) {
const inputPose = frame.getInputPose(
targetRaySpace,
referenceSpace
);
inputPose.transform = {
matrix: inputPose.targetRay.transformMatrix
};
return inputPose;
} else {
return tempGetPose(targetRaySpace.gripSpace, referenceSpace);
}
};
callback( time, frame );
} );
};
// WebXRManager - xrFrame.getPose( inputSource.targetRaySpace, referenceSpace) Polyfill - line 279
const tempGetInputSources = session.getInputSources.bind( session );
session.getInputSources = function () {
const res = tempGetInputSources();
res.forEach( function (xrInputSource ) {
Object.defineProperty( xrInputSource, "targetRaySpace", {
get: function () {
return xrInputSource;
}
} );
} );
return res;
};
// WebXRManager - xrSession.getInputSources() Polyfill Line 132 - 136
session.inputSources = Object.defineProperty(
session,
"inputSources",
{
get: session.getInputSources
}
);
// WebXRManager - xrSession.updateRenderState() Polyfill Line 129
if (isHelio96) {
session.updateRenderState = function ( { baseLayer } ) {
session.baseLayer = baseLayer;
// WebXRManager - xrSession.renderState.baseLayer Polyfill Line 219
session.renderState = {
baseLayer: baseLayer
};
};
}
// WebXRManager - xrSession.requestReferenceSpace() Polyfill Line 130
const tempRequestReferenceSpace = session.requestReferenceSpace.bind(
session
);
session.requestReferenceSpace = function () {
return tempRequestReferenceSpace( {
type: "stationary",
subtype: "floor-level"
} );
};
resolve( session );
} )
.catch( function ( error ) {
return reject( error );
} );
} );
};
}
}