diff --git a/PixelComposer.resource_order b/PixelComposer.resource_order index 92e2ad620..cb00074da 100644 --- a/PixelComposer.resource_order +++ b/PixelComposer.resource_order @@ -733,6 +733,7 @@ {"name":"node_array_copy","order":14,"path":"scripts/node_array_copy/node_array_copy.yy",}, {"name":"node_array_csv_parse","order":15,"path":"scripts/node_array_csv_parse/node_array_csv_parse.yy",}, {"name":"node_array_find","order":1,"path":"scripts/node_array_find/node_array_find.yy",}, + {"name":"node_array_flattern","order":24,"path":"scripts/node_array_flattern/node_array_flattern.yy",}, {"name":"node_array_get","order":7,"path":"scripts/node_array_get/node_array_get.yy",}, {"name":"node_array_length","order":8,"path":"scripts/node_array_length/node_array_length.yy",}, {"name":"node_array_pin","order":22,"path":"scripts/node_array_pin/node_array_pin.yy",}, @@ -1955,6 +1956,7 @@ {"name":"s_node_array_copy","order":4,"path":"sprites/s_node_array_copy/s_node_array_copy.yy",}, {"name":"s_node_array_csv_parse","order":19,"path":"sprites/s_node_array_csv_parse/s_node_array_csv_parse.yy",}, {"name":"s_node_array_find","order":5,"path":"sprites/s_node_array_find/s_node_array_find.yy",}, + {"name":"s_node_array_flattern","order":24,"path":"sprites/s_node_array_flattern/s_node_array_flattern.yy",}, {"name":"s_node_array_get","order":6,"path":"sprites/s_node_array_get/s_node_array_get.yy",}, {"name":"s_node_array_insert","order":7,"path":"sprites/s_node_array_insert/s_node_array_insert.yy",}, {"name":"s_node_array_length","order":8,"path":"sprites/s_node_array_length/s_node_array_length.yy",}, diff --git a/PixelComposer.yyp b/PixelComposer.yyp index c9066b591..d2b3f7b1f 100644 --- a/PixelComposer.yyp +++ b/PixelComposer.yyp @@ -1903,6 +1903,7 @@ {"id":{"name":"node_array_copy","path":"scripts/node_array_copy/node_array_copy.yy",},}, {"id":{"name":"node_array_csv_parse","path":"scripts/node_array_csv_parse/node_array_csv_parse.yy",},}, {"id":{"name":"node_array_find","path":"scripts/node_array_find/node_array_find.yy",},}, + {"id":{"name":"node_array_flattern","path":"scripts/node_array_flattern/node_array_flattern.yy",},}, {"id":{"name":"node_array_get","path":"scripts/node_array_get/node_array_get.yy",},}, {"id":{"name":"node_array_insert","path":"scripts/node_array_insert/node_array_insert.yy",},}, {"id":{"name":"node_array_length","path":"scripts/node_array_length/node_array_length.yy",},}, @@ -3291,6 +3292,7 @@ {"id":{"name":"s_node_array_copy","path":"sprites/s_node_array_copy/s_node_array_copy.yy",},}, {"id":{"name":"s_node_array_csv_parse","path":"sprites/s_node_array_csv_parse/s_node_array_csv_parse.yy",},}, {"id":{"name":"s_node_array_find","path":"sprites/s_node_array_find/s_node_array_find.yy",},}, + {"id":{"name":"s_node_array_flattern","path":"sprites/s_node_array_flattern/s_node_array_flattern.yy",},}, {"id":{"name":"s_node_array_get","path":"sprites/s_node_array_get/s_node_array_get.yy",},}, {"id":{"name":"s_node_array_insert","path":"sprites/s_node_array_insert/s_node_array_insert.yy",},}, {"id":{"name":"s_node_array_length","path":"sprites/s_node_array_length/s_node_array_length.yy",},}, diff --git a/datafiles/data/Nodes/Internal.zip b/datafiles/data/Nodes/Internal.zip index 0629f937d..6089c5b53 100644 Binary files a/datafiles/data/Nodes/Internal.zip and b/datafiles/data/Nodes/Internal.zip differ diff --git a/datafiles/data/Nodes/Internal/Values/Array/Node_Array_Flattern/info.json b/datafiles/data/Nodes/Internal/Values/Array/Node_Array_Flattern/info.json new file mode 100644 index 000000000..006eb8bbd --- /dev/null +++ b/datafiles/data/Nodes/Internal/Values/Array/Node_Array_Flattern/info.json @@ -0,0 +1,10 @@ +{ + "name":"Array Flattern", + "baseNode":"Node_Array_Flattern", + "tooltip":"Flattern higher dimension array into 1 dimension linear array.", + "spr":"s_node_array_flattern", + "io":[ + "float" + ], + "pxc_version":118090, +} \ No newline at end of file diff --git a/datafiles/data/Nodes/display_data.json b/datafiles/data/Nodes/display_data.json index 23ff2b7d2..1ff1310ce 100644 --- a/datafiles/data/Nodes/display_data.json +++ b/datafiles/data/Nodes/display_data.json @@ -754,6 +754,7 @@ "Node_Array_Shuffle", "Node_Array_Unique", "Node_Array_Boolean_Opr", + "Node_Array_Flattern", { "label": "/Group Operators" }, "Node_Array_Sort", "Node_Iterate_Each_Inline", diff --git a/objects/o_dialog_arrayBox/Create_0.gml b/objects/o_dialog_arrayBox/Create_0.gml index 4c2421be1..5ec6a345f 100644 --- a/objects/o_dialog_arrayBox/Create_0.gml +++ b/objects/o_dialog_arrayBox/Create_0.gml @@ -10,11 +10,11 @@ event_inherited(); font = f_p1; arrayBox = noone; - - anchor = ANCHOR.top | ANCHOR.left; + mode = 0; + anchor = ANCHOR.top | ANCHOR.left; sc_content = new scrollPane(0, 0, function(_y, _m) { - draw_clear(COLORS.panel_bg_clear); + draw_clear(COLORS.panel_bg_clear, 1); var hght = line_get_height(font, 8); var _h = array_length(arrayBox.data) * hght; @@ -24,11 +24,17 @@ event_inherited(); for(var i = 0; i < array_length(arrayBox.data); i++) { var _ly = _y + i * hght; var yc = _ly + hght / 2; - var exists = false; + var exists = 0; - for( var j = 0; j < array_length(array); j++ ) { - if(arrayBox.data[i] == array[j]) - exists = true; + if(mode == 0) { + for( var j = 0; j < array_length(array); j++ ) + if(arrayBox.data[i] == array[j]) exists = 1; + + } else if(mode == 1) { + for( var j = 0; j < array_length(array); j++ ) { + if("+" + arrayBox.data[i] == array[j]) exists = 1; + if("-" + arrayBox.data[i] == array[j]) exists = -1; + } } var ind = 0; @@ -43,8 +49,22 @@ event_inherited(); ind = 1; if(sFOCUS && (mouse_press(mb_left) || keyboard_check_pressed(vk_enter))) { - if(exists) array_remove(array, arrayBox.data[i]); - else array_push(array, arrayBox.data[i]); + if(mode == 0) { + if(exists) array_remove(array, arrayBox.data[i]); + else array_push(array, arrayBox.data[i]); + + } else if(mode == 1) { + switch(exists) { + case 0 : array_push(array, "+" + arrayBox.data[i]); break; + + case 1 : + array_remove(array, "+" + arrayBox.data[i]); + array_push(array, "-" + arrayBox.data[i]); + break; + + case -1 : array_remove(array, "-" + arrayBox.data[i]); break; + } + } if(arrayBox.onModify) arrayBox.onModify(); } @@ -52,10 +72,17 @@ event_inherited(); var bs = hght - ui(8); draw_sprite_stretched(THEME.checkbox_def, ind, ui(20) - bs / 2, yc - bs / 2, bs, bs); - if(exists) draw_sprite_stretched_ext(THEME.checkbox_def, 2, ui(20) - bs / 2, yc - bs / 2, bs, bs, COLORS._main_accent, 1); + + if(mode == 0) { + if(exists) draw_sprite_stretched_ext(THEME.checkbox_def, 2, ui(20) - bs / 2, yc - bs / 2, bs, bs, COLORS._main_accent, 1); + + } else if(mode == 1) { + if(exists == 1) draw_sprite_ext(THEME.arrow, 1, ui(20), yc, 1, 1, 0, COLORS._main_value_positive, 1); + else if(exists == -1) draw_sprite_ext(THEME.arrow, 3, ui(20), yc + ui(2), 1, 1, 0, COLORS._main_value_negative, 1); + } draw_set_text(font, fa_left, fa_center, COLORS._main_text); - draw_text(ui(40), yc, arrayBox.data[i]); + draw_text_add(ui(40), yc, arrayBox.data[i]); } if(sFOCUS) { diff --git a/scripts/globals/globals.gml b/scripts/globals/globals.gml index e458a3460..68b6f6e4c 100644 --- a/scripts/globals/globals.gml +++ b/scripts/globals/globals.gml @@ -43,7 +43,7 @@ LATEST_VERSION = 1_18_00_0; VERSION = 1_18_08_0; SAVE_VERSION = 1_18_09_0; - VERSION_STRING = MAC? "1.18.003m" : "1.18.9.001"; + VERSION_STRING = MAC? "1.18.003m" : "1.18.9.002"; BUILD_NUMBER = 118080.002; PREF_VERSION = 1_17_1; diff --git a/scripts/node_array_csv_parse/node_array_csv_parse.gml b/scripts/node_array_csv_parse/node_array_csv_parse.gml index 91f82015d..5843b7967 100644 --- a/scripts/node_array_csv_parse/node_array_csv_parse.gml +++ b/scripts/node_array_csv_parse/node_array_csv_parse.gml @@ -2,25 +2,148 @@ function Node_Array_CSV_Parse(_x, _y, _group = noone) : Node(_x, _y, _group) con name = "CSV Parse"; setDimension(96, 48); - newInput(0, nodeValue_Text("CSV string", self, 0)) + newInput(0, nodeValue_Text("CSV string", self, "")) .setVisible(true, true); newInput(1, nodeValue_Int("Skip line", self, 0)); + newInput(2, nodeValue_Bool("First Row Header", self, false)); + + newInput(3, nodeValue_Text("Sort", self, [])) + .setDisplay(VALUE_DISPLAY.text_array, { data: [] }); + + newInput(4, nodeValue_Bool("Output Struct", self, false)); + + newInput(5, nodeValue_Text("Columns", self, [])) + .setDisplay(VALUE_DISPLAY.text_array, { data: [] }); + newOutput(0, nodeValue_Output("Array", self, VALUE_TYPE.any, 0)) .setArrayDepth(1); + input_display_list = [ + ["Input", false], 0, 1, + ["Table", false], 2, 3, + ["Output", false], 5, 4, + ]; + + inputs[0].editWidget.max_height = ui(240); + inputs[3].editWidget.mode = 1; + + __sortKey = ""; + + function sortValueAsc(a,b,k) { + var va = a[$ k]; + var vb = b[$ k]; + + if(is_string(va)) return string_compare(va,vb); + if(is_numeric(va)) return va-vb; + return 0; + } + + function sortValueDec(a,b,k) { + var va = a[$ k]; + var vb = b[$ k]; + + if(is_string(va)) return string_compare(vb,va); + if(is_numeric(va)) return vb-va; + return 0; + } + static update = function(frame = CURRENT_FRAME) { - var _str = getInputData(0); - var _skp = getInputData(1); + var _str = getInputData(0); + var _skp = getInputData(1); + var _hed = getInputData(2); + var _sort = getInputData(3); + var _struct = getInputData(4); + var _ocol = getInputData(5); - var _lines = string_splice(_str, "\n"); - var _arr = []; + var _lines = _str; + var _lAmo = array_length(_lines); + var _head = noone; + var _sarr = []; - for( var i = _skp; i < array_length(_lines); i++ ) - array_push(_arr, string_splice(_lines[i], ",")); + var _col = 0; - outputs[0].setValue(_arr); + ////- PARSE + + for( var i = _skp; i < _lAmo; i++ ) { + var _l = _lines[i]; + _l = string_replace_all(_l, "\"", ""); + _l = string_trim(_l); + + var _row = string_split(_l, ","); + + if(_hed && _head == noone) { + _head = _row; + _col = array_length(_row); + continue; + } + + if(_head != noone) { + var _rowStr = {}; + for( var j = 0, m = min(array_length(_row), _col); j < m; j++ ) + _rowStr[$ _head[j]] = _row[j]; + array_push(_sarr, _rowStr); + } + } + + ////- SORT + + if(_hed && _head != noone) { + inputs[3].editWidget.data = _head; + inputs[5].editWidget.data = _head; + } + + __sort = []; + for( var i = 0, n = array_length(_sort); i < n; i++ ) { + var _srt = _sort[i]; + __sort[i] = [ + string_char_at(_srt, 1) == "+", + string_copy(_srt, 2, string_length(_srt) - 1) + ]; + } + + array_sort(_sarr, function(a,b) /*=>*/ { + for( var i = 0, n = array_length(__sort); i < n; i++ ) { + var _srt = __sort[i]; + var _res = _srt[0]? sortValueAsc(a, b, _srt[1]) : sortValueDec(a, b, _srt[1]); + if(_res != 0) return _res; + } + + return 0; + }); + + ////- OUTPUT + + if(_struct && _head != noone) { + if(!array_empty(_ocol)) { + var _a = []; + + for( var i = 0, n = array_length(_sarr); i < n; i++ ) { + var _rw = {}; + for( var j = 0, m = array_length(outCol); j < m; j++ ) + _rw[$ outCol[j]] = _sarr[i][$ outCol[j]]; + _a[i] = _rw; + } + + outputs[0].setValue(_a); + + } else + outputs[0].setValue(_sarr); + + } else { + var outCol = array_empty(_ocol)? _head : _ocol; + var _a = []; + + for( var i = 0, n = array_length(_sarr); i < n; i++ ) { + var _rw = []; + for( var j = 0, m = array_length(outCol); j < m; j++ ) + _rw[j] = _sarr[i][$ outCol[j]]; + _a[i] = _rw; + } + + outputs[0].setValue(_a); + } } static onDrawNode = function(xx, yy, _mx, _my, _s, _hover, _focus) { diff --git a/scripts/node_array_flattern/node_array_flattern.gml b/scripts/node_array_flattern/node_array_flattern.gml new file mode 100644 index 000000000..be7647b54 --- /dev/null +++ b/scripts/node_array_flattern/node_array_flattern.gml @@ -0,0 +1,31 @@ +function Node_Array_Flattern(_x, _y, _group = noone) : Node(_x, _y, _group) constructor { + name = "Array Flattern"; + setDimension(96, 48); + + newInput(0, nodeValue("Array in", self, CONNECT_TYPE.input, VALUE_TYPE.any, [])) + .setVisible(true, true); + + newOutput(0, nodeValue_Output("Flatterned Array", self, VALUE_TYPE.any, [])); + + static update = function(frame = CURRENT_FRAME) { + var arr = getInputData(0); + + inputs[0].setType(VALUE_TYPE.any); + outputs[0].setType(VALUE_TYPE.any); + + if(!is_array(arr)) return; + + if(inputs[0].value_from != noone) { + inputs[0].setType(inputs[0].value_from.type); + outputs[0].setType(inputs[0].value_from.type); + } + + var _arr = array_spread(arr); + outputs[0].setValue(_arr); + } + + static onDrawNode = function(xx, yy, _mx, _my, _s, _hover, _focus) { + var bbox = drawGetBbox(xx, yy, _s); + draw_sprite_fit(s_node_array_flattern, 0, bbox.xc, bbox.yc, bbox.w, bbox.h); + } +} \ No newline at end of file diff --git a/scripts/node_array_flattern/node_array_flattern.yy b/scripts/node_array_flattern/node_array_flattern.yy new file mode 100644 index 000000000..290292e7f --- /dev/null +++ b/scripts/node_array_flattern/node_array_flattern.yy @@ -0,0 +1,14 @@ +{ + "$GMScript":"v1", + "%Name":"node_array_flattern", + "isCompatibility":false, + "isDnD":false, + "name":"node_array_flattern", + "parent":{ + "name":"array", + "path":"folders/nodes/data/value/array.yy", + }, + "resourceType":"GMScript", + "resourceVersion":"2.0", + "tags":[], +} \ No newline at end of file diff --git a/scripts/node_csv_file_read/node_csv_file_read.gml b/scripts/node_csv_file_read/node_csv_file_read.gml index 56a690812..00882330d 100644 --- a/scripts/node_csv_file_read/node_csv_file_read.gml +++ b/scripts/node_csv_file_read/node_csv_file_read.gml @@ -28,14 +28,13 @@ function Node_create_CSV_File_Read_path(_x, _y, path) { function Node_CSV_File_Read(_x, _y, _group = noone) : Node(_x, _y, _group) constructor { name = "CSV File In"; color = COLORS.node_blend_input; - - w = 128; + w = 128; newInput(0, nodeValue_Path("Path", self, "")) .setDisplay(VALUE_DISPLAY.path_load, { filter: "CSV file|*.csv" }) .rejectArray(); - newInput(1, nodeValue_Bool("Convert to number", self, false)) + newInput(1, nodeValue_Bool("Convert to Number", self, false)) .rejectArray(); newOutput(0, nodeValue_Output("Content", self, VALUE_TYPE.text, "")); @@ -43,22 +42,21 @@ function Node_CSV_File_Read(_x, _y, _group = noone) : Node(_x, _y, _group) const newOutput(1, nodeValue_Output("Path", self, VALUE_TYPE.path, "")) .setVisible(true, true); + input_display_list = [ 0, + ["Data", false], 1, + ]; + content = ""; path_current = ""; edit_time = 0; attributes.file_checker = true; - array_push(attributeEditors, [ "File Watcher", function() { return attributes.file_checker; }, - new checkBox(function() { attributes.file_checker = !attributes.file_checker; }) ]); + array_push(attributeEditors, [ "File Watcher", function() /*=>*/ {return attributes.file_checker}, new checkBox(function() /*=>*/ { attributes.file_checker = !attributes.file_checker; }) ]); first_update = false; on_drop_file = function(path) { - if(updatePaths(path)) { - doUpdate(); - return true; - } - + if(updatePaths(path)) { doUpdate(); return true; } return false; } @@ -66,13 +64,12 @@ function Node_CSV_File_Read(_x, _y, _group = noone) : Node(_x, _y, _group) const path = path_get(path); if(path == -1) return false; - var ext = string_lower(filename_ext(path)); - var _name = string_replace(filename_name(path), filename_ext(path), ""); + var ext = string_lower(filename_ext(path)); + var _name = filename_name_only(path); if(ext != ".csv") return false; outputs[1].setValue(path); - content = file_text_read_all_lines(path); var convert = getInputData(1); diff --git a/scripts/node_group_input/node_group_input.gml b/scripts/node_group_input/node_group_input.gml index 9db77f628..4ed3f499e 100644 --- a/scripts/node_group_input/node_group_input.gml +++ b/scripts/node_group_input/node_group_input.gml @@ -8,7 +8,7 @@ globalvar GROUP_IO_TYPE_NAME, GROUP_IO_TYPE_MAP, GROUP_IO_DISPLAY; -1, "3D Mesh", "3D Light", "3D Camera", "3D Scene", "3D Material", -1, "PCX", "Audio", "Fluid Domain", - "SDF", + "SDF", "Gradient", ]; GROUP_IO_TYPE_MAP = [ VALUE_TYPE.integer, VALUE_TYPE.float, VALUE_TYPE.boolean, VALUE_TYPE.color, VALUE_TYPE.surface, @@ -18,50 +18,51 @@ globalvar GROUP_IO_TYPE_NAME, GROUP_IO_TYPE_MAP, GROUP_IO_DISPLAY; noone, VALUE_TYPE.d3Mesh, VALUE_TYPE.d3Light, VALUE_TYPE.d3Camera, VALUE_TYPE.d3Scene, VALUE_TYPE.d3Material, noone, VALUE_TYPE.PCXnode, VALUE_TYPE.audioBit, VALUE_TYPE.fdomain, - VALUE_TYPE.sdf, + VALUE_TYPE.sdf, VALUE_TYPE.gradient, ]; GROUP_IO_DISPLAY = [ - /*Integer*/ [ "Default", "Range", "Rotation", "Rotation range", "Slider", "Slider range", "Padding", "Vector", "Vector range", "Area", "Enum button", "Menu scroll" ], - /*Float*/ [ "Default", "Range", "Rotation", "Rotation range", "Slider", "Slider range", "Padding", "Vector", "Vector range", "Area" ], - /*Boolean*/ [ "Default" ], - /*Color*/ [ "Default", "Gradient", "Palette" ], - /*Surface*/ [ "Default" ], + /*Integer*/ [ "Integer", "Range", "Rotation", "Rotation range", "Slider", "Slider range", "Padding", "Vector", "Vector range", "Area", "Enum button", "Menu scroll" ], + /*Float*/ [ "Float", "Range", "Rotation", "Rotation range", "Slider", "Slider range", "Padding", "Vector", "Vector range", "Area" ], + /*Boolean*/ [ "Boolean" ], + /*Color*/ [ "Color", "Palette" ], + /*Surface*/ [ "Surface" ], - /*Path*/ [ "Default" ], + /*Path*/ [ "Path" ], /*Curve*/ [ "Curve", ], - /*Text*/ [ "Default" ], - /*Object*/ [ "Default" ], - /*Node*/ [ "Default" ], + /*Text*/ [ "Text" ], + /*Object*/ [ "Object" ], + /*Node*/ [ "Node" ], - /*3D*/ [ "Default" ], - /*Any*/ [ "Default" ], - /*Pathnode*/ [ "Default" ], - /*Particle*/ [ "Default" ], - /*Rigid*/ [ "Default" ], + /*3D*/ [ "-" ], + /*Any*/ [ "Any" ], + /*Pathnode*/ [ "Pathnode" ], + /*Particle*/ [ "Particle" ], + /*Rigid*/ [ "Rigidbody Object" ], - /*Sdomain*/ [ "Default" ], - /*Struct*/ [ "Default" ], - /*Strand*/ [ "Default" ], - /*Mesh*/ [ "Default" ], - /*Trigger*/ [ "Default" ], + /*Sdomain*/ [ "Domain" ], + /*Struct*/ [ "Struct" ], + /*Strand*/ [ "Strand" ], + /*Mesh*/ [ "Mesh" ], + /*Trigger*/ [ "Trigger" ], //=========================// - /*Noone*/ [ "Default" ], - /*3D Mesh*/ [ "Default" ], - /*3D Light*/ [ "Default" ], - /*3D Camera*/ [ "Default" ], - /*3D Scene*/ [ "Default" ], + /*Noone*/ [ "-" ], + /*3D Mesh*/ [ "3D Mesh" ], + /*3D Light*/ [ "3D Light" ], + /*3D Camera*/ [ "3D Camera" ], + /*3D Scene*/ [ "3D Scene" ], - /*3D Material*/ [ "Default" ], - /*noone*/ [ "Default" ], - /*PCX*/ [ "Default" ], - /*Audio*/ [ "Default" ], - /*Fdomain*/ [ "Default" ], + /*3D Material*/ [ "3D Material" ], + /*noone*/ [ "-" ], + /*PCX*/ [ "PCX" ], + /*Audio*/ [ "Audio" ], + /*Fdomain*/ [ "Fdomain" ], - /*SDF*/ [ "Default" ], + /*SDF*/ [ "SDF" ], + /*Gradient*/ [ "Gradient" ], ]; #endregion @@ -146,42 +147,31 @@ function Node_Group_Input(_x, _y, _group = noone) : Node(_x, _y, _group) constru attributes.inherit_type = false; var ind = array_find(GROUP_IO_TYPE_MAP, juncTo.type); - if(ind == -1) return; - outputs[0].setType(juncTo.type); - inputs[2].setValue(ind); + + if(ind != -1) inputs[2].setValue(ind); switch(instanceof(juncTo)) { case "__NodeValue_Vec2" : case "__NodeValue_Dimension" : - inputs[0].setValue(array_find(GROUP_IO_DISPLAY[0], "Vector")); - inputs[4].setValue(0); - break; + inputs[0].setValue(array_find(GROUP_IO_DISPLAY[0], "Vector")); inputs[4].setValue(0); break; case "__NodeValue_Vec2_Range" : - inputs[0].setValue(array_find(GROUP_IO_DISPLAY[0], "Vector range")); - inputs[4].setValue(0); - break; + inputs[0].setValue(array_find(GROUP_IO_DISPLAY[0], "Vector range")); inputs[4].setValue(0); break; case "__NodeValue_Vec3" : - inputs[0].setValue(array_find(GROUP_IO_DISPLAY[0], "Vector")); - inputs[4].setValue(1); - break; + inputs[0].setValue(array_find(GROUP_IO_DISPLAY[0], "Vector")); inputs[4].setValue(1); break; case "__NodeValue_Vec3_Range" : - inputs[0].setValue(array_find(GROUP_IO_DISPLAY[0], "Vector range")); - inputs[4].setValue(1); - break; + inputs[0].setValue(array_find(GROUP_IO_DISPLAY[0], "Vector range")); inputs[4].setValue(1); break; case "__NodeValue_Vec4" : - inputs[0].setValue(array_find(GROUP_IO_DISPLAY[0], "Vector")); - inputs[4].setValue(2); - break; + inputs[0].setValue(array_find(GROUP_IO_DISPLAY[0], "Vector")); inputs[4].setValue(2); break; case "__NodeValue_Rotation" : - inputs[0].setValue(array_find(GROUP_IO_DISPLAY[0], "Rotation")); - inputs[4].setValue(2); - break; + inputs[0].setValue(array_find(GROUP_IO_DISPLAY[0], "Rotation")); inputs[4].setValue(2); break; + + case "__NodeValue_Palette" : inputs[0].setValue(1); break; } juncTo.value_from = noone; @@ -274,12 +264,9 @@ function Node_Group_Input(_x, _y, _group = noone) : Node(_x, _y, _group) constru if(index == 2) { if(outputs[0].type != _val_type) { - var _o = outputs[0]; - for(var j = 0; j < array_length(_o.value_to); j++) { - var _to = _o.value_to[j]; - if(_to.value_from == _o) - _to.removeFrom(); - } + var _to = outputs[0].getJunctionTo(); + for( var i = 0, n = array_length(_to); i < n; i++ ) + _to[i].removeFrom(); } inputs[0].setValue(0); @@ -307,6 +294,7 @@ function Node_Group_Input(_x, _y, _group = noone) : Node(_x, _y, _group) constru inParent.def_val = 0; inParent.setDisplay(VALUE_DISPLAY.slider, { range: [_range[0], _range[1], _step] }); break; + case "Slider range" : if(!is_array(_val) || array_length(_val) != 2) inParent.animator = new valueAnimator([0, 0], inParent); @@ -355,12 +343,14 @@ function Node_Group_Input(_x, _y, _group = noone) : Node(_x, _y, _group) constru inParent.def_val = [0, 0]; break; + case 1 : if(!is_array(_val) || array_length(_val) != 3) inParent.animator = new valueAnimator([0, 0, 0], inParent); inParent.def_val = [0, 0, 0]; break; + case 2 : if(!is_array(_val) || array_length(_val) != 4) inParent.animator = new valueAnimator([0, 0, 0, 0], inParent); @@ -399,8 +389,7 @@ function Node_Group_Input(_x, _y, _group = noone) : Node(_x, _y, _group) constru outputs[0].setType(inParent.type); inParent.animator = new valueAnimator(new gradientObject(cola(c_white)), inParent); - - inParent.def_val = new gradientObject(cola(c_white)); + inParent.def_val = new gradientObject(cola(c_white)); inParent.setDisplay(VALUE_DISPLAY._default); break; diff --git a/scripts/node_stagger/node_stagger.gml b/scripts/node_stagger/node_stagger.gml index c7b5eeaf3..899355b48 100644 --- a/scripts/node_stagger/node_stagger.gml +++ b/scripts/node_stagger/node_stagger.gml @@ -3,9 +3,9 @@ function Node_Stagger(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) c newInput(0, nodeValue_Surface("Surface", self)); - newInput(1, nodeValue_Int("Delay Step", self, 1)); + newInput(1, nodeValue_Float("Delay Step", self, 1)); - newInput(2, nodeValue_Int("Delay Amount", self, 1)); + newInput(2, nodeValue_Float("Delay Amount", self, 1)); newInput(3, nodeValue_Curve("Stagger Curve", self, CURVE_DEF_01)); @@ -47,22 +47,19 @@ function Node_Stagger(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) c var _sh = surface_get_height_safe(_surf); surf_indexes[_array_index][_time] = surface_verify(surf_indexes[_array_index][_time], _sw, _sh); - surface_set_target(surf_indexes[_array_index][_time]); - DRAW_CLEAR + surface_set_shader(surf_indexes[_array_index][_time]); draw_surface_safe(_surf); - surface_reset_target(); + surface_reset_shader(); _output = surface_verify(_output, _sw, _sh); - surface_set_target(_output); - DRAW_CLEAR - + surface_set_shader(_output); if(0 <= _frtm && _frtm < TOTAL_FRAMES) { draw_surface_safe(surf_indexes[_array_index][_frtm]); surface_free(surf_indexes[_array_index][_frtm]); surf_indexes[_array_index][_frtm] = 0; } - surface_reset_target(); + surface_reset_shader(); return _output; } diff --git a/scripts/textArea/textArea.gml b/scripts/textArea/textArea.gml index 10b648422..e4085ba90 100644 --- a/scripts/textArea/textArea.gml +++ b/scripts/textArea/textArea.gml @@ -1012,7 +1012,7 @@ function textArea(_input, _onModify) : textInput(_input, _onModify) constructor text_y_max = max(0, total_h - hh + 16); text_y = lerp_float(text_y, text_y_to, 5); - if(hover) { + if(ihover) { if(mouse_wheel_down()) text_y_to = clamp(text_y_to - ui(64) * SCROLL_SPEED, -text_y_max, 0); if(mouse_wheel_up()) text_y_to = clamp(text_y_to + ui(64) * SCROLL_SPEED, -text_y_max, 0); } @@ -1034,12 +1034,12 @@ function textArea(_input, _onModify) : textInput(_input, _onModify) constructor } if(text_y_max) { - var hov = hover && point_in_rectangle(_m[0], _m[1], scr_x - 3, _y, _x + _w, _y + _h); + var hov = ihover && point_in_rectangle(_m[0], _m[1], scr_x - 3, _y, _x + _w, _y + _h); draw_sprite_stretched_ext(THEME.ui_scrollbar, 0, scr_x, scr_y, scr_w, scr_h, COLORS.scrollbar_bg, 1); draw_sprite_stretched_ext(THEME.ui_scrollbar, 0, scr_x, bar_y, scr_w, bar_h, hov || text_scrolling? COLORS.scrollbar_hover : COLORS.scrollbar_idle, 1); - if(mouse_press(mb_left, hov && active)) { + if(hov && mouse_press(mb_left, iactive)) { text_scrolling = true; text_scroll_sy = text_y; text_scroll_my = _m[1]; diff --git a/scripts/textArrayBox/textArrayBox.gml b/scripts/textArrayBox/textArrayBox.gml index 044b56d9b..6b65da1ef 100644 --- a/scripts/textArrayBox/textArrayBox.gml +++ b/scripts/textArrayBox/textArrayBox.gml @@ -7,10 +7,13 @@ function textArrayBox(arraySet, data, onModify = noone) : widget() constructor { hide = false; open = false; + mode = 0; + + pressed = false; + dragging = noone; static drawParam = function(params) { setParam(params); - return draw(params.x, params.y, params.w, params.h, params.m, params.rx, params.ry); } @@ -21,67 +24,111 @@ function textArrayBox(arraySet, data, onModify = noone) : widget() constructor { if(getArray != noone) arraySet = getArray(); - var tx = _x + ui(4); - var ty = _y + ui(4); - var hh = line_get_height(font, ui(4)); - var th = hh + ui(8); - - draw_set_text(font, fa_left, fa_center, COLORS._main_text); - for( var i = 0, n = array_length(arraySet); i < n; i++ ) { - var ww = string_width(arraySet[i]) + ui(16); - if(tx + ww + ui(2) > _x + _w - ui(8)) { - tx = _x + ui(4); - ty += hh + ui(2); - th += hh + ui(2); - } - tx += ww + ui(2); - } - - h = th; - - draw_sprite_stretched_ext(THEME.textbox, 3, _x, _y, _w, th, boxColor); + draw_sprite_stretched_ext(THEME.textbox, 3, _x, _y, _w, h, boxColor); if(open) { - draw_sprite_stretched_ext(THEME.textbox, 2, _x, _y, _w, th, COLORS._main_accent, 1); + draw_sprite_stretched_ext(THEME.textbox, 2, _x, _y, _w, h, COLORS._main_accent, 1); } else { - if(hover && point_in_rectangle(_m[0], _m[1], _x, _y, _x + _w, _y + th)) { - draw_sprite_stretched_ext(THEME.textbox, 1, _x, _y, _w, th, boxColor, 0.5 + !hide * 0.5); - if(mouse_press(mb_left, active)) { - with(dialogCall(o_dialog_arrayBox, _rx + _x, _ry + _y + th)) { + if(hover && point_in_rectangle(_m[0], _m[1], _x, _y, _x + _w, _y + h)) { + draw_sprite_stretched_ext(THEME.textbox, 1, _x, _y, _w, h, boxColor, 0.5 + !hide * 0.5); + if(mouse_press(mb_left, active)) pressed = true; + + if(pressed && mouse_release(mb_left, active)) { + with(dialogCall(o_dialog_arrayBox, _rx + _x, _ry + _y + h)) { arrayBox = other; dialog_w = other.w; font = other.font; + mode = other.mode; } } } else if(!hide) - draw_sprite_stretched_ext(THEME.textbox, 0, _x, _y, _w, th, boxColor, 0.5 + 0.5 * interactable); + draw_sprite_stretched_ext(THEME.textbox, 0, _x, _y, _w, h, boxColor, 0.5 + 0.5 * interactable); } + if(mouse_release(mb_left)) pressed = false; + + var ww, hh = line_get_height(font, ui(4)); var tx = _x + ui(4); var ty = _y + ui(4); - var hh = line_get_height(font, ui(4)); + var th = hh + ui(8); + var hovi = noone; draw_set_text(font, fa_left, fa_center, COLORS._main_text); for( var i = 0, n = array_length(arraySet); i < n; i++ ) { - var ww = string_width(arraySet[i]) + ui(16); - if(tx + ww + ui(2) > _x + _w - ui(8)) { - tx = _x + ui(4); - ty += hh + ui(2); + var _txt = arraySet[i]; + + switch(mode) { + case 0 : + ww = string_width(_txt) + ui(16); + break; + + case 1 : + var _type = string_char_at(_txt, 1); + + _txt = string_copy(_txt, 2, string_length(_txt) - 1); + ww = ui(24) + string_width(_txt) + ui(16); + break; } - draw_sprite_stretched_ext(THEME.box_r5_clr, 0, tx, ty, ww, hh, COLORS._main_icon, 1); - draw_text_add(tx + ui(8), ty + hh / 2, arraySet[i]); + if(tx + ww + ui(2) > _x + _w - ui(8)) { + tx = _x + ui(4); + ty += hh + ui(2); + th += hh + ui(2); + } + + var _hov = hover && point_in_rectangle(_m[0], _m[1], tx, ty, tx + ww, ty + hh); + if(_hov) hovi = [i, tx, ty, tx + ww, ty + hh]; + + draw_sprite_stretched_ext(THEME.box_r5_clr, _hov, tx, ty, ww, hh, COLORS._main_icon, 1); + draw_set_color(dragging == i? COLORS._main_text_accent : COLORS._main_text); + + switch(mode) { + case 0 : + draw_text_add(tx + ui(8), ty + hh / 2, _txt); + break; + + case 1 : + if(_type == "+") draw_sprite_ext(THEME.arrow, 1, tx + ui(16), ty + hh / 2, 1, 1, 0, COLORS._main_value_positive, 1); + else if(_type == "-") draw_sprite_ext(THEME.arrow, 3, tx + ui(16), ty + hh / 2 + ui(2), 1, 1, 0, COLORS._main_value_negative, 1); + + draw_text_add(tx + ui(32), ty + hh / 2, _txt); + break; + } + + if(_hov && mouse_press(mb_left, active)) { + pressed = false; + dragging = i; + } tx += ww + ui(2); } + if(dragging != noone) { + if(hovi != noone && hovi[0] != dragging) { + draw_set_color(COLORS._main_accent); + var _tx = hovi[0] > dragging? hovi[3] : hovi[1]; + draw_line_width(_tx, hovi[2], _tx, hovi[4], 2); + } + + if(mouse_release(mb_left)) { + if(hovi != noone && hovi[0] != dragging) { + var _val = arraySet[dragging]; + + array_delete(arraySet, dragging, 1); + array_insert(arraySet, hovi[0], _val); + + onModify(); + } + + dragging = noone; + } + } + + h = th; + resetFocus(); return th; } - static clone = function() { - var cln = new textArrayBox(getArray, data, onModify); - - return cln; - } + static clone = function() /*=>*/ {return new textArrayBox(getArray, data, onModify)}; } \ No newline at end of file diff --git a/sprites/s_node_array_flattern/119dc552-4005-46ba-98cb-42697347e056.png b/sprites/s_node_array_flattern/119dc552-4005-46ba-98cb-42697347e056.png new file mode 100644 index 000000000..62bae3ac8 Binary files /dev/null and b/sprites/s_node_array_flattern/119dc552-4005-46ba-98cb-42697347e056.png differ diff --git a/sprites/s_node_array_flattern/layers/119dc552-4005-46ba-98cb-42697347e056/1fe4c9ea-5e40-468d-85ac-3aeacbc2e89e.png b/sprites/s_node_array_flattern/layers/119dc552-4005-46ba-98cb-42697347e056/1fe4c9ea-5e40-468d-85ac-3aeacbc2e89e.png new file mode 100644 index 000000000..62bae3ac8 Binary files /dev/null and b/sprites/s_node_array_flattern/layers/119dc552-4005-46ba-98cb-42697347e056/1fe4c9ea-5e40-468d-85ac-3aeacbc2e89e.png differ diff --git a/sprites/s_node_array_flattern/s_node_array_flattern.yy b/sprites/s_node_array_flattern/s_node_array_flattern.yy new file mode 100644 index 000000000..98dd4c996 --- /dev/null +++ b/sprites/s_node_array_flattern/s_node_array_flattern.yy @@ -0,0 +1,90 @@ +{ + "$GMSprite":"", + "%Name":"s_node_array_flattern", + "bboxMode":0, + "bbox_bottom":61, + "bbox_left":0, + "bbox_right":63, + "bbox_top":3, + "collisionKind":1, + "collisionTolerance":0, + "DynamicTexturePage":false, + "edgeFiltering":false, + "For3D":false, + "frames":[ + {"$GMSpriteFrame":"","%Name":"119dc552-4005-46ba-98cb-42697347e056","name":"119dc552-4005-46ba-98cb-42697347e056","resourceType":"GMSpriteFrame","resourceVersion":"2.0",}, + ], + "gridX":0, + "gridY":0, + "height":64, + "HTile":false, + "layers":[ + {"$GMImageLayer":"","%Name":"1fe4c9ea-5e40-468d-85ac-3aeacbc2e89e","blendMode":0,"displayName":"default","isLocked":false,"name":"1fe4c9ea-5e40-468d-85ac-3aeacbc2e89e","opacity":100.0,"resourceType":"GMImageLayer","resourceVersion":"2.0","visible":true,}, + ], + "name":"s_node_array_flattern", + "nineSlice":null, + "origin":4, + "parent":{ + "name":"array", + "path":"folders/nodes/icons/value/array.yy", + }, + "preMultiplyAlpha":false, + "resourceType":"GMSprite", + "resourceVersion":"2.0", + "sequence":{ + "$GMSequence":"", + "%Name":"s_node_array_flattern", + "autoRecord":true, + "backdropHeight":768, + "backdropImageOpacity":0.5, + "backdropImagePath":"", + "backdropWidth":1366, + "backdropXOffset":0.0, + "backdropYOffset":0.0, + "events":{ + "$KeyframeStore":"", + "Keyframes":[], + "resourceType":"KeyframeStore", + "resourceVersion":"2.0", + }, + "eventStubScript":null, + "eventToFunction":{}, + "length":1.0, + "lockOrigin":false, + "moments":{ + "$KeyframeStore":"", + "Keyframes":[], + "resourceType":"KeyframeStore", + "resourceVersion":"2.0", + }, + "name":"s_node_array_flattern", + "playback":1, + "playbackSpeed":30.0, + "playbackSpeedType":0, + "resourceType":"GMSequence", + "resourceVersion":"2.0", + "showBackdrop":true, + "showBackdropImage":false, + "timeUnits":1, + "tracks":[ + {"$GMSpriteFramesTrack":"","builtinName":0,"events":[],"inheritsTrackColour":true,"interpolation":1,"isCreationTrack":false,"keyframes":{"$KeyframeStore":"","Keyframes":[ + {"$Keyframe":"","Channels":{ + "0":{"$SpriteFrameKeyframe":"","Id":{"name":"119dc552-4005-46ba-98cb-42697347e056","path":"sprites/s_node_array_flattern/s_node_array_flattern.yy",},"resourceType":"SpriteFrameKeyframe","resourceVersion":"2.0",}, + },"Disabled":false,"id":"171cba14-8a41-4377-8a02-bbc00916c8d5","IsCreationKey":false,"Key":0.0,"Length":1.0,"resourceType":"Keyframe","resourceVersion":"2.0","Stretch":false,}, + ],"resourceType":"KeyframeStore","resourceVersion":"2.0",},"modifiers":[],"name":"frames","resourceType":"GMSpriteFramesTrack","resourceVersion":"2.0","spriteId":null,"trackColour":0,"tracks":[],"traits":0,}, + ], + "visibleRange":null, + "volume":1.0, + "xorigin":32, + "yorigin":32, + }, + "swatchColours":null, + "swfPrecision":0.5, + "textureGroupId":{ + "name":"Default", + "path":"texturegroups/Default", + }, + "type":0, + "VTile":false, + "width":64, +} \ No newline at end of file