WebGPUGeometries.js 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. class WebGPUGeometries {
  2. constructor( attributes, info ) {
  3. this.attributes = attributes;
  4. this.info = info;
  5. this.geometries = new WeakMap();
  6. }
  7. has( geometry ) {
  8. return this.geometries.has( geometry );
  9. }
  10. update( geometry ) {
  11. if ( this.geometries.has( geometry ) === false ) {
  12. const disposeCallback = onGeometryDispose.bind( this );
  13. this.geometries.set( geometry, disposeCallback );
  14. this.info.memory.geometries ++;
  15. geometry.addEventListener( 'dispose', disposeCallback );
  16. }
  17. const geometryAttributes = geometry.attributes;
  18. for ( const name in geometryAttributes ) {
  19. this.attributes.update( geometryAttributes[ name ] );
  20. }
  21. const index = geometry.index;
  22. if ( index !== null ) {
  23. this.attributes.update( index, true );
  24. }
  25. }
  26. }
  27. function onGeometryDispose( event ) {
  28. const geometry = event.target;
  29. const disposeCallback = this.geometries.get( geometry );
  30. this.geometries.delete( geometry );
  31. this.info.memory.geometries --;
  32. geometry.removeEventListener( 'dispose', disposeCallback );
  33. //
  34. const index = geometry.index;
  35. const geometryAttributes = geometry.attributes;
  36. if ( index !== null ) {
  37. this.attributes.remove( index );
  38. }
  39. for ( const name in geometryAttributes ) {
  40. this.attributes.remove( geometryAttributes[ name ] );
  41. }
  42. }
  43. export default WebGPUGeometries;