updateBufferNew method

void updateBufferNew(
  1. Buffer buffer,
  2. dynamic attribute,
  3. 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();
}