UNPKG

@polygonjs/polygonjs

Version:

node-based WebGL 3D engine https://polygonjs.com

70 lines (66 loc) 1.92 kB
/** * Returns the value of another parameter * * @remarks * It takes 1 argument, the path to the parameter. * * `ch(param_path)` * * - `param_path` is a string, which can be the absolute or relative path * * ## Usage * * - `ch('./tx')` - returns the value of the parameter tx of the same node * - `ch('/geo1/tx')` - returns the value of the tx of the node /geo1 * */ import {isString} from './../../../core/Type'; import {BaseMethodFindDependencyArgs} from './_Base'; import {BaseMethod} from './_Base'; import {DecomposedPath} from '../../../core/DecomposedPath'; import {MethodDependency} from '../MethodDependency'; import {BaseParamType} from '../../params/_Base'; export class ChExpression extends BaseMethod { static override requiredArguments() { return [['string', 'path to param']]; } private _referencedParam: BaseParamType | undefined; override findDependency(args: BaseMethodFindDependencyArgs): MethodDependency | null { const {indexOrPath} = args; if (indexOrPath == null) { return null; } if (!isString(indexOrPath)) { return null; } const decomposedPath = new DecomposedPath(); const param = this.getReferencedParam(indexOrPath, decomposedPath); if (param) { // TODO: consider using this dependency optimization in other expression methods this._referencedParam = param; return this.createDependency(param, {indexOrPath}, decomposedPath); } return null; } override async processArguments(args: any[]): Promise<any> { return new Promise(async (resolve, reject) => { let val: any = 0; if (args.length == 1) { const path = args[0]; const ref = this._referencedParam || this.getReferencedParam(path); if (ref) { if (ref.isDirty()) { await ref.compute(); } const result = ref.value; if (result != null) { val = result; resolve(val); } } else { reject(0); } } }); } }