@@ -560,6 +560,36 @@ Scene.prototype.stop = function() {
560
560
this . ignore = false ;
561
561
} ;
562
562
563
+ var ProgramSet = function ( vsId , fsId , fogMask ) {
564
+ this . vsId = vsId ;
565
+ this . fsId = fsId ;
566
+ this . fogMask = fogMask ; // If fogMask is false, then programs from this program set never have fog turned on.
567
+ this . cache = { } ;
568
+ } ;
569
+
570
+ ProgramSet . prototype . getKey = function ( shadingSettings ) {
571
+ var key = 'p' ;
572
+ if ( this . fogMask && shadingSettings . fog ) {
573
+ key += 'Fog' ;
574
+ }
575
+ if ( shadingSettings . reflection ) {
576
+ key += 'Reflect' ;
577
+ }
578
+ if ( shadingSettings . normalMap ) {
579
+ key += 'Normalmap' ;
580
+ }
581
+ return key ;
582
+ } ;
583
+
584
+ ProgramSet . prototype . getProgram = function ( shadingSettings ) {
585
+ var key = this . getKey ( shadingSettings ) ;
586
+ if ( ! this . cache . hasOwnProperty ( key ) ) {
587
+ var fog = this . fogMask && shadingSettings . fog ;
588
+ this . cache [ key ] = createProgramFromTags ( this . vsId , this . fsId , fog , shadingSettings . reflection , shadingSettings . normalMap ) ;
589
+ }
590
+ return this . cache [ key ] ;
591
+ } ;
592
+
563
593
Scene . prototype . onload_ = function ( data , exception ) {
564
594
if ( this . ignore ) {
565
595
return ;
@@ -585,11 +615,6 @@ Scene.prototype.onload_ = function(data, exception) {
585
615
field . data ,
586
616
field . type ) ;
587
617
}
588
- // setup program
589
- // There are 3 programs
590
- // DM
591
- // DM+NM
592
- // DM+NM+RM
593
618
var type ;
594
619
var vsId ;
595
620
var fsId ;
@@ -620,58 +645,36 @@ Scene.prototype.onload_ = function(data, exception) {
620
645
vsId = 'diffuseVertexShader' ;
621
646
fsId = 'diffuseFragmentShader' ;
622
647
}
623
- var program = createProgramFromTags ( vsId , fsId , this . fog ) ;
624
- var noFog = createProgramFromTags ( vsId , fsId , false ) ;
625
- var noReflection = createProgramFromTags ( vsId , fsId , this . fog , false ) ;
626
- var noFognoReflection = createProgramFromTags ( vsId , fsId , false , false ) ;
627
- var noNormalMaps = createProgramFromTags ( vsId , fsId , this . fog , false ) ;
628
- var noFognoNormalMaps =
629
- createProgramFromTags ( vsId , fsId , false , false ) ;
630
- var noReflectionnoNormalMaps =
631
- createProgramFromTags ( vsId , fsId , this . fog , false , false ) ;
632
- var noFognoReflectionnoNormalMaps =
633
- createProgramFromTags ( vsId , fsId , false , false , false ) ;
648
+
649
+ var programSet = new ProgramSet ( vsId , fsId , this . fog ) ;
650
+ var program = programSet . getProgram ( getShadingSettings ( ) ) ;
634
651
635
652
tdl . log ( this . url , ": " , type ) ;
636
653
var model = new tdl . models . Model ( program , arrays , textures ) ;
637
- model . programs = {
638
- base : program ,
639
- noFog : noFog ,
640
- noReflection : noReflection ,
641
- noFognoReflection : noFognoReflection ,
642
- noNormalMaps : noNormalMaps ,
643
- noFognoNormalMaps : noFognoNormalMaps ,
644
- noReflectionnoNormalMaps : noReflectionnoNormalMaps ,
645
- noFognoReflectionnoNormalMaps : noFognoReflectionnoNormalMaps
646
- } ;
654
+ model . programSet = programSet ;
647
655
model . extents = arrays . position . computeExtents ( ) ;
648
656
this . models . push ( model ) ;
649
657
}
650
- setShaders ( ) ;
651
658
}
652
659
} ;
653
660
661
+ function getShadingSettings ( ) {
662
+ return {
663
+ fog : g . options . fog . enabled ,
664
+ reflection : g . options . reflection . enabled ,
665
+ normalMap : g . options . normalMaps . enabled
666
+ } ;
667
+ }
668
+
654
669
function setShaders ( ) {
655
- var name = '' ;
656
- if ( ! g . options . fog . enabled ) {
657
- name += 'noFog' ;
658
- }
659
- if ( ! g . options . reflection . enabled ) {
660
- name += 'noReflection' ;
661
- }
662
- if ( ! g . options . normalMaps . enabled ) {
663
- name += 'noNormalMaps' ;
664
- }
665
- if ( name == '' ) {
666
- name = 'base' ;
667
- }
670
+ var shadingSettings = getShadingSettings ( ) ;
668
671
for ( var sceneName in g_scenes ) {
669
672
var scene = g_scenes [ sceneName ] ;
670
673
var models = scene . models ;
671
674
var numModels = models . length ;
672
675
for ( var jj = 0 ; jj < numModels ; ++ jj ) {
673
676
var model = models [ jj ] ;
674
- model . setProgram ( model . programs [ name ] ) ;
677
+ model . setProgram ( model . programSet . getProgram ( shadingSettings ) ) ;
675
678
}
676
679
}
677
680
}
@@ -733,9 +736,6 @@ function initLightRay(info) {
733
736
function setupLaser ( ) {
734
737
var textures = {
735
738
colorMap : tdl . textures . loadTexture ( g_aquariumConfig . aquariumRoot + 'static_assets/beam.png' ) } ;
736
- var program = createProgramFromTags (
737
- 'laserVertexShader' ,
738
- 'laserFragmentShader' ) ;
739
739
var beam1Arrays = tdl . primitives . createPlane ( 1 , 1 , 1 , 1 ) ;
740
740
delete beam1Arrays . normal ;
741
741
tdl . primitives . reorient ( beam1Arrays ,
@@ -750,7 +750,11 @@ function setupLaser() {
750
750
beam1Arrays ,
751
751
beam2Arrays ,
752
752
beam3Arrays ] ) ;
753
- return new tdl . models . Model ( program , arrays , textures ) ;
753
+ var programSet = new ProgramSet ( 'laserVertexShader' , 'laserFragmentShader' , false ) ;
754
+ var program = programSet . getProgram ( getShadingSettings ( ) ) ;
755
+ var model = new tdl . models . Model ( program , arrays , textures ) ;
756
+ model . programSet = programSet ;
757
+ return model ;
754
758
}
755
759
756
760
function setupLightRay ( ) {
@@ -763,17 +767,18 @@ function setupLightRay() {
763
767
764
768
var textures = {
765
769
colorMap : tdl . textures . loadTexture ( g_aquariumConfig . aquariumRoot + 'assets/LightRay.png' ) } ;
766
- var program = createProgramFromTags (
767
- 'texVertexShader' ,
768
- 'texFragmentShader' ) ;
769
770
var arrays = tdl . primitives . createPlane ( 1 , 1 , 1 , 1 ) ;
770
771
tdl . primitives . reorient ( arrays ,
771
772
[ 1 , 0 , 0 , 0 ,
772
773
0 , 0 , - 1 , 0 ,
773
774
0 , 1 , 0 , 0 ,
774
775
0 , 0.5 , 0 , 1 ] ) ;
775
776
delete arrays . normal ;
776
- return new tdl . models . Model ( program , arrays , textures ) ;
777
+ var programSet = new ProgramSet ( 'texVertexShader' , 'texFragmentShader' , false ) ;
778
+ var program = programSet . getProgram ( getShadingSettings ( ) ) ;
779
+ var model = new tdl . models . Model ( program , arrays , textures ) ;
780
+ model . programSet = programSet ;
781
+ return model ;
777
782
}
778
783
779
784
function setupBubbles ( particleSystem ) {
0 commit comments