@@ -156,21 +156,26 @@ ShaderProgram.prototype._log=function(i,v){
156156 //console.log("setting "+i+": "+v);
157157}
158158/** @private */
159+ ShaderProgram . prototype . _saveIfNotCurrent = function ( v , i , isCurrentProgram ) {
160+ this . _log ( i , v ) ;
161+ if ( isCurrentProgram == null ) {
162+ isCurrentProgram = this . context . getParameter (
163+ this . context . CURRENT_PROGRAM ) == this . program ;
164+ }
165+ if ( ! isCurrentProgram ) {
166+ // Save this uniform to write later
167+ this . savedUniforms [ i ] = ( typeof v == "number" ) ? v : v . slice ( 0 , v . length ) ;
168+ this . uniformValues [ i ] = null ;
169+ }
170+ return isCurrentProgram ;
171+ }
172+ /** @private */
159173ShaderProgram . prototype . _setUniform = function ( uniforms , i , isCurrentProgram ) {
160174 var isCurrentProgram = null ;
161175 var v = uniforms [ i ] ;
162176 var uniform = this . get ( i ) ;
163177 if ( uniform === null ) return isCurrentProgram ;
164- if ( isCurrentProgram == null ) {
165- isCurrentProgram = this . context . getParameter (
166- this . context . CURRENT_PROGRAM ) == this . program ;
167- }
168178 var uv = this . uniformValues [ i ] ;
169- if ( ! isCurrentProgram ) {
170- // Save this uniform to write later
171- this . savedUniforms [ i ] = ( v instanceof Array ) ? v . slice ( 0 , v . length ) : v ;
172- return isCurrentProgram ;
173- }
174179 if ( typeof v == "number" ) {
175180 var newUv = false ;
176181 if ( uv == null ) {
@@ -182,62 +187,74 @@ ShaderProgram.prototype._setUniform=function(uniforms,i,isCurrentProgram){
182187 newUv = true ;
183188 }
184189 if ( newUv ) {
185- if ( this . uniformTypes [ i ] == this . context . FLOAT ) {
190+ if ( this . uniformTypes [ i ] == this . context . FLOAT ) {
191+ if ( ! ( isCurrentProgram = this . _saveIfNotCurrent ( uv , i , isCurrentProgram ) ) )
192+ return isCurrentProgram ;
186193 this . context . uniform1f ( uniform , uv ) ;
187- this . _log ( i , v ) ;
188194 } else {
195+ if ( ! ( isCurrentProgram = this . _saveIfNotCurrent ( uv , i , isCurrentProgram ) ) )
196+ return isCurrentProgram ;
189197 this . context . uniform1i ( uniform , uv ) ;
190- this . _log ( i , v ) ;
191198 }
192199 }
193200 }
194201 else if ( v . length == 3 ) {
195202 if ( ! uv ) {
196203 this . uniformValues [ i ] = uv = v . slice ( 0 , v . length )
197- this . context . uniform3f ( uniform , uv [ 0 ] , uv [ 1 ] , uv [ 2 ] ) ;
198- this . _log ( i , v ) ;
204+ if ( ! ( isCurrentProgram = this . _saveIfNotCurrent ( uv , i , isCurrentProgram ) ) )
205+ return isCurrentProgram ;
206+ this . context . uniform3fv ( uniform , uv ) ;
199207 } else if ( uv [ 0 ] != v [ 0 ] || uv [ 1 ] != v [ 1 ] || uv [ 2 ] != v [ 2 ] ) {
200208 uv [ 0 ] = v [ 0 ] ; uv [ 1 ] = v [ 1 ] ; uv [ 2 ] = v [ 2 ] ;
201- this . _log ( i , v ) ;
202- this . context . uniform3f ( uniform , uv [ 0 ] , uv [ 1 ] , uv [ 2 ] ) ;
209+ if ( ! ( isCurrentProgram = this . _saveIfNotCurrent ( uv , i , isCurrentProgram ) ) )
210+ return isCurrentProgram ;
211+ this . context . uniform3fv ( uniform , uv ) ;
203212 }
204213 } else if ( v . length == 2 ) {
205214 if ( ! uv ) {
206215 this . uniformValues [ i ] = uv = v . slice ( 0 , v . length )
207- this . context . uniform2f ( uniform , uv [ 0 ] , uv [ 1 ] ) ;
208- this . _log ( i , v ) ;
216+ if ( ! ( isCurrentProgram = this . _saveIfNotCurrent ( uv , i , isCurrentProgram ) ) )
217+ return isCurrentProgram ;
218+ this . context . uniform2fv ( uniform , uv ) ;
209219 } else if ( uv [ 0 ] != v [ 0 ] || uv [ 1 ] != v [ 1 ] ) {
210220 uv [ 0 ] = v [ 0 ] ; uv [ 1 ] = v [ 1 ] ;
211- this . context . uniform2f ( uniform , uv [ 0 ] , uv [ 1 ] ) ;
212- this . _log ( i , v ) ;
221+ if ( ! ( isCurrentProgram = this . _saveIfNotCurrent ( uv , i , isCurrentProgram ) ) )
222+ return isCurrentProgram ;
223+ this . context . uniform2fv ( uniform , uv ) ;
213224 }
214225 } else if ( v . length == 4 ) {
215226 if ( ! uv ) {
216227 this . uniformValues [ i ] = uv = v . slice ( 0 , v . length )
217- this . context . uniform4f ( uniform , uv [ 0 ] , uv [ 1 ] , uv [ 2 ] , uv [ 3 ] ) ;
218- this . _log ( i , v ) ;
228+ if ( ! ( isCurrentProgram = this . _saveIfNotCurrent ( uv , i , isCurrentProgram ) ) )
229+ return isCurrentProgram ;
230+ this . context . uniform4fv ( uniform , uv ) ;
219231 } else if ( uv [ 0 ] != v [ 0 ] || uv [ 1 ] != v [ 1 ] || uv [ 2 ] != v [ 2 ] || uv [ 3 ] != v [ 3 ] ) {
220232 uv [ 0 ] = v [ 0 ] ; uv [ 1 ] = v [ 1 ] ; uv [ 2 ] = v [ 2 ] ; uv [ 3 ] = v [ 3 ] ;
221- this . context . uniform4f ( uniform , uv [ 0 ] , uv [ 1 ] , uv [ 2 ] , uv [ 3 ] ) ;
222- this . _log ( i , v ) ;
233+ if ( ! ( isCurrentProgram = this . _saveIfNotCurrent ( uv , i , isCurrentProgram ) ) )
234+ return isCurrentProgram ;
235+ this . context . uniform4fv ( uniform , uv ) ;
223236 }
224237 } else if ( v . length == 16 ) {
225238 if ( ! uv ) {
226239 this . uniformValues [ i ] = uv = v . slice ( 0 , v . length )
240+ if ( ! ( isCurrentProgram = this . _saveIfNotCurrent ( uv , i , isCurrentProgram ) ) )
241+ return isCurrentProgram ;
227242 this . context . uniformMatrix4fv ( uniform , false , uv ) ;
228- this . _log ( i , v ) ;
229243 } else if ( ShaderProgram . _copyIfDifferent ( v , uv , 16 ) ) {
244+ if ( ! ( isCurrentProgram = this . _saveIfNotCurrent ( uv , i , isCurrentProgram ) ) )
245+ return isCurrentProgram ;
230246 this . context . uniformMatrix4fv ( uniform , false , uv ) ;
231- this . _log ( i , v ) ;
232247 }
233248 } else if ( v . length == 9 ) {
234249 if ( ! uv ) {
235250 this . uniformValues [ i ] = uv = v . slice ( 0 , v . length )
251+ if ( ! ( isCurrentProgram = this . _saveIfNotCurrent ( uv , i , isCurrentProgram ) ) )
252+ return isCurrentProgram ;
236253 this . context . uniformMatrix3fv ( uniform , false , uv ) ;
237- this . _log ( i , v ) ;
238254 } else if ( ShaderProgram . _copyIfDifferent ( v , uv , 9 ) ) {
255+ if ( ! ( isCurrentProgram = this . _saveIfNotCurrent ( uv , i , isCurrentProgram ) ) )
256+ return isCurrentProgram ;
239257 this . context . uniformMatrix3fv ( uniform , false , uv ) ;
240- this . _log ( i , v ) ;
241258 }
242259 }
243260 return isCurrentProgram ;
0 commit comments