IndexNode.js 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. import Node, { addNodeClass } from './Node.js';
  2. import { varying } from './VaryingNode.js';
  3. import { nodeImmutable } from '../shadernode/ShaderNode.js';
  4. class IndexNode extends Node {
  5. constructor( scope ) {
  6. super( 'uint' );
  7. this.scope = scope;
  8. this.isInstanceIndexNode = true;
  9. }
  10. generate( builder ) {
  11. const nodeType = this.getNodeType( builder );
  12. const scope = this.scope;
  13. let propertyName;
  14. if ( scope === IndexNode.VERTEX ) {
  15. propertyName = builder.getVertexIndex();
  16. } else if ( scope === IndexNode.INSTANCE ) {
  17. propertyName = builder.getInstanceIndex();
  18. } else {
  19. throw new Error( 'THREE.IndexNode: Unknown scope: ' + scope );
  20. }
  21. let output;
  22. if ( builder.shaderStage === 'vertex' || builder.shaderStage === 'compute' ) {
  23. output = propertyName;
  24. } else {
  25. const nodeVarying = varying( this );
  26. output = nodeVarying.build( builder, nodeType );
  27. }
  28. return output;
  29. }
  30. }
  31. IndexNode.VERTEX = 'vertex';
  32. IndexNode.INSTANCE = 'instance';
  33. export default IndexNode;
  34. export const vertexIndex = nodeImmutable( IndexNode, IndexNode.VERTEX );
  35. export const instanceIndex = nodeImmutable( IndexNode, IndexNode.INSTANCE );
  36. addNodeClass( 'IndexNode', IndexNode );