Skip to content

Commit 323dfb7

Browse files
committed
rewrite setUniforms
1 parent 71ae4c9 commit 323dfb7

File tree

3 files changed

+218
-151
lines changed

3 files changed

+218
-151
lines changed

glutil-shaderprog.js

Lines changed: 96 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,81 @@ ShaderProgram.prototype.use=function(){
151151
this.savedUniforms={};
152152
return this;
153153
}
154+
/** @private */
155+
ShaderProgram.prototype._setUniform=function(uniforms,i,isCurrentProgram){
156+
var isCurrentProgram=null;
157+
var v=uniforms[i];
158+
var uniform=this.get(i);
159+
if(uniform===null)return isCurrentProgram;
160+
// console.log("setting "+i+": "+v);
161+
if(isCurrentProgram==null){
162+
isCurrentProgram=this.context.getParameter(
163+
this.context.CURRENT_PROGRAM)==this.program;
164+
}
165+
var uv=this.uniformValues[i];
166+
if(!isCurrentProgram){
167+
// Save this uniform to write later
168+
this.savedUniforms[i]=(v instanceof Array) ? v.slice(0,v.length) : v;
169+
return isCurrentProgram;
170+
}
171+
if(typeof v=="number"){
172+
var newUv=false;
173+
if(uv==null){
174+
this.uniformValues[i]=uv=v;
175+
newUv=true;
176+
} else if(uv!=v){
177+
uv=v;
178+
newUv=true;
179+
}
180+
if(newUv){
181+
if(this.uniformTypes[i]==this.context.FLOAT){
182+
this.context.uniform1f(uniform, uv);
183+
} else {
184+
this.context.uniform1i(uniform, uv);
185+
}
186+
}
187+
}
188+
else if(v.length==3){
189+
if(!uv){
190+
this.uniformValues[i]=uv=v.slice(0,v.length)
191+
this.context.uniform3f(uniform, uv[0],uv[1],uv[2]);
192+
} else if(uv[0]!=v[0] || uv[1]!=v[1] || uv[2]!=v[2]){
193+
uv[0]=v[0]; uv[1]=v[1]; uv[2]=v[2];
194+
this.context.uniform3f(uniform, uv[0],uv[1],uv[2]);
195+
}
196+
} else if(v.length==2){
197+
if(!uv){
198+
this.uniformValues[i]=uv=v.slice(0,v.length)
199+
this.context.uniform2f(uniform, uv[0],uv[1]);
200+
} else if(uv[0]!=v[0] || uv[1]!=v[1]){
201+
uv[0]=v[0]; uv[1]=v[1];
202+
this.context.uniform2f(uniform, uv[0],uv[1]);
203+
}
204+
} else if(v.length==4){
205+
if(!uv){
206+
this.uniformValues[i]=uv=v.slice(0,v.length)
207+
this.context.uniform4f(uniform, uv[0],uv[1],uv[2],uv[3]);
208+
} else if(uv[0]!=v[0] || uv[1]!=v[1] || uv[2]!=v[2] || uv[3]!=v[3]){
209+
uv[0]=v[0]; uv[1]=v[1]; uv[2]=v[2]; uv[3]=v[3];
210+
this.context.uniform4f(uniform, uv[0],uv[1],uv[2],uv[3]);
211+
}
212+
} else if(v.length==16){
213+
if(!uv){
214+
this.uniformValues[i]=uv=v.slice(0,v.length)
215+
this.context.uniformMatrix4fv(uniform,false,uv);
216+
} else if(ShaderProgram._copyIfDifferent(v,uv,16)){
217+
this.context.uniformMatrix4fv(uniform,false,uv);
218+
}
219+
} else if(v.length==9){
220+
if(!uv){
221+
this.uniformValues[i]=uv=v.slice(0,v.length)
222+
this.context.uniformMatrix3fv(uniform,false,uv);
223+
} else if(ShaderProgram._copyIfDifferent(v,uv,9)){
224+
this.context.uniformMatrix3fv(uniform,false,uv);
225+
}
226+
}
227+
return isCurrentProgram;
228+
}
154229
/**
155230
* Sets uniform variables for this program. Uniform variables
156231
* are called uniform because they uniformly apply to all vertices
@@ -178,40 +253,30 @@ ShaderProgram.prototype.use=function(){
178253
*/
179254
ShaderProgram.prototype.setUniforms=function(uniforms){
180255
var isCurrentProgram=null;
181-
for(var i in uniforms){
182-
v=uniforms[i];
183-
var uniform=this.get(i);
184-
if(uniform===null)continue;
185-
// console.log("setting "+i+": "+v);
186-
if(isCurrentProgram==null){
187-
isCurrentProgram=this.context.getParameter(
188-
this.context.CURRENT_PROGRAM)==this.program;
189-
}
190-
var val=(v instanceof Array) ? v.slice(0,v.length) : v;
191-
this.uniformValues[i]=val;
192-
if(!isCurrentProgram){
193-
// Save this uniform to write later
194-
this.savedUniforms[i]=val;
195-
} else if(v.length==3){
196-
this.context.uniform3f(uniform, v[0],v[1],v[2]);
197-
} else if(v.length==2){
198-
this.context.uniform2f(uniform, v[0],v[1]);
199-
} else if(v.length==4){
200-
this.context.uniform4f(uniform, v[0],v[1],v[2],v[3]);
201-
} else if(v.length==16){
202-
this.context.uniformMatrix4fv(uniform,false,v);
203-
} else if(v.length==9){
204-
this.context.uniformMatrix3fv(uniform,false,v);
205-
} else {
206-
if(this.uniformTypes[i]==this.context.FLOAT){
207-
this.context.uniform1f(uniform, v);
208-
} else {
209-
this.context.uniform1i(uniform, v);
210-
}
211-
}
256+
if(typeof Object.keys!=="undefined"){
257+
var keys=Object.keys(uniforms);for(var ki=0;ki<keys.length;ki++){var i=keys[ki];
258+
isCurrentProgram=this._setUniform(uniforms,i,isCurrentProgram);
259+
}
260+
} else {
261+
for(var i in uniforms){
262+
isCurrentProgram=this._setUniform(uniforms,i,isCurrentProgram);
263+
}
212264
}
213265
return this;
214266
}
267+
ShaderProgram._copyIfDifferent=function(src,dst,len){
268+
for(var i=0;i<len;i++){
269+
if(src[i]!=dst[i]){
270+
// Arrays are different
271+
dst[i]=src[i];
272+
for(var j=i+1;j<len;j++){
273+
dst[j]=src[j];
274+
}
275+
return true;
276+
}
277+
}
278+
return false;
279+
}
215280
/** @private */
216281
ShaderProgram._compileShaders=function(context, vertexShader, fragmentShader){
217282
function compileShader(context, kind, text){

glutil.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ var GLUtil={
8686
if(!canvasElement)return null;
8787
if(!canvasElement.getContext)return null;
8888
var context=null;
89-
var options={antialias:true};
89+
var options={"antialias":true};
9090
try { context=canvasElement.getContext("webgl", options);
9191
} catch(e) { context=null; }
9292
if(!context){

0 commit comments

Comments
 (0)