添加关照、全局等高线、修改图层问题
This commit is contained in:
@ -0,0 +1,258 @@
|
||||
import { IntType } from 'three';
|
||||
|
||||
let _id = 0;
|
||||
|
||||
class DualAttributeData {
|
||||
|
||||
constructor( attributeData, dualBuffer ) {
|
||||
|
||||
this.buffers = [ attributeData.bufferGPU, dualBuffer ];
|
||||
this.type = attributeData.type;
|
||||
this.bufferType = attributeData.bufferType;
|
||||
this.pbo = attributeData.pbo;
|
||||
this.byteLength = attributeData.byteLength;
|
||||
this.bytesPerElement = attributeData.BYTES_PER_ELEMENT;
|
||||
this.version = attributeData.version;
|
||||
this.isInteger = attributeData.isInteger;
|
||||
this.activeBufferIndex = 0;
|
||||
this.baseId = attributeData.id;
|
||||
|
||||
}
|
||||
|
||||
|
||||
get id() {
|
||||
|
||||
return `${ this.baseId }|${ this.activeBufferIndex }`;
|
||||
|
||||
}
|
||||
|
||||
get bufferGPU() {
|
||||
|
||||
return this.buffers[ this.activeBufferIndex ];
|
||||
|
||||
}
|
||||
|
||||
get transformBuffer() {
|
||||
|
||||
return this.buffers[ this.activeBufferIndex ^ 1 ];
|
||||
|
||||
}
|
||||
|
||||
switchBuffers() {
|
||||
|
||||
this.activeBufferIndex ^= 1;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
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 = this._createBuffer( gl, bufferType, array, usage );
|
||||
|
||||
bufferData.bufferGPU = bufferGPU;
|
||||
bufferData.bufferType = bufferType;
|
||||
bufferData.version = bufferAttribute.version;
|
||||
|
||||
}
|
||||
|
||||
//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.WebGLBackend: Unsupported buffer data format: ' + array );
|
||||
|
||||
}
|
||||
|
||||
let attributeData = {
|
||||
bufferGPU,
|
||||
bufferType,
|
||||
type,
|
||||
byteLength: array.byteLength,
|
||||
bytesPerElement: array.BYTES_PER_ELEMENT,
|
||||
version: attribute.version,
|
||||
pbo: attribute.pbo,
|
||||
isInteger: type === gl.INT || type === gl.UNSIGNED_INT || type === gl.UNSIGNED_SHORT || attribute.gpuType === IntType,
|
||||
id: _id ++
|
||||
};
|
||||
|
||||
if ( attribute.isStorageBufferAttribute || attribute.isStorageInstancedBufferAttribute ) {
|
||||
|
||||
// create buffer for tranform feedback use
|
||||
const bufferGPUDual = this._createBuffer( gl, bufferType, array, usage );
|
||||
attributeData = new DualAttributeData( attributeData, bufferGPUDual );
|
||||
|
||||
}
|
||||
|
||||
backend.set( attribute, attributeData );
|
||||
|
||||
}
|
||||
|
||||
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;
|
||||
const updateRanges = attribute.isInterleavedBufferAttribute ? attribute.data.updateRanges : attribute.updateRanges;
|
||||
|
||||
gl.bindBuffer( bufferType, bufferData.bufferGPU );
|
||||
|
||||
if ( updateRanges.length === 0 ) {
|
||||
|
||||
// Not using update ranges
|
||||
|
||||
gl.bufferSubData( bufferType, 0, array );
|
||||
|
||||
} else {
|
||||
|
||||
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 );
|
||||
|
||||
}
|
||||
|
||||
bufferAttribute.clearUpdateRanges();
|
||||
|
||||
}
|
||||
|
||||
gl.bindBuffer( bufferType, null );
|
||||
|
||||
bufferData.version = bufferAttribute.version;
|
||||
|
||||
}
|
||||
|
||||
destroyAttribute( attribute ) {
|
||||
|
||||
const backend = this.backend;
|
||||
const { gl } = backend;
|
||||
|
||||
if ( attribute.isInterleavedBufferAttribute ) {
|
||||
|
||||
backend.delete( attribute.data );
|
||||
|
||||
}
|
||||
|
||||
const attributeData = backend.get( attribute );
|
||||
|
||||
gl.deleteBuffer( attributeData.bufferGPU );
|
||||
|
||||
backend.delete( attribute );
|
||||
|
||||
}
|
||||
|
||||
async getArrayBufferAsync( attribute ) {
|
||||
|
||||
const backend = this.backend;
|
||||
const { gl } = backend;
|
||||
|
||||
const bufferAttribute = attribute.isInterleavedBufferAttribute ? attribute.data : attribute;
|
||||
const { bufferGPU } = backend.get( bufferAttribute );
|
||||
|
||||
const array = attribute.array;
|
||||
const byteLength = array.byteLength;
|
||||
|
||||
gl.bindBuffer( gl.COPY_READ_BUFFER, bufferGPU );
|
||||
|
||||
const writeBuffer = gl.createBuffer();
|
||||
|
||||
gl.bindBuffer( gl.COPY_WRITE_BUFFER, writeBuffer );
|
||||
gl.bufferData( gl.COPY_WRITE_BUFFER, byteLength, gl.STREAM_READ );
|
||||
|
||||
gl.copyBufferSubData( gl.COPY_READ_BUFFER, gl.COPY_WRITE_BUFFER, 0, 0, byteLength );
|
||||
|
||||
await backend.utils._clientWaitAsync();
|
||||
|
||||
const dstBuffer = new attribute.array.constructor( array.length );
|
||||
|
||||
gl.getBufferSubData( gl.COPY_WRITE_BUFFER, 0, dstBuffer );
|
||||
|
||||
gl.deleteBuffer( writeBuffer );
|
||||
|
||||
return dstBuffer.buffer;
|
||||
|
||||
}
|
||||
|
||||
_createBuffer( gl, bufferType, array, usage ) {
|
||||
|
||||
const bufferGPU = gl.createBuffer();
|
||||
|
||||
gl.bindBuffer( bufferType, bufferGPU );
|
||||
gl.bufferData( bufferType, array, usage );
|
||||
gl.bindBuffer( bufferType, null );
|
||||
|
||||
return bufferGPU;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
export default WebGLAttributeUtils;
|
Reference in New Issue
Block a user