ComputeNode.js 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. import Node, { addNodeClass } from '../core/Node.js';
  2. import { NodeUpdateType } from '../core/constants.js';
  3. import { addNodeElement, nodeObject } from '../shadernode/ShaderNode.js';
  4. class ComputeNode extends Node {
  5. constructor( computeNode, count, workgroupSize = [ 64 ] ) {
  6. super( 'void' );
  7. this.isComputeNode = true;
  8. this.computeNode = computeNode;
  9. this.count = count;
  10. this.workgroupSize = workgroupSize;
  11. this.dispatchCount = 0;
  12. this.version = 1;
  13. this.updateBeforeType = NodeUpdateType.OBJECT;
  14. this.updateDispatchCount();
  15. }
  16. dispose() {
  17. this.dispatchEvent( { type: 'dispose' } );
  18. }
  19. set needsUpdate( value ) {
  20. if ( value === true ) this.version ++;
  21. }
  22. updateDispatchCount() {
  23. const { count, workgroupSize } = this;
  24. let size = workgroupSize[ 0 ];
  25. for ( let i = 1; i < workgroupSize.length; i ++ )
  26. size *= workgroupSize[ i ];
  27. this.dispatchCount = Math.ceil( count / size );
  28. }
  29. onInit() { }
  30. updateBefore( { renderer } ) {
  31. renderer.compute( this );
  32. }
  33. generate( builder ) {
  34. const { shaderStage } = builder;
  35. if ( shaderStage === 'compute' ) {
  36. const snippet = this.computeNode.build( builder, 'void' );
  37. if ( snippet !== '' ) {
  38. builder.addLineFlowCode( snippet );
  39. }
  40. }
  41. }
  42. }
  43. export default ComputeNode;
  44. export const compute = ( node, count, workgroupSize ) => nodeObject( new ComputeNode( nodeObject( node ), count, workgroupSize ) );
  45. addNodeElement( 'compute', compute );
  46. addNodeClass( 'ComputeNode', ComputeNode );