Browse Source

Added support of object.renderDepth to Projector. Related to #2386.

Mr.doob 13 years ago
parent
commit
2386d63147

+ 1 - 1
examples/js/renderers/SVGRenderer.js

@@ -97,7 +97,7 @@ THREE.SVGRenderer = function () {
 		_this.info.render.vertices = 0;
 		_this.info.render.vertices = 0;
 		_this.info.render.faces = 0;
 		_this.info.render.faces = 0;
 
 
-		_renderData = _projector.projectScene( scene, camera, this.sortElements );
+		_renderData = _projector.projectScene( scene, camera, this.sortObjects, this.sortElements );
 		_elements = _renderData.elements;
 		_elements = _renderData.elements;
 		_lights = _renderData.lights;
 		_lights = _renderData.lights;
 
 

+ 33 - 13
src/core/Projector.js

@@ -68,7 +68,7 @@ THREE.Projector = function() {
 
 
 	};
 	};
 
 
-	var projectGraph = function ( root, sort ) {
+	var projectGraph = function ( root, sortObjects ) {
 
 
 		_objectCount = 0;
 		_objectCount = 0;
 
 
@@ -83,23 +83,43 @@ THREE.Projector = function() {
 			if ( ( object instanceof THREE.Mesh || object instanceof THREE.Line ) &&
 			if ( ( object instanceof THREE.Mesh || object instanceof THREE.Line ) &&
 			( object.frustumCulled === false || _frustum.contains( object ) === true ) ) {
 			( object.frustumCulled === false || _frustum.contains( object ) === true ) ) {
 
 
-				_vector3.copy( object.matrixWorld.getPosition() );
-				_viewProjectionMatrix.multiplyVector3( _vector3 );
-
 				_object = getNextObjectInPool();
 				_object = getNextObjectInPool();
 				_object.object = object;
 				_object.object = object;
-				_object.z = _vector3.z;
+
+				if ( object.renderDepth !== null ) {
+
+					console.log( object.renderDepth );
+
+					_object.z = object.renderDepth;
+
+				} else {
+
+					_vector3.copy( object.matrixWorld.getPosition() );
+					_viewProjectionMatrix.multiplyVector3( _vector3 );
+					_object.z = _vector3.z;
+
+				}
 
 
 				_renderData.objects.push( _object );
 				_renderData.objects.push( _object );
 
 
 			} else if ( object instanceof THREE.Sprite || object instanceof THREE.Particle ) {
 			} else if ( object instanceof THREE.Sprite || object instanceof THREE.Particle ) {
 
 
-				_vector3.copy( object.matrixWorld.getPosition() );
-				_viewProjectionMatrix.multiplyVector3( _vector3 );
-
 				_object = getNextObjectInPool();
 				_object = getNextObjectInPool();
 				_object.object = object;
 				_object.object = object;
-				_object.z = _vector3.z;
+
+				// TODO: Find an elegant and performant solution and remove this dupe code.
+
+				if ( object.renderDepth !== null ) {
+
+					_object.z = object.renderDepth;
+
+				} else {
+
+					_vector3.copy( object.matrixWorld.getPosition() );
+					_viewProjectionMatrix.multiplyVector3( _vector3 );
+					_object.z = _vector3.z;
+
+				}
 
 
 				_renderData.sprites.push( _object );
 				_renderData.sprites.push( _object );
 
 
@@ -119,13 +139,13 @@ THREE.Projector = function() {
 
 
 		projectObject( root );
 		projectObject( root );
 
 
-		if ( sort === true ) _renderData.objects.sort( painterSort );
+		if ( sortObjects === true ) _renderData.objects.sort( painterSort );
 
 
 		return _renderData;
 		return _renderData;
 
 
 	};
 	};
 
 
-	this.projectScene = function ( scene, camera, sort ) {
+	this.projectScene = function ( scene, camera, sortObjects, sortElements ) {
 
 
 		var near = camera.near, far = camera.far, visible = false,
 		var near = camera.near, far = camera.far, visible = false,
 		o, ol, v, vl, f, fl, n, nl, c, cl, u, ul, object,
 		o, ol, v, vl, f, fl, n, nl, c, cl, u, ul, object,
@@ -151,7 +171,7 @@ THREE.Projector = function() {
 
 
 		_frustum.setFromMatrix( _viewProjectionMatrix );
 		_frustum.setFromMatrix( _viewProjectionMatrix );
 
 
-		_renderData = projectGraph( scene, false );
+		_renderData = projectGraph( scene, sortObjects );
 
 
 		for ( o = 0, ol = _renderData.objects.length; o < ol; o++ ) {
 		for ( o = 0, ol = _renderData.objects.length; o < ol; o++ ) {
 
 
@@ -404,7 +424,7 @@ THREE.Projector = function() {
 
 
 		}
 		}
 
 
-		sort && _renderData.elements.sort( painterSort );
+		if ( sortElements === true ) _renderData.elements.sort( painterSort );
 
 
 		return _renderData;
 		return _renderData;
 
 

+ 1 - 1
src/renderers/CanvasRenderer.js

@@ -195,7 +195,7 @@ THREE.CanvasRenderer = function ( parameters ) {
 		_this.info.render.vertices = 0;
 		_this.info.render.vertices = 0;
 		_this.info.render.faces = 0;
 		_this.info.render.faces = 0;
 
 
-		_renderData = _projector.projectScene( scene, camera, this.sortElements );
+		_renderData = _projector.projectScene( scene, camera, this.sortObjects, this.sortElements );
 		_elements = _renderData.elements;
 		_elements = _renderData.elements;
 		_lights = _renderData.lights;
 		_lights = _renderData.lights;
 
 

+ 2 - 2
src/renderers/WebGLRenderer.js

@@ -3694,9 +3694,9 @@ THREE.WebGLRenderer = function ( parameters ) {
 
 
 					webglObject.render = true;
 					webglObject.render = true;
 
 
-					if ( this.sortObjects ) {
+					if ( this.sortObjects === true ) {
 
 
-						if ( object.renderDepth ) {
+						if ( object.renderDepth !== null ) {
 
 
 							webglObject.z = object.renderDepth;
 							webglObject.z = object.renderDepth;