StorageTextureNode.js 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. import { addNodeClass } from '../core/Node.js';
  2. import TextureNode from './TextureNode.js';
  3. import { nodeProxy } from '../shadernode/ShaderNode.js';
  4. import { GPUStorageTextureAccess } from '../../renderers/webgpu/utils/WebGPUConstants.js';
  5. class StorageTextureNode extends TextureNode {
  6. constructor( value, uvNode, storeNode = null ) {
  7. super( value, uvNode );
  8. this.storeNode = storeNode;
  9. this.isStorageTextureNode = true;
  10. this.access = GPUStorageTextureAccess.WriteOnly;
  11. }
  12. getInputType( /*builder*/ ) {
  13. return 'storageTexture';
  14. }
  15. setup( builder ) {
  16. super.setup( builder );
  17. const properties = builder.getNodeProperties( this );
  18. properties.storeNode = this.storeNode;
  19. }
  20. setAccess( value ) {
  21. this.access = value;
  22. return this;
  23. }
  24. generate( builder, output ) {
  25. let snippet;
  26. if ( this.storeNode !== null ) {
  27. snippet = this.generateStore( builder );
  28. } else {
  29. snippet = super.generate( builder, output );
  30. }
  31. return snippet;
  32. }
  33. generateStore( builder ) {
  34. const properties = builder.getNodeProperties( this );
  35. const { uvNode, storeNode } = properties;
  36. const textureProperty = super.generate( builder, 'property' );
  37. const uvSnippet = uvNode.build( builder, 'uvec2' );
  38. const storeSnippet = storeNode.build( builder, 'vec4' );
  39. const snippet = builder.generateTextureStore( builder, textureProperty, uvSnippet, storeSnippet );
  40. builder.addLineFlowCode( snippet );
  41. }
  42. }
  43. export default StorageTextureNode;
  44. export const storageTexture = nodeProxy( StorageTextureNode );
  45. export const storageTextureReadOnly = ( value, uvNode, storeNode ) => storageTexture( value, uvNode, storeNode ).setAccess( 'read-only' );
  46. export const storageTextureReadWrite = ( value, uvNode, storeNode ) => storageTexture( value, uvNode, storeNode ).setAccess( 'read-write' );
  47. export const textureStore = ( value, uvNode, storeNode ) => {
  48. const node = storageTexture( value, uvNode, storeNode );
  49. if ( storeNode !== null ) node.append();
  50. return node;
  51. };
  52. addNodeClass( 'StorageTextureNode', StorageTextureNode );