diff --git a/datafiles/data/Nodes/display_data.json b/datafiles/data/Nodes/display_data.json index 6d5edbe0d..65062600f 100644 --- a/datafiles/data/Nodes/display_data.json +++ b/datafiles/data/Nodes/display_data.json @@ -836,13 +836,13 @@ "name": "Animation", "nodes": [ { "label": "Animations" }, - "Node_Counter", "Node_Rate_Remap", "Node_Delay", "Node_Stagger", "Node_Revert", { "label": "Value" }, + "Node_Counter", "Node_Anim_Curve", "Node_Fn_WaveTable", "Node_Wiggler", diff --git a/scripts/nodeValue_drawer/nodeValue_drawer.gml b/scripts/nodeValue_drawer/nodeValue_drawer.gml index 07bd68b4d..79bbae2ce 100644 --- a/scripts/nodeValue_drawer/nodeValue_drawer.gml +++ b/scripts/nodeValue_drawer/nodeValue_drawer.gml @@ -130,7 +130,7 @@ function drawWidget(xx, yy, ww, _m, jun, global_var = true, _hover = false, _foc var tx = xx + ui(40) + string_width(_name) + ui(16); var ty = lb_y - ui(1); - if(point_in_circle(_m[0], _m[1], tx, ty, ui(10))) { + if(_hover && point_in_circle(_m[0], _m[1], tx, ty, ui(10))) { cHov = true; TOOLTIP = jun.active_tooltip; @@ -150,7 +150,7 @@ function drawWidget(xx, yy, ww, _m, jun, global_var = true, _hover = false, _foc var tx = xx + ui(40) + string_width(_name) + ui(16); var ty = lb_y - ui(1); - if(point_in_circle(_m[0], _m[1], tx, ty, ui(10))) { + if(_hover && point_in_circle(_m[0], _m[1], tx, ty, ui(10))) { cHov = true; if(is_string(jun.tooltip)) diff --git a/scripts/node_data/node_data.gml b/scripts/node_data/node_data.gml index 32fc68d40..7aa08c19d 100644 --- a/scripts/node_data/node_data.gml +++ b/scripts/node_data/node_data.gml @@ -24,7 +24,6 @@ function Node(_x, _y, _group = noone) : __Node_Base(_x, _y) constructor { - #region ---- main & active ---- project = PROJECT; diff --git a/scripts/pcx_ast/pcx_ast.gml b/scripts/pcx_ast/pcx_ast.gml index 4ac190c1f..56c7d5eaf 100644 --- a/scripts/pcx_ast/pcx_ast.gml +++ b/scripts/pcx_ast/pcx_ast.gml @@ -2,36 +2,36 @@ global.EVALUATE_HEAD = noone; global.PCX_FUNCTIONS = ds_map_create(); - global.PCX_FUNCTIONS[? "sin"] = [ ["radian"], function(val) { return sin(array_safe_get_fast(val, 0)); } ]; - global.PCX_FUNCTIONS[? "cos"] = [ ["radian"], function(val) { return cos(array_safe_get_fast(val, 0)); } ]; - global.PCX_FUNCTIONS[? "tan"] = [ ["radian"], function(val) { return tan(array_safe_get_fast(val, 0)); } ]; + global.PCX_FUNCTIONS[? "sin"] = [ ["radian"], function(val) /*=>*/ {return sin(array_safe_get_fast(val, 0))} ]; + global.PCX_FUNCTIONS[? "cos"] = [ ["radian"], function(val) /*=>*/ {return cos(array_safe_get_fast(val, 0))} ]; + global.PCX_FUNCTIONS[? "tan"] = [ ["radian"], function(val) /*=>*/ {return tan(array_safe_get_fast(val, 0))} ]; - global.PCX_FUNCTIONS[? "dsin"] = [ ["degree"], function(val) { return dsin(array_safe_get_fast(val, 0)); } ]; - global.PCX_FUNCTIONS[? "dcos"] = [ ["degree"], function(val) { return dcos(array_safe_get_fast(val, 0)); } ]; - global.PCX_FUNCTIONS[? "dtan"] = [ ["degree"], function(val) { return dtan(array_safe_get_fast(val, 0)); } ]; + global.PCX_FUNCTIONS[? "dsin"] = [ ["degree"], function(val) /*=>*/ {return dsin(array_safe_get_fast(val, 0))} ]; + global.PCX_FUNCTIONS[? "dcos"] = [ ["degree"], function(val) /*=>*/ {return dcos(array_safe_get_fast(val, 0))} ]; + global.PCX_FUNCTIONS[? "dtan"] = [ ["degree"], function(val) /*=>*/ {return dtan(array_safe_get_fast(val, 0))} ]; - global.PCX_FUNCTIONS[? "arcsin"] = [ ["x"], function(val) { return arcsin(array_safe_get_fast(val, 0)); } ]; - global.PCX_FUNCTIONS[? "arccos"] = [ ["x"], function(val) { return arccos(array_safe_get_fast(val, 0)); } ]; - global.PCX_FUNCTIONS[? "arctan"] = [ ["x"], function(val) { return arctan(array_safe_get_fast(val, 0)); } ]; - global.PCX_FUNCTIONS[? "arctan2"] = [ ["y", "x"], function(val) { return arctan2(array_safe_get_fast(val, 0), array_safe_get_fast(val, 1)); } ]; + global.PCX_FUNCTIONS[? "arcsin"] = [ ["x"], function(val) /*=>*/ {return arcsin(array_safe_get_fast(val, 0))} ]; + global.PCX_FUNCTIONS[? "arccos"] = [ ["x"], function(val) /*=>*/ {return arccos(array_safe_get_fast(val, 0))} ]; + global.PCX_FUNCTIONS[? "arctan"] = [ ["x"], function(val) /*=>*/ {return arctan(array_safe_get_fast(val, 0))} ]; + global.PCX_FUNCTIONS[? "arctan2"] = [ ["y", "x"], function(val) /*=>*/ {return arctan2(array_safe_get_fast(val, 0), array_safe_get_fast(val, 1))} ]; - global.PCX_FUNCTIONS[? "darcsin"] = [ ["x"], function(val) { return darcsin(array_safe_get_fast(val, 0)); } ]; - global.PCX_FUNCTIONS[? "darccos"] = [ ["x"], function(val) { return darccos(array_safe_get_fast(val, 0)); } ]; - global.PCX_FUNCTIONS[? "darctan"] = [ ["x"], function(val) { return darctan(array_safe_get_fast(val, 0)); } ]; - global.PCX_FUNCTIONS[? "darctan2"] = [ ["y", "x"], function(val) { return darctan2(array_safe_get_fast(val, 0), array_safe_get_fast(val, 1)); } ]; + global.PCX_FUNCTIONS[? "darcsin"] = [ ["x"], function(val) /*=>*/ {return darcsin(array_safe_get_fast(val, 0))} ]; + global.PCX_FUNCTIONS[? "darccos"] = [ ["x"], function(val) /*=>*/ {return darccos(array_safe_get_fast(val, 0))} ]; + global.PCX_FUNCTIONS[? "darctan"] = [ ["x"], function(val) /*=>*/ {return darctan(array_safe_get_fast(val, 0))} ]; + global.PCX_FUNCTIONS[? "darctan2"] = [ ["y", "x"], function(val) /*=>*/ {return darctan2(array_safe_get_fast(val, 0), array_safe_get_fast(val, 1))} ]; - global.PCX_FUNCTIONS[? "abs"] = [ ["x"], function(val) { return abs(array_safe_get_fast(val, 0)); } ]; - global.PCX_FUNCTIONS[? "round"] = [ ["x"], function(val) { return round(array_safe_get_fast(val, 0)); } ]; - global.PCX_FUNCTIONS[? "ceil"] = [ ["x"], function(val) { return ceil(array_safe_get_fast(val, 0)); } ]; - global.PCX_FUNCTIONS[? "floor"] = [ ["x"], function(val) { return floor(array_safe_get_fast(val, 0)); } ]; - global.PCX_FUNCTIONS[? "fract"] = [ ["x"], function(val) { return frac(array_safe_get_fast(val, 0)); } ]; - global.PCX_FUNCTIONS[? "sign"] = [ ["x"], function(val) { return sign(array_safe_get_fast(val, 0)); } ]; + global.PCX_FUNCTIONS[? "abs"] = [ ["x"], function(val) /*=>*/ {return abs(array_safe_get_fast(val, 0))} ]; + global.PCX_FUNCTIONS[? "round"] = [ ["x"], function(val) /*=>*/ {return round(array_safe_get_fast(val, 0))} ]; + global.PCX_FUNCTIONS[? "ceil"] = [ ["x"], function(val) /*=>*/ {return ceil(array_safe_get_fast(val, 0))} ]; + global.PCX_FUNCTIONS[? "floor"] = [ ["x"], function(val) /*=>*/ {return floor(array_safe_get_fast(val, 0))} ]; + global.PCX_FUNCTIONS[? "fract"] = [ ["x"], function(val) /*=>*/ {return frac(array_safe_get_fast(val, 0))} ]; + global.PCX_FUNCTIONS[? "sign"] = [ ["x"], function(val) /*=>*/ {return sign(array_safe_get_fast(val, 0))} ]; - global.PCX_FUNCTIONS[? "min"] = [ ["x", "y"], function(val) { return min(array_safe_get_fast(val, 0), array_safe_get_fast(val, 1)); } ]; - global.PCX_FUNCTIONS[? "max"] = [ ["x", "y"], function(val) { return max(array_safe_get_fast(val, 0), array_safe_get_fast(val, 1)); } ]; - global.PCX_FUNCTIONS[? "clamp"] = [ ["x", "min = 0", "max = 1"], function(val) { return clamp(array_safe_get_fast(val, 0), array_safe_get_fast(val, 1, 0), array_safe_get_fast(val, 2, 1)); } ]; + global.PCX_FUNCTIONS[? "min"] = [ ["x", "y"], function(val) /*=>*/ {return min(array_safe_get_fast(val, 0), array_safe_get_fast(val, 1))} ]; + global.PCX_FUNCTIONS[? "max"] = [ ["x", "y"], function(val) /*=>*/ {return max(array_safe_get_fast(val, 0), array_safe_get_fast(val, 1))} ]; + global.PCX_FUNCTIONS[? "clamp"] = [ ["x", "min = 0", "max = 1"], function(val) /*=>*/ {return clamp(array_safe_get_fast(val, 0), array_safe_get_fast(val, 1, 0), array_safe_get_fast(val, 2, 1))} ]; - global.PCX_FUNCTIONS[? "lerp"] = [ ["x", "y", "amount"], function(val) { return lerp(array_safe_get_fast(val, 0), array_safe_get_fast(val, 1), array_safe_get_fast(val, 2)); } ]; + global.PCX_FUNCTIONS[? "lerp"] = [ ["x", "y", "amount"], function(val) /*=>*/ {return lerp(array_safe_get_fast(val, 0), array_safe_get_fast(val, 1), array_safe_get_fast(val, 2))} ]; global.PCX_FUNCTIONS[? "wiggle"] = [ ["time", "frequency", "octave = 1", "seed = 0"], function(val) { return wiggle(0, 1, TOTAL_FRAMES / array_safe_get_fast(val, 1), @@ -39,32 +39,26 @@ array_safe_get_fast(val, 3, 0), array_safe_get_fast(val, 2, 1)); } ]; - global.PCX_FUNCTIONS[? "random"] = [ ["min = 0", "max = 1"], function(val) { - return random_range(array_safe_get_fast(val, 0, 0), - array_safe_get_fast(val, 1, 1)); - } ]; - global.PCX_FUNCTIONS[? "irandom"] = [ ["min = 0", "max = 1"], function(val) { - return irandom_range(array_safe_get_fast(val, 0, 0), - array_safe_get_fast(val, 1, 1)); - } ]; + global.PCX_FUNCTIONS[? "random"] = [ ["min = 0", "max = 1"], function(val) /*=>*/ {return random_range(array_safe_get_fast(val, 0, 0), array_safe_get_fast(val, 1, 1))} ]; + global.PCX_FUNCTIONS[? "irandom"] = [ ["min = 0", "max = 1"], function(val) /*=>*/ {return irandom_range(array_safe_get_fast(val, 0, 0), array_safe_get_fast(val, 1, 1))} ]; global.PCX_FUNCTIONS[? "range"] = [ ["length", "start = 0", "step = 1"], function(val) { - var arr = array_create(array_safe_get_fast(val, 0, 0)); - for( var i = 0, n = array_length(arr); i < n; i++ ) - arr[i] = array_safe_get_fast(val, 1, 0) + i * array_safe_get_fast(val, 2, 1); - return arr; - } ]; + var arr = array_create(array_safe_get_fast(val, 0, 0)); + for( var i = 0, n = array_length(arr); i < n; i++ ) + arr[i] = array_safe_get_fast(val, 1, 0) + i * array_safe_get_fast(val, 2, 1); + return arr; + } ]; global.PCX_FUNCTIONS[? "length"] = [ ["value"], function(val) { - if(is_array(val)) return array_length(val); - if(is_string(val)) return string_length(val); - return 0; - } ]; + if(is_array(val)) return array_length(val); + if(is_string(val)) return string_length(val); + return 0; + } ]; - global.PCX_FUNCTIONS[? "string"] = [ ["value"], function(val) { return string(array_safe_get_fast(val, 0)); } ]; - global.PCX_FUNCTIONS[? "number"] = [ ["value"], function(val) { return toNumber(array_safe_get_fast(val, 0)); } ]; - global.PCX_FUNCTIONS[? "chr"] = [ ["x"], function(val) { return chr(array_safe_get_fast(val, 0)); } ]; - global.PCX_FUNCTIONS[? "ord"] = [ ["char"], function(val) { return ord(array_safe_get_fast(val, 0)); } ]; + global.PCX_FUNCTIONS[? "string"] = [ ["value"], function(val) /*=>*/ {return string(array_safe_get_fast(val, 0))} ]; + global.PCX_FUNCTIONS[? "number"] = [ ["value"], function(val) /*=>*/ {return toNumber(array_safe_get_fast(val, 0))} ]; + global.PCX_FUNCTIONS[? "chr"] = [ ["x"], function(val) /*=>*/ {return chr(array_safe_get_fast(val, 0))} ]; + global.PCX_FUNCTIONS[? "ord"] = [ ["char"], function(val) /*=>*/ {return ord(array_safe_get_fast(val, 0))} ]; global.PCX_FUNCTIONS[? "draw"] = [ ["surface", "x = 0", "y = 0", "xs = 1", "ys = 1", "rot = 0", "color = white", "alpha = 1"], function(val) { @@ -100,25 +94,25 @@ PROJECT_VARIABLES = {}; PROJECT_VARIABLES.Project = {}; - PROJECT_VARIABLES.Project.frame = [ function() { return CURRENT_FRAME }, EXPRESS_TREE_ANIM.animated ]; - PROJECT_VARIABLES.Project.progress = [ function() { return CURRENT_FRAME / (TOTAL_FRAMES - 1) }, EXPRESS_TREE_ANIM.animated ]; - PROJECT_VARIABLES.Project.frameTotal = [ function() { return TOTAL_FRAMES }, EXPRESS_TREE_ANIM.none ]; - PROJECT_VARIABLES.Project.FPS = [ function() { return PROJECT.animator.framerate }, EXPRESS_TREE_ANIM.none ]; - PROJECT_VARIABLES.Project.time = [ function() { return CURRENT_FRAME / PROJECT.animator.framerate }, EXPRESS_TREE_ANIM.animated ]; - PROJECT_VARIABLES.Project.name = [ function() { return filename_name_only(PROJECT.path) }, EXPRESS_TREE_ANIM.none ]; - PROJECT_VARIABLES.Project.dimension = [ function() { return PROJECT.attributes.surface_dimension; }, EXPRESS_TREE_ANIM.none ]; + PROJECT_VARIABLES.Project.frame = [ function() /*=>*/ {return CURRENT_FRAME}, EXPRESS_TREE_ANIM.animated ]; + PROJECT_VARIABLES.Project.progress = [ function() /*=>*/ {return CURRENT_FRAME / (TOTAL_FRAMES - 1)}, EXPRESS_TREE_ANIM.animated ]; + PROJECT_VARIABLES.Project.frameTotal = [ function() /*=>*/ {return TOTAL_FRAMES}, EXPRESS_TREE_ANIM.none ]; + PROJECT_VARIABLES.Project.FPS = [ function() /*=>*/ {return PROJECT.animator.framerate}, EXPRESS_TREE_ANIM.none ]; + PROJECT_VARIABLES.Project.time = [ function() /*=>*/ {return CURRENT_FRAME / PROJECT.animator.framerate}, EXPRESS_TREE_ANIM.animated ]; + PROJECT_VARIABLES.Project.name = [ function() /*=>*/ {return filename_name_only(PROJECT.path)}, EXPRESS_TREE_ANIM.none ]; + PROJECT_VARIABLES.Project.dimension = [ function() /*=>*/ {return PROJECT.attributes.surface_dimension}, EXPRESS_TREE_ANIM.none ]; PROJECT_VARIABLES.Program = {}; - PROJECT_VARIABLES.Program.time = [ function() { return current_time / 1000 }, EXPRESS_TREE_ANIM.animated ]; + PROJECT_VARIABLES.Program.time = [ function() /*=>*/ {return current_time / 1000}, EXPRESS_TREE_ANIM.animated ]; PROJECT_VARIABLES.Device = {}; - PROJECT_VARIABLES.Device.timeSecond = [ function() { return current_second }, EXPRESS_TREE_ANIM.animated ]; - PROJECT_VARIABLES.Device.timeMinute = [ function() { return current_minute }, EXPRESS_TREE_ANIM.animated ]; - PROJECT_VARIABLES.Device.timeHour = [ function() { return current_hour }, EXPRESS_TREE_ANIM.animated ]; - PROJECT_VARIABLES.Device.timeDay = [ function() { return current_day }, EXPRESS_TREE_ANIM.animated ]; - PROJECT_VARIABLES.Device.timeDayInWeek = [ function() { return current_weekday }, EXPRESS_TREE_ANIM.animated ]; - PROJECT_VARIABLES.Device.timeMonth = [ function() { return current_month }, EXPRESS_TREE_ANIM.animated ]; - PROJECT_VARIABLES.Device.timeYear = [ function() { return current_year }, EXPRESS_TREE_ANIM.animated ]; + PROJECT_VARIABLES.Device.timeSecond = [ function() /*=>*/ {return current_second}, EXPRESS_TREE_ANIM.animated ]; + PROJECT_VARIABLES.Device.timeMinute = [ function() /*=>*/ {return current_minute}, EXPRESS_TREE_ANIM.animated ]; + PROJECT_VARIABLES.Device.timeHour = [ function() /*=>*/ {return current_hour}, EXPRESS_TREE_ANIM.animated ]; + PROJECT_VARIABLES.Device.timeDay = [ function() /*=>*/ {return current_day}, EXPRESS_TREE_ANIM.animated ]; + PROJECT_VARIABLES.Device.timeDayInWeek = [ function() /*=>*/ {return current_weekday}, EXPRESS_TREE_ANIM.animated ]; + PROJECT_VARIABLES.Device.timeMonth = [ function() /*=>*/ {return current_month}, EXPRESS_TREE_ANIM.animated ]; + PROJECT_VARIABLES.Device.timeYear = [ function() /*=>*/ {return current_year}, EXPRESS_TREE_ANIM.animated ]; #endregion #region evaluator @@ -151,7 +145,6 @@ } static eval = function(params = {}) { - //var _params = variable_clone(params); var val = 0; for( var i = 0, n = array_length(funcTrees); i < n; i++ ) @@ -389,63 +382,73 @@ getRaw = true; } - var v1 = getVal(l, params, getRaw || isLeft); - var v2 = getVal(r, params); - + var v1 = getVal(l, params, getRaw || isLeft); + var v2 = getVal(r, params); var res = 0; - if(symbol == "") { - res = v1; - } else if(symbol == "【") { // array builder - res = array_create(array_length(v1)); - for( var i = 0, n = array_length(v1); i < n; i++ ) - res[i] = getVal(v1[i], params); - } else if(symbol == "@") { // array getter - if(isLeft) - res = [ v1, v2 ]; - else if(is_real(v2)) { - if(is_array(v1)) { - if(v2 < 0) v2 = array_length(v1) + v2; - res = array_safe_get_fast(v1, v2); - } else if(is_string(v1)) { - if(v2 < 0) v2 = string_length(v1) + v2; - res = string_char_at(v1, v2 + 1); + switch(symbol) { + case "" : + res = v1; + break; + + case "【" : // array builder + res = array_create(array_length(v1)); + for( var i = 0, n = array_length(v1); i < n; i++ ) + res[i] = getVal(v1[i], params); + break; + + case "@" : // array getter + if(isLeft) + res = [ v1, v2 ]; + else if(is_real(v2)) { + if(is_array(v1)) { + if(v2 < 0) v2 = array_length(v1) + v2; + res = array_safe_get_fast(v1, v2); + } else if(is_string(v1)) { + if(v2 < 0) v2 = string_length(v1) + v2; + res = string_char_at(v1, v2 + 1); + } } - } - - //print($"Array getter {v1}, {v2} = {res}"); - } else if(symbol == "=") { // value assignment - if(is_array(v1)) { - var val = params[$ v1[0]]; - val = array_safe_set(val, v1[1], v2); - params[$ v1[0]] = val; - res = val; - } else { - params[$ v1] = v2; - res = v2; - } - } else if(symbol == "≔") { // function default replacement - if(!struct_exists(params, v1)) - params[$ v1] = v2; - res = params[$ v1]; - - } else if(is_array(v1) && !is_array(v2)) { // evaluate value - res = array_create(array_length(v1)); - for( var i = 0, n = array_length(res); i < n; i++ ) - res[i] = eval_real(array_safe_get_fast(v1, i), v2); + break; - } else if(!is_array(v1) && is_array(v2)) { - res = array_create(array_length(v2)); - for( var i = 0, n = array_length(res); i < n; i++ ) - res[i] = eval_real(v1, array_safe_get_fast(v2, i)); + case "=" : // value assignment + if(is_array(v1)) { + var val = params[$ v1[0]]; + val = array_safe_set(val, v1[1], v2); + params[$ v1[0]] = val; + res = val; + } else { + params[$ v1] = v2; + res = v2; + } + break; - } else if(is_array(v1) && is_array(v2)) { - res = array_create(max(array_length(v1), array_length(v2))); - for( var i = 0, n = array_length(res); i < n; i++ ) - res[i] = eval_real(array_safe_get_fast(v1, i), array_safe_get_fast(v2, i)); + case "≔" : // function default replacement + if(!struct_exists(params, v1)) + params[$ v1] = v2; + res = params[$ v1]; + break; - } else - res = eval_real(v1, v2); + default : + if(is_array(v1) && !is_array(v2)) { // evaluate value + res = array_create(array_length(v1)); + for( var i = 0, n = array_length(res); i < n; i++ ) + res[i] = eval_real(array_safe_get_fast(v1, i), v2); + + } else if(!is_array(v1) && is_array(v2)) { + res = array_create(array_length(v2)); + for( var i = 0, n = array_length(res); i < n; i++ ) + res[i] = eval_real(v1, array_safe_get_fast(v2, i)); + + } else if(is_array(v1) && is_array(v2)) { + res = array_create(max(array_length(v1), array_length(v2))); + for( var i = 0, n = array_length(res); i < n; i++ ) + res[i] = eval_real(array_safe_get_fast(v1, i), array_safe_get_fast(v2, i)); + + } else + res = eval_real(v1, v2); + break; + } var _v1_var = getVal(l, params, true); switch(symbol) { diff --git a/scripts/pcx_parse/pcx_parse.gml b/scripts/pcx_parse/pcx_parse.gml index 36c9b7d35..7f1703ab1 100644 --- a/scripts/pcx_parse/pcx_parse.gml +++ b/scripts/pcx_parse/pcx_parse.gml @@ -51,6 +51,7 @@ if(ch == " ") { if(str) _fx += ch; + } else { if(ch == "-" && _prevSym) _fx += $"0∸"; @@ -129,13 +130,9 @@ for( var i = 0, n = array_length(fxs); i < n; i++ ) { var _fx = functionStringClean(fxs[i]); - //print($"Eval line {i}: {_fx} [stack size = {ds_stack_size(call_st)}]"); if(_fx == "" || _fx == "{") continue; - if(_fx == "}") { - ds_stack_pop(call_st); - continue; - } + if(_fx == "}") { ds_stack_pop(call_st); continue; } var _fx_sp = string_split(_fx, "("); var _cmd = string_trim(_fx_sp[0]); @@ -167,7 +164,6 @@ continue; case "for": - var con_for = new __funcFor(); var cond = string_splice(_cond, ":"); if(array_length(cond) == 2) { @@ -195,6 +191,7 @@ if(ds_stack_empty(call_st)) { print("Block stack empty, how?"); + } else { var _top = ds_stack_top(call_st); _top.addFunction(evaluateFunctionTree(_fx));