76 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			76 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 
								 | 
							
								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;
							 |