TextureNode.js 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. import InputNode from '../core/InputNode.js';
  2. import ExpressionNode from '../core/ExpressionNode.js';
  3. import UVNode from '../accessors/UVNode.js';
  4. class TextureNode extends InputNode {
  5. constructor( value = null, uv = new UVNode(), bias = null ) {
  6. super( 'texture' );
  7. this.value = value;
  8. this.uv = uv;
  9. this.bias = bias;
  10. }
  11. generate( builder, output ) {
  12. const texture = this.value;
  13. if ( ! texture || texture.isTexture !== true ) {
  14. throw new Error( 'TextureNode: Need a three.js texture.' );
  15. }
  16. const type = this.getNodeType( builder );
  17. const textureProperty = super.generate( builder, type );
  18. if ( output === 'sampler2D' || output === 'texture2D' ) {
  19. return textureProperty;
  20. } else if ( output === 'sampler' ) {
  21. return textureProperty + '_sampler';
  22. } else {
  23. const nodeData = builder.getDataFromNode( this );
  24. let snippet = nodeData.snippet;
  25. if ( snippet === undefined ) {
  26. const uvSnippet = this.uv.build( builder, 'vec2' );
  27. const bias = this.bias;
  28. let biasSnippet = null;
  29. if ( bias !== null ) {
  30. biasSnippet = bias.build( builder, 'float' );
  31. }
  32. snippet = builder.getTexture( textureProperty, uvSnippet, biasSnippet );
  33. nodeData.snippet = snippet;
  34. }
  35. return builder.format( snippet, 'vec4', output );
  36. }
  37. }
  38. }
  39. TextureNode.prototype.isTextureNode = true;
  40. export default TextureNode;