Skip to content

Commit e5aa0f2

Browse files
authored
Merge pull request #15484 from Mugen87/dev2
WebGLRenderer: Added ability to sort groups by renderOrder
2 parents fb6f745 + 7d584d9 commit e5aa0f2

File tree

4 files changed

+33
-18
lines changed

4 files changed

+33
-18
lines changed

docs/api/en/core/Object3D.html

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,8 @@ <h3>[property:Boolean receiveShadow]</h3>
137137
<h3>[property:Number renderOrder]</h3>
138138
<p>
139139
This value allows the default rendering order of [link:https://en.wikipedia.org/wiki/Scene_graph scene graph]
140-
objects to be overridden although opaque and transparent objects remain sorted independently.
140+
objects to be overridden although opaque and transparent objects remain sorted independently. When this property
141+
is set for an instance of [page:Group Group], all descendants objects will be sorted and rendered together.
141142
Sorting is from lowest to highest renderOrder. Default value is *0*.
142143
</p>
143144

src/renderers/WebGLRenderer.js

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1073,7 +1073,7 @@ function WebGLRenderer( parameters ) {
10731073
currentRenderList = renderLists.get( scene, camera );
10741074
currentRenderList.init();
10751075

1076-
projectObject( scene, camera, _this.sortObjects );
1076+
projectObject( scene, camera, 0, _this.sortObjects );
10771077

10781078
if ( _this.sortObjects === true ) {
10791079

@@ -1164,15 +1164,19 @@ function WebGLRenderer( parameters ) {
11641164

11651165
};
11661166

1167-
function projectObject( object, camera, sortObjects ) {
1167+
function projectObject( object, camera, groupOrder, sortObjects ) {
11681168

11691169
if ( object.visible === false ) return;
11701170

11711171
var visible = object.layers.test( camera.layers );
11721172

11731173
if ( visible ) {
11741174

1175-
if ( object.isLight ) {
1175+
if ( object.isGroup ) {
1176+
1177+
groupOrder = object.renderOrder;
1178+
1179+
} else if ( object.isLight ) {
11761180

11771181
currentRenderState.pushLight( object );
11781182

@@ -1196,7 +1200,7 @@ function WebGLRenderer( parameters ) {
11961200
var geometry = objects.update( object );
11971201
var material = object.material;
11981202

1199-
currentRenderList.push( object, geometry, material, _vector3.z, null );
1203+
currentRenderList.push( object, geometry, material, groupOrder, _vector3.z, null );
12001204

12011205
}
12021206

@@ -1209,7 +1213,7 @@ function WebGLRenderer( parameters ) {
12091213

12101214
}
12111215

1212-
currentRenderList.push( object, null, object.material, _vector3.z, null );
1216+
currentRenderList.push( object, null, object.material, groupOrder, _vector3.z, null );
12131217

12141218
} else if ( object.isMesh || object.isLine || object.isPoints ) {
12151219

@@ -1242,15 +1246,15 @@ function WebGLRenderer( parameters ) {
12421246

12431247
if ( groupMaterial && groupMaterial.visible ) {
12441248

1245-
currentRenderList.push( object, geometry, groupMaterial, _vector3.z, group );
1249+
currentRenderList.push( object, geometry, groupMaterial, groupOrder, _vector3.z, group );
12461250

12471251
}
12481252

12491253
}
12501254

12511255
} else if ( material.visible ) {
12521256

1253-
currentRenderList.push( object, geometry, material, _vector3.z, null );
1257+
currentRenderList.push( object, geometry, material, groupOrder, _vector3.z, null );
12541258

12551259
}
12561260

@@ -1264,7 +1268,7 @@ function WebGLRenderer( parameters ) {
12641268

12651269
for ( var i = 0, l = children.length; i < l; i ++ ) {
12661270

1267-
projectObject( children[ i ], camera, sortObjects );
1271+
projectObject( children[ i ], camera, groupOrder, sortObjects );
12681272

12691273
}
12701274

src/renderers/webgl/WebGLBackground.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ function WebGLBackground( renderer, state, objects, premultipliedAlpha ) {
105105
}
106106

107107
// push to the pre-sorted opaque render list
108-
renderList.unshift( boxMesh, boxMesh.geometry, boxMesh.material, 0, null );
108+
renderList.unshift( boxMesh, boxMesh.geometry, boxMesh.material, 0, 0, null );
109109

110110
} else if ( background && background.isTexture ) {
111111

@@ -164,7 +164,7 @@ function WebGLBackground( renderer, state, objects, premultipliedAlpha ) {
164164

165165

166166
// push to the pre-sorted opaque render list
167-
renderList.unshift( planeMesh, planeMesh.geometry, planeMesh.material, 0, null );
167+
renderList.unshift( planeMesh, planeMesh.geometry, planeMesh.material, 0, 0, null );
168168

169169
}
170170

src/renderers/webgl/WebGLRenderLists.js

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,11 @@
44

55
function painterSortStable( a, b ) {
66

7-
if ( a.renderOrder !== b.renderOrder ) {
7+
if ( a.groupOrder !== b.groupOrder ) {
8+
9+
return a.groupOrder - b.groupOrder;
10+
11+
} else if ( a.renderOrder !== b.renderOrder ) {
812

913
return a.renderOrder - b.renderOrder;
1014

@@ -30,7 +34,11 @@ function painterSortStable( a, b ) {
3034

3135
function reversePainterSortStable( a, b ) {
3236

33-
if ( a.renderOrder !== b.renderOrder ) {
37+
if ( a.groupOrder !== b.groupOrder ) {
38+
39+
return a.groupOrder - b.groupOrder;
40+
41+
} else if ( a.renderOrder !== b.renderOrder ) {
3442

3543
return a.renderOrder - b.renderOrder;
3644

@@ -64,7 +72,7 @@ function WebGLRenderList() {
6472

6573
}
6674

67-
function getNextRenderItem( object, geometry, material, z, group ) {
75+
function getNextRenderItem( object, geometry, material, groupOrder, z, group ) {
6876

6977
var renderItem = renderItems[ renderItemsIndex ];
7078

@@ -76,6 +84,7 @@ function WebGLRenderList() {
7684
geometry: geometry,
7785
material: material,
7886
program: material.program,
87+
groupOrder: groupOrder,
7988
renderOrder: object.renderOrder,
8089
z: z,
8190
group: group
@@ -90,6 +99,7 @@ function WebGLRenderList() {
9099
renderItem.geometry = geometry;
91100
renderItem.material = material;
92101
renderItem.program = material.program;
102+
renderItem.groupOrder = groupOrder;
93103
renderItem.renderOrder = object.renderOrder;
94104
renderItem.z = z;
95105
renderItem.group = group;
@@ -102,17 +112,17 @@ function WebGLRenderList() {
102112

103113
}
104114

105-
function push( object, geometry, material, z, group ) {
115+
function push( object, geometry, material, groupOrder, z, group ) {
106116

107-
var renderItem = getNextRenderItem( object, geometry, material, z, group );
117+
var renderItem = getNextRenderItem( object, geometry, material, groupOrder, z, group );
108118

109119
( material.transparent === true ? transparent : opaque ).push( renderItem );
110120

111121
}
112122

113-
function unshift( object, geometry, material, z, group ) {
123+
function unshift( object, geometry, material, groupOrder, z, group ) {
114124

115-
var renderItem = getNextRenderItem( object, geometry, material, z, group );
125+
var renderItem = getNextRenderItem( object, geometry, material, groupOrder, z, group );
116126

117127
( material.transparent === true ? transparent : opaque ).unshift( renderItem );
118128

0 commit comments

Comments
 (0)