MCP 3D Printer Server

by DMontgomery40
Verified
import Node from '../core/Node.js'; import { NodeUpdateType } from '../core/constants.js'; import { addMethodChaining, nodeObject } from '../tsl/TSLCore.js'; /** @module ComputeNode **/ /** * TODO * * @augments Node */ class ComputeNode extends Node { static get type() { return 'ComputeNode'; } /** * Constructs a new compute node. * * @param {Node} computeNode - TODO * @param {Number} count - TODO. * @param {Array<Number>} [workgroupSize=[64]] - TODO. */ constructor( computeNode, count, workgroupSize = [ 64 ] ) { super( 'void' ); /** * This flag can be used for type testing. * * @type {Boolean} * @readonly * @default true */ this.isComputeNode = true; /** * TODO * * @type {Node} */ this.computeNode = computeNode; /** * TODO * * @type {Number} */ this.count = count; /** * TODO * * @type {Array<Number>} * @default [64] */ this.workgroupSize = workgroupSize; /** * TODO * * @type {Number} */ this.dispatchCount = 0; /** * TODO * * @type {Number} */ this.version = 1; /** * The name or label of the uniform. * * @type {String} * @default '' */ this.name = ''; /** * The `updateBeforeType` is set to `NodeUpdateType.OBJECT` since {@link ComputeNode#updateBefore} * is executed once per object by default. * * @type {String} * @default 'object' */ this.updateBeforeType = NodeUpdateType.OBJECT; /** * TODO * * @type {Function} */ this.onInitFunction = null; this.updateDispatchCount(); } /** * Executes the `dispose` event for this node. */ dispose() { this.dispatchEvent( { type: 'dispose' } ); } /** * Sets the {@link ComputeNode#name} property. * * @param {String} name - The name of the uniform. * @return {ComputeNode} A reference to this node. */ label( name ) { this.name = name; return this; } /** * TODO */ updateDispatchCount() { const { count, workgroupSize } = this; let size = workgroupSize[ 0 ]; for ( let i = 1; i < workgroupSize.length; i ++ ) size *= workgroupSize[ i ]; this.dispatchCount = Math.ceil( count / size ); } /** * TODO * * @param {Function} callback - TODO. * @return {ComputeNode} A reference to this node. */ onInit( callback ) { this.onInitFunction = callback; return this; } /** * The method execute the compute for this node. * * @param {NodeFrame} frame - A reference to the current node frame. */ updateBefore( { renderer } ) { renderer.compute( this ); } generate( builder ) { const { shaderStage } = builder; if ( shaderStage === 'compute' ) { const snippet = this.computeNode.build( builder, 'void' ); if ( snippet !== '' ) { builder.addLineFlowCode( snippet, this ); } } } } export default ComputeNode; /** * TSL function for creating a compute node. * * @function * @param {Node} node - TODO * @param {Number} count - TODO. * @param {Array<Number>} [workgroupSize=[64]] - TODO. * @returns {AtomicFunctionNode} */ export const compute = ( node, count, workgroupSize ) => nodeObject( new ComputeNode( nodeObject( node ), count, workgroupSize ) ); addMethodChaining( 'compute', compute );