updateBufferData method

void updateBufferData(
  1. Map uniformsGroup
)

Implementation

void updateBufferData(Map uniformsGroup ) {
	final buffer = buffers[ uniformsGroup['id'] ];
	final uniforms = uniformsGroup['uniforms'];
	final cache = uniformsGroup['__cache'];

	gl.bindBuffer( WebGL.UNIFORM_BUFFER, buffer );

	for (int i = 0, il = uniforms.length; i < il; i ++ ) {
		final uniformArray = uniforms[ i ] is List? uniforms[ i ] : [ uniforms[ i ] ];

		for (int j = 0, jl = uniformArray.length; j < jl; j ++ ) {
			final uniform = uniformArray[ j ];

			if ( hasUniformChanged( uniform, i, j, cache ) == true ) {
				final offset = uniform['__offset'];
				final values = uniform['value'] is List? uniform['value'] : [ uniform['value'] ];
				int arrayOffset = 0;

				for (int k = 0; k < values.length; k ++ ) {
					final value = values[ k ];
					final info = getUniformSize( value );

					// TODO add integer and struct support
					if (value is double || value is int || value is num || value is bool ) {
						uniform['__data'][ 0 ] = value;
						gl.bufferSubData( WebGL.UNIFORM_BUFFER, offset + arrayOffset, uniform['__data'] );
					}
            else if ( value is Matrix3 ) {
						uniform['__data'][ 0 ] = value.storage[ 0 ];
						uniform['__data'][ 1 ] = value.storage[ 1 ];
						uniform['__data'][ 2 ] = value.storage[ 2 ];
						uniform['__data'][ 3 ] = 0;
						uniform['__data'][ 4 ] = value.storage[ 3 ];
						uniform['__data'][ 5 ] = value.storage[ 4 ];
						uniform['__data'][ 6 ] = value.storage[ 5 ];
						uniform['__data'][ 7 ] = 0;
						uniform['__data'][ 8 ] = value.storage[ 6 ];
						uniform['__data'][ 9 ] = value.storage[ 7 ];
						uniform['__data'][ 10 ] = value.storage[ 8 ];
						uniform['__data'][ 11 ] = 0;
					}
            else {
						value.toArray( uniform['__data'], arrayOffset );
						arrayOffset += info['storage']! ~/ Float32List.bytesPerElement;
					}
				}

				gl.bufferSubData( WebGL.UNIFORM_BUFFER, offset, uniform['__data'] );
			}
		}
	}

	gl.bindBuffer( WebGL.UNIFORM_BUFFER, null );
}