123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190 |
- /**
- * @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 );
- } );
- } );
- };
- }
- }
|