83 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			83 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| import { addNodeClass } from '../core/Node.js';
 | |
| import TextureNode from './TextureNode.js';
 | |
| import { nodeProxy } from '../shadernode/ShaderNode.js';
 | |
| 
 | |
| class TextureStoreNode extends TextureNode {
 | |
| 
 | |
| 	constructor( value, uvNode, storeNode = null ) {
 | |
| 
 | |
| 		super( value, uvNode );
 | |
| 
 | |
| 		this.storeNode = storeNode;
 | |
| 
 | |
| 		this.isStoreTextureNode = true;
 | |
| 
 | |
| 	}
 | |
| 
 | |
| 	getInputType( /*builder*/ ) {
 | |
| 
 | |
| 		return 'storageTexture';
 | |
| 
 | |
| 	}
 | |
| 
 | |
| 	setup( builder ) {
 | |
| 
 | |
| 		super.setup( builder );
 | |
| 
 | |
| 		const properties = builder.getNodeProperties( this );
 | |
| 		properties.storeNode = this.storeNode;
 | |
| 
 | |
| 	}
 | |
| 
 | |
| 	generate( builder, output ) {
 | |
| 
 | |
| 		let snippet;
 | |
| 
 | |
| 		if ( this.storeNode !== null ) {
 | |
| 
 | |
| 			snippet = this.generateStore( builder );
 | |
| 
 | |
| 		} else {
 | |
| 
 | |
| 			snippet = super.generate( builder, output );
 | |
| 
 | |
| 		}
 | |
| 
 | |
| 		return snippet;
 | |
| 
 | |
| 	}
 | |
| 
 | |
| 	generateStore( builder ) {
 | |
| 
 | |
| 		const properties = builder.getNodeProperties( this );
 | |
| 
 | |
| 		const { uvNode, storeNode } = properties;
 | |
| 
 | |
| 		const textureProperty = super.generate( builder, 'property' );
 | |
| 		const uvSnippet = uvNode.build( builder, 'uvec2' );
 | |
| 		const storeSnippet = storeNode.build( builder, 'vec4' );
 | |
| 
 | |
| 		const snippet = builder.generateTextureStore( builder, textureProperty, uvSnippet, storeSnippet );
 | |
| 
 | |
| 		builder.addLineFlowCode( snippet );
 | |
| 
 | |
| 	}
 | |
| 
 | |
| }
 | |
| 
 | |
| export default TextureStoreNode;
 | |
| 
 | |
| const textureStoreBase = nodeProxy( TextureStoreNode );
 | |
| 
 | |
| export const textureStore = ( value, uvNode, storeNode ) => {
 | |
| 
 | |
| 	const node = textureStoreBase( value, uvNode, storeNode );
 | |
| 
 | |
| 	if ( storeNode !== null ) node.append();
 | |
| 
 | |
| 	return node;
 | |
| 
 | |
| };
 | |
| 
 | |
| addNodeClass( 'TextureStoreNode', TextureStoreNode );
 |