123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202 |
- function WebGLAttributes( gl ) {
- const buffers = new WeakMap();
- function createBuffer( attribute, bufferType ) {
- const array = attribute.array;
- const usage = attribute.usage;
- const size = array.byteLength;
- const buffer = gl.createBuffer();
- gl.bindBuffer( bufferType, buffer );
- gl.bufferData( bufferType, array, usage );
- attribute.onUploadCallback();
- let type;
- if ( array instanceof Float32Array ) {
- type = gl.FLOAT;
- } else if ( array instanceof Uint16Array ) {
- if ( attribute.isFloat16BufferAttribute ) {
- type = gl.HALF_FLOAT;
- } else {
- type = gl.UNSIGNED_SHORT;
- }
- } else if ( array instanceof Int16Array ) {
- type = gl.SHORT;
- } else if ( array instanceof Uint32Array ) {
- type = gl.UNSIGNED_INT;
- } else if ( array instanceof Int32Array ) {
- type = gl.INT;
- } else if ( array instanceof Int8Array ) {
- type = gl.BYTE;
- } else if ( array instanceof Uint8Array ) {
- type = gl.UNSIGNED_BYTE;
- } else if ( array instanceof Uint8ClampedArray ) {
- type = gl.UNSIGNED_BYTE;
- } else {
- throw new Error( 'THREE.WebGLAttributes: Unsupported buffer data format: ' + array );
- }
- return {
- buffer: buffer,
- type: type,
- bytesPerElement: array.BYTES_PER_ELEMENT,
- version: attribute.version,
- size: size
- };
- }
- function updateBuffer( buffer, attribute, bufferType ) {
- const array = attribute.array;
- const updateRange = attribute._updateRange; // @deprecated, r159
- const updateRanges = attribute.updateRanges;
- gl.bindBuffer( bufferType, buffer );
- if ( updateRange.count === - 1 && updateRanges.length === 0 ) {
- // Not using update ranges
- gl.bufferSubData( bufferType, 0, array );
- }
- if ( updateRanges.length !== 0 ) {
- for ( let i = 0, l = updateRanges.length; i < l; i ++ ) {
- const range = updateRanges[ i ];
- gl.bufferSubData( bufferType, range.start * array.BYTES_PER_ELEMENT,
- array, range.start, range.count );
- }
- attribute.clearUpdateRanges();
- }
- // @deprecated, r159
- if ( updateRange.count !== - 1 ) {
- gl.bufferSubData( bufferType, updateRange.offset * array.BYTES_PER_ELEMENT,
- array, updateRange.offset, updateRange.count );
- updateRange.count = - 1; // reset range
- }
- attribute.onUploadCallback();
- }
- //
- function get( attribute ) {
- if ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data;
- return buffers.get( attribute );
- }
- function remove( attribute ) {
- if ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data;
- const data = buffers.get( attribute );
- if ( data ) {
- gl.deleteBuffer( data.buffer );
- buffers.delete( attribute );
- }
- }
- function update( attribute, bufferType ) {
- if ( attribute.isGLBufferAttribute ) {
- const cached = buffers.get( attribute );
- if ( ! cached || cached.version < attribute.version ) {
- buffers.set( attribute, {
- buffer: attribute.buffer,
- type: attribute.type,
- bytesPerElement: attribute.elementSize,
- version: attribute.version
- } );
- }
- return;
- }
- if ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data;
- const data = buffers.get( attribute );
- if ( data === undefined ) {
- buffers.set( attribute, createBuffer( attribute, bufferType ) );
- } else if ( data.version < attribute.version ) {
- if ( data.size !== attribute.array.byteLength ) {
- throw new Error( 'THREE.WebGLAttributes: The size of the buffer attribute\'s array buffer does not match the original size. Resizing buffer attributes is not supported.' );
- }
- updateBuffer( data.buffer, attribute, bufferType );
- data.version = attribute.version;
- }
- }
- return {
- get: get,
- remove: remove,
- update: update
- };
- }
- export { WebGLAttributes };
|