StorageTextureNode.js 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  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. toReadOnly() {
  34. return this.setAccess( GPUStorageTextureAccess.ReadOnly );
  35. }
  36. toWriteOnly() {
  37. return this.setAccess( GPUStorageTextureAccess.WriteOnly );
  38. }
  39. generateStore( builder ) {
  40. const properties = builder.getNodeProperties( this );
  41. const { uvNode, storeNode } = properties;
  42. const textureProperty = super.generate( builder, 'property' );
  43. const uvSnippet = uvNode.build( builder, 'uvec2' );
  44. const storeSnippet = storeNode.build( builder, 'vec4' );
  45. const snippet = builder.generateTextureStore( builder, textureProperty, uvSnippet, storeSnippet );
  46. builder.addLineFlowCode( snippet );
  47. }
  48. }
  49. export default StorageTextureNode;
  50. export const storageTexture = nodeProxy( StorageTextureNode );
  51. export const textureStore = ( value, uvNode, storeNode ) => {
  52. const node = storageTexture( value, uvNode, storeNode );
  53. if ( storeNode !== null ) node.append();
  54. return node;
  55. };
  56. addNodeClass( 'StorageTextureNode', StorageTextureNode );