diff --git a/examples/webgl_materials_cars_parallaxbarrier.html b/examples/webgl_materials_cars_parallaxbarrier.html
index d3e5b258..d5dffdb4 100644
--- a/examples/webgl_materials_cars_parallaxbarrier.html
+++ b/examples/webgl_materials_cars_parallaxbarrier.html
@@ -56,6 +56,7 @@
+
@@ -165,6 +166,8 @@
scene = new THREE.Scene();
+ scene.add( camera );
+
// LIGHTS
var ambient = new THREE.AmbientLight( 0x555555 );
diff --git a/src/extras/renderers/ParallaxBarrierWebGLRenderer.js b/src/extras/renderers/ParallaxBarrierWebGLRenderer.js
index bd9772fa..c7f87a73 100644
--- a/src/extras/renderers/ParallaxBarrierWebGLRenderer.js
+++ b/src/extras/renderers/ParallaxBarrierWebGLRenderer.js
@@ -1,6 +1,7 @@
/**
* @author mrdoob / http://mrdoob.com/
* @author marklundin / http://mark-lundin.com/
+ * @author alteredq / http://alteredqualia.com/
*/
if ( THREE.WebGLRenderer ) {
@@ -9,6 +10,8 @@ if ( THREE.WebGLRenderer ) {
THREE.WebGLRenderer.call( this, parameters );
+ this.autoUpdateScene = false;
+
var _this = this, _setSize = this.setSize, _render = this.render;
var _cameraL = new THREE.PerspectiveCamera(),
@@ -17,7 +20,7 @@ if ( THREE.WebGLRenderer ) {
var eyeRight = new THREE.Matrix4(),
eyeLeft = new THREE.Matrix4(),
focalLength = 125,
- aspect, near, fov;
+ _aspect, _near, _far, _fov;
_cameraL.matrixAutoUpdate = _cameraR.matrixAutoUpdate = false;
@@ -80,6 +83,8 @@ if ( THREE.WebGLRenderer ) {
var _scene = new THREE.Scene();
_scene.add( new THREE.Mesh( new THREE.PlaneGeometry( 2, 2 ), _material ) );
+ _scene.add( _camera );
+
this.setSize = function ( width, height ) {
_setSize.call( _this, width, height );
@@ -100,59 +105,65 @@ if ( THREE.WebGLRenderer ) {
this.render = function ( scene, camera, renderTarget, forceClear ) {
- //camera.update( null, true );
+ scene.updateMatrixWorld();
- var hasCameraChanged = aspect !== camera.aspect || near !== camera.near || fov !== camera.fov;
+ var hasCameraChanged = ( _aspect !== camera.aspect ) || ( _near !== camera.near ) || ( _far !== camera.far ) || ( _fov !== camera.fov );
if( hasCameraChanged ) {
- aspect = camera.aspect;
- near = camera.near;
- fov = camera.fov;
+ _aspect = camera.aspect;
+ _near = camera.near;
+ _far = camera.far;
+ _fov = camera.fov;
var projectionMatrix = camera.projectionMatrix.clone(),
eyeSep = focalLength / 30 * 0.5,
- eyeSepOnProjection = eyeSep * near / focalLength,
- ymax = near * Math.tan( fov * Math.PI / 360 ),
+ eyeSepOnProjection = eyeSep * _near / focalLength,
+ ymax = _near * Math.tan( _fov * Math.PI / 360 ),
xmin, xmax;
- //translate xOffset
+ // translate xOffset
eyeRight.n14 = eyeSep;
eyeLeft.n14 = -eyeSep;
- //For left eye
+ // for left eye
- xmin = -ymax * aspect + eyeSepOnProjection;
- xmax = ymax * aspect + eyeSepOnProjection;
- projectionMatrix.n11 = 2 * near / ( xmax - xmin );
+ xmin = -ymax * _aspect + eyeSepOnProjection;
+ xmax = ymax * _aspect + eyeSepOnProjection;
+
+ projectionMatrix.n11 = 2 * _near / ( xmax - xmin );
projectionMatrix.n13 = ( xmax + xmin ) / ( xmax - xmin );
- _cameraL.projectionMatrix = projectionMatrix.clone();
- //for right eye
+ _cameraL.projectionMatrix.copy( projectionMatrix );
- xmin = -ymax * aspect - eyeSepOnProjection;
- xmax = ymax * aspect - eyeSepOnProjection;
- projectionMatrix.n11 = 2 * near / ( xmax - xmin );
+ // for right eye
+
+ xmin = -ymax * _aspect - eyeSepOnProjection;
+ xmax = ymax * _aspect - eyeSepOnProjection;
+
+ projectionMatrix.n11 = 2 * _near / ( xmax - xmin );
projectionMatrix.n13 = ( xmax + xmin ) / ( xmax - xmin );
- _cameraR.projectionMatrix = projectionMatrix.clone();
+
+ _cameraR.projectionMatrix.copy( projectionMatrix );
}
- _cameraL.matrix = camera.matrixWorld.clone().multiplySelf( eyeLeft );
- //_cameraL.update( null, true );
+ _cameraL.matrixWorld.copy( camera.matrixWorld ).multiplySelf( eyeLeft );
_cameraL.position.copy( camera.position );
- _cameraL.near = near;
+ _cameraL.near = camera.near;
_cameraL.far = camera.far;
+
_render.call( _this, scene, _cameraL, _renderTargetL, true );
- _cameraR.matrix = camera.matrixWorld.clone().multiplySelf( eyeRight );
- //_cameraR.update( null, true );
+ _cameraR.matrixWorld.copy( camera.matrixWorld ).multiplySelf( eyeRight );
_cameraR.position.copy( camera.position );
- _cameraR.near = near;
+ _cameraR.near = camera.near;
_cameraR.far = camera.far;
+
_render.call( _this, scene, _cameraR, _renderTargetR, true );
+ _scene.updateMatrixWorld();
_render.call( _this, _scene, _camera );
};