UniformNode.js 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. import InputNode from './InputNode.js';
  2. import { addNodeClass } from './Node.js';
  3. import { nodeObject, getConstNodeType } from '../shadernode/ShaderNode.js';
  4. class UniformNode extends InputNode {
  5. constructor( value, nodeType = null ) {
  6. super( value, nodeType );
  7. this.isUniformNode = true;
  8. }
  9. getUniformHash( builder ) {
  10. return this.getHash( builder );
  11. }
  12. generate( builder, output ) {
  13. const type = this.getNodeType( builder );
  14. const hash = this.getUniformHash( builder );
  15. let sharedNode = builder.getNodeFromHash( hash );
  16. if ( sharedNode === undefined ) {
  17. builder.setHashNode( this, hash );
  18. sharedNode = this;
  19. }
  20. const sharedNodeType = sharedNode.getInputType( builder );
  21. const nodeUniform = builder.getUniformFromNode( sharedNode, sharedNodeType, builder.shaderStage, builder.context.label );
  22. const propertyName = builder.getPropertyName( nodeUniform );
  23. if ( builder.context.label !== undefined ) delete builder.context.label;
  24. return builder.format( propertyName, type, output );
  25. }
  26. }
  27. export default UniformNode;
  28. export const uniform = ( arg1, arg2 ) => {
  29. const nodeType = getConstNodeType( arg2 || arg1 );
  30. // @TODO: get ConstNode from .traverse() in the future
  31. const value = ( arg1 && arg1.isNode === true ) ? ( arg1.node && arg1.node.value ) || arg1.value : arg1;
  32. return nodeObject( new UniformNode( value, nodeType ) );
  33. };
  34. addNodeClass( UniformNode );