HelioWebXRPolyfill.js 3.7 KB

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