-
-
Notifications
You must be signed in to change notification settings - Fork 36.1k
WebGLRenderer: Added SortingGroup #14433
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
|
So, within a sorting group, If so, I expect |
|
And a sorting group should not contain both opaque and transparent renderable objects. I think that is OK, though. |
|
@mrdoob I wonder if |
Yes. And if
Um, I'm not sure how to solve this. Objects of type |
|
Yes. You have to be able to sort the sorting groups themselves. |
|
Sorting groups via BTW: It's now necessary to set new property of |
|
Mesh without SortingGroup parent should be able to compare renderOrder with SortingGroup, as unity does this. |
|
This should work now, too. The code is also slightly refactored so changes to |
|
Nevertheless the holistic implementation of this approach feels hacky. Besides, the current way |
|
What about this implementation: diff --git a/src/renderers/WebGLRenderer.js b/src/renderers/WebGLRenderer.js
index 4f61704e7..f684902b8 100644
--- a/src/renderers/WebGLRenderer.js
+++ b/src/renderers/WebGLRenderer.js
@@ -1073,7 +1073,7 @@ function WebGLRenderer( parameters ) {
currentRenderList = renderLists.get( scene, camera );
currentRenderList.init();
- projectObject( scene, camera, _this.sortObjects );
+ projectObject( scene, camera, 0, _this.sortObjects );
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;
@@ -1172,7 +1172,11 @@ function WebGLRenderer( parameters ) {
if ( visible ) {
- if ( object.isLight ) {
+ if ( object.isSortingGroup ) {
+
+ groupOrder = object.renderOrder;
+
+ } else if ( object.isLight ) {
currentRenderState.pushLight( object );
@@ -1196,7 +1200,7 @@ function WebGLRenderer( parameters ) {
var geometry = objects.update( object );
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 ) {
@@ -1242,7 +1246,7 @@ function WebGLRenderer( parameters ) {
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 ) {
- 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 ++ ) {
- projectObject( children[ i ], camera, sortObjects );
+ projectObject( children[ i ], camera, groupOrder, sortObjects );
}
diff --git a/src/renderers/webgl/WebGLRenderLists.js b/src/renderers/webgl/WebGLRenderLists.js
index 234de8d5f..0150d2518 100644
--- a/src/renderers/webgl/WebGLRenderLists.js
+++ b/src/renderers/webgl/WebGLRenderLists.js
@@ -4,7 +4,11 @@
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;
@@ -30,7 +34,11 @@ function painterSortStable( 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;
@@ -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 ];
@@ -76,6 +84,7 @@ function WebGLRenderList() {
geometry: geometry,
material: material,
program: material.program,
+ groupOrder: groupOrder,
renderOrder: object.renderOrder,
z: z,
group: group
@@ -90,6 +99,7 @@ function WebGLRenderList() {
renderItem.geometry = geometry;
renderItem.material = material;
renderItem.program = material.program;
+ renderItem.groupOrder = object.groupOrder;
renderItem.renderOrder = object.renderOrder;
renderItem.z = z;
renderItem.group = group; |
|
Actually, we could just do this with the current diff --git a/src/renderers/WebGLRenderer.js b/src/renderers/WebGLRenderer.js
index 4f61704e7..f684902b8 100644
--- a/src/renderers/WebGLRenderer.js
+++ b/src/renderers/WebGLRenderer.js
@@ -1073,7 +1073,7 @@ function WebGLRenderer( parameters ) {
currentRenderList = renderLists.get( scene, camera );
currentRenderList.init();
- projectObject( scene, camera, _this.sortObjects );
+ projectObject( scene, camera, 0, _this.sortObjects );
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;
@@ -1172,7 +1172,11 @@ function WebGLRenderer( parameters ) {
if ( visible ) {
- if ( object.isLight ) {
+ if ( object.isGroup ) {
+
+ groupOrder = object.renderOrder;
+
+ } else if ( object.isLight ) {
currentRenderState.pushLight( object );
@@ -1196,7 +1200,7 @@ function WebGLRenderer( parameters ) {
var geometry = objects.update( object );
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 ) {
@@ -1242,7 +1246,7 @@ function WebGLRenderer( parameters ) {
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 ) {
- 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 ++ ) {
- projectObject( children[ i ], camera, sortObjects );
+ projectObject( children[ i ], camera, groupOrder, sortObjects );
}
diff --git a/src/renderers/webgl/WebGLRenderLists.js b/src/renderers/webgl/WebGLRenderLists.js
index 234de8d5f..0150d2518 100644
--- a/src/renderers/webgl/WebGLRenderLists.js
+++ b/src/renderers/webgl/WebGLRenderLists.js
@@ -4,7 +4,11 @@
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;
@@ -30,7 +34,11 @@ function painterSortStable( 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;
@@ -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 ];
@@ -76,6 +84,7 @@ function WebGLRenderList() {
geometry: geometry,
material: material,
program: material.program,
+ groupOrder: groupOrder,
renderOrder: object.renderOrder,
z: z,
group: group
@@ -90,6 +99,7 @@ function WebGLRenderList() {
renderItem.geometry = geometry;
renderItem.material = material;
renderItem.program = material.program;
+ renderItem.groupOrder = object.groupOrder;
renderItem.renderOrder = object.renderOrder;
renderItem.z = z;
renderItem.group = group; |
|
I've added a WIP PR to demonstrate your suggested change. I've also added a small demo that shows that the PR solve the original issue mentioned in #14415 |
Fixes #14415
The PR introduces a new class
SortingGroupwhich can be used to group objects within the render list. So it's somewhat similar to Unity's SortingGroup API.