diff --git a/PixelComposer.resource_order b/PixelComposer.resource_order index 0c6a029db..7027607ff 100644 --- a/PixelComposer.resource_order +++ b/PixelComposer.resource_order @@ -1037,6 +1037,8 @@ {"name":"node_tunnel_out","order":1,"path":"scripts/node_tunnel_out/node_tunnel_out.yy",}, {"name":"node_twirl","order":4,"path":"scripts/node_twirl/node_twirl.yy",}, {"name":"node_unicode","order":1,"path":"scripts/node_unicode/node_unicode.yy",}, + {"name":"node_value_base","order":17,"path":"scripts/node_value_base/node_value_base.yy",}, + {"name":"node_value_types","order":18,"path":"scripts/node_value_types/node_value_types.yy",}, {"name":"node_value","order":5,"path":"scripts/node_value/node_value.yy",}, {"name":"node_vector_cross_2D","order":11,"path":"scripts/node_vector_cross_2D/node_vector_cross_2D.yy",}, {"name":"node_vector_cross_3D","order":10,"path":"scripts/node_vector_cross_3D/node_vector_cross_3D.yy",}, diff --git a/PixelComposer.yyp b/PixelComposer.yyp index 85cdd8a97..5ad98f6e0 100644 --- a/PixelComposer.yyp +++ b/PixelComposer.yyp @@ -1493,6 +1493,8 @@ {"id":{"name":"node_tunnel_out","path":"scripts/node_tunnel_out/node_tunnel_out.yy",},}, {"id":{"name":"node_twirl","path":"scripts/node_twirl/node_twirl.yy",},}, {"id":{"name":"node_unicode","path":"scripts/node_unicode/node_unicode.yy",},}, + {"id":{"name":"node_value_base","path":"scripts/node_value_base/node_value_base.yy",},}, + {"id":{"name":"node_value_types","path":"scripts/node_value_types/node_value_types.yy",},}, {"id":{"name":"node_value","path":"scripts/node_value/node_value.yy",},}, {"id":{"name":"node_VCT","path":"scripts/node_VCT/node_VCT.yy",},}, {"id":{"name":"node_vector_cross_2D","path":"scripts/node_vector_cross_2D/node_vector_cross_2D.yy",},}, diff --git a/scripts/button/button.gml b/scripts/button/button.gml index c03c43ab2..8dae157ee 100644 --- a/scripts/button/button.gml +++ b/scripts/button/button.gml @@ -19,6 +19,11 @@ function buttonClass(_onClick, _icon = noone) : widget() constructor { toggled = false; context = noone; + static setContext = function(struct) { #region + onClick = method(struct, onClick); + return self; + } #endregion + static setLua = function(_lua_thread, _lua_key, _lua_func) { #region lua_thread = _lua_thread; lua_thread_key = _lua_key; @@ -163,14 +168,16 @@ function buttonInstant(spr, _x, _y, _w, _h, _m, _act, _hvr, _tip = "", _icon = n return res; } -function buttonTextIconInstant(spr, _x, _y, _w, _h, _m, _act, _hvr, _tip = "", _icon = noone, _icon_label = "") { - var _b = buttonInstant(spr, _x, _y, _w, _h, _m, _act, _hvr, _tip); +function buttonTextIconInstant(active, spr, _x, _y, _w, _h, _m, _act, _hvr, _tip = "", _icon = noone, _icon_label = "", _icon_blend = COLORS._main_icon_light, _icon_alpha = 1) { + var _b = 0; - draw_set_text(f_p1, fa_left, fa_center, COLORS._main_icon_light); + if(active) _b = buttonInstant(spr, _x, _y, _w, _h, _m, _act, _hvr, _tip); + + draw_set_text(f_p1, fa_left, fa_center, active? COLORS._main_icon_light : COLORS._main_icon); var bxc = _x + _w / 2 - (string_width(_icon_label) + ui(64)) / 2; var byc = _y + _h / 2; - draw_sprite_ui(_icon, 0, bxc + ui(24), byc,,,, COLORS._main_icon_light); - draw_text(bxc + ui(48), byc, _icon_label); + draw_sprite_ui(_icon, 0, bxc + ui(24), byc, 1, 1, 0, _icon_blend, _icon_alpha * (0.5 + 0.5 * active)); + draw_text_add(bxc + ui(48), byc, _icon_label); return _b; } \ No newline at end of file diff --git a/scripts/event_recorder/event_recorder.gml b/scripts/event_recorder/event_recorder.gml index 23ce21835..f3b3a8037 100644 --- a/scripts/event_recorder/event_recorder.gml +++ b/scripts/event_recorder/event_recorder.gml @@ -149,7 +149,7 @@ function Action(_type, _object, _data, _trigger = 0) constructor { break; case ACTION_TYPE.custom : - obj(data); + obj(data, true); break; } @@ -239,7 +239,7 @@ function Action(_type, _object, _data, _trigger = 0) constructor { break; case ACTION_TYPE.custom : - obj(data); + obj(data, false); break; } @@ -342,9 +342,9 @@ function recordAction(_type, _object, _data = -1, _trigger = 0) { #region return act; } #endregion -function recordAction_variable_change(object, variable_name, variable_old_value, undo_label = "") { +function recordAction_variable_change(object, variable_name, variable_old_value, undo_label = "", _trigger = 0) { INLINE - recordAction(ACTION_TYPE.var_modify, object, undo_label == ""? [ variable_old_value, variable_name ] : [ variable_old_value, variable_name, undo_label ]); + recordAction(ACTION_TYPE.var_modify, object, undo_label == ""? [ variable_old_value, variable_name ] : [ variable_old_value, variable_name, undo_label ], _trigger); } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/scripts/node_VFX_renderer/node_VFX_renderer.gml b/scripts/node_VFX_renderer/node_VFX_renderer.gml index 7ce8da47e..22e1ae610 100644 --- a/scripts/node_VFX_renderer/node_VFX_renderer.gml +++ b/scripts/node_VFX_renderer/node_VFX_renderer.gml @@ -40,7 +40,9 @@ function Node_VFX_Renderer(_x, _y, _group = noone) : Node(_x, _y, _group) constr array_push(input_display_list, ["Particle", false], index + 0, index + 1); return inputs[| index + 1]; - } setDynamicInput(2, true, VALUE_TYPE.particle); + } + + setDynamicInput(2, true, VALUE_TYPE.particle); dyna_input_check_shift = 1; outputs[| 0] = nodeValue("Surface out", self, JUNCTION_CONNECT.output, VALUE_TYPE.surface, noone); @@ -81,7 +83,7 @@ function Node_VFX_Renderer(_x, _y, _group = noone) : Node(_x, _y, _group) constr if(_type == PARTICLE_RENDER_TYPE.surface) shader_set_interpolation(_outSurf); - for( var i = input_fix_len; i < ds_list_size(inputs) - 1; i += data_length ) { + for( var i = input_fix_len; i < ds_list_size(inputs); i += data_length ) { var blend = inputs[| i + 0].getValue(_time); var parts = inputs[| i + 1].getValue(_time); diff --git a/scripts/node_VFX_renderer_output/node_VFX_renderer_output.gml b/scripts/node_VFX_renderer_output/node_VFX_renderer_output.gml index 556005501..0a116cd35 100644 --- a/scripts/node_VFX_renderer_output/node_VFX_renderer_output.gml +++ b/scripts/node_VFX_renderer_output/node_VFX_renderer_output.gml @@ -46,7 +46,9 @@ function Node_VFX_Renderer_Output(_x, _y, _group = noone) : Node_Group_Output(_x array_push(input_display_list, ["Particle", false], index + 0, index + 1); return inputs[| index + 1]; - } setDynamicInput(2, true, VALUE_TYPE.particle); + } + + setDynamicInput(2, true, VALUE_TYPE.particle); dyna_input_check_shift = 1; static createOutput = function() { #region @@ -106,7 +108,7 @@ function Node_VFX_Renderer_Output(_x, _y, _group = noone) : Node_Group_Output(_x if(_type == PARTICLE_RENDER_TYPE.surface) shader_set_interpolation(_outSurf); - for( var i = input_fix_len; i < ds_list_size(inputs) - 1; i += data_length ) { + for( var i = input_fix_len; i < ds_list_size(inputs); i += data_length ) { var blend = inputs[| i + 0].getValue(_time); var parts = inputs[| i + 1].getValue(_time); diff --git a/scripts/node_array/node_array.gml b/scripts/node_array/node_array.gml index 2372a870f..2d0fab8a4 100644 --- a/scripts/node_array/node_array.gml +++ b/scripts/node_array/node_array.gml @@ -3,7 +3,6 @@ function Node_Array(_x, _y, _group = noone) : Node(_x, _y, _group) constructor { setDimension(96, 48); - attributes.size = 0; attributes.spread_value = false; inputs[| 0] = nodeValue("Type", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 0 ) @@ -18,17 +17,15 @@ function Node_Array(_x, _y, _group = noone) : Node(_x, _y, _group) constructor { var bw = _w / 2 - ui(4); var bh = ui(36); - if(buttonTextIconInstant(THEME.button_hide, _x, _y + ui(8), bw, bh, _m, _focus, _hover, "", THEME.add, __txt("Add")) == 2) { - attributes.size++; - refreshDynamicInput(); - update(); + if(buttonTextIconInstant(true, THEME.button_hide, _x, _y + ui(8), bw, bh, _m, _focus, _hover, "", THEME.add, __txt("Add"), COLORS._main_value_positive) == 2) { + attributes.size = max(attributes.size, (ds_list_size(inputs) - input_fix_len) / data_length ) + 1; + onInputResize(); } var amo = attributes.size; - if(buttonTextIconInstant(THEME.button_hide, _x + _w - bw, _y + ui(8), bw, bh, _m, _focus, _hover, "", THEME.minus, __txt("Remove")) == 2) { - attributes.size = max(attributes.size - 1, 0); - refreshDynamicInput(); - update(); + if(buttonTextIconInstant(attributes.size > 0, THEME.button_hide, _x + _w - bw, _y + ui(8), bw, bh, _m, _focus, _hover, "", THEME.minus, __txt("Remove"), COLORS._main_value_negative) == 2) { + attributes.size--; + onInputResize(); } return _h; @@ -47,7 +44,9 @@ function Node_Array(_x, _y, _group = noone) : Node(_x, _y, _group) constructor { array_push(input_display_list, index); return inputs[| index]; - } setDynamicInput(1); + } + + setDynamicInput(1); static getType = function() { #region var _type = getInputData(0); @@ -145,7 +144,7 @@ function Node_Array(_x, _y, _group = noone) : Node(_x, _y, _group) constructor { var ind = 0; var spd = getInputData(1); - for( var i = input_fix_len; i < ds_list_size(inputs) - 1; i++ ) { + for( var i = input_fix_len; i < ds_list_size(inputs); i++ ) { var val = getInputData(i); if(is_array(val) && spd) array_append(res, val); diff --git a/scripts/node_data/node_data.gml b/scripts/node_data/node_data.gml index 534bd63cc..f6eeb5f90 100644 --- a/scripts/node_data/node_data.gml +++ b/scripts/node_data/node_data.gml @@ -466,6 +466,8 @@ function Node(_x, _y, _group = noone) : __Node_Base(_x, _y) constructor { .setDummy(function() { return createNewInput(); }) .setVisible(false, true); } + + attributes.size = 0; } #endregion static refreshDynamicInput = function() { #region @@ -513,6 +515,8 @@ function Node(_x, _y, _group = noone) : __Node_Base(_x, _y) constructor { static getInputAmount = function() { return (ds_list_size(inputs) - input_fix_len) / data_length; } + function onInputResize() { refreshDynamicInput(); triggerRender(); } + #endregion //////////////////////////////// Dynamic IO //////////////////////////////// static getOutput = function(junc = noone) { #region @@ -999,7 +1003,7 @@ function Node(_x, _y, _group = noone) : __Node_Base(_x, _y) constructor { getJunctionList(); } run_in(1, function() { refreshNodeDisplay(); }); #endregion - static getJunctionList = function() { #region + static getJunctionList = function() { #region ////getJunctionList var amo = input_display_list == -1? ds_list_size(inputs) : array_length(input_display_list); inputDisplayList = []; diff --git a/scripts/node_equation/node_equation.gml b/scripts/node_equation/node_equation.gml index 14cb752fe..6ccf38af3 100644 --- a/scripts/node_equation/node_equation.gml +++ b/scripts/node_equation/node_equation.gml @@ -50,15 +50,15 @@ function Node_Equation(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) var bw = _w / 2 - ui(4); var bh = ui(36); - if(buttonTextIconInstant(THEME.button_hide, _x, _y + ui(8), bw, bh, _m, _focus, _hover, "", THEME.add, __txt("Add")) == 2) { + if(buttonTextIconInstant(true, THEME.button_hide, _x, _y + ui(8), bw, bh, _m, _focus, _hover, "", THEME.add, __txt("Add"), COLORS._main_value_positive) == 2) { attributes.size++; refreshDynamicInput(); update(); } var amo = attributes.size; - if(buttonTextIconInstant(THEME.button_hide, _x + _w - bw, _y + ui(8), bw, bh, _m, _focus, _hover, "", THEME.minus, __txt("Remove")) == 2) { - attributes.size = max(attributes.size - 1, 0); + if(buttonTextIconInstant(attributes.size > 0 && THEME.button_hide, _x + _w - bw, _y + ui(8), bw, bh, _m, _focus, _hover, "", THEME.minus, __txt("Remove"), COLORS._main_value_negative) == 2) { + attributes.size--; refreshDynamicInput(); update(); } diff --git a/scripts/node_midi_in/node_midi_in.gml b/scripts/node_midi_in/node_midi_in.gml index 8cdab09cd..92125b462 100644 --- a/scripts/node_midi_in/node_midi_in.gml +++ b/scripts/node_midi_in/node_midi_in.gml @@ -28,12 +28,12 @@ function Node_MIDI_In(_x, _y, _group = noone) : Node(_x, _y, _group) constructor var bw = _w / 2 - ui(4); var bh = ui(36); - if(buttonTextIconInstant(THEME.button_hide, _x, _y + ui(8), bw, bh, _m, _focus, _hover, "", THEME.add, __txt("Add")) == 2) { + if(buttonTextIconInstant(true, THEME.button_hide, _x, _y + ui(8), bw, bh, _m, _focus, _hover, "", THEME.add, __txt("Add"), COLORS._main_value_positive) == 2) { createNewInput(); } var amo = ds_list_size(inputs); - if(amo > 1 && buttonTextIconInstant(THEME.button_hide, _x + _w - bw, _y + ui(8), bw, bh, _m, _focus, _hover, "", THEME.minus, __txt("Remove")) == 2) { + if(buttonTextIconInstant(amo > 1, THEME.button_hide, _x + _w - bw, _y + ui(8), bw, bh, _m, _focus, _hover, "", THEME.minus, __txt("Remove"), COLORS._main_value_negative) == 2) { var _out = outputs[| ds_list_size(outputs) - 1]; for( var i = 0, n = array_length(_out.value_to); i < n; i++ ) _out.value_to[i].removeFrom(); diff --git a/scripts/node_statistic/node_statistic.gml b/scripts/node_statistic/node_statistic.gml index 9617a6135..98defbfc8 100644 --- a/scripts/node_statistic/node_statistic.gml +++ b/scripts/node_statistic/node_statistic.gml @@ -40,7 +40,9 @@ function Node_Statistic(_x, _y, _group = noone) : Node(_x, _y, _group) construct .setVisible(false, true); return inputs[| index]; - } setDynamicInput(1, true, VALUE_TYPE.float); + } + + setDynamicInput(1, true, VALUE_TYPE.float); outputs[| 0] = nodeValue("Statistic", self, JUNCTION_CONNECT.output, VALUE_TYPE.float, -1); @@ -48,14 +50,9 @@ function Node_Statistic(_x, _y, _group = noone) : Node(_x, _y, _group) construct var type = getInputData(0); var res = 0; - if(ds_list_size(inputs) - 1 == input_fix_len) { - outputs[| 0].setValue(0); - return; - } - switch(type) { case STAT_OPERATOR._sum : - for( var i = input_fix_len; i < ds_list_size(inputs) - 1; i++ ) { + for( var i = input_fix_len; i < ds_list_size(inputs); i++ ) { var val = getInputData(i); if(is_array(val)) { for( var j = 0; j < array_length(val); j++ ) @@ -71,7 +68,7 @@ function Node_Statistic(_x, _y, _group = noone) : Node(_x, _y, _group) construct } var amo = 0; - for( var i = input_fix_len; i < ds_list_size(inputs) - 1; i++ ) { + for( var i = input_fix_len; i < ds_list_size(inputs); i++ ) { var val = getInputData(i); if(is_array(val)) { for( var j = 0; j < array_length(val); j++ ) { @@ -86,14 +83,14 @@ function Node_Statistic(_x, _y, _group = noone) : Node(_x, _y, _group) construct res /= amo; break; case STAT_OPERATOR._median : - if(ds_list_size(inputs) - 1 - input_fix_len == 0) { + if(ds_list_size(inputs) - input_fix_len == 0) { res = 0; break; } var vals = []; var amo = 0; - for( var i = input_fix_len; i < ds_list_size(inputs) - 1; i++ ) { + for( var i = input_fix_len; i < ds_list_size(inputs); i++ ) { var val = getInputData(i); if(is_array(val)) { for( var j = 0; j < array_length(val); j++ ) { @@ -119,7 +116,7 @@ function Node_Statistic(_x, _y, _group = noone) : Node(_x, _y, _group) construct break; case STAT_OPERATOR._min : var _min = 9999999999; - for( var i = input_fix_len; i < ds_list_size(inputs) - 1; i++ ) { + for( var i = input_fix_len; i < ds_list_size(inputs); i++ ) { var val = getInputData(i); if(is_array(val)) { for( var j = 0; j < array_length(val); j++ ) @@ -132,7 +129,7 @@ function Node_Statistic(_x, _y, _group = noone) : Node(_x, _y, _group) construct case STAT_OPERATOR._max : var _max = -9999999999; - for( var i = input_fix_len; i < ds_list_size(inputs) - 1; i++ ) { + for( var i = input_fix_len; i < ds_list_size(inputs); i++ ) { var val = getInputData(i); if(is_array(val)) { for( var j = 0; j < array_length(val); j++ ) diff --git a/scripts/node_struct/node_struct.gml b/scripts/node_struct/node_struct.gml index 762305902..8f19407a8 100644 --- a/scripts/node_struct/node_struct.gml +++ b/scripts/node_struct/node_struct.gml @@ -3,56 +3,119 @@ function Node_Struct(_x, _y, _group = noone) : Node(_x, _y, _group) constructor setDimension(96, 48); + size_adjust_tool = new Inspector_Custom_Renderer(function(_x, _y, _w, _m, _hover, _focus) { #region + var _h = ui(48); + + var bw = _w / 2 - ui(4); + var bh = ui(36); + if(buttonTextIconInstant(true, THEME.button_hide, _x, _y + ui(8), bw, bh, _m, _focus, _hover, "", THEME.add, __txt("Add"), COLORS._main_value_positive) == 2) + addInput(); + + var amo = attributes.size; + if(buttonTextIconInstant(attributes.size > 0, THEME.button_hide, _x + _w - bw, _y + ui(8), bw, bh, _m, _focus, _hover, "", THEME.minus, __txt("Remove"), COLORS._main_value_negative) == 2) + deleteInput(ds_list_size(inputs) - data_length); + + return _h; + }); #endregion + + input_display_list = [ size_adjust_tool, ]; + outputs[| 0] = nodeValue("Struct", self, JUNCTION_CONNECT.output, VALUE_TYPE.struct, {}); - static createNewInput = function() { - var index = ds_list_size(inputs); - inputs[| index + 0] = nodeValue("Key", self, JUNCTION_CONNECT.input, VALUE_TYPE.text, "" ); - - inputs[| index + 1] = nodeValue("value", self, JUNCTION_CONNECT.input, VALUE_TYPE.any, 0 ) - .setVisible(false, false); - - return inputs[| index + 0]; - } setDynamicInput(2, false); - - if(!LOADING && !APPENDING) createNewInput(); + #region //////////////////////////////// Dynamic IO //////////////////////////////// - static refreshDynamicInput = function() { - var _in = ds_list_create(); - - for( var i = 0; i < input_fix_len; i++ ) - ds_list_add(_in, inputs[| i]); - - for( var i = input_fix_len; i < ds_list_size(inputs); i += data_length ) { - var _val = inputs[| i].getValue(); + static createNewInput = function(list = inputs) { + var index = ds_list_size(list); - if(_val != "") { - ds_list_add(_in, inputs[| i + 0]); - ds_list_add(_in, inputs[| i + 1].setVisible(false, true)); + var bDel = button(function() { node.deleteInput(index); }) + .setIcon(THEME.minus_16, 0, COLORS._main_icon); + + list[| index + 0] = nodeValue("Key", self, JUNCTION_CONNECT.input, VALUE_TYPE.text, "" ) + .setDisplay(VALUE_DISPLAY.text_box, { side_button : bDel }) + .setAnimable(false); + bDel.setContext(list[| index + 0]); + + list[| index + 1] = nodeValue("value", self, JUNCTION_CONNECT.input, VALUE_TYPE.any, 0 ) + .setVisible(false, false); + + return list[| index + 0]; + } + + setDynamicInput(2, false); + + static addInput = function() { + var index = ds_list_size(inputs); + + attributes.size++; + createNewInput(); + + if(!UNDO_HOLDING) { + var _inputs = array_create(data_length); + for(var i = 0; i < data_length; i++) + _inputs[i] = inputs[| index + i]; + + recordAction(ACTION_TYPE.custom, function(data, undo) { + if(undo) deleteInput(data.index); + else insertInput(data.index, data.inputs); + }, { index, inputs : _inputs }); } + + onInputResize(); } - for( var i = 0; i < ds_list_size(_in); i++ ) - _in[| i].index = i; + static deleteInput = function(index) { + if(!UNDO_HOLDING) { + var _inputs = array_create(data_length); + for(var i = 0; i < data_length; i++) + _inputs[i] = inputs[| index + i]; + + recordAction(ACTION_TYPE.custom, function(data, undo) { + if(undo) insertInput(data.index, data.inputs); + else deleteInput(data.index); + }, { index, inputs : _inputs }); + } + + attributes.size--; + for(var i = data_length - 1; i >= 0; i--) + ds_list_delete(inputs, index + i); + + onInputResize(); + } - ds_list_destroy(inputs); - inputs = _in; + static insertInput = function(index, _inputs) { + attributes.size++; + + for(var i = 0; i < data_length; i++) + ds_list_insert(inputs, index + i, _inputs[i]); + + onInputResize(); + } - createNewInput(); - } + static refreshDynamicInput = function() { + input_display_list = array_clone(input_display_list_raw); + + for( var i = 0; i < ds_list_size(inputs); i++ ) { + inputs[| i].index = i; + array_push(input_display_list, i); + } + + getJunctionList(); + } + #endregion //////////////////////////////// Dynamic IO //////////////////////////////// + static onValueUpdate = function(index = 0) { if(LOADING || APPENDING) return; if(index < 0) return; - if(safe_mod(index - input_fix_len, data_length) == 0) + if(safe_mod(index - input_fix_len, data_length) == 0) { + inputs[| index + 1].setVisible(false, true); inputs[| index + 1].name = $"{getInputData(index)} value"; - - refreshDynamicInput(); + } } static step = function() { - for(var i = input_fix_len; i < ds_list_size(inputs) - data_length; i += data_length) { + for(var i = input_fix_len; i < ds_list_size(inputs); i += data_length) { var inp = inputs[| i + 1]; var typ = inp.value_from == noone? VALUE_TYPE.any : inp.value_from.type; inp.setType(typ); @@ -62,7 +125,7 @@ function Node_Struct(_x, _y, _group = noone) : Node(_x, _y, _group) constructor static update = function() { var str = {}; - for(var i = input_fix_len; i < ds_list_size(inputs) - data_length; i += data_length) { + for(var i = input_fix_len; i < ds_list_size(inputs); i += data_length) { var key = getInputData(i + 0); var val = getInputData(i + 1); var frm = inputs[| i + 1].value_from; @@ -85,9 +148,11 @@ function Node_Struct(_x, _y, _group = noone) : Node(_x, _y, _group) constructor draw_set_text(f_sdf, fa_left, fa_center, COLORS._main_text); - for(var i = input_fix_len; i < ds_list_size(inputs) - data_length; i += data_length) { - var key = getInputData(i + 0); + for(var i = input_fix_len; i < ds_list_size(inputs); i += data_length) { + var key = getInputData(i + 0, ""); var val = inputs[| i + 1]; + if(!val.visible) continue; + var _ss = min(_s * .4, string_scale(key, bbox.w - 12 * _s, 9999)); draw_set_color(value_color(val.type)); diff --git a/scripts/node_switch/node_switch.gml b/scripts/node_switch/node_switch.gml index 7ad1a72c3..ee5228ef0 100644 --- a/scripts/node_switch/node_switch.gml +++ b/scripts/node_switch/node_switch.gml @@ -10,55 +10,108 @@ function Node_Switch(_x, _y, _group = noone) : Node(_x, _y, _group) constructor inputs[| 1] = nodeValue("Default value", self, JUNCTION_CONNECT.input, VALUE_TYPE.any, 0 ) .setVisible(false, true); + size_adjust_tool = new Inspector_Custom_Renderer(function(_x, _y, _w, _m, _hover, _focus) { #region + var _h = ui(48); + + var bw = _w / 2 - ui(4); + var bh = ui(36); + if(buttonTextIconInstant(true, THEME.button_hide, _x, _y + ui(8), bw, bh, _m, _focus, _hover, "", THEME.add, __txt("Add"), COLORS._main_value_positive) == 2) + addInput(); + + var amo = attributes.size; + if(buttonTextIconInstant(attributes.size > 0, THEME.button_hide, _x + _w - bw, _y + ui(8), bw, bh, _m, _focus, _hover, "", THEME.minus, __txt("Remove"), COLORS._main_value_negative) == 2) + deleteInput(ds_list_size(inputs) - data_length); + + return _h; + }); #endregion + outputs[| 0] = nodeValue("Result", self, JUNCTION_CONNECT.output, VALUE_TYPE.any, 0); - input_display_list = [ 0, - ["Inputs", false], 1 + input_display_list = [ 0, 1, + ["Cases", false], size_adjust_tool ] - static createNewInput = function() { - var index = ds_list_size(inputs); - inputs[| index + 0] = nodeValue("Case", self, JUNCTION_CONNECT.input, VALUE_TYPE.text, "" ); + #region //////////////////////////////// Dynamic IO //////////////////////////////// - inputs[| index + 1] = nodeValue("value", self, JUNCTION_CONNECT.input, VALUE_TYPE.any, 0 ) - .setVisible(false, false); + static createNewInput = function(list = inputs) { + var index = ds_list_size(list); + var bDel = button(function() { node.deleteInput(index); }) + .setIcon(THEME.minus_16, 0, COLORS._main_icon); + + list[| index + 0] = nodeValue("Case", self, JUNCTION_CONNECT.input, VALUE_TYPE.text, "" ) + .setDisplay(VALUE_DISPLAY.text_box, { side_button : bDel }) + .setAnimable(false); + bDel.setContext(list[| index + 0]); + + list[| index + 1] = nodeValue("value", self, JUNCTION_CONNECT.input, VALUE_TYPE.any, 0 ) + .setVisible(false, false); + + return list[| index + 0]; + } - array_push(input_display_list, index + 0); - array_push(input_display_list, index + 1); + setDynamicInput(2, false); - return inputs[| index + 0]; - } setDynamicInput(2, false); - - if(!LOADING && !APPENDING) createNewInput(); - - static refreshDynamicInput = function() { #region - var _in = ds_list_create(); - - for( var i = 0; i < input_fix_len; i++ ) - ds_list_add(_in, inputs[| i]); - - array_resize(input_display_list, input_display_len); - - for( var i = input_fix_len; i < ds_list_size(inputs); i += data_length ) { - if(inputs[| i].getValue() != "") { - ds_list_add(_in, inputs[| i + 0]); - ds_list_add(_in, inputs[| i + 1]); - inputs[| i + 1].setVisible(false, true); + static addInput = function() { + var index = ds_list_size(inputs); + + attributes.size++; + createNewInput(); + + if(!UNDO_HOLDING) { + var _inputs = array_create(data_length); + for(var i = 0; i < data_length; i++) + _inputs[i] = inputs[| index + i]; - array_push(input_display_list, i + 0); - array_push(input_display_list, i + 1); + recordAction(ACTION_TYPE.custom, function(data, undo) { + if(undo) deleteInput(data.index); + else insertInput(data.index, data.inputs); + }, { index, inputs : _inputs }); } + + onInputResize(); } - for( var i = 0; i < ds_list_size(_in); i++ ) - _in[| i].index = i; + static deleteInput = function(index) { + if(!UNDO_HOLDING) { + var _inputs = array_create(data_length); + for(var i = 0; i < data_length; i++) + _inputs[i] = inputs[| index + i]; + + recordAction(ACTION_TYPE.custom, function(data, undo) { + if(undo) insertInput(data.index, data.inputs); + else deleteInput(data.index); + }, { index, inputs : _inputs }); + } + + attributes.size--; + for(var i = data_length - 1; i >= 0; i--) + ds_list_delete(inputs, index + i); + + onInputResize(); + } - ds_list_destroy(inputs); - inputs = _in; + static insertInput = function(index, _inputs) { + attributes.size++; + + for(var i = 0; i < data_length; i++) + ds_list_insert(inputs, index + i, _inputs[i]); + + onInputResize(); + } - createNewInput(); - } #endregion + static refreshDynamicInput = function() { + input_display_list = array_clone(input_display_list_raw); + + for( var i = input_fix_len; i < ds_list_size(inputs); i++ ) { + inputs[| i].index = i; + array_push(input_display_list, i); + } + + getJunctionList(); + } + #endregion //////////////////////////////// Dynamic IO //////////////////////////////// + static onValueFromUpdate = function(index) { #region if(LOADING || APPENDING) return; if(index < 0) return; @@ -76,8 +129,10 @@ function Node_Switch(_x, _y, _group = noone) : Node(_x, _y, _group) constructor if(index < input_fix_len) return; if(LOADING || APPENDING) return; - if(safe_mod(index - input_fix_len, data_length) == 0) //Variable name + if(safe_mod(index - input_fix_len, data_length) == 0) { + inputs[| index + 1].setVisible(false, true); inputs[| index + 1].name = $"{getInputData(index)} value"; + } refreshDynamicInput(); } #endregion @@ -97,7 +152,7 @@ function Node_Switch(_x, _y, _group = noone) : Node(_x, _y, _group) constructor outputs[| 0].setType(inputs[| 1].value_from? inputs[| 1].value_from.type : VALUE_TYPE.any); - for( var i = input_fix_len; i < ds_list_size(inputs) - data_length; i += data_length ) { + for( var i = input_fix_len; i < ds_list_size(inputs); i += data_length ) { var _cas = getInputData(i + 0); var _val = getInputData(i + 1); @@ -116,7 +171,7 @@ function Node_Switch(_x, _y, _group = noone) : Node(_x, _y, _group) constructor var sele = getInputData(0); var _res = getInputData(1); - for( var i = input_fix_len; i < ds_list_size(inputs) - data_length; i += data_length ) { + for( var i = input_fix_len; i < ds_list_size(inputs); i += data_length ) { var _cas = getInputData(i + 0); if(sele == _cas) frm = inputs[| i + 1]; } @@ -139,10 +194,12 @@ function Node_Switch(_x, _y, _group = noone) : Node(_x, _y, _group) constructor draw_text_transformed(bbox.x0 + 8 * _s, inputs[| 1].y, str, ss, ss, 0); } - for( var i = input_fix_len; i < ds_list_size(inputs) - data_length; i += data_length ) { + for( var i = input_fix_len; i < ds_list_size(inputs); i += data_length ) { if(!inputs[| i + 1].visible) continue; - var str = string(getInputData(i)); + var str = string(getInputData(i, "")); + if(str == "") continue; + var ss = min(_s * 0.4, string_scale(str, bbox.w - 16 * _s, 999)); draw_set_color(value_color(inputs[| i + 1].type)); draw_text_transformed(bbox.x0 + 8 * _s, inputs[| i + 1].y, str, ss, ss, 0); diff --git a/scripts/node_value/node_value.gml b/scripts/node_value/node_value.gml index 52548d294..24ce48379 100644 --- a/scripts/node_value/node_value.gml +++ b/scripts/node_value/node_value.gml @@ -1,438 +1,3 @@ -#region ---- global names ---- - global.junctionEndName = [ "Hold", "Loop", "Ping pong", "Wrap" ]; - - global.displaySuffix_Range = [ "min", "max" ]; - global.displaySuffix_Area = [ "x", "y", "w", "h", "shape" ]; - global.displaySuffix_Padding = [ "right", "top", "left", "bottom" ]; - global.displaySuffix_VecRange = [ "x min", "x max", "y min", "y max" ]; - global.displaySuffix_Axis = [ "x", "y", "z", "w" ]; -#endregion - -enum JUNCTION_CONNECT { - input, - output -} - -enum VALUE_TYPE { - integer = 0, - float = 1, - boolean = 2, - color = 3, - surface = 4, - - path = 5, - curve = 6, - text = 7, - object = 8, - node = 9, - d3object = 10, - - any = 11, - - pathnode = 12, - particle = 13, - rigid = 14, - sdomain = 15, - struct = 16, - strands = 17, - mesh = 18, - trigger = 19, - atlas = 20, - - d3vertex = 21, - gradient = 22, - armature = 23, - buffer = 24, - - pbBox = 25, - - d3Mesh = 26, - d3Light = 27, - d3Camera = 28, - d3Scene = 29, - d3Material = 30, - - dynaSurface = 31, - PCXnode = 32, - - audioBit = 33, - - fdomain = 34, - - action = 99, -} - -enum VALUE_DISPLAY { - _default, - none, - range, - - //Int - enum_scroll, - enum_button, - rotation, - rotation_range, - rotation_random, - slider, - slider_range, - - //Color - palette, - - //Int array - padding, - vector, - vector_range, - area, - transform, - corner, - toggle, - matrix, - path_anchor, - gradient_range, - boolean_grid, - - //Curve - curve, - - //Misc - puppet_control, - button, - label, - - //Array - path_array, - - //Text - codeLUA, - codeHLSL, - text_array, - text_box, - text_tunnel, - - //path - path_save, - path_load, - path_font, - - //d3d - d3vertex, - d3quarternion, -} - -enum KEYFRAME_END { - hold, - loop, - ping, - wrap, -} - -enum VALIDATION { - pass, - warning, - error -} - -enum VALUE_UNIT { - constant, - reference -} - -enum VALUE_TAG { - updateInTrigger = -2, - updateOutTrigger = -3, - none = 0 -} - -enum LINE_STYLE { - solid, - dashed -} - -function value_color(i) { #region - static JUNCTION_COLORS = [ - #ff9166, //int - #ffe478, //float - #8c3f5d, //bool - #8fde5d, //color - #ff6b97, //surface - #eb004b, //path - #c2c2d1, //curve - #66ffe3, //text - #ffb5b5, //object - #4da6ff, //node - #c1007c, //3D - #808080, //any - #ffb5b5, //path - #8fde5d, //particle - #88ffe9, //rigid - #6d6e71, //sdomain - #8c3f5d, //struct - #ff9166, //strand - #c2c2d1, //mesh - #8fde5d, //trigger - #ff6b97, //atlas - #c1007c, //d3vertex - #8fde5d, //gradient - #ff9166, //armature - #808080, //buffer - #ff6b97, //pbBox - #4da6ff, //d3Mesh - #4da6ff, //d3Light - #4da6ff, //d3Camera - #4da6ff, //d3Scene - #ff6b97, //d3Material - #ff6b97, //dynaSurf - #c2c2d1, //PCX - #8fde5d, //audiobit - #4da6ff, //flipfluid - ]; - static JUNCTION_COLORS_LENGTH = array_length(JUNCTION_COLORS); - - if(i == 99) return #8fde5d; - - return JUNCTION_COLORS[i]; -} #endregion - -function value_color_bg(i) { #region - return #3b3b4e; -} #endregion - -function value_color_bg_array(i) { #region - static JUNCTION_COLORS = [ - #e36956, //int - #ff9166, //float - #5e315b, //bool - #3ca370, //color - #bd4882, //surface - #bb003c, //path - #83839b, //curve - #4da6ff, //text - #e28989, //object - #4b5bab, //node - #64003f, //3D - #4d4d4d, //any - #e28989, //path - #3ca370, //particle - #4da6ff, //rigid - #4b5bab, //sdomain - #5e315b, //struct - #e36956, //strand - #83839b, //mesh - #3ca370, //trigger - #9e2a69, //atlas - #64003f, //d3vertex - #3ca370, //gradient - #e36956, //armature - #4d4d4d, //buffer - #bd4882, //pbBox - #4b5bab, //d3Mesh - #4b5bab, //d3Light - #4b5bab, //d3Camera - #4b5bab, //d3Scene - #bd4882, //d3Material - #bd4882, //dynaSurf - #83839b, //PCX - #3ca370, //audiobit - ]; - - if(i == 99) return $5dde8f; - return JUNCTION_COLORS[safe_mod(max(0, i), array_length(JUNCTION_COLORS))]; -} #endregion - -function value_bit(i) { #region - switch(i) { - case VALUE_TYPE.integer : return 1 << 0 | 1 << 1; - case VALUE_TYPE.float : return 1 << 2 | 1 << 1; - case VALUE_TYPE.boolean : return 1 << 3 | 1 << 1; - case VALUE_TYPE.color : return 1 << 4; - case VALUE_TYPE.gradient : return 1 << 25; - case VALUE_TYPE.dynaSurface : - case VALUE_TYPE.surface : return 1 << 5 | 1 << 23; - case VALUE_TYPE.path : return 1 << 10; - case VALUE_TYPE.text : return 1 << 10; - case VALUE_TYPE.object : return 1 << 13; - case VALUE_TYPE.d3object : return 1 << 14; - case VALUE_TYPE.d3vertex : return 1 << 24; - - case VALUE_TYPE.pathnode : return 1 << 15; - case VALUE_TYPE.particle : return 1 << 16; - case VALUE_TYPE.rigid : return 1 << 17; - case VALUE_TYPE.sdomain : return 1 << 18; - case VALUE_TYPE.struct : return 1 << 19; - case VALUE_TYPE.strands : return 1 << 20; - case VALUE_TYPE.mesh : return 1 << 21; - case VALUE_TYPE.armature : return 1 << 26 | 1 << 19; - - case VALUE_TYPE.node : return 1 << 32; - - case VALUE_TYPE.buffer : return 1 << 27; - - case VALUE_TYPE.pbBox : return 1 << 28; - - case VALUE_TYPE.trigger : return 1 << 22; - case VALUE_TYPE.action : return 1 << 22 | 1 << 3; - - case VALUE_TYPE.d3Mesh : return 1 << 29; - case VALUE_TYPE.d3Light : return 1 << 29; - case VALUE_TYPE.d3Camera : return 1 << 29; - case VALUE_TYPE.d3Scene : return 1 << 29 | 1 << 30; - case VALUE_TYPE.d3Material : return 1 << 33; - - case VALUE_TYPE.PCXnode : return 1 << 34; - case VALUE_TYPE.audioBit : return 1 << 35; - case VALUE_TYPE.fdomain : return 1 << 36; - - case VALUE_TYPE.any : return ~0 & ~(1 << 32); - } - return 0; -} #endregion - -function value_type_directional(f, t) { #region - if(f == VALUE_TYPE.surface && t == VALUE_TYPE.integer) return true; - if(f == VALUE_TYPE.surface && t == VALUE_TYPE.float) return true; - - if(f == VALUE_TYPE.integer && t == VALUE_TYPE.text) return true; - if(f == VALUE_TYPE.float && t == VALUE_TYPE.text) return true; - if(f == VALUE_TYPE.boolean && t == VALUE_TYPE.text) return true; - - if(f == VALUE_TYPE.integer && t == VALUE_TYPE.color) return true; - if(f == VALUE_TYPE.float && t == VALUE_TYPE.color) return true; - if(f == VALUE_TYPE.color && t == VALUE_TYPE.integer) return true; - if(f == VALUE_TYPE.color && t == VALUE_TYPE.float ) return true; - if(f == VALUE_TYPE.color && t == VALUE_TYPE.gradient) return true; - - if(f == VALUE_TYPE.strands && t == VALUE_TYPE.pathnode ) return true; - - if(f == VALUE_TYPE.color && t == VALUE_TYPE.struct ) return true; - if(f == VALUE_TYPE.mesh && t == VALUE_TYPE.struct ) return true; - if(f == VALUE_TYPE.particle && t == VALUE_TYPE.struct ) return true; - - if(f == VALUE_TYPE.surface && t == VALUE_TYPE.d3Material ) return true; - - return false; -} #endregion - -function value_type_from_string(str) { #region - switch(str) { - case "integer" : return VALUE_TYPE.integer; - case "float" : return VALUE_TYPE.float; - case "boolean" : return VALUE_TYPE.boolean; - case "color" : return VALUE_TYPE.color; - case "surface" : return VALUE_TYPE.surface; - - case "path" : return VALUE_TYPE.path; - case "curve" : return VALUE_TYPE.curve; - case "text" : return VALUE_TYPE.text; - case "object" : return VALUE_TYPE.object; - case "node" : return VALUE_TYPE.node; - case "d3object" : return VALUE_TYPE.d3object; - - case "any" : return VALUE_TYPE.any; - - case "pathnode" : return VALUE_TYPE.pathnode; - case "particle" : return VALUE_TYPE.particle; - case "rigid" : return VALUE_TYPE.rigid; - case "sdomain" : return VALUE_TYPE.sdomain; - case "struct" : return VALUE_TYPE.struct; - case "strands" : return VALUE_TYPE.strands; - case "mesh" : return VALUE_TYPE.mesh; - case "trigger" : return VALUE_TYPE.trigger; - case "atlas" : return VALUE_TYPE.atlas; - - case "d3vertex" : return VALUE_TYPE.d3vertex; - case "gradient" : return VALUE_TYPE.gradient; - case "armature" : return VALUE_TYPE.armature; - case "buffer" : return VALUE_TYPE.buffer; - - case "pbBox" : return VALUE_TYPE.pbBox; - - case "d3Mesh" : return VALUE_TYPE.d3Mesh; - case "d3Light" : return VALUE_TYPE.d3Light; - case "d3Camera" : return VALUE_TYPE.d3Camera; - case "d3Scene" : return VALUE_TYPE.d3Scene; - case "d3Material" : return VALUE_TYPE.d3Material; - - case "dynaSurface" : return VALUE_TYPE.dynaSurface; - case "PCXnode" : return VALUE_TYPE.PCXnode; - - case "audioBit" : return VALUE_TYPE.audioBit; - - case "fDomain" : return VALUE_TYPE.fdomain; - - case "action" : return VALUE_TYPE.action; - } - - return VALUE_TYPE.any; -} #endregion - -function typeArray(_type) { #region - switch(_type) { - case VALUE_DISPLAY.range : - case VALUE_DISPLAY.vector_range : - case VALUE_DISPLAY.rotation_range : - case VALUE_DISPLAY.rotation_random : - case VALUE_DISPLAY.slider_range : - case VALUE_DISPLAY.path_anchor : - case VALUE_DISPLAY.gradient_range : - - case VALUE_DISPLAY.vector : - case VALUE_DISPLAY.padding : - case VALUE_DISPLAY.area : - case VALUE_DISPLAY.puppet_control : - case VALUE_DISPLAY.matrix : - case VALUE_DISPLAY.transform : - case VALUE_DISPLAY.boolean_grid : - - case VALUE_DISPLAY.curve : - - case VALUE_DISPLAY.path_array : - case VALUE_DISPLAY.palette : - case VALUE_DISPLAY.text_array : - - case VALUE_DISPLAY.d3vertex : - case VALUE_DISPLAY.d3quarternion : - return 1; - } - return 0; -} #endregion - -function typeCompatible(fromType, toType, directional_cast = true) { #region - if(value_bit(fromType) & value_bit(toType) != 0) - return true; - if(!directional_cast) - return false; - return value_type_directional(fromType, toType); -} #endregion - -function typeIncompatible(from, to) { #region - if(from.type == VALUE_TYPE.surface && (to.type == VALUE_TYPE.integer || to.type == VALUE_TYPE.float)) { - switch(to.display_type) { - case VALUE_DISPLAY.area : - case VALUE_DISPLAY.matrix : - case VALUE_DISPLAY.vector_range : - case VALUE_DISPLAY.puppet_control : - case VALUE_DISPLAY.padding : - case VALUE_DISPLAY.curve : - return true; - } - } - - return false; -} #endregion - -function isGraphable(prop) { #region - if(prop.type == VALUE_TYPE.integer || prop.type == VALUE_TYPE.float) { - if(prop.display_type == VALUE_DISPLAY.puppet_control) - return false; - return true; - } - if(prop.type == VALUE_TYPE.color && prop.display_type == VALUE_DISPLAY._default) - return true; - - return false; -} #endregion - function nodeValueUnit(_nodeValue) constructor { #region self._nodeValue = _nodeValue; @@ -630,6 +195,7 @@ function NodeValue(_name, _node, _connect, _type, _value, _tooltip = "") constru cache_value = [ false, false, undefined, undefined ]; cache_array = [ false, false ]; use_cache = true; + record_value = true; process_array = true; dynamic_array = false; @@ -919,7 +485,6 @@ function NodeValue(_name, _node, _connect, _type, _value, _tooltip = "") constru if(struct_has(display_data, "slide_speed")) editWidget.setSlidable(display_data.slide_speed); if(struct_has(display_data, "unit")) editWidget.unit = display_data.unit; - if(struct_has(display_data, "side_button")) editWidget.side_button = display_data.side_button; if(struct_has(display_data, "front_button")) editWidget.front_button = display_data.front_button; extract_node = "Node_Number"; @@ -949,7 +514,6 @@ function NodeValue(_name, _node, _connect, _type, _value, _tooltip = "") constru if(struct_has(display_data, "linkable")) editWidget.linkable = display_data.linkable; if(struct_has(display_data, "per_line")) editWidget.per_line = display_data.per_line; if(struct_has(display_data, "linked")) editWidget.linked = display_data.linked; - if(struct_has(display_data, "side_button")) editWidget.side_button = display_data.side_button; if(type == VALUE_TYPE.integer) editWidget.setSlideSpeed(1 / 10); @@ -1338,6 +902,9 @@ function NodeValue(_name, _node, _connect, _type, _value, _tooltip = "") constru break; #endregion } + if(struct_has(display_data, "side_button") && editWidget.side_button == noone) + editWidget.side_button = display_data.side_button; + editWidgetRaw = editWidget; if(editWidget) graphWidget = editWidget.clone(); @@ -1636,7 +1203,7 @@ function NodeValue(_name, _node, _connect, _type, _value, _tooltip = "") constru static getStaticValue = function() { INLINE return ds_list_empty(animator.values)? 0 : animator.values[| 0].value; } - static getValue = function(_time = CURRENT_FRAME, applyUnit = true, arrIndex = 0, useCache = false, log = false) { #region //Get value + static getValue = function(_time = CURRENT_FRAME, applyUnit = true, arrIndex = 0, useCache = false, log = false) { #region ////Get value if(type == VALUE_TYPE.trigger) return _getValue(_time, false, 0, false); @@ -1991,7 +1558,7 @@ function NodeValue(_name, _node, _connect, _type, _value, _tooltip = "") constru return array_length(ar); } #endregion - static setValue = function(val = 0, record = true, time = CURRENT_FRAME, _update = true) { #region //Set value + static setValue = function(val = 0, record = true, time = CURRENT_FRAME, _update = true) { #region ////Set value val = unit.invApply(val); return setValueDirect(val, noone, record, time, _update); } #endregion @@ -2035,6 +1602,8 @@ function NodeValue(_name, _node, _connect, _type, _value, _tooltip = "") constru var _val = val; var _inp = connect_type == JUNCTION_CONNECT.input; + record &= record_value; + if(sep_axis) { if(index == noone) { for( var i = 0, n = array_length(animators); i < n; i++ ) diff --git a/scripts/node_value_base/node_value_base.gml b/scripts/node_value_base/node_value_base.gml new file mode 100644 index 000000000..f0c7f3718 --- /dev/null +++ b/scripts/node_value_base/node_value_base.gml @@ -0,0 +1,3 @@ +function NodeValueBase(_name, _node, _connect, _type, _value, _tooltip = "") constructor { + +} \ No newline at end of file diff --git a/scripts/node_value_base/node_value_base.yy b/scripts/node_value_base/node_value_base.yy new file mode 100644 index 000000000..7561a7a1d --- /dev/null +++ b/scripts/node_value_base/node_value_base.yy @@ -0,0 +1,13 @@ +{ + "$GMScript":"", + "%Name":"node_value_base", + "isCompatibility":false, + "isDnD":false, + "name":"node_value_base", + "parent":{ + "name":"__base__", + "path":"folders/nodes/data/__base__.yy", + }, + "resourceType":"GMScript", + "resourceVersion":"2.0", +} \ No newline at end of file diff --git a/scripts/node_value_types/node_value_types.gml b/scripts/node_value_types/node_value_types.gml new file mode 100644 index 000000000..b4bb42ec5 --- /dev/null +++ b/scripts/node_value_types/node_value_types.gml @@ -0,0 +1,434 @@ +#region ---- global names ---- + global.junctionEndName = [ "Hold", "Loop", "Ping pong", "Wrap" ]; + + global.displaySuffix_Range = [ "min", "max" ]; + global.displaySuffix_Area = [ "x", "y", "w", "h", "shape" ]; + global.displaySuffix_Padding = [ "right", "top", "left", "bottom" ]; + global.displaySuffix_VecRange = [ "x min", "x max", "y min", "y max" ]; + global.displaySuffix_Axis = [ "x", "y", "z", "w" ]; +#endregion + +enum JUNCTION_CONNECT { + input, + output +} + +enum VALUE_TYPE { + integer = 0, + float = 1, + boolean = 2, + color = 3, + surface = 4, + + path = 5, + curve = 6, + text = 7, + object = 8, + node = 9, + d3object = 10, + + any = 11, + + pathnode = 12, + particle = 13, + rigid = 14, + sdomain = 15, + struct = 16, + strands = 17, + mesh = 18, + trigger = 19, + atlas = 20, + + d3vertex = 21, + gradient = 22, + armature = 23, + buffer = 24, + + pbBox = 25, + + d3Mesh = 26, + d3Light = 27, + d3Camera = 28, + d3Scene = 29, + d3Material = 30, + + dynaSurface = 31, + PCXnode = 32, + + audioBit = 33, + + fdomain = 34, + + action = 99, +} + +enum VALUE_DISPLAY { + _default, + none, + range, + + //Int + enum_scroll, + enum_button, + rotation, + rotation_range, + rotation_random, + slider, + slider_range, + + //Color + palette, + + //Int array + padding, + vector, + vector_range, + area, + transform, + corner, + toggle, + matrix, + path_anchor, + gradient_range, + boolean_grid, + + //Curve + curve, + + //Misc + puppet_control, + button, + label, + + //Array + path_array, + + //Text + codeLUA, + codeHLSL, + text_array, + text_box, + text_tunnel, + + //path + path_save, + path_load, + path_font, + + //d3d + d3vertex, + d3quarternion, +} + +enum KEYFRAME_END { + hold, + loop, + ping, + wrap, +} + +enum VALIDATION { + pass, + warning, + error +} + +enum VALUE_UNIT { + constant, + reference +} + +enum VALUE_TAG { + updateInTrigger = -2, + updateOutTrigger = -3, + none = 0 +} + +enum LINE_STYLE { + solid, + dashed +} + +function value_color(i) { #region + static JUNCTION_COLORS = [ + #ff9166, //int + #ffe478, //float + #8c3f5d, //bool + #8fde5d, //color + #ff6b97, //surface + #eb004b, //path + #c2c2d1, //curve + #66ffe3, //text + #ffb5b5, //object + #4da6ff, //node + #c1007c, //3D + #808080, //any + #ffb5b5, //path + #8fde5d, //particle + #88ffe9, //rigid + #6d6e71, //sdomain + #8c3f5d, //struct + #ff9166, //strand + #c2c2d1, //mesh + #8fde5d, //trigger + #ff6b97, //atlas + #c1007c, //d3vertex + #8fde5d, //gradient + #ff9166, //armature + #808080, //buffer + #ff6b97, //pbBox + #4da6ff, //d3Mesh + #4da6ff, //d3Light + #4da6ff, //d3Camera + #4da6ff, //d3Scene + #ff6b97, //d3Material + #ff6b97, //dynaSurf + #c2c2d1, //PCX + #8fde5d, //audiobit + #4da6ff, //flipfluid + ]; + static JUNCTION_COLORS_LENGTH = array_length(JUNCTION_COLORS); + + if(i == 99) return #8fde5d; + + return JUNCTION_COLORS[i]; +} #endregion + +function value_color_bg(i) { #region + return #3b3b4e; +} #endregion + +function value_color_bg_array(i) { #region + static JUNCTION_COLORS = [ + #e36956, //int + #ff9166, //float + #5e315b, //bool + #3ca370, //color + #bd4882, //surface + #bb003c, //path + #83839b, //curve + #4da6ff, //text + #e28989, //object + #4b5bab, //node + #64003f, //3D + #4d4d4d, //any + #e28989, //path + #3ca370, //particle + #4da6ff, //rigid + #4b5bab, //sdomain + #5e315b, //struct + #e36956, //strand + #83839b, //mesh + #3ca370, //trigger + #9e2a69, //atlas + #64003f, //d3vertex + #3ca370, //gradient + #e36956, //armature + #4d4d4d, //buffer + #bd4882, //pbBox + #4b5bab, //d3Mesh + #4b5bab, //d3Light + #4b5bab, //d3Camera + #4b5bab, //d3Scene + #bd4882, //d3Material + #bd4882, //dynaSurf + #83839b, //PCX + #3ca370, //audiobit + ]; + + if(i == 99) return $5dde8f; + return JUNCTION_COLORS[safe_mod(max(0, i), array_length(JUNCTION_COLORS))]; +} #endregion + +function value_bit(i) { #region + switch(i) { + case VALUE_TYPE.integer : return 1 << 0 | 1 << 1; + case VALUE_TYPE.float : return 1 << 2 | 1 << 1; + case VALUE_TYPE.boolean : return 1 << 3 | 1 << 1; + case VALUE_TYPE.color : return 1 << 4; + case VALUE_TYPE.gradient : return 1 << 25; + case VALUE_TYPE.dynaSurface : + case VALUE_TYPE.surface : return 1 << 5 | 1 << 23; + case VALUE_TYPE.path : return 1 << 10; + case VALUE_TYPE.text : return 1 << 10; + case VALUE_TYPE.object : return 1 << 13; + case VALUE_TYPE.d3object : return 1 << 14; + case VALUE_TYPE.d3vertex : return 1 << 24; + + case VALUE_TYPE.pathnode : return 1 << 15; + case VALUE_TYPE.particle : return 1 << 16; + case VALUE_TYPE.rigid : return 1 << 17; + case VALUE_TYPE.sdomain : return 1 << 18; + case VALUE_TYPE.struct : return 1 << 19; + case VALUE_TYPE.strands : return 1 << 20; + case VALUE_TYPE.mesh : return 1 << 21; + case VALUE_TYPE.armature : return 1 << 26 | 1 << 19; + + case VALUE_TYPE.node : return 1 << 32; + + case VALUE_TYPE.buffer : return 1 << 27; + + case VALUE_TYPE.pbBox : return 1 << 28; + + case VALUE_TYPE.trigger : return 1 << 22; + case VALUE_TYPE.action : return 1 << 22 | 1 << 3; + + case VALUE_TYPE.d3Mesh : return 1 << 29; + case VALUE_TYPE.d3Light : return 1 << 29; + case VALUE_TYPE.d3Camera : return 1 << 29; + case VALUE_TYPE.d3Scene : return 1 << 29 | 1 << 30; + case VALUE_TYPE.d3Material : return 1 << 33; + + case VALUE_TYPE.PCXnode : return 1 << 34; + case VALUE_TYPE.audioBit : return 1 << 35; + case VALUE_TYPE.fdomain : return 1 << 36; + + case VALUE_TYPE.any : return ~0 & ~(1 << 32); + } + return 0; +} #endregion + +function value_type_directional(f, t) { #region + if(f == VALUE_TYPE.surface && t == VALUE_TYPE.integer) return true; + if(f == VALUE_TYPE.surface && t == VALUE_TYPE.float) return true; + + if(f == VALUE_TYPE.integer && t == VALUE_TYPE.text) return true; + if(f == VALUE_TYPE.float && t == VALUE_TYPE.text) return true; + if(f == VALUE_TYPE.boolean && t == VALUE_TYPE.text) return true; + + if(f == VALUE_TYPE.integer && t == VALUE_TYPE.color) return true; + if(f == VALUE_TYPE.float && t == VALUE_TYPE.color) return true; + if(f == VALUE_TYPE.color && t == VALUE_TYPE.integer) return true; + if(f == VALUE_TYPE.color && t == VALUE_TYPE.float ) return true; + if(f == VALUE_TYPE.color && t == VALUE_TYPE.gradient) return true; + + if(f == VALUE_TYPE.strands && t == VALUE_TYPE.pathnode ) return true; + + if(f == VALUE_TYPE.color && t == VALUE_TYPE.struct ) return true; + if(f == VALUE_TYPE.mesh && t == VALUE_TYPE.struct ) return true; + if(f == VALUE_TYPE.particle && t == VALUE_TYPE.struct ) return true; + + if(f == VALUE_TYPE.surface && t == VALUE_TYPE.d3Material ) return true; + + return false; +} #endregion + +function value_type_from_string(str) { #region + switch(str) { + case "integer" : return VALUE_TYPE.integer; + case "float" : return VALUE_TYPE.float; + case "boolean" : return VALUE_TYPE.boolean; + case "color" : return VALUE_TYPE.color; + case "surface" : return VALUE_TYPE.surface; + + case "path" : return VALUE_TYPE.path; + case "curve" : return VALUE_TYPE.curve; + case "text" : return VALUE_TYPE.text; + case "object" : return VALUE_TYPE.object; + case "node" : return VALUE_TYPE.node; + case "d3object" : return VALUE_TYPE.d3object; + + case "any" : return VALUE_TYPE.any; + + case "pathnode" : return VALUE_TYPE.pathnode; + case "particle" : return VALUE_TYPE.particle; + case "rigid" : return VALUE_TYPE.rigid; + case "sdomain" : return VALUE_TYPE.sdomain; + case "struct" : return VALUE_TYPE.struct; + case "strands" : return VALUE_TYPE.strands; + case "mesh" : return VALUE_TYPE.mesh; + case "trigger" : return VALUE_TYPE.trigger; + case "atlas" : return VALUE_TYPE.atlas; + + case "d3vertex" : return VALUE_TYPE.d3vertex; + case "gradient" : return VALUE_TYPE.gradient; + case "armature" : return VALUE_TYPE.armature; + case "buffer" : return VALUE_TYPE.buffer; + + case "pbBox" : return VALUE_TYPE.pbBox; + + case "d3Mesh" : return VALUE_TYPE.d3Mesh; + case "d3Light" : return VALUE_TYPE.d3Light; + case "d3Camera" : return VALUE_TYPE.d3Camera; + case "d3Scene" : return VALUE_TYPE.d3Scene; + case "d3Material" : return VALUE_TYPE.d3Material; + + case "dynaSurface" : return VALUE_TYPE.dynaSurface; + case "PCXnode" : return VALUE_TYPE.PCXnode; + + case "audioBit" : return VALUE_TYPE.audioBit; + + case "fDomain" : return VALUE_TYPE.fdomain; + + case "action" : return VALUE_TYPE.action; + } + + return VALUE_TYPE.any; +} #endregion + +function typeArray(_type) { #region + switch(_type) { + case VALUE_DISPLAY.range : + case VALUE_DISPLAY.vector_range : + case VALUE_DISPLAY.rotation_range : + case VALUE_DISPLAY.rotation_random : + case VALUE_DISPLAY.slider_range : + case VALUE_DISPLAY.path_anchor : + case VALUE_DISPLAY.gradient_range : + + case VALUE_DISPLAY.vector : + case VALUE_DISPLAY.padding : + case VALUE_DISPLAY.area : + case VALUE_DISPLAY.puppet_control : + case VALUE_DISPLAY.matrix : + case VALUE_DISPLAY.transform : + case VALUE_DISPLAY.boolean_grid : + + case VALUE_DISPLAY.curve : + + case VALUE_DISPLAY.path_array : + case VALUE_DISPLAY.palette : + case VALUE_DISPLAY.text_array : + + case VALUE_DISPLAY.d3vertex : + case VALUE_DISPLAY.d3quarternion : + return 1; + } + return 0; +} #endregion + +function typeCompatible(fromType, toType, directional_cast = true) { #region + if(value_bit(fromType) & value_bit(toType) != 0) + return true; + if(!directional_cast) + return false; + return value_type_directional(fromType, toType); +} #endregion + +function typeIncompatible(from, to) { #region + if(from.type == VALUE_TYPE.surface && (to.type == VALUE_TYPE.integer || to.type == VALUE_TYPE.float)) { + switch(to.display_type) { + case VALUE_DISPLAY.area : + case VALUE_DISPLAY.matrix : + case VALUE_DISPLAY.vector_range : + case VALUE_DISPLAY.puppet_control : + case VALUE_DISPLAY.padding : + case VALUE_DISPLAY.curve : + return true; + } + } + + return false; +} #endregion + +function isGraphable(prop) { #region + if(prop.type == VALUE_TYPE.integer || prop.type == VALUE_TYPE.float) { + if(prop.display_type == VALUE_DISPLAY.puppet_control) + return false; + return true; + } + if(prop.type == VALUE_TYPE.color && prop.display_type == VALUE_DISPLAY._default) + return true; + + return false; +} #endregion \ No newline at end of file diff --git a/scripts/node_value_types/node_value_types.yy b/scripts/node_value_types/node_value_types.yy new file mode 100644 index 000000000..5ab05cc5e --- /dev/null +++ b/scripts/node_value_types/node_value_types.yy @@ -0,0 +1,13 @@ +{ + "$GMScript":"", + "%Name":"node_value_types", + "isCompatibility":false, + "isDnD":false, + "name":"node_value_types", + "parent":{ + "name":"__base__", + "path":"folders/nodes/data/__base__.yy", + }, + "resourceType":"GMScript", + "resourceVersion":"2.0", +} \ No newline at end of file