HelioWebXRPolyfill.js 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. /**
  2. * @author mvilledieu / http://github.com/mvilledieu
  3. */
  4. if ( /(Helio)/g.test( navigator.userAgent ) && "xr" in navigator ) {
  5. if ('isSessionSupported' in navigator.xr) {
  6. return;
  7. }
  8. console.log( "Helio WebXR Polyfill (Lumin 0.97.0)" );
  9. const isHelio96 = navigator.userAgent.includes( "Chrome/73" );
  10. // WebXRManager - XR.supportSession() Polyfill - WebVR.js line 147
  11. if (
  12. "supportsSession" in navigator.xr === false &&
  13. "supportsSessionMode" in navigator.xr
  14. ) {
  15. navigator.xr.supportsSession = function ( sessionType ) {
  16. // Force using immersive-ar
  17. return navigator.xr.supportsSessionMode( 'immersive-ar' );
  18. };
  19. }
  20. if ( "requestSession" in navigator.xr ) {
  21. const tempRequestSession = navigator.xr.requestSession.bind( navigator.xr );
  22. navigator.xr.requestSession = function ( sessionType ) {
  23. return new Promise( function ( resolve, reject ) {
  24. const sessionType = ( isHelio96 ? {
  25. mode: 'immersive-ar' // Force using immersive-ar
  26. } : 'immersive-ar' );
  27. tempRequestSession( sessionType )
  28. .then( function ( session ) {
  29. // WebXRManager - xrFrame.getPose() Polyfill - line 279
  30. const tempRequestAnimationFrame = session.requestAnimationFrame.bind(
  31. session
  32. );
  33. session.requestAnimationFrame = function ( callback ) {
  34. return tempRequestAnimationFrame( function ( time, frame ) {
  35. // WebXRManager - xrFrame.getViewerPose() Polyfill - line 279
  36. // Transforms view.viewMatrix to view.transform.inverse.matrix
  37. const tempGetViewerPose = frame.getViewerPose.bind( frame );
  38. frame.getViewerPose = function ( referenceSpace ) {
  39. const pose = tempGetViewerPose( referenceSpace );
  40. pose.views.forEach( function ( view ) {
  41. view.transform = {
  42. inverse: {
  43. matrix: view.viewMatrix
  44. }
  45. };
  46. } );
  47. return pose;
  48. };
  49. // WebXRManager - xrFrame.getPose() Polyfill - line 259
  50. const tempGetPose = ( isHelio96 ? null : frame.getPose.bind( frame ) );
  51. frame.getPose = function ( targetRaySpace, referenceSpace ) {
  52. if ( isHelio96 ) {
  53. const inputPose = frame.getInputPose(
  54. targetRaySpace,
  55. referenceSpace
  56. );
  57. inputPose.transform = {
  58. matrix: inputPose.targetRay.transformMatrix
  59. };
  60. return inputPose;
  61. } else {
  62. return tempGetPose( targetRaySpace.gripSpace, referenceSpace );
  63. }
  64. };
  65. callback( time, frame );
  66. } );
  67. };
  68. // WebXRManager - xrFrame.getPose( inputSource.targetRaySpace, referenceSpace) Polyfill - line 279
  69. const tempGetInputSources = session.getInputSources.bind( session );
  70. session.getInputSources = function () {
  71. const res = tempGetInputSources();
  72. res.forEach( function ( xrInputSource ) {
  73. Object.defineProperty( xrInputSource, "targetRaySpace", {
  74. get: function () {
  75. return xrInputSource;
  76. }
  77. } );
  78. } );
  79. return res;
  80. };
  81. // WebXRManager - xrSession.getInputSources() Polyfill Line 132 - 136
  82. session.inputSources = Object.defineProperty(
  83. session,
  84. "inputSources",
  85. {
  86. get: session.getInputSources
  87. }
  88. );
  89. // WebXRManager - xrSession.updateRenderState() Polyfill Line 129
  90. if ( isHelio96 ) {
  91. session.updateRenderState = function ( { baseLayer } ) {
  92. session.baseLayer = baseLayer;
  93. // WebXRManager - xrSession.renderState.baseLayer Polyfill Line 219
  94. session.renderState = {
  95. baseLayer: baseLayer
  96. };
  97. };
  98. }
  99. // WebXRManager - xrSession.requestReferenceSpace() Polyfill Line 130
  100. const tempRequestReferenceSpace = session.requestReferenceSpace.bind(
  101. session
  102. );
  103. session.requestReferenceSpace = function () {
  104. return tempRequestReferenceSpace( {
  105. type: "stationary",
  106. subtype: "floor-level"
  107. } );
  108. };
  109. resolve( session );
  110. } )
  111. .catch( function ( error ) {
  112. return reject( error );
  113. } );
  114. } );
  115. };
  116. }
  117. }