You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
120 lines
2.3 KiB
JavaScript
120 lines
2.3 KiB
JavaScript
2 years ago
|
class WebGLAttributeUtils {
|
||
|
|
||
|
constructor( backend ) {
|
||
|
|
||
|
this.backend = backend;
|
||
|
|
||
|
}
|
||
|
|
||
|
createAttribute( attribute, bufferType ) {
|
||
|
|
||
|
const backend = this.backend;
|
||
|
const { gl } = backend;
|
||
|
|
||
|
const array = attribute.array;
|
||
|
const usage = attribute.usage || gl.STATIC_DRAW;
|
||
|
|
||
|
const bufferAttribute = attribute.isInterleavedBufferAttribute ? attribute.data : attribute;
|
||
|
const bufferData = backend.get( bufferAttribute );
|
||
|
|
||
|
let bufferGPU = bufferData.bufferGPU;
|
||
|
|
||
|
if ( bufferGPU === undefined ) {
|
||
|
|
||
|
bufferGPU = gl.createBuffer();
|
||
|
|
||
|
gl.bindBuffer( bufferType, bufferGPU );
|
||
|
gl.bufferData( bufferType, array, usage );
|
||
|
gl.bindBuffer( bufferType, null );
|
||
|
|
||
|
bufferData.bufferGPU = bufferGPU;
|
||
|
bufferData.bufferType = bufferType;
|
||
|
bufferData.version = bufferAttribute.version;
|
||
|
|
||
|
}
|
||
|
|
||
|
//attribute.onUploadCallback();
|
||
|
|
||
|
let type;
|
||
|
let isFloat = false;
|
||
|
|
||
|
if ( array instanceof Float32Array ) {
|
||
|
|
||
|
type = gl.FLOAT;
|
||
|
isFloat = true;
|
||
|
|
||
|
} else if ( array instanceof Uint16Array ) {
|
||
|
|
||
|
if ( attribute.isFloat16BufferAttribute ) {
|
||
|
|
||
|
type = gl.HALF_FLOAT;
|
||
|
isFloat = true;
|
||
|
|
||
|
} 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.WebGLBackend: Unsupported buffer data format: ' + array );
|
||
|
|
||
|
}
|
||
|
|
||
|
backend.set( attribute, {
|
||
|
bufferGPU,
|
||
|
type,
|
||
|
bytesPerElement: array.BYTES_PER_ELEMENT,
|
||
|
version: attribute.version,
|
||
|
isFloat
|
||
|
} );
|
||
|
|
||
|
}
|
||
|
|
||
|
updateAttribute( attribute ) {
|
||
|
|
||
|
const backend = this.backend;
|
||
|
const { gl } = backend;
|
||
|
|
||
|
const array = attribute.array;
|
||
|
const bufferAttribute = attribute.isInterleavedBufferAttribute ? attribute.data : attribute;
|
||
|
const bufferData = backend.get( bufferAttribute );
|
||
|
const bufferType = bufferData.bufferType;
|
||
|
|
||
|
gl.bindBuffer( bufferType, bufferData.bufferGPU );
|
||
|
gl.bufferSubData( bufferType, 0, array );
|
||
|
gl.bindBuffer( bufferType, null );
|
||
|
|
||
|
bufferData.version = bufferAttribute.version;
|
||
|
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
export default WebGLAttributeUtils;
|