BufferAttributeNode.js 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  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. this.instanced = false;
  15. }
  16. construct( builder ) {
  17. const type = this.getNodeType( builder );
  18. const array = this.value;
  19. const itemSize = builder.getTypeLength( type );
  20. const stride = this.bufferStride || itemSize;
  21. const offset = this.bufferOffset;
  22. const buffer = array.isInterleavedBuffer === true ? array : new InterleavedBuffer( array, stride );
  23. const bufferAttribute = new InterleavedBufferAttribute( buffer, itemSize, offset );
  24. buffer.setUsage( this.usage );
  25. this.attribute = bufferAttribute;
  26. this.attribute.isInstancedBufferAttribute = this.instanced; // @TODO: Add a possible: InstancedInterleavedBufferAttribute
  27. }
  28. generate( builder ) {
  29. const nodeType = this.getNodeType( builder );
  30. const nodeUniform = builder.getBufferAttributeFromNode( this, nodeType );
  31. const propertyName = builder.getPropertyName( nodeUniform );
  32. let output = null;
  33. if ( builder.shaderStage === 'vertex' ) {
  34. output = propertyName;
  35. } else {
  36. const nodeVarying = varying( this );
  37. output = nodeVarying.build( builder, nodeType );
  38. }
  39. return output;
  40. }
  41. getInputType( /*builder*/ ) {
  42. return 'bufferAttribute';
  43. }
  44. setUsage( value ) {
  45. this.usage = value;
  46. return this;
  47. }
  48. setInstanced( value ) {
  49. this.instanced = value;
  50. return this;
  51. }
  52. }
  53. export default BufferAttributeNode;
  54. export const bufferAttribute = ( array, type, stride, offset ) => nodeObject( new BufferAttributeNode( array, type, stride, offset ) );
  55. export const dynamicBufferAttribute = ( array, type, stride, offset ) => bufferAttribute( array, type, stride, offset ).setUsage( DynamicDrawUsage );
  56. export const instancedBufferAttribute = ( array, type, stride, offset ) => bufferAttribute( array, type, stride, offset ).setInstanced( true );
  57. export const instancedDynamicBufferAttribute = ( array, type, stride, offset ) => dynamicBufferAttribute( array, type, stride, offset ).setInstanced( true );
  58. addNodeClass( BufferAttributeNode );