UNPKG

@openhps/core

Version:

Open Hybrid Positioning System - Core component

196 lines (180 loc) 4.25 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = exports.compute = void 0; var _Node = _interopRequireDefault(require("../core/Node.js")); var _constants = require("../core/constants.js"); var _TSLCore = require("../tsl/TSLCore.js"); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /** * TODO * * @augments Node */ class ComputeNode extends _Node.default { 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 = _constants.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); } setup(builder) { const result = this.computeNode.setup(builder); if (result) { const properties = builder.getNodeProperties(this); properties.outputComputeNode = result.outputNode; result.outputNode = null; } return result; } generate(builder, output) { const { shaderStage } = builder; if (shaderStage === 'compute') { const snippet = this.computeNode.build(builder, 'void'); if (snippet !== '') { builder.addLineFlowCode(snippet, this); } } else { const properties = builder.getNodeProperties(this); const outputComputeNode = properties.outputComputeNode; if (outputComputeNode) { return outputComputeNode.build(builder, output); } } } } var _default = exports.default = ComputeNode; /** * TSL function for creating a compute node. * * @tsl * @function * @param {Node} node - TODO * @param {number} count - TODO. * @param {Array<number>} [workgroupSize=[64]] - TODO. * @returns {AtomicFunctionNode} */ const compute = (node, count, workgroupSize) => (0, _TSLCore.nodeObject)(new ComputeNode((0, _TSLCore.nodeObject)(node), count, workgroupSize)); exports.compute = compute; (0, _TSLCore.addMethodChaining)('compute', compute);