VaryingNode.js 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. import Node, { addNodeClass } from './Node.js';
  2. import { NodeShaderStage } from './constants.js';
  3. import { addNodeElement, nodeProxy } from '../shadernode/ShaderNode.js';
  4. class VaryingNode extends Node {
  5. constructor( node, name = null ) {
  6. super();
  7. this.node = node;
  8. this.name = name;
  9. this.isVaryingNode = true;
  10. }
  11. isGlobal() {
  12. return true;
  13. }
  14. getHash( builder ) {
  15. return this.name || super.getHash( builder );
  16. }
  17. getNodeType( builder ) {
  18. // VaryingNode is auto type
  19. return this.node.getNodeType( builder );
  20. }
  21. setupVarying( builder ) {
  22. const properties = builder.getNodeProperties( this );
  23. let varying = properties.varying;
  24. if ( varying === undefined ) {
  25. const name = this.name;
  26. const type = this.getNodeType( builder );
  27. properties.varying = varying = builder.getVaryingFromNode( this, name, type );
  28. properties.node = this.node;
  29. }
  30. // this property can be used to check if the varying can be optimized for a variable
  31. varying.needsInterpolation || ( varying.needsInterpolation = ( builder.shaderStage === 'fragment' ) );
  32. return varying;
  33. }
  34. setup( builder ) {
  35. this.setupVarying( builder );
  36. }
  37. generate( builder ) {
  38. const type = this.getNodeType( builder );
  39. const varying = this.setupVarying( builder );
  40. const propertyName = builder.getPropertyName( varying, NodeShaderStage.VERTEX );
  41. // force node run in vertex stage
  42. builder.flowNodeFromShaderStage( NodeShaderStage.VERTEX, this.node, type, propertyName );
  43. return builder.getPropertyName( varying );
  44. }
  45. }
  46. export default VaryingNode;
  47. export const varying = nodeProxy( VaryingNode );
  48. addNodeElement( 'varying', varying );
  49. addNodeClass( 'VaryingNode', VaryingNode );