HelioWebXRPolyfill.js 3.4 KB

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