You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
76 lines
1.3 KiB
76 lines
1.3 KiB
import DataMap from './DataMap.js';
|
|
import { AttributeType } from './Constants.js';
|
|
import { DynamicDrawUsage } from 'three';
|
|
|
|
class Attributes extends DataMap {
|
|
|
|
constructor( backend ) {
|
|
|
|
super();
|
|
|
|
this.backend = backend;
|
|
|
|
}
|
|
|
|
delete( attribute ) {
|
|
|
|
const attributeData = super.delete( attribute );
|
|
|
|
if ( attributeData !== undefined ) {
|
|
|
|
this.backend.destroyAttribute( attribute );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
update( attribute, type ) {
|
|
|
|
const data = this.get( attribute );
|
|
|
|
if ( data.version === undefined ) {
|
|
|
|
if ( type === AttributeType.VERTEX ) {
|
|
|
|
this.backend.createAttribute( attribute );
|
|
|
|
} else if ( type === AttributeType.INDEX ) {
|
|
|
|
this.backend.createIndexAttribute( attribute );
|
|
|
|
} else if ( type === AttributeType.STORAGE ) {
|
|
|
|
this.backend.createStorageAttribute( attribute );
|
|
|
|
}
|
|
|
|
data.version = this._getBufferAttribute( attribute ).version;
|
|
|
|
} else {
|
|
|
|
const bufferAttribute = this._getBufferAttribute( attribute );
|
|
|
|
if ( data.version < bufferAttribute.version || bufferAttribute.usage === DynamicDrawUsage ) {
|
|
|
|
this.backend.updateAttribute( attribute );
|
|
|
|
data.version = bufferAttribute.version;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
_getBufferAttribute( attribute ) {
|
|
|
|
if ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data;
|
|
|
|
return attribute;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
export default Attributes;
|