Skip to content

Commit 7439dc9

Browse files
committed
Add support for equirect layer
1 parent 3c4cc47 commit 7439dc9

File tree

1 file changed

+52
-2
lines changed

1 file changed

+52
-2
lines changed

src/components/layer.js

Lines changed: 52 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,9 @@ var warn = utils.debug('components:layer:warn');
66

77
export var Component = registerComponent('layer', {
88
schema: {
9-
type: {default: 'quad', oneOf: ['quad', 'monocubemap', 'stereocubemap']},
9+
type: {default: 'quad', oneOf: ['mono-equirect', 'stereo-left-right-equirect', 'stereo-top-bottom-equirect', 'quad', 'monocubemap', 'stereocubemap']},
1010
src: {type: 'map'},
11+
is180: {default: false, if: {type: ['mono-equirect', 'stereo-left-right-equirect', 'stereo-top-bottom-equirect']}},
1112
rotateCubemap: {default: false},
1213
width: {default: 0},
1314
height: {default: 0}
@@ -59,6 +60,11 @@ export var Component = registerComponent('layer', {
5960
this.destroyLayer();
6061
this.texture = undefined;
6162
this.textureIsVideo = this.data.src.tagName === 'VIDEO';
63+
if (type.endsWith('equirect')) {
64+
this.loadEquirectImage();
65+
return;
66+
}
67+
6268
if (type === 'quad') {
6369
this.loadQuadImage();
6470
return;
@@ -104,6 +110,15 @@ export var Component = registerComponent('layer', {
104110
}
105111
},
106112

113+
loadEquirectImage: function () {
114+
var src = this.data.src;
115+
var self = this;
116+
this.el.sceneEl.systems.material.loadTexture(src, {src: src}, function textureLoaded (texture) {
117+
self.el.sceneEl.renderer.initTexture(texture);
118+
self.texture = texture;
119+
});
120+
},
121+
107122
loadQuadImage: function () {
108123
var src = this.data.src;
109124
var self = this;
@@ -226,7 +241,7 @@ export var Component = registerComponent('layer', {
226241
if (this.data.src.complete && (this.pendingCubeMapUpdate || this.loadingScreen || this.visibilityChanged)) { this.loadCubeMapImages(); }
227242
if (!this.needsRedraw && !this.layer.needsRedraw) { return; }
228243
if (this.textureIsVideo) { return; }
229-
if (this.data.type === 'quad') { this.draw(); }
244+
if (this.data.type === 'quad' || this.data.type.endsWith('equirect')) { this.draw(); }
230245
},
231246

232247
initLayer: function () {
@@ -237,6 +252,11 @@ export var Component = registerComponent('layer', {
237252
self.visibilityChanged = evt.session.visibilityState !== 'hidden';
238253
};
239254

255+
if (type.endsWith('equirect')) {
256+
this.initEquirectLayer();
257+
return;
258+
}
259+
240260
if (type === 'quad') {
241261
this.initQuadLayer();
242262
return;
@@ -248,6 +268,36 @@ export var Component = registerComponent('layer', {
248268
}
249269
},
250270

271+
initEquirectLayer: function () {
272+
if (!this.texture) { return; }
273+
var sceneEl = this.el.sceneEl;
274+
var eqrtIs180 = this.data.is180;
275+
var eqrtRadius = 10;
276+
var eqrtLayout = this.data.type.replace('-equirect', ''); // mono stereo-left-right stereo-top-bottom
277+
if (this.textureIsVideo) {
278+
var mediaBinding = new XRMediaBinding(sceneEl.xrSession);
279+
this.layer = mediaBinding.createEquirectLayer(this.data.src, {
280+
space: this.referenceSpace,
281+
layout: eqrtLayout
282+
});
283+
} else {
284+
var eqrtTextureWidth = this.texture.image.width;
285+
var eqrtTextureHeight = this.texture.image.height;
286+
var xrGLFactory = this.xrGLFactory = sceneEl.renderer.xr.getBinding();
287+
this.layer = xrGLFactory.createEquirectLayer({
288+
space: this.referenceSpace,
289+
viewPixelWidth: eqrtTextureWidth / (eqrtLayout === 'stereo-left-right' ? 2 : 1),
290+
viewPixelHeight: eqrtTextureHeight / (eqrtLayout === 'stereo-top-bottom' ? 2 : 1),
291+
layout: eqrtLayout
292+
});
293+
}
294+
this.layer.centralHorizontalAngle = Math.PI * (eqrtIs180 ? 1 : 2);
295+
this.layer.upperVerticalAngle = Math.PI / 2.0;
296+
this.layer.lowerVerticalAngle = -Math.PI / 2.0;
297+
this.layer.radius = eqrtRadius;
298+
sceneEl.renderer.xr.addLayer(this.layer);
299+
},
300+
251301
initQuadLayer: function () {
252302
if (!this.texture) { return; }
253303
var sceneEl = this.el.sceneEl;

0 commit comments

Comments
 (0)