BufferAttributeNode.js 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. import InputNode from '../core/InputNode.js';
  2. import { addNodeClass } from '../core/Node.js';
  3. import { varying } from '../core/VaryingNode.js';
  4. import { nodeObject } from '../shadernode/ShaderNode.js';
  5. import { InterleavedBufferAttribute, InterleavedBuffer, StaticDrawUsage, DynamicDrawUsage } from 'three';
  6. class BufferAttributeNode extends InputNode {
  7. constructor( value, bufferType, bufferStride = 0, bufferOffset = 0 ) {
  8. super( value, bufferType );
  9. this.isBufferNode = true;
  10. this.bufferType = bufferType;
  11. this.bufferStride = bufferStride;
  12. this.bufferOffset = bufferOffset;
  13. this.usage = StaticDrawUsage;
  14. }
  15. construct( builder ) {
  16. const type = this.getNodeType( builder );
  17. const array = this.value;
  18. const itemSize = builder.getTypeLength( type );
  19. const stride = this.bufferStride || itemSize;
  20. const offset = this.bufferOffset;
  21. const buffer = new InterleavedBuffer( array, stride );
  22. const bufferAttribute = new InterleavedBufferAttribute( buffer, itemSize, offset );
  23. buffer.setUsage( this.usage );
  24. this.attribute = bufferAttribute;
  25. this.attribute.isInstancedBufferAttribute = true; // @TODO: Add a possible: InstancedInterleavedBufferAttribute
  26. }
  27. generate( builder ) {
  28. const nodeType = this.getNodeType( builder );
  29. const nodeUniform = builder.getBufferAttributeFromNode( this, nodeType );
  30. const propertyName = builder.getPropertyName( nodeUniform );
  31. let output = null;
  32. if ( builder.shaderStage === 'vertex' ) {
  33. output = propertyName;
  34. } else {
  35. const nodeVarying = varying( this );
  36. output = nodeVarying.build( builder, nodeType );
  37. }
  38. return output;
  39. }
  40. getInputType( /*builder*/ ) {
  41. return 'bufferAttribute';
  42. }
  43. }
  44. export default BufferAttributeNode;
  45. export const bufferAttribute = ( array, type, stride, offset ) => nodeObject( new BufferAttributeNode( array, type, stride, offset ) );
  46. export const dynamicBufferAttribute = ( array, type, stride, offset ) => {
  47. const node = bufferAttribute( array, type, stride, offset );
  48. node.usage = DynamicDrawUsage;
  49. return node;
  50. };
  51. addNodeClass( BufferAttributeNode );