@@ -119,6 +119,9 @@ var skipRenderAfter = 0;
119
119
120
120
var _skinUpdateIndex = 0 ;
121
121
122
+ var _tempMaterialSet = new Set ( ) ;
123
+
124
+
122
125
// The 8 points of the camera frustum transformed to light space
123
126
var frustumPoints = [ ] ;
124
127
for ( var fp = 0 ; fp < 8 ; fp ++ ) {
@@ -2291,58 +2294,49 @@ Object.assign(ForwardRenderer.prototype, {
2291
2294
} ,
2292
2295
2293
2296
updateShaders : function ( drawCalls ) {
2294
- // #ifdef PROFILER
2295
- var time = now ( ) ;
2296
- // #endif
2297
-
2298
- var i ;
2299
- // Collect materials
2300
- var materials = [ ] ;
2301
- for ( i = 0 ; i < drawCalls . length ; i ++ ) {
2302
- var drawCall = drawCalls [ i ] ;
2303
- if ( drawCall . material !== undefined ) {
2304
- if ( materials . indexOf ( drawCall . material ) === - 1 ) {
2305
- materials . push ( drawCall . material ) ;
2297
+ var mat , count = drawCalls . length ;
2298
+ for ( var i = 0 ; i < count ; i ++ ) {
2299
+ mat = drawCalls [ i ] . material ;
2300
+ if ( mat ) {
2301
+ // material not processed yet
2302
+ if ( ! _tempMaterialSet . has ( mat ) ) {
2303
+ _tempMaterialSet . add ( mat ) ;
2304
+
2305
+ if ( mat . updateShader !== Material . prototype . updateShader ) {
2306
+ mat . clearVariants ( ) ;
2307
+ mat . shader = null ;
2308
+ }
2306
2309
}
2307
2310
}
2308
2311
}
2309
- // Clear material shaders
2310
- for ( i = 0 ; i < materials . length ; i ++ ) {
2311
- var mat = materials [ i ] ;
2312
- if ( mat . updateShader !== Material . prototype . updateShader ) {
2313
- mat . clearVariants ( ) ;
2314
- mat . shader = null ;
2315
- }
2316
- }
2317
2312
2318
- // #ifdef PROFILER
2319
- this . scene . _stats . updateShadersTime += now ( ) - time ;
2320
- // #endif
2313
+ // keep temp set empty
2314
+ _tempMaterialSet . clear ( ) ;
2321
2315
} ,
2322
2316
2323
2317
updateLitShaders : function ( drawCalls ) {
2324
- // #ifdef PROFILER
2325
- var time = now ( ) ;
2326
- // #endif
2327
-
2328
- for ( var i = 0 ; i < drawCalls . length ; i ++ ) {
2329
- var drawCall = drawCalls [ i ] ;
2330
- if ( drawCall . material !== undefined ) {
2331
- var mat = drawCall . material ;
2332
- if ( mat . updateShader !== Material . prototype . updateShader ) {
2333
- if ( mat . useLighting === false || ( mat . emitter && ! mat . emitter . lighting ) ) {
2334
- // skip unlit standard and particles materials
2335
- continue ;
2318
+ var mat , count = drawCalls . length ;
2319
+ for ( var i = 0 ; i < count ; i ++ ) {
2320
+ mat = drawCalls [ i ] . material ;
2321
+ if ( mat ) {
2322
+ // material not processed yet
2323
+ if ( ! _tempMaterialSet . has ( mat ) ) {
2324
+ _tempMaterialSet . add ( mat ) ;
2325
+
2326
+ if ( mat . updateShader !== Material . prototype . updateShader ) {
2327
+
2328
+ // only process lit materials
2329
+ if ( mat . useLighting && ( ! mat . emitter || mat . emitter . lighting ) ) {
2330
+ mat . clearVariants ( ) ;
2331
+ mat . shader = null ;
2332
+ }
2336
2333
}
2337
- mat . clearVariants ( ) ;
2338
- mat . shader = null ;
2339
2334
}
2340
2335
}
2341
2336
}
2342
2337
2343
- // #ifdef PROFILER
2344
- this . scene . _stats . updateShadersTime += now ( ) - time ;
2345
- // #endif
2338
+ // keep temp set empty
2339
+ _tempMaterialSet . clear ( ) ;
2346
2340
} ,
2347
2341
2348
2342
beginFrame : function ( comp ) {
0 commit comments