Skip to content

Commit 877da70

Browse files
authored
WebGLRenderer: Consider skinning / instancing when sorting objects. (mrdoob#28125)
1 parent decc02e commit 877da70

2 files changed

Lines changed: 23 additions & 0 deletions

File tree

src/renderers/webgl/WebGLRenderLists.js

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,10 @@ function painterSortStable( a, b ) {
1212

1313
return a.material.id - b.material.id;
1414

15+
} else if ( a.materialVariant !== b.materialVariant ) {
16+
17+
return a.materialVariant - b.materialVariant;
18+
1519
} else if ( a.z !== b.z ) {
1620

1721
return a.z - b.z;
@@ -66,6 +70,15 @@ function WebGLRenderList() {
6670

6771
}
6872

73+
function materialVariant( object ) {
74+
75+
let variant = 0;
76+
if ( object.isInstancedMesh ) variant += 2;
77+
if ( object.isSkinnedMesh ) variant += 1;
78+
return variant;
79+
80+
}
81+
6982
function getNextRenderItem( object, geometry, material, groupOrder, z, group ) {
7083

7184
let renderItem = renderItems[ renderItemsIndex ];
@@ -77,6 +90,7 @@ function WebGLRenderList() {
7790
object: object,
7891
geometry: geometry,
7992
material: material,
93+
materialVariant: materialVariant( object ),
8094
groupOrder: groupOrder,
8195
renderOrder: object.renderOrder,
8296
z: z,
@@ -91,6 +105,7 @@ function WebGLRenderList() {
91105
renderItem.object = object;
92106
renderItem.geometry = geometry;
93107
renderItem.material = material;
108+
renderItem.materialVariant = materialVariant( object );
94109
renderItem.groupOrder = groupOrder;
95110
renderItem.renderOrder = object.renderOrder;
96111
renderItem.z = z;

test/unit/src/renderers/webgl/WebGLRenderLists.tests.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ export default QUnit.module( 'Renderers', () => {
7676
object: objA,
7777
geometry: geoA,
7878
material: matA,
79+
materialVariant: 0,
7980
groupOrder: 0,
8081
renderOrder: 0,
8182
z: 0.5,
@@ -94,6 +95,7 @@ export default QUnit.module( 'Renderers', () => {
9495
object: objB,
9596
geometry: geoB,
9697
material: matB,
98+
materialVariant: 0,
9799
groupOrder: 1,
98100
renderOrder: 0,
99101
z: 1.5,
@@ -112,6 +114,7 @@ export default QUnit.module( 'Renderers', () => {
112114
object: objC,
113115
geometry: geoC,
114116
material: matC,
117+
materialVariant: 0,
115118
groupOrder: 2,
116119
renderOrder: 0,
117120
z: 2.5,
@@ -130,6 +133,7 @@ export default QUnit.module( 'Renderers', () => {
130133
object: objD,
131134
geometry: geoD,
132135
material: matD,
136+
materialVariant: 0,
133137
groupOrder: 3,
134138
renderOrder: 0,
135139
z: 3.5,
@@ -170,6 +174,7 @@ export default QUnit.module( 'Renderers', () => {
170174
object: objA,
171175
geometry: geoA,
172176
material: matA,
177+
materialVariant: 0,
173178
groupOrder: 0,
174179
renderOrder: 0,
175180
z: 0.5,
@@ -188,6 +193,7 @@ export default QUnit.module( 'Renderers', () => {
188193
object: objB,
189194
geometry: geoB,
190195
material: matB,
196+
materialVariant: 0,
191197
groupOrder: 1,
192198
renderOrder: 0,
193199
z: 1.5,
@@ -206,6 +212,7 @@ export default QUnit.module( 'Renderers', () => {
206212
object: objC,
207213
geometry: geoC,
208214
material: matC,
215+
materialVariant: 0,
209216
groupOrder: 2,
210217
renderOrder: 0,
211218
z: 2.5,
@@ -224,6 +231,7 @@ export default QUnit.module( 'Renderers', () => {
224231
object: objD,
225232
geometry: geoD,
226233
material: matD,
234+
materialVariant: 0,
227235
groupOrder: 3,
228236
renderOrder: 0,
229237
z: 3.5,

0 commit comments

Comments
 (0)