IndexNode.js 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  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 if ( scope === IndexNode.DRAW ) {
  19. propertyName = builder.getDrawIndex();
  20. } else {
  21. throw new Error( 'THREE.IndexNode: Unknown scope: ' + scope );
  22. }
  23. let output;
  24. if ( builder.shaderStage === 'vertex' || builder.shaderStage === 'compute' ) {
  25. output = propertyName;
  26. } else {
  27. const nodeVarying = varying( this );
  28. output = nodeVarying.build( builder, nodeType );
  29. }
  30. return output;
  31. }
  32. }
  33. IndexNode.VERTEX = 'vertex';
  34. IndexNode.INSTANCE = 'instance';
  35. IndexNode.DRAW = 'draw';
  36. export default IndexNode;
  37. export const vertexIndex = nodeImmutable( IndexNode, IndexNode.VERTEX );
  38. export const instanceIndex = nodeImmutable( IndexNode, IndexNode.INSTANCE );
  39. export const drawIndex = nodeImmutable( IndexNode, IndexNode.DRAW );
  40. addNodeClass( 'IndexNode', IndexNode );