Explorar o código

Merge pull request #15484 from Mugen87/dev2

WebGLRenderer: Added ability to sort groups by renderOrder
Mr.doob %!s(int64=6) %!d(string=hai) anos
pai
achega
e5aa0f28a9

+ 2 - 1
docs/api/en/core/Object3D.html

@@ -137,7 +137,8 @@
 		<h3>[property:Number renderOrder]</h3>
 		<h3>[property:Number renderOrder]</h3>
 		<p>
 		<p>
 		This value allows the default rendering order of [link:https://en.wikipedia.org/wiki/Scene_graph scene graph]
 		This value allows the default rendering order of [link:https://en.wikipedia.org/wiki/Scene_graph scene graph]
-		objects to be overridden although opaque and transparent objects remain sorted independently.
+		objects to be overridden although opaque and transparent objects remain sorted independently. When this property
+		is set for an instance of [page:Group Group], all descendants objects will be sorted and rendered together.
 		Sorting is from lowest to highest renderOrder. Default value is *0*.
 		Sorting is from lowest to highest renderOrder. Default value is *0*.
 		</p>
 		</p>
 
 

+ 12 - 8
src/renderers/WebGLRenderer.js

@@ -1073,7 +1073,7 @@ function WebGLRenderer( parameters ) {
 		currentRenderList = renderLists.get( scene, camera );
 		currentRenderList = renderLists.get( scene, camera );
 		currentRenderList.init();
 		currentRenderList.init();
 
 
-		projectObject( scene, camera, _this.sortObjects );
+		projectObject( scene, camera, 0, _this.sortObjects );
 
 
 		if ( _this.sortObjects === true ) {
 		if ( _this.sortObjects === true ) {
 
 
@@ -1164,7 +1164,7 @@ function WebGLRenderer( parameters ) {
 
 
 	};
 	};
 
 
-	function projectObject( object, camera, sortObjects ) {
+	function projectObject( object, camera, groupOrder, sortObjects ) {
 
 
 		if ( object.visible === false ) return;
 		if ( object.visible === false ) return;
 
 
@@ -1172,7 +1172,11 @@ function WebGLRenderer( parameters ) {
 
 
 		if ( visible ) {
 		if ( visible ) {
 
 
-			if ( object.isLight ) {
+			if ( object.isGroup ) {
+
+				groupOrder = object.renderOrder;
+
+			} else if ( object.isLight ) {
 
 
 				currentRenderState.pushLight( object );
 				currentRenderState.pushLight( object );
 
 
@@ -1196,7 +1200,7 @@ function WebGLRenderer( parameters ) {
 					var geometry = objects.update( object );
 					var geometry = objects.update( object );
 					var material = object.material;
 					var material = object.material;
 
 
-					currentRenderList.push( object, geometry, material, _vector3.z, null );
+					currentRenderList.push( object, geometry, material, groupOrder, _vector3.z, null );
 
 
 				}
 				}
 
 
@@ -1209,7 +1213,7 @@ function WebGLRenderer( parameters ) {
 
 
 				}
 				}
 
 
-				currentRenderList.push( object, null, object.material, _vector3.z, null );
+				currentRenderList.push( object, null, object.material, groupOrder, _vector3.z, null );
 
 
 			} else if ( object.isMesh || object.isLine || object.isPoints ) {
 			} else if ( object.isMesh || object.isLine || object.isPoints ) {
 
 
@@ -1242,7 +1246,7 @@ function WebGLRenderer( parameters ) {
 
 
 							if ( groupMaterial && groupMaterial.visible ) {
 							if ( groupMaterial && groupMaterial.visible ) {
 
 
-								currentRenderList.push( object, geometry, groupMaterial, _vector3.z, group );
+								currentRenderList.push( object, geometry, groupMaterial, groupOrder, _vector3.z, group );
 
 
 							}
 							}
 
 
@@ -1250,7 +1254,7 @@ function WebGLRenderer( parameters ) {
 
 
 					} else if ( material.visible ) {
 					} else if ( material.visible ) {
 
 
-						currentRenderList.push( object, geometry, material, _vector3.z, null );
+						currentRenderList.push( object, geometry, material, groupOrder, _vector3.z, null );
 
 
 					}
 					}
 
 
@@ -1264,7 +1268,7 @@ function WebGLRenderer( parameters ) {
 
 
 		for ( var i = 0, l = children.length; i < l; i ++ ) {
 		for ( var i = 0, l = children.length; i < l; i ++ ) {
 
 
-			projectObject( children[ i ], camera, sortObjects );
+			projectObject( children[ i ], camera, groupOrder, sortObjects );
 
 
 		}
 		}
 
 

+ 2 - 2
src/renderers/webgl/WebGLBackground.js

@@ -105,7 +105,7 @@ function WebGLBackground( renderer, state, objects, premultipliedAlpha ) {
 			}
 			}
 
 
 			// push to the pre-sorted opaque render list
 			// push to the pre-sorted opaque render list
-			renderList.unshift( boxMesh, boxMesh.geometry, boxMesh.material, 0, null );
+			renderList.unshift( boxMesh, boxMesh.geometry, boxMesh.material, 0, 0, null );
 
 
 		} else if ( background && background.isTexture ) {
 		} else if ( background && background.isTexture ) {
 
 
@@ -164,7 +164,7 @@ function WebGLBackground( renderer, state, objects, premultipliedAlpha ) {
 
 
 
 
 			// push to the pre-sorted opaque render list
 			// push to the pre-sorted opaque render list
-			renderList.unshift( planeMesh, planeMesh.geometry, planeMesh.material, 0, null );
+			renderList.unshift( planeMesh, planeMesh.geometry, planeMesh.material, 0, 0, null );
 
 
 		}
 		}
 
 

+ 17 - 7
src/renderers/webgl/WebGLRenderLists.js

@@ -4,7 +4,11 @@
 
 
 function painterSortStable( a, b ) {
 function painterSortStable( a, b ) {
 
 
-	if ( a.renderOrder !== b.renderOrder ) {
+	if ( a.groupOrder !== b.groupOrder ) {
+
+		return a.groupOrder - b.groupOrder;
+
+	} else if ( a.renderOrder !== b.renderOrder ) {
 
 
 		return a.renderOrder - b.renderOrder;
 		return a.renderOrder - b.renderOrder;
 
 
@@ -30,7 +34,11 @@ function painterSortStable( a, b ) {
 
 
 function reversePainterSortStable( a, b ) {
 function reversePainterSortStable( a, b ) {
 
 
-	if ( a.renderOrder !== b.renderOrder ) {
+	if ( a.groupOrder !== b.groupOrder ) {
+
+		return a.groupOrder - b.groupOrder;
+
+	} else if ( a.renderOrder !== b.renderOrder ) {
 
 
 		return a.renderOrder - b.renderOrder;
 		return a.renderOrder - b.renderOrder;
 
 
@@ -64,7 +72,7 @@ function WebGLRenderList() {
 
 
 	}
 	}
 
 
-	function getNextRenderItem( object, geometry, material, z, group ) {
+	function getNextRenderItem( object, geometry, material, groupOrder, z, group ) {
 
 
 		var renderItem = renderItems[ renderItemsIndex ];
 		var renderItem = renderItems[ renderItemsIndex ];
 
 
@@ -76,6 +84,7 @@ function WebGLRenderList() {
 				geometry: geometry,
 				geometry: geometry,
 				material: material,
 				material: material,
 				program: material.program,
 				program: material.program,
+				groupOrder: groupOrder,
 				renderOrder: object.renderOrder,
 				renderOrder: object.renderOrder,
 				z: z,
 				z: z,
 				group: group
 				group: group
@@ -90,6 +99,7 @@ function WebGLRenderList() {
 			renderItem.geometry = geometry;
 			renderItem.geometry = geometry;
 			renderItem.material = material;
 			renderItem.material = material;
 			renderItem.program = material.program;
 			renderItem.program = material.program;
+			renderItem.groupOrder = groupOrder;
 			renderItem.renderOrder = object.renderOrder;
 			renderItem.renderOrder = object.renderOrder;
 			renderItem.z = z;
 			renderItem.z = z;
 			renderItem.group = group;
 			renderItem.group = group;
@@ -102,17 +112,17 @@ function WebGLRenderList() {
 
 
 	}
 	}
 
 
-	function push( object, geometry, material, z, group ) {
+	function push( object, geometry, material, groupOrder, z, group ) {
 
 
-		var renderItem = getNextRenderItem( object, geometry, material, z, group );
+		var renderItem = getNextRenderItem( object, geometry, material, groupOrder, z, group );
 
 
 		( material.transparent === true ? transparent : opaque ).push( renderItem );
 		( material.transparent === true ? transparent : opaque ).push( renderItem );
 
 
 	}
 	}
 
 
-	function unshift( object, geometry, material, z, group ) {
+	function unshift( object, geometry, material, groupOrder, z, group ) {
 
 
-		var renderItem = getNextRenderItem( object, geometry, material, z, group );
+		var renderItem = getNextRenderItem( object, geometry, material, groupOrder, z, group );
 
 
 		( material.transparent === true ? transparent : opaque ).unshift( renderItem );
 		( material.transparent === true ? transparent : opaque ).unshift( renderItem );