TextureNode.js 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  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. if ( output === 'sampler2D' ) {
  14. return super.generate( builder, output );
  15. } else {
  16. const nodeData = builder.getDataFromNode( this );
  17. let colorSpace = nodeData.colorSpace;
  18. if ( colorSpace === undefined ) {
  19. const type = this.getType( builder );
  20. const textureProperty = super.generate( builder, type );
  21. const uvSnippet = this.uv.build( builder, 'vec2' );
  22. const bias = this.bias;
  23. let biasSnippet = null;
  24. if ( bias !== null ) {
  25. biasSnippet = bias.build( builder, 'float' );
  26. }
  27. const textureCallSnippet = builder.getTexture( textureProperty, uvSnippet, biasSnippet );
  28. colorSpace = new ColorSpaceNode();
  29. colorSpace.input = new ExpressionNode( textureCallSnippet, 'vec4' );
  30. colorSpace.fromDecoding( builder.getTextureEncodingFromMap( this.value ) );
  31. nodeData.colorSpace = colorSpace;
  32. }
  33. return colorSpace.build( builder, output );
  34. }
  35. }
  36. }
  37. TextureNode.prototype.isTextureNode = true;
  38. export default TextureNode;