UNPKG

@openhps/core

Version:

Open Hybrid Positioning System - Core component

114 lines (105 loc) 2.76 kB
import TempNode from './TempNode.js'; import { addMethodChaining, nodeObject } from '../tsl/TSLCore.js'; /** * ArrayNode represents a collection of nodes, typically created using the {@link array} function. * ```js * const colors = array( [ * vec3( 1, 0, 0 ), * vec3( 0, 1, 0 ), * vec3( 0, 0, 1 ) * ] ); * * const redColor = tintColors.element( 0 ); * * @augments TempNode */ class ArrayNode extends TempNode { static get type() { return 'ArrayNode'; } /** * Constructs a new array node. * * @param {?string} nodeType - The data type of the elements. * @param {number} count - Size of the array. * @param {?Array<Node>} [values=null] - Array default values. */ constructor(nodeType, count, values = null) { super(nodeType); /** * Array size. * * @type {number} */ this.count = count; /** * Array default values. * * @type {?Array<Node>} */ this.values = values; /** * This flag can be used for type testing. * * @type {boolean} * @readonly * @default true */ this.isArrayNode = true; } /** * Returns the node's type. * * @param {NodeBuilder} builder - The current node builder. * @return {string} The type of the node. */ getNodeType(builder) { if (this.nodeType === null) { this.nodeType = this.values[0].getNodeType(builder); } return this.nodeType; } /** * Returns the node's type. * * @param {NodeBuilder} builder - The current node builder. * @return {string} The type of the node. */ getElementType(builder) { return this.getNodeType(builder); } /** * This method builds the output node and returns the resulting array as a shader string. * * @param {NodeBuilder} builder - The current node builder. * @return {string} The generated shader string. */ generate(builder) { const type = this.getNodeType(builder); return builder.generateArray(type, this.count, this.values); } } export default ArrayNode; /** * TSL function for creating an array node. * * @tsl * @function * @param {string|Array<Node>} nodeTypeOrValues - A string representing the element type (e.g., 'vec3') * or an array containing the default values (e.g., [ vec3() ]). * @param {?number} [count] - Size of the array. * @returns {ArrayNode} */ export const array = (...params) => { let node; if (params.length === 1) { const values = params[0]; node = new ArrayNode(null, values.length, values); } else { const nodeType = params[0]; const count = params[1]; node = new ArrayNode(nodeType, count); } return nodeObject(node); }; addMethodChaining('toArray', (node, count) => array(Array(count).fill(node)));