HelioWebXRPolyfill.js 4.0 KB

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