VaryingNode.js 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  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. }
  10. isGlobal() {
  11. return true;
  12. }
  13. getHash( builder ) {
  14. return this.name || super.getHash( builder );
  15. }
  16. getNodeType( builder ) {
  17. // VaryingNode is auto type
  18. return this.node.getNodeType( builder );
  19. }
  20. generate( builder ) {
  21. const { name, node } = this;
  22. const type = this.getNodeType( builder );
  23. const nodeVarying = builder.getVaryingFromNode( this, type );
  24. // this property can be used to check if the varying can be optimized for a var
  25. nodeVarying.needsInterpolation || ( nodeVarying.needsInterpolation = ( builder.shaderStage === 'fragment' ) );
  26. if ( name !== null ) {
  27. nodeVarying.name = name;
  28. }
  29. const propertyName = builder.getPropertyName( nodeVarying, NodeShaderStage.VERTEX );
  30. // force node run in vertex stage
  31. builder.flowNodeFromShaderStage( NodeShaderStage.VERTEX, node, type, propertyName );
  32. return builder.getPropertyName( nodeVarying );
  33. }
  34. }
  35. export default VaryingNode;
  36. export const varying = nodeProxy( VaryingNode );
  37. addNodeElement( 'varying', varying );
  38. addNodeClass( VaryingNode );