Skip to content

Commit a990e51

Browse files
committed
feat: add xrsessioninit options for XRManager
1 parent f18dc90 commit a990e51

File tree

4 files changed

+29
-9
lines changed

4 files changed

+29
-9
lines changed

src/PanoImageRenderer/PanoImageRenderer.js

+4-4
Original file line numberDiff line numberDiff line change
@@ -687,7 +687,7 @@ class PanoImageRenderer extends Component {
687687
/**
688688
* @return Promise
689689
*/
690-
enterVR() {
690+
enterVR(options) {
691691
const vr = this._vr;
692692

693693
if (!WEBXR_SUPPORTED && !navigator.getVRDisplays) {
@@ -697,7 +697,7 @@ class PanoImageRenderer extends Component {
697697
return Promise.resolve("VR already enabled.");
698698
}
699699

700-
return this._requestPresent();
700+
return this._requestPresent(options);
701701
}
702702

703703
exitVR = () => {
@@ -727,13 +727,13 @@ class PanoImageRenderer extends Component {
727727
animator.start();
728728
}
729729

730-
_requestPresent() {
730+
_requestPresent(options) {
731731
const gl = this.context;
732732
const canvas = this.canvas;
733733
const animator = this._animator;
734734

735735
this._vr = WEBXR_SUPPORTED ?
736-
new XRManager() :
736+
new XRManager(options) :
737737
new VRManager();
738738

739739
const vr = this._vr;

src/PanoImageRenderer/vr/XRManager.js

+8-3
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
import {mat4, glMatrix} from "gl-matrix";
22
import {IS_SAFARI_ON_DESKTOP} from "../../utils/browser";
3+
import {merge} from "../../utils/utils";
34

45
const XR_REFERENCE_SPACE = "local";
56

67
class XRManager {
78
get context() { return this._xrSession; }
89

9-
constructor() {
10+
constructor(options) {
1011
this._clear();
12+
this._options = options;
1113
}
1214

1315
destroy = () => {
@@ -87,9 +89,11 @@ class XRManager {
8789
}
8890

8991
requestPresent(canvas, gl) {
90-
return navigator.xr.requestSession("immersive-vr", {
92+
const options = merge({
9193
requiredFeatures: [XR_REFERENCE_SPACE],
92-
}).then(session => {
94+
}, this._options);
95+
96+
return navigator.xr.requestSession("immersive-vr", options).then(session => {
9397
const xrLayer = new window.XRWebGLLayer(session, gl);
9498

9599
session.updateRenderState({baseLayer: xrLayer});
@@ -118,6 +122,7 @@ class XRManager {
118122
this._xrRefSpace = null;
119123
this._presenting = false;
120124
this._yawOffset = 0;
125+
this._options = {};
121126
}
122127
}
123128

src/PanoViewer/PanoViewer.js

+3-2
Original file line numberDiff line numberDiff line change
@@ -405,16 +405,17 @@ class PanoViewer extends Component {
405405
* 이 메소드는 사용자 인터렉션에 의해서 호출되어야 합니다. 예로, 버튼의 onclick 콜백과 같은 콘텍스트에서 호출되어야 합니다.
406406
* 디바이스 센서 활성화에 실패시 혹은 아직 이미지/비디오가 로딩중인 경우("ready"이벤트가 아직 트리거되지 않은 경우)에는 Promise가 reject됩니다.
407407
* @method eg.view360.PanoViewer#enterVR
408+
* @param {object} options Additional options for WebXR session, see {@link https://developer.mozilla.org/en-US/docs/Web/API/XRSessionInit XRSessionInit}.<ko>WebXR용 추가 옵션, {@link https://developer.mozilla.org/en-US/docs/Web/API/XRSessionInit XRSessionInit}을 참조해주세요.</ko>
408409
* @return {Promise<string>} Promise containing either a string of resolved reason or an Error instance of rejected reason.<ko>Promise가 resolve된 이유(string) 혹은 reject된 이유(Error)</ko>
409410
*/
410-
enterVR() {
411+
enterVR(options = {}) {
411412
if (!this._isReady) {
412413
return Promise.reject(new Error("PanoViewer is not ready to show image."));
413414
}
414415

415416
return new Promise((resolve, reject) => {
416417
this.enableSensor()
417-
.then(() => this._photoSphereRenderer.enterVR())
418+
.then(() => this._photoSphereRenderer.enterVR(options))
418419
.then(res => resolve(res))
419420
.catch(e => reject(e));
420421
});

src/utils/utils.js

+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
export function merge(target, ...srcs) {
2+
srcs.forEach(source => {
3+
Object.keys(source).forEach(key => {
4+
const value = source[key];
5+
if (Array.isArray(target[key]) && Array.isArray(value)) {
6+
target[key] = [...target[key], ...value];
7+
} else {
8+
target[key] = value;
9+
}
10+
});
11+
});
12+
13+
return target;
14+
}

0 commit comments

Comments
 (0)