TextureNode.js 1.6 KB

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