UniformNode.js 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  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. onUpdate( callback, updateType ) {
  22. const self = this.getSelf();
  23. callback = callback.bind( self );
  24. return super.onUpdate( ( frame ) => {
  25. const value = callback( frame, self );
  26. if ( value !== undefined ) {
  27. this.value = value;
  28. }
  29. }, updateType );
  30. }
  31. generate( builder, output ) {
  32. const type = this.getNodeType( builder );
  33. const hash = this.getUniformHash( builder );
  34. let sharedNode = builder.getNodeFromHash( hash );
  35. if ( sharedNode === undefined ) {
  36. builder.setHashNode( this, hash );
  37. sharedNode = this;
  38. }
  39. const sharedNodeType = sharedNode.getInputType( builder );
  40. const nodeUniform = builder.getUniformFromNode( sharedNode, sharedNodeType, builder.shaderStage, builder.context.label );
  41. const propertyName = builder.getPropertyName( nodeUniform );
  42. if ( builder.context.label !== undefined ) delete builder.context.label;
  43. return builder.format( propertyName, type, output );
  44. }
  45. }
  46. export default UniformNode;
  47. export const uniform = ( arg1, arg2 ) => {
  48. const nodeType = getConstNodeType( arg2 || arg1 );
  49. // @TODO: get ConstNode from .traverse() in the future
  50. const value = ( arg1 && arg1.isNode === true ) ? ( arg1.node && arg1.node.value ) || arg1.value : arg1;
  51. return nodeObject( new UniformNode( value, nodeType ) );
  52. };
  53. addNodeClass( 'UniformNode', UniformNode );