@@ -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*/
179254ShaderProgram . 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 */
216281ShaderProgram . _compileShaders = function ( context , vertexShader , fragmentShader ) {
217282 function compileShader ( context , kind , text ) {
0 commit comments