UniformNode.js 1.6 KB

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