updateBufferData method
void
updateBufferData(
- 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 );
}