|
@@ -102,43 +102,52 @@ function WebGLUniformsGroups( gl, info, capabilities, state ) {
|
|
|
|
|
|
if ( hasUniformChanged( uniform, i, cache ) === true ) {
|
|
|
|
|
|
- const value = uniform.value;
|
|
|
const offset = uniform.__offset;
|
|
|
|
|
|
- if ( typeof value === 'number' ) {
|
|
|
+ const values = Array.isArray( uniform.value ) ? uniform.value : [ uniform.value ];
|
|
|
|
|
|
- uniform.__data[ 0 ] = value;
|
|
|
- gl.bufferSubData( gl.UNIFORM_BUFFER, offset, uniform.__data );
|
|
|
+ let arrayOffset = 0;
|
|
|
|
|
|
- } else {
|
|
|
+ for ( let i = 0; i < values.length; i ++ ) {
|
|
|
|
|
|
- if ( uniform.value.isMatrix3 ) {
|
|
|
+ const value = values[ i ];
|
|
|
+
|
|
|
+ const info = getUniformSize( value );
|
|
|
+
|
|
|
+ if ( typeof value === 'number' ) {
|
|
|
+
|
|
|
+ uniform.__data[ 0 ] = value;
|
|
|
+ gl.bufferSubData( gl.UNIFORM_BUFFER, offset + arrayOffset, uniform.__data );
|
|
|
+
|
|
|
+ } else if ( value.isMatrix3 ) {
|
|
|
|
|
|
// manually converting 3x3 to 3x4
|
|
|
|
|
|
- uniform.__data[ 0 ] = uniform.value.elements[ 0 ];
|
|
|
- uniform.__data[ 1 ] = uniform.value.elements[ 1 ];
|
|
|
- uniform.__data[ 2 ] = uniform.value.elements[ 2 ];
|
|
|
- uniform.__data[ 3 ] = uniform.value.elements[ 0 ];
|
|
|
- uniform.__data[ 4 ] = uniform.value.elements[ 3 ];
|
|
|
- uniform.__data[ 5 ] = uniform.value.elements[ 4 ];
|
|
|
- uniform.__data[ 6 ] = uniform.value.elements[ 5 ];
|
|
|
- uniform.__data[ 7 ] = uniform.value.elements[ 0 ];
|
|
|
- uniform.__data[ 8 ] = uniform.value.elements[ 6 ];
|
|
|
- uniform.__data[ 9 ] = uniform.value.elements[ 7 ];
|
|
|
- uniform.__data[ 10 ] = uniform.value.elements[ 8 ];
|
|
|
- uniform.__data[ 11 ] = uniform.value.elements[ 0 ];
|
|
|
+ uniform.__data[ 0 ] = value.elements[ 0 ];
|
|
|
+ uniform.__data[ 1 ] = value.elements[ 1 ];
|
|
|
+ uniform.__data[ 2 ] = value.elements[ 2 ];
|
|
|
+ uniform.__data[ 3 ] = value.elements[ 0 ];
|
|
|
+ uniform.__data[ 4 ] = value.elements[ 3 ];
|
|
|
+ uniform.__data[ 5 ] = value.elements[ 4 ];
|
|
|
+ uniform.__data[ 6 ] = value.elements[ 5 ];
|
|
|
+ uniform.__data[ 7 ] = value.elements[ 0 ];
|
|
|
+ uniform.__data[ 8 ] = value.elements[ 6 ];
|
|
|
+ uniform.__data[ 9 ] = value.elements[ 7 ];
|
|
|
+ uniform.__data[ 10 ] = value.elements[ 8 ];
|
|
|
+ uniform.__data[ 11 ] = value.elements[ 0 ];
|
|
|
|
|
|
} else {
|
|
|
|
|
|
- value.toArray( uniform.__data );
|
|
|
+ value.toArray( uniform.__data, arrayOffset );
|
|
|
|
|
|
- }
|
|
|
+ arrayOffset += info.storage / Float32Array.BYTES_PER_ELEMENT;
|
|
|
|
|
|
- gl.bufferSubData( gl.UNIFORM_BUFFER, offset, uniform.__data );
|
|
|
+ }
|
|
|
|
|
|
}
|
|
|
|
|
|
+ gl.bufferSubData( gl.UNIFORM_BUFFER, offset, uniform.__data );
|
|
|
+
|
|
|
}
|
|
|
|
|
|
}
|
|
@@ -161,7 +170,17 @@ function WebGLUniformsGroups( gl, info, capabilities, state ) {
|
|
|
|
|
|
} else {
|
|
|
|
|
|
- cache[ index ] = value.clone();
|
|
|
+ const values = Array.isArray( value ) ? value : [ value ];
|
|
|
+
|
|
|
+ const tempValues = [];
|
|
|
+
|
|
|
+ for ( let i = 0; i < values.length; i ++ ) {
|
|
|
+
|
|
|
+ tempValues.push( values[ i ].clone() );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ cache[ index ] = tempValues;
|
|
|
|
|
|
}
|
|
|
|
|
@@ -182,12 +201,19 @@ function WebGLUniformsGroups( gl, info, capabilities, state ) {
|
|
|
|
|
|
} else {
|
|
|
|
|
|
- const cachedObject = cache[ index ];
|
|
|
+ const cachedObjects = Array.isArray( cache[ index ] ) ? cache[ index ] : [ cache[ index ] ];
|
|
|
+ const values = Array.isArray( value ) ? value : [ value ];
|
|
|
|
|
|
- if ( cachedObject.equals( value ) === false ) {
|
|
|
+ for ( let i = 0; i < cachedObjects.length; i ++ ) {
|
|
|
|
|
|
- cachedObject.copy( value );
|
|
|
- return true;
|
|
|
+ const cachedObject = cachedObjects[ i ];
|
|
|
+
|
|
|
+ if ( cachedObject.equals( values[ i ] ) === false ) {
|
|
|
+
|
|
|
+ cachedObject.copy( values[ i ] );
|
|
|
+ return true;
|
|
|
+
|
|
|
+ }
|
|
|
|
|
|
}
|
|
|
|
|
@@ -213,11 +239,28 @@ function WebGLUniformsGroups( gl, info, capabilities, state ) {
|
|
|
for ( let i = 0, l = uniforms.length; i < l; i ++ ) {
|
|
|
|
|
|
const uniform = uniforms[ i ];
|
|
|
- const info = getUniformSize( uniform );
|
|
|
+
|
|
|
+ const infos = {
|
|
|
+ boundary: 0, // bytes
|
|
|
+ storage: 0 // bytes
|
|
|
+ };
|
|
|
+
|
|
|
+ const values = Array.isArray( uniform.value ) ? uniform.value : [ uniform.value ];
|
|
|
+
|
|
|
+ for ( let j = 0, jl = values.length; j < jl; j ++ ) {
|
|
|
+
|
|
|
+ const value = values[ j ];
|
|
|
+
|
|
|
+ const info = getUniformSize( value );
|
|
|
+
|
|
|
+ infos.boundary += info.boundary;
|
|
|
+ infos.storage += info.storage;
|
|
|
+
|
|
|
+ }
|
|
|
|
|
|
// the following two properties will be used for partial buffer updates
|
|
|
|
|
|
- uniform.__data = new Float32Array( info.storage / Float32Array.BYTES_PER_ELEMENT );
|
|
|
+ uniform.__data = new Float32Array( infos.storage / Float32Array.BYTES_PER_ELEMENT );
|
|
|
uniform.__offset = offset;
|
|
|
|
|
|
//
|
|
@@ -230,7 +273,7 @@ function WebGLUniformsGroups( gl, info, capabilities, state ) {
|
|
|
|
|
|
// check for chunk overflow
|
|
|
|
|
|
- if ( chunkOffset !== 0 && ( remainingSizeInChunk - info.boundary ) < 0 ) {
|
|
|
+ if ( chunkOffset !== 0 && ( remainingSizeInChunk - infos.boundary ) < 0 ) {
|
|
|
|
|
|
// add padding and adjust offset
|
|
|
|
|
@@ -241,7 +284,7 @@ function WebGLUniformsGroups( gl, info, capabilities, state ) {
|
|
|
|
|
|
}
|
|
|
|
|
|
- offset += info.storage;
|
|
|
+ offset += infos.storage;
|
|
|
|
|
|
}
|
|
|
|
|
@@ -260,9 +303,7 @@ function WebGLUniformsGroups( gl, info, capabilities, state ) {
|
|
|
|
|
|
}
|
|
|
|
|
|
- function getUniformSize( uniform ) {
|
|
|
-
|
|
|
- const value = uniform.value;
|
|
|
+ function getUniformSize( value ) {
|
|
|
|
|
|
const info = {
|
|
|
boundary: 0, // bytes
|