Spaces:
Running
Running
| /** | |
| * @author mrdoob / http://mrdoob.com/ | |
| */ | |
| function WebGLAttributes( gl ) { | |
| var buffers = new WeakMap(); | |
| function createBuffer( attribute, bufferType ) { | |
| var array = attribute.array; | |
| var usage = attribute.dynamic ? gl.DYNAMIC_DRAW : gl.STATIC_DRAW; | |
| var buffer = gl.createBuffer(); | |
| gl.bindBuffer( bufferType, buffer ); | |
| gl.bufferData( bufferType, array, usage ); | |
| attribute.onUploadCallback(); | |
| var type = gl.FLOAT; | |
| if ( array instanceof Float32Array ) { | |
| type = gl.FLOAT; | |
| } else if ( array instanceof Float64Array ) { | |
| console.warn( 'THREE.WebGLAttributes: Unsupported data buffer format: Float64Array.' ); | |
| } else if ( array instanceof Uint16Array ) { | |
| 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; | |
| } | |
| return { | |
| buffer: buffer, | |
| type: type, | |
| bytesPerElement: array.BYTES_PER_ELEMENT, | |
| version: attribute.version | |
| }; | |
| } | |
| function updateBuffer( buffer, attribute, bufferType ) { | |
| var array = attribute.array; | |
| var updateRange = attribute.updateRange; | |
| gl.bindBuffer( bufferType, buffer ); | |
| if ( attribute.dynamic === false ) { | |
| gl.bufferData( bufferType, array, gl.STATIC_DRAW ); | |
| } else if ( updateRange.count === - 1 ) { | |
| // Not using update ranges | |
| gl.bufferSubData( bufferType, 0, array ); | |
| } else if ( updateRange.count === 0 ) { | |
| console.error( 'THREE.WebGLObjects.updateBuffer: dynamic THREE.BufferAttribute marked as needsUpdate but updateRange.count is 0, ensure you are using set methods or updating manually.' ); | |
| } else { | |
| gl.bufferSubData( bufferType, updateRange.offset * array.BYTES_PER_ELEMENT, | |
| array.subarray( updateRange.offset, updateRange.offset + updateRange.count ) ); | |
| updateRange.count = - 1; // reset range | |
| } | |
| } | |
| // | |
| function get( attribute ) { | |
| if ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data; | |
| return buffers.get( attribute ); | |
| } | |
| function remove( attribute ) { | |
| if ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data; | |
| var data = buffers.get( attribute ); | |
| if ( data ) { | |
| gl.deleteBuffer( data.buffer ); | |
| buffers.delete( attribute ); | |
| } | |
| } | |
| function update( attribute, bufferType ) { | |
| if ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data; | |
| var data = buffers.get( attribute ); | |
| if ( data === undefined ) { | |
| buffers.set( attribute, createBuffer( attribute, bufferType ) ); | |
| } else if ( data.version < attribute.version ) { | |
| updateBuffer( data.buffer, attribute, bufferType ); | |
| data.version = attribute.version; | |
| } | |
| } | |
| return { | |
| get: get, | |
| remove: remove, | |
| update: update | |
| }; | |
| } | |
| export { WebGLAttributes }; | |