updateBufferNew method
void
updateBufferNew(
- Buffer buffer,
- dynamic attribute,
- int bufferType
)
Implementation
void updateBufferNew(Buffer buffer, attribute, int bufferType) {
final array = attribute.array;
final updateRanges = attribute.updateRanges;
gl.bindBuffer(bufferType, buffer);
if (updateRanges!["length"] == 0) {
// Not using update ranges
gl.bufferSubData(bufferType, 0, attribute.array);
}
// else {
// console.info(" WebGLAttributes.dart gl.bufferSubData need debug confirm.... ");
// gl.bufferSubData(bufferType, updateRange["offset"]! * attribute.itemSize, attribute.array);
// updateRange["count"] = -1; // reset range
// }
// print(updateRanges);
else{
updateRanges.sort( ( a, b ) => a.start - b.start );
int mergeIndex = 0;
for ( int i = 1; i < updateRanges.length; i ++ ) {
final previousRange = updateRanges[ mergeIndex ];
final range = updateRanges[ i ];
// We add one here to merge adjacent ranges. This is safe because ranges
// operate over positive integers.
if ( range.start <= previousRange.start + previousRange.count + 1 ) {
previousRange.count = math.max<int>(
previousRange.count,
range.start + range.count - previousRange.start
);
}
else {
++ mergeIndex;
updateRanges[ mergeIndex ] = range;
}
}
updateRanges.length = mergeIndex + 1;
for (int i = 0, l = updateRanges.length; i < l; i ++ ) {
final range = updateRanges[i];
Float32Array f = Float32Array.fromList(attribute.array.sublist(range.start,range.count) as List<double>);
gl.bufferSubData(
bufferType,
range.start * array.BYTES_PER_ELEMENT,
f,
);
f.dispose();
}
attribute.clearUpdateRanges();
}
attribute.onUploadCallback?.call();
}