VaryingNode.js 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  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. analyze( builder ) {
  38. this.setupVarying( builder );
  39. return this.node.analyze( builder );
  40. }
  41. generate( builder ) {
  42. const properties = builder.getNodeProperties( this );
  43. const varying = this.setupVarying( builder );
  44. if ( properties.propertyName === undefined ) {
  45. const type = this.getNodeType( builder );
  46. const propertyName = builder.getPropertyName( varying, NodeShaderStage.VERTEX );
  47. // force node run in vertex stage
  48. builder.flowNodeFromShaderStage( NodeShaderStage.VERTEX, this.node, type, propertyName );
  49. properties.propertyName = propertyName;
  50. }
  51. return builder.getPropertyName( varying );
  52. }
  53. }
  54. export default VaryingNode;
  55. export const varying = nodeProxy( VaryingNode );
  56. addNodeElement( 'varying', varying );
  57. addNodeClass( 'VaryingNode', VaryingNode );