summaryrefslogtreecommitdiff
path: root/src/webGLWorker.js
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2014-06-09 15:53:02 -0700
committerAlon Zakai <alonzakai@gmail.com>2014-06-09 15:53:02 -0700
commita494c2689708e7f81861c404e5c15a34c7956b91 (patch)
treef4d6132cca829fed71634bd19fd4fa1aeb326d3f /src/webGLWorker.js
parent559b1af7c3f6bba5dff4127e431d650a3bf33e71 (diff)
programs and uniforms stuff
Diffstat (limited to 'src/webGLWorker.js')
-rw-r--r--src/webGLWorker.js50
1 files changed, 40 insertions, 10 deletions
diff --git a/src/webGLWorker.js b/src/webGLWorker.js
index 0e349f5f..52f5d2ba 100644
--- a/src/webGLWorker.js
+++ b/src/webGLWorker.js
@@ -517,22 +517,52 @@ function WebGLWorker() {
};
this.linkProgram = function(program) {
commandBuffer.push('linkProgram', 1, program.id);
+ // parse shader sources
+ program.uniforms = {};
+ program.uniformVec = [];
+ program.shaders.forEach(function(shader) {
+ var newUniforms = shader.source.match(/uniform\s+\w+\s+(\w+)(\[\d+\])?;/g);
+ if (!newUniforms) return;
+ newUniforms.forEach(function(uniform) {
+ var name = uniform.substr(uniform.lastIndexOf(' ')+1);
+ var size = 1;
+ var open = name.indexOf('[');
+ if (open >= 0) {
+ var close = name.indexOf(']');
+ size = parseInt(name.substring(open+1, close));
+ name = name.substr(0, open);
+ }
+ if (!program.uniforms[name]) {
+ program.uniforms[name] = { what: 'uniform', name: name, size: size };
+ program.uniformVec.push(name);
+ }
+ });
+ });
};
this.getProgramParameter = function(program, name) {
if (name === this.ACTIVE_UNIFORMS) {
- // parse shader sources, make a guess...
- var uniforms = [];
- program.shaders.forEach(function(shader) {
- var newUniforms = shader.source.match(/uniform\s+\w+\s+(\w+);/g);
- if (!newUniforms) return;
- uniforms = uniforms.concat(newUniforms.filter(function(uniform) {
- return uniforms.indexOf(uniform) < 0;
- }));
- });
- return uniforms.length;
+ return program.uniformVec.length;
}
throw 'bad getProgramParameter ' + revname(name);
};
+ this.getActiveUniform = function(program, index) {
+ var name = program.uniformVec[index];
+ if (!name) return null;
+ return program.uniforms[name];
+ };
+ this.getUniformLocation = function(program, name) {
+ var index = -1;
+ var open = name.indexOf('[');
+ if (open >= 0) {
+ var close = name.indexOf(']');
+ index = parseInt(name.substring(open+1, close));
+ name = name.substr(0, open);
+ }
+ return { what: 'location', uniform: program.uniforms[name], index: index };
+ };
+ this.getProgramInfoLog = function(shader) {
+ return ''; // optimistic assumption of success; no proxying
+ };
// Setup
var postMainLoop = Module['postMainLoop'];