@polygonjs/polygonjs
Version:
node-based WebGL 3D engine https://polygonjs.com
69 lines (65 loc) • 2.05 kB
text/typescript
/**
* Returns the value of another nodePath or nodeParam parameter
*
*
* @remarks
* It takes 1 argument, the path to the parameter.
*
* `chsop(param_path)`
*
* - `param_path` is a string, which can be the absolute or relative path
*
* ## Usage
*
* - `chsop('./material1/material')` - returns the value of the parameter material of node ./material1
*
*/
import {isString} from './../../../core/Type';
import {BaseMethodFindDependencyArgs} from './_Base';
import {TypedParamPathParamValue, TypedNodePathParamValue} from './../../../core/Walker';
import {BaseMethod} from './_Base';
import {DecomposedPath} from '../../../core/DecomposedPath';
import {MethodDependency} from '../MethodDependency';
import {BaseParamType} from '../../params/_Base';
export class ChsopExpression 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> {
if (args.length == 1) {
const path = args[0];
const param = this._referencedParam || this.getReferencedParam(path);
if (param) {
if (param.isDirty()) {
await param.compute();
}
const paramValue = param.value;
if (paramValue instanceof TypedParamPathParamValue || paramValue instanceof TypedNodePathParamValue) {
const result = paramValue.graphNodePath();
if (result != null) {
return result;
}
}
}
}
return '';
}
}