UNPKG

@openhps/core

Version:

Open Hybrid Positioning System - Core component

175 lines (159 loc) 4.51 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.stack = exports.default = void 0; var _Node = _interopRequireDefault(require("./Node.js")); var _ConditionalNode = require("../math/ConditionalNode.js"); var _TSLBase = require("../tsl/TSLBase.js"); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /** * Stack is a helper for Nodes that need to produce stack-based code instead of continuous flow. * They are usually needed in cases like `If`, `Else`. * * @augments Node */ class StackNode extends _Node.default { static get type() { return 'StackNode'; } /** * Constructs a new stack node. * * @param {?StackNode} [parent=null] - The parent stack node. */ constructor(parent = null) { super(); /** * List of nodes. * * @type {Array<Node>} */ this.nodes = []; /** * The output node. * * @type {?Node} * @default null */ this.outputNode = null; /** * The parent stack node. * * @type {?StackNode} * @default null */ this.parent = parent; /** * The current conditional node. * * @private * @type {ConditionalNode} * @default null */ this._currentCond = null; /** * This flag can be used for type testing. * * @type {boolean} * @readonly * @default true */ this.isStackNode = true; } getNodeType(builder) { return this.outputNode ? this.outputNode.getNodeType(builder) : 'void'; } getMemberType(builder, name) { return this.outputNode ? this.outputNode.getMemberType(builder, name) : 'void'; } /** * Adds a node to this stack. * * @param {Node} node - The node to add. * @return {StackNode} A reference to this stack node. */ add(node) { this.nodes.push(node); return this; } /** * Represent an `if` statement in TSL. * * @param {Node} boolNode - Represents the condition. * @param {Function} method - TSL code which is executed if the condition evaluates to `true`. * @return {StackNode} A reference to this stack node. */ If(boolNode, method) { const methodNode = new _TSLBase.ShaderNode(method); this._currentCond = (0, _ConditionalNode.select)(boolNode, methodNode); return this.add(this._currentCond); } /** * Represent an `elseif` statement in TSL. * * @param {Node} boolNode - Represents the condition. * @param {Function} method - TSL code which is executed if the condition evaluates to `true`. * @return {StackNode} A reference to this stack node. */ ElseIf(boolNode, method) { const methodNode = new _TSLBase.ShaderNode(method); const ifNode = (0, _ConditionalNode.select)(boolNode, methodNode); this._currentCond.elseNode = ifNode; this._currentCond = ifNode; return this; } /** * Represent an `else` statement in TSL. * * @param {Function} method - TSL code which is executed in the `else` case. * @return {StackNode} A reference to this stack node. */ Else(method) { this._currentCond.elseNode = new _TSLBase.ShaderNode(method); return this; } build(builder, ...params) { const previousStack = (0, _TSLBase.getCurrentStack)(); (0, _TSLBase.setCurrentStack)(this); for (const node of this.nodes) { node.build(builder, 'void'); } (0, _TSLBase.setCurrentStack)(previousStack); return this.outputNode ? this.outputNode.build(builder, ...params) : super.build(builder, ...params); } // Deprecated /** * @function * @deprecated since r168. Use {@link StackNode#Else} instead. * * @param {...any} params * @returns {StackNode} */ else(...params) { // @deprecated, r168 console.warn('THREE.TSL: .else() has been renamed to .Else().'); return this.Else(...params); } /** * @deprecated since r168. Use {@link StackNode#ElseIf} instead. * * @param {...any} params * @returns {StackNode} */ elseif(...params) { // @deprecated, r168 console.warn('THREE.TSL: .elseif() has been renamed to .ElseIf().'); return this.ElseIf(...params); } } var _default = exports.default = StackNode; /** * TSL function for creating a stack node. * * @tsl * @function * @param {?StackNode} [parent=null] - The parent stack node. * @returns {StackNode} */ const stack = exports.stack = /*@__PURE__*/(0, _TSLBase.nodeProxy)(StackNode).setParameterLength(0, 1);