@@ -6,8 +6,9 @@ var warn = utils.debug('components:layer:warn');
66
77export 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