Skip to content

Commit d90f2cc

Browse files
committed
Consider skinning / instancing when sorting objects
1 parent 454ada9 commit d90f2cc

File tree

2 files changed

+23
-0
lines changed

2 files changed

+23
-0
lines changed

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
@@ -78,6 +78,7 @@ export default QUnit.module( 'Renderers', () => {
7878
object: objA,
7979
geometry: geoA,
8080
material: matA,
81+
materialVariant: 0,
8182
groupOrder: 0,
8283
renderOrder: 0,
8384
z: 0.5,
@@ -96,6 +97,7 @@ export default QUnit.module( 'Renderers', () => {
9697
object: objB,
9798
geometry: geoB,
9899
material: matB,
100+
materialVariant: 0,
99101
groupOrder: 1,
100102
renderOrder: 0,
101103
z: 1.5,
@@ -114,6 +116,7 @@ export default QUnit.module( 'Renderers', () => {
114116
object: objC,
115117
geometry: geoC,
116118
material: matC,
119+
materialVariant: 0,
117120
groupOrder: 2,
118121
renderOrder: 0,
119122
z: 2.5,
@@ -132,6 +135,7 @@ export default QUnit.module( 'Renderers', () => {
132135
object: objD,
133136
geometry: geoD,
134137
material: matD,
138+
materialVariant: 0,
135139
groupOrder: 3,
136140
renderOrder: 0,
137141
z: 3.5,
@@ -172,6 +176,7 @@ export default QUnit.module( 'Renderers', () => {
172176
object: objA,
173177
geometry: geoA,
174178
material: matA,
179+
materialVariant: 0,
175180
groupOrder: 0,
176181
renderOrder: 0,
177182
z: 0.5,
@@ -190,6 +195,7 @@ export default QUnit.module( 'Renderers', () => {
190195
object: objB,
191196
geometry: geoB,
192197
material: matB,
198+
materialVariant: 0,
193199
groupOrder: 1,
194200
renderOrder: 0,
195201
z: 1.5,
@@ -208,6 +214,7 @@ export default QUnit.module( 'Renderers', () => {
208214
object: objC,
209215
geometry: geoC,
210216
material: matC,
217+
materialVariant: 0,
211218
groupOrder: 2,
212219
renderOrder: 0,
213220
z: 2.5,
@@ -226,6 +233,7 @@ export default QUnit.module( 'Renderers', () => {
226233
object: objD,
227234
geometry: geoD,
228235
material: matD,
236+
materialVariant: 0,
229237
groupOrder: 3,
230238
renderOrder: 0,
231239
z: 3.5,

0 commit comments

Comments
 (0)