HelioWebXRPolyfill.js 4.1 KB

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