HelioWebXRPolyfill.js 3.2 KB

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