Skip to content

Commit 8ff2df5

Browse files
Olli Etuahophemavax
authored andcommitted
Add a utility for storing different shader programs for Aquarium
Aquarium has a lot of different rendering settings that use different shader programs. This patch adds a class that makes managing these programs easier instead of requiring a separate line of code for each combination of settings. The programs are now compiled on demand instead of all being compiled when loading.
1 parent c91f11f commit 8ff2df5

File tree

1 file changed

+54
-49
lines changed

1 file changed

+54
-49
lines changed

aquarium/aquarium.js

Lines changed: 54 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -560,6 +560,36 @@ Scene.prototype.stop = function() {
560560
this.ignore = false;
561561
};
562562

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+
563593
Scene.prototype.onload_ = function(data, exception) {
564594
if (this.ignore) {
565595
return;
@@ -585,11 +615,6 @@ Scene.prototype.onload_ = function(data, exception) {
585615
field.data,
586616
field.type);
587617
}
588-
// setup program
589-
// There are 3 programs
590-
// DM
591-
// DM+NM
592-
// DM+NM+RM
593618
var type;
594619
var vsId;
595620
var fsId;
@@ -620,58 +645,36 @@ Scene.prototype.onload_ = function(data, exception) {
620645
vsId = 'diffuseVertexShader';
621646
fsId = 'diffuseFragmentShader';
622647
}
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());
634651

635652
tdl.log(this.url, ": ", type);
636653
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;
647655
model.extents = arrays.position.computeExtents();
648656
this.models.push(model);
649657
}
650-
setShaders();
651658
}
652659
};
653660

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+
654669
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();
668671
for (var sceneName in g_scenes) {
669672
var scene = g_scenes[sceneName];
670673
var models = scene.models;
671674
var numModels = models.length;
672675
for (var jj = 0; jj < numModels; ++jj) {
673676
var model = models[jj];
674-
model.setProgram(model.programs[name]);
677+
model.setProgram(model.programSet.getProgram(shadingSettings));
675678
}
676679
}
677680
}
@@ -733,9 +736,6 @@ function initLightRay(info) {
733736
function setupLaser() {
734737
var textures = {
735738
colorMap: tdl.textures.loadTexture(g_aquariumConfig.aquariumRoot + 'static_assets/beam.png')};
736-
var program = createProgramFromTags(
737-
'laserVertexShader',
738-
'laserFragmentShader');
739739
var beam1Arrays = tdl.primitives.createPlane(1, 1, 1, 1);
740740
delete beam1Arrays.normal;
741741
tdl.primitives.reorient(beam1Arrays,
@@ -750,7 +750,11 @@ function setupLaser() {
750750
beam1Arrays,
751751
beam2Arrays,
752752
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;
754758
}
755759

756760
function setupLightRay() {
@@ -763,17 +767,18 @@ function setupLightRay() {
763767

764768
var textures = {
765769
colorMap: tdl.textures.loadTexture(g_aquariumConfig.aquariumRoot + 'assets/LightRay.png') };
766-
var program = createProgramFromTags(
767-
'texVertexShader',
768-
'texFragmentShader');
769770
var arrays = tdl.primitives.createPlane(1, 1, 1, 1);
770771
tdl.primitives.reorient(arrays,
771772
[1, 0, 0, 0,
772773
0, 0, -1, 0,
773774
0, 1, 0, 0,
774775
0, 0.5, 0, 1]);
775776
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;
777782
}
778783

779784
function setupBubbles(particleSystem) {

0 commit comments

Comments
 (0)