|
@@ -15509,6 +15509,7 @@ var arrayCacheI32 = [];
|
|
|
|
|
|
var mat4array = new Float32Array( 16 );
|
|
|
var mat3array = new Float32Array( 9 );
|
|
|
+var mat2array = new Float32Array( 4 );
|
|
|
|
|
|
// Flattening for arrays of vectors and matrices
|
|
|
|
|
@@ -15547,6 +15548,30 @@ function flatten( array, nBlocks, blockSize ) {
|
|
|
|
|
|
}
|
|
|
|
|
|
+function arraysEqual( a, b ) {
|
|
|
+
|
|
|
+ if ( a.length !== b.length ) return false;
|
|
|
+
|
|
|
+ for ( var i = 0, l = a.length; i < l; i ++ ) {
|
|
|
+
|
|
|
+ if ( a[ i ] !== b[ i ] ) return false;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ return true;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+function copyArray( a, b ) {
|
|
|
+
|
|
|
+ for ( var i = 0, l = b.length; i < l; i ++ ) {
|
|
|
+
|
|
|
+ a[ i ] = b[ i ];
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
// Texture unit allocation
|
|
|
|
|
|
function allocTexUnits( renderer, n ) {
|
|
@@ -15576,27 +15601,52 @@ function allocTexUnits( renderer, n ) {
|
|
|
|
|
|
function setValue1f( gl, v ) {
|
|
|
|
|
|
+ var cache = this.cache;
|
|
|
+
|
|
|
+ if ( cache[ 0 ] === v ) return;
|
|
|
+
|
|
|
gl.uniform1f( this.addr, v );
|
|
|
|
|
|
+ cache[ 0 ] = v;
|
|
|
+
|
|
|
}
|
|
|
|
|
|
function setValue1i( gl, v ) {
|
|
|
|
|
|
+ var cache = this.cache;
|
|
|
+
|
|
|
+ if ( cache[ 0 ] === v ) return;
|
|
|
+
|
|
|
gl.uniform1i( this.addr, v );
|
|
|
|
|
|
+ cache[ 0 ] = v;
|
|
|
+
|
|
|
}
|
|
|
|
|
|
// Single float vector (from flat array or THREE.VectorN)
|
|
|
|
|
|
function setValue2fv( gl, v ) {
|
|
|
|
|
|
- if ( v.x === undefined ) {
|
|
|
+ var cache = this.cache;
|
|
|
|
|
|
- gl.uniform2fv( this.addr, v );
|
|
|
+ if ( v.x !== undefined ) {
|
|
|
+
|
|
|
+ if ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y ) {
|
|
|
+
|
|
|
+ gl.uniform2f( this.addr, v.x, v.y );
|
|
|
+
|
|
|
+ cache[ 0 ] = v.x;
|
|
|
+ cache[ 1 ] = v.y;
|
|
|
+
|
|
|
+ }
|
|
|
|
|
|
} else {
|
|
|
|
|
|
- gl.uniform2f( this.addr, v.x, v.y );
|
|
|
+ if ( arraysEqual( cache, v ) ) return;
|
|
|
+
|
|
|
+ gl.uniform2fv( this.addr, v );
|
|
|
+
|
|
|
+ copyArray( cache, v );
|
|
|
|
|
|
}
|
|
|
|
|
@@ -15604,31 +15654,68 @@ function setValue2fv( gl, v ) {
|
|
|
|
|
|
function setValue3fv( gl, v ) {
|
|
|
|
|
|
+ var cache = this.cache;
|
|
|
+
|
|
|
if ( v.x !== undefined ) {
|
|
|
|
|
|
- gl.uniform3f( this.addr, v.x, v.y, v.z );
|
|
|
+ if ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z ) {
|
|
|
+
|
|
|
+ gl.uniform3f( this.addr, v.x, v.y, v.z );
|
|
|
+
|
|
|
+ cache[ 0 ] = v.x;
|
|
|
+ cache[ 1 ] = v.y;
|
|
|
+ cache[ 2 ] = v.z;
|
|
|
+
|
|
|
+ }
|
|
|
|
|
|
} else if ( v.r !== undefined ) {
|
|
|
|
|
|
- gl.uniform3f( this.addr, v.r, v.g, v.b );
|
|
|
+ if ( cache[ 0 ] !== v.r || cache[ 1 ] !== v.g || cache[ 2 ] !== v.b ) {
|
|
|
+
|
|
|
+ gl.uniform3f( this.addr, v.r, v.g, v.b );
|
|
|
+
|
|
|
+ cache[ 0 ] = v.r;
|
|
|
+ cache[ 1 ] = v.g;
|
|
|
+ cache[ 2 ] = v.b;
|
|
|
+
|
|
|
+ }
|
|
|
|
|
|
} else {
|
|
|
|
|
|
+ if ( arraysEqual( cache, v ) ) return;
|
|
|
+
|
|
|
gl.uniform3fv( this.addr, v );
|
|
|
|
|
|
+ copyArray( cache, v );
|
|
|
+
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
function setValue4fv( gl, v ) {
|
|
|
|
|
|
- if ( v.x === undefined ) {
|
|
|
+ var cache = this.cache;
|
|
|
|
|
|
- gl.uniform4fv( this.addr, v );
|
|
|
+ if ( v.x !== undefined ) {
|
|
|
+
|
|
|
+ if ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z || cache[ 3 ] !== v.w ) {
|
|
|
+
|
|
|
+ gl.uniform4f( this.addr, v.x, v.y, v.z, v.w );
|
|
|
+
|
|
|
+ cache[ 0 ] = v.x;
|
|
|
+ cache[ 1 ] = v.y;
|
|
|
+ cache[ 2 ] = v.z;
|
|
|
+ cache[ 3 ] = v.w;
|
|
|
+
|
|
|
+ }
|
|
|
|
|
|
} else {
|
|
|
|
|
|
- gl.uniform4f( this.addr, v.x, v.y, v.z, v.w );
|
|
|
+ if ( arraysEqual( cache, v ) ) return;
|
|
|
+
|
|
|
+ gl.uniform4fv( this.addr, v );
|
|
|
+
|
|
|
+ copyArray( cache, v );
|
|
|
|
|
|
}
|
|
|
|
|
@@ -15638,36 +15725,81 @@ function setValue4fv( gl, v ) {
|
|
|
|
|
|
function setValue2fm( gl, v ) {
|
|
|
|
|
|
- gl.uniformMatrix2fv( this.addr, false, v.elements || v );
|
|
|
+ var cache = this.cache;
|
|
|
+ var elements = v.elements;
|
|
|
+
|
|
|
+ if ( elements === undefined ) {
|
|
|
+
|
|
|
+ if ( arraysEqual( cache, v ) ) return;
|
|
|
+
|
|
|
+ gl.uniformMatrix2fv( this.addr, false, v );
|
|
|
+
|
|
|
+ copyArray( cache, v );
|
|
|
+
|
|
|
+ } else {
|
|
|
+
|
|
|
+ if ( arraysEqual( cache, elements ) ) return;
|
|
|
+
|
|
|
+ mat2array.set( elements );
|
|
|
+
|
|
|
+ gl.uniformMatrix2fv( this.addr, false, mat2array );
|
|
|
+
|
|
|
+ copyArray( cache, elements );
|
|
|
+
|
|
|
+ }
|
|
|
|
|
|
}
|
|
|
|
|
|
function setValue3fm( gl, v ) {
|
|
|
|
|
|
- if ( v.elements === undefined ) {
|
|
|
+ var cache = this.cache;
|
|
|
+ var elements = v.elements;
|
|
|
+
|
|
|
+ if ( elements === undefined ) {
|
|
|
+
|
|
|
+ if ( arraysEqual( cache, v ) ) return;
|
|
|
|
|
|
gl.uniformMatrix3fv( this.addr, false, v );
|
|
|
|
|
|
+ copyArray( cache, v );
|
|
|
+
|
|
|
} else {
|
|
|
|
|
|
- mat3array.set( v.elements );
|
|
|
+ if ( arraysEqual( cache, elements ) ) return;
|
|
|
+
|
|
|
+ mat3array.set( elements );
|
|
|
+
|
|
|
gl.uniformMatrix3fv( this.addr, false, mat3array );
|
|
|
|
|
|
+ copyArray( cache, elements );
|
|
|
+
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
function setValue4fm( gl, v ) {
|
|
|
|
|
|
- if ( v.elements === undefined ) {
|
|
|
+ var cache = this.cache;
|
|
|
+ var elements = v.elements;
|
|
|
+
|
|
|
+ if ( elements === undefined ) {
|
|
|
+
|
|
|
+ if ( arraysEqual( cache, v ) ) return;
|
|
|
|
|
|
gl.uniformMatrix4fv( this.addr, false, v );
|
|
|
|
|
|
+ copyArray( cache, v );
|
|
|
+
|
|
|
} else {
|
|
|
|
|
|
- mat4array.set( v.elements );
|
|
|
+ if ( arraysEqual( cache, elements ) ) return;
|
|
|
+
|
|
|
+ mat4array.set( elements );
|
|
|
+
|
|
|
gl.uniformMatrix4fv( this.addr, false, mat4array );
|
|
|
|
|
|
+ copyArray( cache, elements );
|
|
|
+
|
|
|
}
|
|
|
|
|
|
}
|
|
@@ -15677,7 +15809,14 @@ function setValue4fm( gl, v ) {
|
|
|
function setValueT1( gl, v, renderer ) {
|
|
|
|
|
|
var unit = renderer.allocTextureUnit();
|
|
|
- gl.uniform1i( this.addr, unit );
|
|
|
+
|
|
|
+ if ( this.cache[ 0 ] !== unit ) {
|
|
|
+
|
|
|
+ gl.uniform1i( this.addr, unit );
|
|
|
+ this.cache[ 0 ] = unit;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
renderer.setTexture2D( v || emptyTexture, unit );
|
|
|
|
|
|
}
|
|
@@ -15685,7 +15824,14 @@ function setValueT1( gl, v, renderer ) {
|
|
|
function setValueT6( gl, v, renderer ) {
|
|
|
|
|
|
var unit = renderer.allocTextureUnit();
|
|
|
- gl.uniform1i( this.addr, unit );
|
|
|
+
|
|
|
+ if ( this.cache[ 0 ] !== unit ) {
|
|
|
+
|
|
|
+ gl.uniform1i( this.addr, unit );
|
|
|
+ this.cache[ 0 ] = unit;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
renderer.setTextureCube( v || emptyCubeTexture, unit );
|
|
|
|
|
|
}
|
|
@@ -15694,20 +15840,32 @@ function setValueT6( gl, v, renderer ) {
|
|
|
|
|
|
function setValue2iv( gl, v ) {
|
|
|
|
|
|
+ if ( arraysEqual( this.cache, v ) ) return;
|
|
|
+
|
|
|
gl.uniform2iv( this.addr, v );
|
|
|
|
|
|
+ copyArray( this.cache, v );
|
|
|
+
|
|
|
}
|
|
|
|
|
|
function setValue3iv( gl, v ) {
|
|
|
|
|
|
+ if ( arraysEqual( this.cache, v ) ) return;
|
|
|
+
|
|
|
gl.uniform3iv( this.addr, v );
|
|
|
|
|
|
+ copyArray( this.cache, v );
|
|
|
+
|
|
|
}
|
|
|
|
|
|
function setValue4iv( gl, v ) {
|
|
|
|
|
|
+ if ( arraysEqual( this.cache, v ) ) return;
|
|
|
+
|
|
|
gl.uniform4iv( this.addr, v );
|
|
|
|
|
|
+ copyArray( this.cache, v );
|
|
|
+
|
|
|
}
|
|
|
|
|
|
// Helper to pick the right setter for the singular case
|
|
@@ -15855,6 +16013,7 @@ function SingleUniform( id, activeInfo, addr ) {
|
|
|
|
|
|
this.id = id;
|
|
|
this.addr = addr;
|
|
|
+ this.cache = [];
|
|
|
this.setValue = getSingularSetter( activeInfo.type );
|
|
|
|
|
|
// this.path = activeInfo.name; // DEBUG
|
|
@@ -15926,7 +16085,7 @@ function parseUniform( activeInfo, addr, container ) {
|
|
|
// reset RegExp object, because of the early exit of a previous run
|
|
|
RePathPart.lastIndex = 0;
|
|
|
|
|
|
- for ( ; ; ) {
|
|
|
+ while ( true ) {
|
|
|
|
|
|
var match = RePathPart.exec( path ),
|
|
|
matchEnd = RePathPart.lastIndex,
|