HelioWebXRPolyfill.js 3.3 KB

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