TextureNode.js 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. import UniformNode from '../core/UniformNode.js';
  2. import UVNode from './UVNode.js';
  3. class TextureNode extends UniformNode {
  4. constructor( value, uvNode = new UVNode(), biasNode = null ) {
  5. super( value, 'vec4' );
  6. this.uvNode = uvNode;
  7. this.biasNode = biasNode;
  8. }
  9. getUniformHash( /*builder*/ ) {
  10. return this.value.uuid;
  11. }
  12. getInputType( /*builder*/ ) {
  13. return 'texture';
  14. }
  15. generate( builder, output ) {
  16. const texture = this.value;
  17. if ( ! texture || texture.isTexture !== true ) {
  18. throw new Error( 'TextureNode: Need a three.js texture.' );
  19. }
  20. const textureProperty = super.generate( builder, 'texture' );
  21. if ( output === 'sampler2D' || output === 'texture2D' ) {
  22. return textureProperty;
  23. } else if ( output === 'sampler' ) {
  24. return textureProperty + '_sampler';
  25. } else {
  26. const nodeData = builder.getDataFromNode( this );
  27. let snippet = nodeData.snippet;
  28. if ( snippet === undefined ) {
  29. const uvSnippet = this.uvNode.build( builder, 'vec2' );
  30. const biasNode = this.biasNode;
  31. let biasSnippet = null;
  32. if ( biasNode !== null ) {
  33. biasSnippet = biasNode.build( builder, 'float' );
  34. }
  35. snippet = builder.getTexture( textureProperty, uvSnippet, biasSnippet );
  36. nodeData.snippet = snippet;
  37. }
  38. return builder.format( snippet, 'texture', output );
  39. }
  40. }
  41. serialize( data ) {
  42. super.serialize( data );
  43. data.value = this.value.toJSON( data.meta ).uuid;
  44. }
  45. deserialize( data ) {
  46. super.deserialize( data );
  47. this.value = data.meta.textures[ data.value ];
  48. }
  49. }
  50. TextureNode.prototype.isTextureNode = true;
  51. export default TextureNode;