Skip to content

Commit 5060cdd

Browse files
brianchirlsmrdoob
authored andcommitted
VREffect: Support layer bounds (mrdoob#9290)
* VREffect: Support layer bounds - Retrieve left and right eye layer bounds on vrdisplaypresentchange - Set viewport to layer bounds when rendering stereo * Fix incorrect variable name and style/spacing * Really, fix vrDisplay variable name * Fix default value for leftBounds in VREffect
1 parent d868ce7 commit 5060cdd

File tree

1 file changed

+35
-14
lines changed

1 file changed

+35
-14
lines changed

examples/js/effects/VREffect.js

Lines changed: 35 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -116,23 +116,16 @@ THREE.VREffect = function ( renderer, onError ) {
116116
var requestFullscreen;
117117
var exitFullscreen;
118118
var fullscreenElement;
119+
var leftBounds = [ 0.0, 0.0, 0.5, 1.0 ];
120+
var rightBounds = [ 0.5, 0.0, 0.5, 1.0 ];
119121

120122
function onFullscreenChange () {
121123

122124
var wasPresenting = scope.isPresenting;
123125
scope.isPresenting = vrDisplay !== undefined && ( vrDisplay.isPresenting || ( ! isWebVR1 && document[ fullscreenElement ] instanceof window.HTMLElement ) );
124126

125-
if ( wasPresenting === scope.isPresenting ) {
126-
127-
return;
128-
129-
}
130-
131127
if ( scope.isPresenting ) {
132128

133-
rendererPixelRatio = renderer.getPixelRatio();
134-
rendererSize = renderer.getSize();
135-
136129
var eyeParamsL = vrDisplay.getEyeParameters( 'left' );
137130
var eyeWidth, eyeHeight;
138131

@@ -141,17 +134,35 @@ THREE.VREffect = function ( renderer, onError ) {
141134
eyeWidth = eyeParamsL.renderWidth;
142135
eyeHeight = eyeParamsL.renderHeight;
143136

137+
if ( vrDisplay.getLayers ) {
138+
139+
var layers = vrDisplay.getLayers();
140+
if (layers.length) {
141+
142+
leftBounds = layers[0].leftBounds || [ 0.0, 0.0, 0.5, 1.0 ];
143+
rightBounds = layers[0].rightBounds || [ 0.5, 0.0, 0.5, 1.0 ];
144+
145+
}
146+
}
147+
144148
} else {
145149

146150
eyeWidth = eyeParamsL.renderRect.width;
147151
eyeHeight = eyeParamsL.renderRect.height;
148152

149153
}
150154

151-
renderer.setPixelRatio( 1 );
152-
renderer.setSize( eyeWidth * 2, eyeHeight, false );
155+
if ( !wasPresenting ) {
153156

154-
} else {
157+
rendererPixelRatio = renderer.getPixelRatio();
158+
rendererSize = renderer.getSize();
159+
160+
renderer.setPixelRatio( 1 );
161+
renderer.setSize( eyeWidth * 2, eyeHeight, false );
162+
163+
}
164+
165+
} else if ( wasPresenting ) {
155166

156167
renderer.setPixelRatio( rendererPixelRatio );
157168
renderer.setSize( rendererSize.width, rendererSize.height );
@@ -311,8 +322,18 @@ THREE.VREffect = function ( renderer, onError ) {
311322
// When rendering we don't care what the recommended size is, only what the actual size
312323
// of the backbuffer is.
313324
var size = renderer.getSize();
314-
renderRectL = { x: 0, y: 0, width: size.width / 2, height: size.height };
315-
renderRectR = { x: size.width / 2, y: 0, width: size.width / 2, height: size.height };
325+
renderRectL = {
326+
x: Math.round( size.width * leftBounds[ 0 ] ),
327+
y: Math.round( size.height * leftBounds[ 1 ] ),
328+
width: Math.round( size.width * leftBounds[ 2 ] ),
329+
height: Math.round(size.height * leftBounds[ 3 ] )
330+
};
331+
renderRectR = {
332+
x: Math.round( size.width * rightBounds[ 0 ] ),
333+
y: Math.round( size.height * rightBounds[ 1 ] ),
334+
width: Math.round( size.width * rightBounds[ 2 ] ),
335+
height: Math.round(size.height * rightBounds[ 3 ] )
336+
};
316337

317338
renderer.setScissorTest( true );
318339

0 commit comments

Comments
 (0)