VaryingNode.js 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  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. generate( builder ) {
  22. const { name, node } = this;
  23. const type = this.getNodeType( builder );
  24. const nodeVarying = builder.getVaryingFromNode( this, type );
  25. // this property can be used to check if the varying can be optimized for a var
  26. nodeVarying.needsInterpolation || ( nodeVarying.needsInterpolation = ( builder.shaderStage === 'fragment' ) );
  27. if ( name !== null ) {
  28. nodeVarying.name = name;
  29. }
  30. const propertyName = builder.getPropertyName( nodeVarying, NodeShaderStage.VERTEX );
  31. // force node run in vertex stage
  32. builder.flowNodeFromShaderStage( NodeShaderStage.VERTEX, node, type, propertyName );
  33. return builder.getPropertyName( nodeVarying );
  34. }
  35. }
  36. export default VaryingNode;
  37. export const varying = nodeProxy( VaryingNode );
  38. addNodeElement( 'varying', varying );
  39. addNodeClass( 'VaryingNode', VaryingNode );