@@ -82,8 +82,6 @@ THREE.WebGLRenderer = function ( parameters ) {
82
82
83
83
var _this = this ,
84
84
85
- _programs = [ ] ,
86
-
87
85
// internal state cache
88
86
89
87
_currentProgram = null ,
@@ -131,7 +129,6 @@ THREE.WebGLRenderer = function ( parameters ) {
131
129
132
130
_infoMemory = {
133
131
134
- programs : 0 ,
135
132
geometries : 0 ,
136
133
textures : 0
137
134
@@ -150,10 +147,16 @@ THREE.WebGLRenderer = function ( parameters ) {
150
147
151
148
render : _infoRender ,
152
149
memory : _infoMemory ,
153
- programs : _programs
150
+ programs : [ ]
154
151
155
152
} ;
156
153
154
+ Object . defineProperty ( _infoMemory , 'programs' , { get : function ( ) {
155
+
156
+ return _this . info . programs . length ;
157
+
158
+ } } ) ;
159
+
157
160
// initialize
158
161
159
162
var _gl ;
@@ -589,41 +592,13 @@ THREE.WebGLRenderer = function ( parameters ) {
589
592
590
593
function releaseMaterialProgramReference ( material ) {
591
594
592
- var program = properties . get ( material ) . program . program ;
593
-
594
- if ( program === undefined ) return ;
595
+ var programInfo = properties . get ( material ) . program ;
595
596
596
597
material . program = undefined ;
597
598
598
- for ( var i = 0 , n = _programs . length ; i !== n ; ++ i ) {
599
-
600
- var programInfo = _programs [ i ] ;
601
-
602
- if ( programInfo . program === program ) {
603
-
604
- var newReferenceCount = -- programInfo . usedTimes ;
605
-
606
- if ( newReferenceCount === 0 ) {
607
-
608
- // the last material that has been using the program let
609
- // go of it, so remove it from the (unordered) _programs
610
- // set and deallocate the GL resource
611
-
612
- var newLength = n - 1 ;
613
-
614
- _programs [ i ] = _programs [ newLength ] ;
615
- _programs . pop ( ) ;
616
-
617
- _gl . deleteProgram ( program ) ;
618
-
619
- _infoMemory . programs = newLength ;
620
-
621
- }
622
-
623
- break ;
624
-
625
- }
599
+ if ( programInfo !== undefined ) {
626
600
601
+ programCache . releaseProgram ( programInfo ) ;
627
602
}
628
603
629
604
}
@@ -1442,15 +1417,15 @@ THREE.WebGLRenderer = function ( parameters ) {
1442
1417
var parameters = programCache . getParameters ( material , lights , fog , object ) ;
1443
1418
var code = programCache . getProgramCode ( material , parameters ) ;
1444
1419
1445
-
1420
+ var program = materialProperties . program ;
1446
1421
var programChange = true ;
1447
1422
1448
- if ( ! materialProperties . program ) {
1423
+ if ( program === undefined ) {
1449
1424
1450
1425
// new material
1451
1426
material . addEventListener ( 'dispose' , onMaterialDispose ) ;
1452
1427
1453
- } else if ( materialProperties . program . code !== code ) {
1428
+ } else if ( program . code !== code ) {
1454
1429
1455
1430
// changed glsl or parameters
1456
1431
releaseMaterialProgramReference ( material ) ;
@@ -1467,41 +1442,39 @@ THREE.WebGLRenderer = function ( parameters ) {
1467
1442
1468
1443
}
1469
1444
1470
- if ( parameters . shaderID ) {
1445
+ if ( programChange ) {
1471
1446
1472
- var shader = THREE . ShaderLib [ parameters . shaderID ] ;
1447
+ if ( parameters . shaderID ) {
1473
1448
1474
- materialProperties . __webglShader = {
1475
- name : material . type ,
1476
- uniforms : THREE . UniformsUtils . clone ( shader . uniforms ) ,
1477
- vertexShader : shader . vertexShader ,
1478
- fragmentShader : shader . fragmentShader
1479
- } ;
1449
+ var shader = THREE . ShaderLib [ parameters . shaderID ] ;
1480
1450
1481
- } else {
1451
+ materialProperties . __webglShader = {
1452
+ name : material . type ,
1453
+ uniforms : THREE . UniformsUtils . clone ( shader . uniforms ) ,
1454
+ vertexShader : shader . vertexShader ,
1455
+ fragmentShader : shader . fragmentShader
1456
+ } ;
1482
1457
1483
- materialProperties . __webglShader = {
1484
- name : material . type ,
1485
- uniforms : material . uniforms ,
1486
- vertexShader : material . vertexShader ,
1487
- fragmentShader : material . fragmentShader
1488
- } ;
1458
+ } else {
1489
1459
1490
- }
1460
+ materialProperties . __webglShader = {
1461
+ name : material . type ,
1462
+ uniforms : material . uniforms ,
1463
+ vertexShader : material . vertexShader ,
1464
+ fragmentShader : material . fragmentShader
1465
+ } ;
1491
1466
1492
- material . __webglShader = materialProperties . __webglShader ;
1467
+ }
1493
1468
1494
- var program = programCache . getProgram ( material , parameters , code ) ;
1469
+ material . __webglShader = materialProperties . __webglShader ;
1495
1470
1496
- if ( programChange ) {
1471
+ program = programCache . acquireProgram ( material , parameters , code ) ;
1497
1472
1498
- program . usedTimes ++ ;
1473
+ materialProperties . program = program ;
1474
+ material . program = program ;
1499
1475
1500
1476
}
1501
1477
1502
- materialProperties . program = program ;
1503
- material . program = program ;
1504
-
1505
1478
var attributes = program . getAttributes ( ) ;
1506
1479
1507
1480
if ( material . morphTargets ) {
0 commit comments