StorageArrayElementNode.js 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. import { addNodeClass } from '../core/Node.js';
  2. import { nodeProxy, addNodeElement } from '../shadernode/ShaderNode.js';
  3. import ArrayElementNode from './ArrayElementNode.js';
  4. class StorageArrayElementNode extends ArrayElementNode {
  5. constructor( storageBufferNode, indexNode ) {
  6. super( storageBufferNode, indexNode );
  7. this.isStorageArrayElementNode = true;
  8. }
  9. set storageBufferNode( value ) {
  10. this.node = value;
  11. }
  12. get storageBufferNode() {
  13. return this.node;
  14. }
  15. setup( builder ) {
  16. if ( builder.isAvailable( 'storageBuffer' ) === false ) {
  17. if ( ! this.node.instanceIndex && this.node.bufferObject === true ) {
  18. builder.setupPBO( this.node );
  19. }
  20. }
  21. return super.setup( builder );
  22. }
  23. generate( builder, output ) {
  24. let snippet;
  25. const isAssignContext = builder.context.assign;
  26. //
  27. if ( builder.isAvailable( 'storageBuffer' ) === false ) {
  28. const { node } = this;
  29. if ( ! node.instanceIndex && this.node.bufferObject === true && isAssignContext !== true ) {
  30. snippet = builder.generatePBO( this );
  31. } else {
  32. snippet = node.build( builder );
  33. }
  34. } else {
  35. snippet = super.generate( builder );
  36. }
  37. if ( isAssignContext !== true ) {
  38. const type = this.getNodeType( builder );
  39. snippet = builder.format( snippet, type, output );
  40. }
  41. return snippet;
  42. }
  43. }
  44. export default StorageArrayElementNode;
  45. export const storageElement = nodeProxy( StorageArrayElementNode );
  46. addNodeElement( 'storageElement', storageElement );
  47. addNodeClass( 'StorageArrayElementNode', StorageArrayElementNode );