lingo3d
Version:
Lingo3D is a React/Vue 3d game development framework that ships with a complete visual editor
77 lines • 2.96 kB
JavaScript
import { defaultsOwnKeysRecordMap } from "../../collections/defaultsCollections";
import { mathNodeDefaults, mathNodeSchema } from "../../interface/IMathNode";
import GameGraphChild from "../GameGraphChild";
import { extractParenthesisTree, compile } from "./compile";
import math from "../../math";
import { TokenList, tokenize } from "./tokenize";
import { runtimeIncludeKeysMap, runtimeSchemaMap } from "../../collections/runtimeCollections";
class MathNode extends GameGraphChild {
static componentName = "mathNode";
static defaults = mathNodeDefaults;
static schema = mathNodeSchema;
static includeKeys = ["expression"];
mathFn = math;
setRuntimeData(runtimeDefaults, runtimeSchema, runtimeIncludeKeys) {
this.runtimeDefaults = runtimeDefaults;
runtimeSchema
? runtimeSchemaMap.set(this, runtimeSchema)
: runtimeSchemaMap.delete(this);
runtimeIncludeKeys
? runtimeIncludeKeysMap.set(this, runtimeIncludeKeys)
: runtimeIncludeKeysMap.delete(this);
if (!runtimeSchema) {
this.runtimeData = undefined;
this.$emitEvent("runtimeSchema");
return;
}
const runtimeData = (this.runtimeData ??= { out: 0 });
const runtimeValues = { ...runtimeData };
const ownKeysRecord = {};
for (const key of Object.keys(runtimeSchema)) {
Object.defineProperty(runtimeData, key, {
get: () => {
return runtimeValues[key] ?? 0;
},
set: (value) => {
runtimeValues[key] = value;
runtimeData.out = eval(this.compiled);
},
enumerable: true
});
ownKeysRecord[key] = true;
}
ownKeysRecord.out = true;
defaultsOwnKeysRecordMap.set(mathNodeDefaults, ownKeysRecord);
runtimeData.out = eval(this.compiled);
runtimeSchema.out = Number;
runtimeDefaults.out = 0;
runtimeIncludeKeys.add("out");
this.$emitEvent("runtimeSchema");
}
compiled;
_expression;
get expression() {
return this._expression;
}
set expression(val) {
this._expression = val;
if (!val) {
this.setRuntimeData();
return;
}
const tokenList = new TokenList();
try {
extractParenthesisTree(tokenize(val, tokenList));
}
catch (err) {
this.setRuntimeData();
console.warn(err);
return;
}
const varTokens = [];
this.compiled = compile(tokenList, varTokens);
this.setRuntimeData(Object.fromEntries(varTokens.map((token) => [token.value, 0])), Object.fromEntries(varTokens.map((token) => [token.value, Number])), new Set(varTokens.map((token) => token.value)));
}
}
export default MathNode;
//# sourceMappingURL=index.js.map