TextureNode.js 1.5 KB

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