diff --git a/datafiles/data/Theme.zip b/datafiles/data/Theme.zip new file mode 100644 index 000000000..2fcc40307 Binary files /dev/null and b/datafiles/data/Theme.zip differ diff --git a/objects/o_dialog_add_node/Create_0.gml b/objects/o_dialog_add_node/Create_0.gml index 5bafe4627..e30f9e0b6 100644 --- a/objects/o_dialog_add_node/Create_0.gml +++ b/objects/o_dialog_add_node/Create_0.gml @@ -17,6 +17,7 @@ event_inherited(); destroy_on_click_out = true; + node_list = ds_list_create(); node_selecting = 0; node_focusing = -1; @@ -42,6 +43,20 @@ event_inherited(); canvas = false; collapsed = {}; + subgroups = []; + subgroup_index = 0; + + view_tooltip = new tooltipSelector("View", [ + __txtx("view_grid", "Grid view"), + __txtx("view_list", "List view"), + ]); + + group_tooltip = new tooltipSelector("Group", [ + __txt("Disabled"), + __txt("Inline"), + __txt("Stacked"), + ]); + #region ---- category ---- category = NODE_CATEGORY; switch(instanceof(context)) { @@ -302,6 +317,91 @@ event_inherited(); } } + function setPage(pageIndex) { + ADD_NODE_PAGE = min(pageIndex, ds_list_size(category) - 1); + subgroups = []; + subgroup_index = 0; + ds_list_clear(node_list); + + if(ADD_NODE_PAGE == -2) { + for(var i = 0; i < ds_list_size(category); i++) { + var cat = category[| i]; + if(array_length(cat.filter) && !array_exists(cat.filter, instanceof(context))) + continue; + + for( var j = 0; j < ds_list_size(cat.list); j++ ) + ds_list_add(node_list, cat.list[| j]); + } + + } else if(ADD_NODE_PAGE == -1) { + for( var i = 0, n = ds_list_size(NEW_NODES); i < n; i++ ) + ds_list_add(node_list, NEW_NODES[| i]); + + } else if(ADD_NODE_PAGE == NODE_PAGE_DEFAULT && category == NODE_CATEGORY) { // page 0 global context + var sug = []; + + if(node_called != noone) { + array_append(sug, nodeReleatedQuery( + node_called.connect_type == CONNECT_TYPE.input? "connectTo" : "connectFrom", + node_called.type + )); + } + + array_append(sug, nodeReleatedQuery("context", instanceof(context))); + + if(!array_empty(sug)) { + ds_list_add(node_list, "Related"); + for( var i = 0, n = array_length(sug); i < n; i++ ) { + var k = array_safe_get_fast(sug, i); + if(k == 0) continue; + if(ds_map_exists(ALL_NODES, k)) + ds_list_add(node_list, ALL_NODES[? k]); + } + } + + ds_list_add(node_list, "Favourites"); + var _favs = struct_get_names(global.FAV_NODES); + for( var i = 0, n = array_length(_favs); i < n; i++ ) { + var _nodeIndex = _favs[i]; + if(!ds_map_exists(ALL_NODES, _nodeIndex)) continue; + + var _node = ALL_NODES[? _nodeIndex]; + if(_node.show_in_recent) + ds_list_add(node_list, _node); + } + + ds_list_add(node_list, "Recents"); + if(is_array(global.RECENT_NODES)) + for( var i = 0, n = array_length(global.RECENT_NODES); i < n; i++ ) { + var _nodeIndex = global.RECENT_NODES[i]; + if(!ds_map_exists(ALL_NODES, _nodeIndex)) continue; + + var _node = ALL_NODES[? _nodeIndex]; + if(_node.show_in_recent) + ds_list_add(node_list, _node); + } + } else { + var _l = category[| ADD_NODE_PAGE].list; + for( var i = 0, n = ds_list_size(_l); i < n; i++ ) + ds_list_add(node_list, _l[| i]); + } + + for( var i = 0, n = ds_list_size(node_list); i < n; i++ ) { + var _node = node_list[| i]; + if(!is_string(_node)) continue; + if(string_starts_with(_node, "/")) continue; + + array_push(subgroups, _node); + } + setSubgroup(0); + } + + function setSubgroup(_subg) { + subgroup_index = _subg; + } +#endregion + +#region content catagory_pane = new scrollPane(category_width, dialog_h - ui(66), function(_y, _m) { draw_clear_alpha(COLORS._main_text, 0); @@ -397,85 +497,74 @@ event_inherited(); catagory_pane.scroll_color_bg = undefined; catagory_pane.scroll_color_bar_alpha = .5; - content_pane = new scrollPane(dialog_w - category_width - ui(36), dialog_h - ui(66), function(_y, _m) { + subcatagory_pane = new scrollPane(ui(96), dialog_h - ui(66), function(_y, _m) { + draw_clear_alpha(COLORS._main_text, 0); + var _f = f_p2; + + var yy = _y + ui(4); + var hh = 0 + ui(4); + var hg = line_get_height(_f, 6); + + var ww = subcatagory_pane.surface_w; + var _hover = subcatagory_pane.hover; + var _active = subcatagory_pane.active; + + for( var i = 0, n = array_length(subgroups); i < n; i++ ) { + + var _hv = _hover && point_in_rectangle(_m[0], _m[1], 0, yy, ww, yy + hg - ui(1)); + + if(_hv) { + draw_sprite_stretched_add(THEME.ui_panel_bg, 0, ui(4), yy, ww - ui(4), hg, CDEF.main_white, .2); + if(mouse_click(mb_left, _active)) setSubgroup(i); + } + + draw_set_text(_f, fa_left, fa_top, i == subgroup_index? COLORS._main_text_accent : CDEF.main_mdwhite); + draw_text_add(ui(12), yy + ui(2), subgroups[i]); + + yy += hg; + hh += hg; + } + + return hh; + }); + + content_pane = new scrollPane(dialog_w - category_width - ui(40), dialog_h - ui(66), function(_y, _m) { draw_clear_alpha(c_white, 0); var _hover = sHOVER && content_pane.hover; var _focus = sFOCUS && content_pane.active; - var _list = node_list; + var _list = ds_list_create(); var ww = content_pane.surface_w; var hh = 0; - if(ADD_NODE_PAGE == -2) { - _list = ds_list_create(); - for(var i = 0; i < ds_list_size(category); i++) { - var cat = category[| i]; - if(array_length(cat.filter) && !array_exists(cat.filter, instanceof(context))) - continue; - - for( var j = 0; j < ds_list_size(cat.list); j++ ) - ds_list_add(_list, cat.list[| j]); - } - - } else if(ADD_NODE_PAGE == -1) { - _list = NEW_NODES; - - } else if(ADD_NODE_PAGE == NODE_PAGE_DEFAULT && category == NODE_CATEGORY) { - _list = ds_list_create(); - - var sug = []; - - if(node_called != noone) { - array_append(sug, nodeReleatedQuery( - node_called.connect_type == CONNECT_TYPE.input? "connectTo" : "connectFrom", - node_called.type - )); - } - - array_append(sug, nodeReleatedQuery("context", instanceof(context))); - - if(!array_empty(sug)) { - ds_list_add(_list, "Related"); - for( var i = 0, n = array_length(sug); i < n; i++ ) { - var k = array_safe_get_fast(sug, i); - if(k == 0) continue; - if(ds_map_exists(ALL_NODES, k)) - ds_list_add(_list, ALL_NODES[? k]); - } - } - - ds_list_add(_list, "Favourites"); - var _favs = struct_get_names(global.FAV_NODES); - for( var i = 0, n = array_length(_favs); i < n; i++ ) { - var _nodeIndex = _favs[i]; - if(!ds_map_exists(ALL_NODES, _nodeIndex)) continue; - - var _node = ALL_NODES[? _nodeIndex]; - if(_node.show_in_recent) - ds_list_add(_list, _node); - } - - ds_list_add(_list, "Recents"); - if(is_array(global.RECENT_NODES)) - for( var i = 0, n = array_length(global.RECENT_NODES); i < n; i++ ) { - var _nodeIndex = global.RECENT_NODES[i]; - if(!ds_map_exists(ALL_NODES, _nodeIndex)) continue; - - var _node = ALL_NODES[? _nodeIndex]; - if(_node.show_in_recent) - ds_list_add(_list, _node); - } + if(node_list == noone) { + ds_list_destroy(_list); + setPage(NODE_PAGE_DEFAULT); + return 0; } - if(_list == noone) { - setPage(NODE_PAGE_DEFAULT); - return 0; + var _subg_cur = -1; + for( var i = 0, n = ds_list_size(node_list); i < n; i++ ) { + var _n = node_list[| i]; + + if(PREFERENCES.dialog_add_node_grouping != 2) { + ds_list_add(_list, _n); + continue; + } + + if(is_string(_n) && !string_starts_with(_n, "/")) { + _subg_cur++ + if(_subg_cur > subgroup_index) break; + } else if(_subg_cur == subgroup_index) { + ds_list_add(_list, _n); + } } var node_count = ds_list_size(_list); var group_labels = []; var _hoverContent = _hover; - + var _lbh = PREFERENCES.dialog_add_node_grouping == 1? ui(24) : ui(16); + if(!content_hoverable) _hoverContent = false; content_hoverable = true; @@ -501,8 +590,8 @@ event_inherited(); } if(is_string(_node)) { - if(!PREFERENCES.dialog_add_node_grouping) - continue; + if(PREFERENCES.dialog_add_node_grouping == 0) continue; + if(PREFERENCES.dialog_add_node_grouping == 1 && string_starts_with(_node, "/")) continue; hh += curr_height; yy += curr_height; @@ -511,17 +600,17 @@ event_inherited(); curr_height = 0; var _key = $"{ADD_NODE_PAGE}:{index}"; - array_push(group_labels, { y: yy, text: __txt(_node), key: _key }); + array_push(group_labels, { y: yy, text: __txt(string_trim_start(__txt(_node), ["/"])), key: _key }); if(struct_try_get(collapsed, _key, 0)) { - hh += ui(24 + 4); - yy += ui(24 + 4); + hh += _lbh + ui(4); + yy += _lbh + ui(4); while(index + 1 < node_count && !is_string(_list[| index + 1])) index++; } else { - hh += ui(24 + 12); - yy += ui(24 + 12); + hh += _lbh + ui(12); + yy += _lbh + ui(12); } continue; } @@ -555,6 +644,7 @@ event_inherited(); } if(_node.getTooltip() != "" || _node.tooltip_spr != noone) { + gpu_set_tex_filter(true); if(_hoverContent && point_in_rectangle(_m[0], _m[1], _boxx, yy, _boxx + ui(16), yy + ui(16))) { content_pane.hover_content = true; @@ -564,6 +654,7 @@ event_inherited(); node_tooltip_y = content_pane.y + yy; } else draw_sprite_ui_uniform(THEME.info, 0, _boxx + ui(8), yy + ui(8), 0.7, COLORS._main_icon, 0.5); + gpu_set_tex_filter(false); } if(is_instanceof(_node, NodeObject)) { @@ -582,10 +673,10 @@ event_inherited(); var _name = _node.getName(); - draw_set_text(f_p2, fa_center, fa_top, COLORS._main_text); + draw_set_text(f_p3, fa_center, fa_top, COLORS._main_text); draw_text_ext_add(_boxx + grid_size / 2, yy + grid_size + 4, _name, -1, grid_width); - var name_height = string_height_ext(_name, -1, grid_width - 4) + 8; + var name_height = string_height_ext(_name, -1, grid_width) + 8; curr_height = max(curr_height, grid_size + grid_space + name_height); if(++cProg >= col) { @@ -599,16 +690,15 @@ event_inherited(); if(PREFERENCES.dialog_add_node_grouping) { var len = array_length(group_labels); - if(len) { + if(len && group_labels[0].y < 0) { gpu_set_blendmode(bm_subtract); draw_set_color(c_white); - draw_rectangle(0, 0, ww, ui(36), false); + draw_rectangle(0, 0, ww, _lbh + ui(12), false); gpu_set_blendmode(bm_normal); - content_hoverable &= !point_in_rectangle(_m[0], _m[1], 0, 0, ww, ui(36)); + content_hoverable &= !point_in_rectangle(_m[0], _m[1], 0, 0, ww, _lbh + ui(12)); } - var _lbh = ui(24); var _cAll = 0; for( var i = 0; i < len; i++ ) { @@ -617,28 +707,36 @@ event_inherited(); var _key = lb.key; var _coll = struct_try_get(collapsed, _key, 0); - var _yy = max(lb.y, i == len - 1? ui(8) : min(ui(8), group_labels[i + 1].y - ui(32))); + var _yy = max(lb.y, i == len - 1? ui(8) : min(ui(8), group_labels[i + 1].y - ui(32))); + var _hv = _hover && point_in_rectangle(_m[0], _m[1], 0, _yy, ww, _yy + _lbh); + var _tc = CDEF.main_ltgrey; BLEND_OVERRIDE; - if(_hover && point_in_rectangle(_m[0], _m[1], 0, _yy, ww, _yy + _lbh)) { - draw_sprite_stretched_ext(THEME.s_box_r5_clr, 0, ui(16), _yy, ww - ui(32), _lbh, COLORS.panel_inspector_group_hover, 1); - if(_focus) { - if(DOUBLE_CLICK) { - _cAll = _coll? -1 : 1; - - } else if(mouse_press(mb_left)) { - if(_coll) struct_set(collapsed, _key, 0); - else struct_set(collapsed, _key, 1); - } + if(PREFERENCES.dialog_add_node_grouping == 1) + draw_sprite_stretched_ext(THEME.s_box_r5_clr, 0, ui(16), _yy, ww - ui(32), _lbh, _hv? COLORS.panel_inspector_group_hover : COLORS.panel_inspector_group_bg, 1); + else { + draw_set_color(COLORS.panel_bg_clear_inner); + draw_rectangle(ui(16), _yy, ww - ui(16), _yy + _lbh, false); + } + + if(_hv && _focus) { + if(PREFERENCES.dialog_add_node_grouping == 2) _tc = CDEF.main_mdwhite; + + if(DOUBLE_CLICK) { + _cAll = _coll? -1 : 1; + MOUSE_BLOCK = 2; + + } else if(mouse_press(mb_left)) { + if(_coll) struct_set(collapsed, _key, 0); + else struct_set(collapsed, _key, 1); } + } - } else - draw_sprite_stretched_ext(THEME.s_box_r5_clr, 0, ui(16), _yy, ww - ui(32), _lbh, COLORS.panel_inspector_group_bg, 1); BLEND_NORMAL; - draw_sprite_ui(THEME.arrow, _coll? 0 : 3, ui(16 + 16), _yy + _lbh / 2, 1, 1, 0, CDEF.main_ltgrey, 1); + draw_sprite_ui(THEME.arrow, _coll? 0 : 3, ui(16 + 16), _yy + _lbh / 2, 1, 1, 0, _tc, 1); - draw_set_text(f_p2, fa_left, fa_center, CDEF.main_ltgrey); + draw_set_text(f_p2, fa_left, fa_center, _tc); draw_text_add(ui(16 + 28), _yy + _lbh / 2, _name); } @@ -658,7 +756,7 @@ event_inherited(); } else if(PREFERENCES.dialog_add_node_view == 1) { // list var list_width = ww; var list_height = display_list_size; - var yy = _y + list_height / 2; + var yy = _y + ui(12); var bg_ind = 0; hh += list_height; @@ -671,25 +769,25 @@ event_inherited(); } if(is_string(_node)) { - if(!PREFERENCES.dialog_add_node_grouping) - continue; + if(PREFERENCES.dialog_add_node_grouping == 0) continue; + if(PREFERENCES.dialog_add_node_grouping == 1 && string_starts_with(_node, "/")) continue; - hh += ui(4) * (i > 0); - yy += ui(4) * (i > 0); + hh += ui(8) * (i > 0); + yy += ui(8) * (i > 0); var _key = $"{ADD_NODE_PAGE}:{i}"; - array_push(group_labels, { y: yy, text: __txt(_node), key: _key }); + array_push(group_labels, { y: yy, text: string_trim_start(__txt(_node), ["/"]), key: _key }); if(struct_try_get(collapsed, _key, 0)) { - hh += ui(24); - yy += ui(24); + hh += _lbh + ui(0); + yy += _lbh + ui(0); while(i + 1 < node_count && !is_string(_list[| i + 1])) i++; } else { - hh += ui(32); - yy += ui(32); + hh += _lbh + ui(8); + yy += _lbh + ui(8); } continue; } @@ -698,24 +796,19 @@ event_inherited(); if(++bg_ind % 2) { BLEND_OVERRIDE; - draw_sprite_stretched_ext(THEME.node_bg, 0, ui(16), yy, list_width - ui(32), list_height, c_white, 0.1); + draw_sprite_stretched_add(THEME.node_bg, 0, ui(16), yy, list_width - ui(32), list_height, c_white, 0.1); BLEND_NORMAL; } if(_hoverContent && point_in_rectangle(_m[0], _m[1], 0, yy, list_width, yy + list_height - 1)) { content_pane.hover_content = true; - if(_node.getTooltip() != "" || _node.tooltip_spr != noone) { - node_tooltip = _node; - node_tooltip_x = content_pane.x + ui(16); - node_tooltip_y = content_pane.y + yy - } - draw_sprite_stretched_ext(THEME.node_bg, 1, ui(16), yy, list_width - ui(32), list_height, COLORS._main_accent, 1); - if(mouse_release(mb_left, sFOCUS)) - buildNode(_node); - else if(mouse_release(mb_right, right_free && sFOCUS)) - rightClick(_node); + + if(sFOCUS) { + if(mouse_release(mb_left)) buildNode(_node); + else if(mouse_release(mb_right, right_free)) rightClick(_node); + } } var tx = list_height + ui(52); @@ -738,6 +831,21 @@ event_inherited(); draw_set_text(f_p2, fa_left, fa_center, COLORS._main_text); draw_text_add(tx, yy + list_height / 2, _node.getName()); + + tx += string_width(_node.getName()); + } + + var _hinfo = _hoverContent && point_in_circle(_m[0], _m[1], tx + ui(12), yy + list_height / 2, list_height / 2); + if(_node.getTooltip() != "" || _node.tooltip_spr != noone) { + gpu_set_tex_filter(true); + draw_sprite_ui_uniform(THEME.info, 0, tx + ui(12), yy + list_height / 2, 0.7, COLORS._main_icon, .5 + _hinfo * .25); + gpu_set_tex_filter(false); + + if(_hinfo) { + node_tooltip = _node; + node_tooltip_x = content_pane.x + ui(16); + node_tooltip_y = content_pane.y + yy + } } yy += list_height; @@ -746,16 +854,15 @@ event_inherited(); if(PREFERENCES.dialog_add_node_grouping) { var len = array_length(group_labels); - if(len) { + if(len && group_labels[0].y < 0) { gpu_set_blendmode(bm_subtract); draw_set_color(c_white); - draw_rectangle(0, 0, ww, ui(36), false); + draw_rectangle(0, 0, ww, _lbh + ui(12), false); gpu_set_blendmode(bm_normal); - content_hoverable &= !point_in_rectangle(_m[0], _m[1], 0, 0, ww, ui(36)); + content_hoverable &= !point_in_rectangle(_m[0], _m[1], 0, 0, ww, _lbh + ui(12)); } - var _lbh = ui(24); var _cAll = 0; for( var i = 0; i < len; i++ ) { @@ -763,28 +870,37 @@ event_inherited(); var _name = lb.text; var _key = lb.key; var _coll = struct_try_get(collapsed, _key, 0); + var _yy = max(lb.y, i == len - 1? ui(8) : min(ui(8), group_labels[i + 1].y - ui(32))); - + var _hv = _hover && point_in_rectangle(_m[0], _m[1], 0, _yy, ww, _yy + _lbh); + var _tc = CDEF.main_ltgrey; + BLEND_OVERRIDE; - if(_hover && point_in_rectangle(_m[0], _m[1], 0, _yy, ww, _yy + _lbh)) { - draw_sprite_stretched_ext(THEME.s_box_r5_clr, 0, ui(16), _yy, ww - ui(32), _lbh, COLORS.panel_inspector_group_hover, 1); - if(_focus) { - if(DOUBLE_CLICK) { - _cAll = _coll? -1 : 1; - - } else if(mouse_press(mb_left)) { - if(_coll) struct_set(collapsed, _key, 0); - else struct_set(collapsed, _key, 1); - } + if(PREFERENCES.dialog_add_node_grouping == 1) + draw_sprite_stretched_ext(THEME.s_box_r5_clr, 0, ui(16), _yy, ww - ui(32), _lbh, _hv? COLORS.panel_inspector_group_hover : COLORS.panel_inspector_group_bg, 1); + else { + draw_set_color(COLORS.panel_bg_clear_inner); + draw_rectangle(ui(16), _yy, ww - ui(16), _yy + _lbh, false); + } + + if(_hv && _focus) { + if(PREFERENCES.dialog_add_node_grouping == 2) _tc = CDEF.main_mdwhite; + + if(DOUBLE_CLICK) { + _cAll = _coll? -1 : 1; + MOUSE_BLOCK = 2; + + } else if(mouse_press(mb_left)) { + if(_coll) struct_set(collapsed, _key, 0); + else struct_set(collapsed, _key, 1); } + } - } else - draw_sprite_stretched_ext(THEME.s_box_r5_clr, 0, ui(16), _yy, ww - ui(32), _lbh, COLORS.panel_inspector_group_bg, 1); BLEND_NORMAL; - draw_sprite_ui(THEME.arrow, _coll? 0 : 3, ui(16 + 16), _yy + _lbh / 2, 1, 1, 0, CDEF.main_ltgrey, 1); + draw_sprite_ui(THEME.arrow, _coll? 0 : 3, ui(16 + 16), _yy + _lbh / 2, 1, 1, 0, _tc, 1); - draw_set_text(f_p2, fa_left, fa_center, CDEF.main_ltgrey); + draw_set_text(f_p2, fa_left, fa_center, _tc); draw_text_add(ui(16 + 28), _yy + _lbh / 2, _name); } @@ -799,23 +915,17 @@ event_inherited(); } } - if(ADD_NODE_PAGE == -2) - ds_list_destroy(_list); + ds_list_destroy(_list); return hh; }); - function setPage(pageIndex) { - ADD_NODE_PAGE = min(pageIndex, ds_list_size(category) - 1); - node_list = pageIndex < 0? noone : category[| ADD_NODE_PAGE].list; - } - if(PREFERENCES.add_node_remember) { content_pane.scroll_y_raw = ADD_NODE_SCROLL; content_pane.scroll_y_to = ADD_NODE_SCROLL; } else ADD_NODE_PAGE = 0; - + setPage(ADD_NODE_PAGE); #endregion @@ -829,9 +939,8 @@ event_inherited(); onResize = function() { var _ch = dialog_h - ui(66); - catagory_pane.resize( category_width, _ch); - content_pane.resize( dialog_w - category_width - ui(36), _ch); - search_pane.resize( dialog_w - ui(36), _ch); + catagory_pane.resize(category_width, _ch); + search_pane.resize(dialog_w - ui(36), _ch); PREFERENCES.dialog_add_node_w = dialog_w; PREFERENCES.dialog_add_node_h = dialog_h; diff --git a/objects/o_dialog_add_node/Destroy_0.gml b/objects/o_dialog_add_node/Destroy_0.gml index 57c5dc646..ce3784604 100644 --- a/objects/o_dialog_add_node/Destroy_0.gml +++ b/objects/o_dialog_add_node/Destroy_0.gml @@ -1,4 +1,5 @@ /// @description event_inherited(); +ds_list_destroy(node_list); WIDGET_CURRENT = noone; \ No newline at end of file diff --git a/objects/o_dialog_add_node/Draw_64.gml b/objects/o_dialog_add_node/Draw_64.gml index b91e56263..7164ac3bb 100644 --- a/objects/o_dialog_add_node/Draw_64.gml +++ b/objects/o_dialog_add_node/Draw_64.gml @@ -20,10 +20,26 @@ if !ready exit; catagory_pane.setFocusHover(sFOCUS, sHOVER); catagory_pane.draw(dialog_x + ui(12), sy); - var _x = dialog_x + category_width + ui(16); - draw_sprite_stretched(THEME.ui_panel_bg, 1, _x, sy, dialog_w - category_width - ui(30), dialog_h - ui(66)); + var _x = dialog_x + category_width + ui(20); + draw_sprite_stretched(THEME.ui_panel_bg, 1, _x, sy, dialog_w - category_width - ui(34), dialog_h - ui(66)); + + var _content_w = dialog_w - category_width - ui(40); + var _content_h = dialog_h - ui(66); + var _content_x = _x; + + if(PREFERENCES.dialog_add_node_grouping == 2 && !array_empty(subgroups)) { + var _subw = ui(128); + _content_w -= _subw; + _content_x += _subw; + + subcatagory_pane.verify(_subw, _content_h); + subcatagory_pane.setFocusHover(sFOCUS, sHOVER); + subcatagory_pane.draw(_x, sy); + } + + content_pane.verify(_content_w, _content_h); content_pane.setFocusHover(sFOCUS, sHOVER); - content_pane.draw(_x, sy); + content_pane.draw(_content_x, sy); node_selecting = 0; @@ -39,20 +55,17 @@ if !ready exit; tb_search.draw(tx, ty, tw, th, search_string, mouse_ui); + view_tooltip.index = PREFERENCES.dialog_add_node_view; + group_tooltip.index = PREFERENCES.dialog_add_node_grouping; + var bx = dialog_x + dialog_w - ui(44); var by = dialog_y + ui(16); - var b = buttonInstant(THEME.button_hide, bx, by, ui(28), ui(28), mouse_ui, sHOVER, sFOCUS, - PREFERENCES.dialog_add_node_view? __txtx("view_list", "List view") : __txtx("view_grid", "Grid view"), - THEME.view_mode, PREFERENCES.dialog_add_node_view, COLORS._main_icon); - if(b == 2) - PREFERENCES.dialog_add_node_view = !PREFERENCES.dialog_add_node_view; + var b = buttonInstant(THEME.button_hide, bx, by, ui(28), ui(28), mouse_ui, sHOVER, sFOCUS, view_tooltip, THEME.view_mode, PREFERENCES.dialog_add_node_view, COLORS._main_icon); + if(b == 2) PREFERENCES.dialog_add_node_view = (PREFERENCES.dialog_add_node_view + 1) % 2; bx -= ui(32); - var b = buttonInstant(THEME.button_hide, bx, by, ui(28), ui(28), mouse_ui, sHOVER, sFOCUS, - PREFERENCES.dialog_add_node_grouping? __txtx("add_node_group_enabled", "Group enabled") : __txtx("add_node_group_disabled", "Group disabled"), - THEME.view_group, PREFERENCES.dialog_add_node_grouping, COLORS._main_icon); - if(b == 2) - PREFERENCES.dialog_add_node_grouping = !PREFERENCES.dialog_add_node_grouping; + var b = buttonInstant(THEME.button_hide, bx, by, ui(28), ui(28), mouse_ui, sHOVER, sFOCUS, group_tooltip, THEME.view_group, PREFERENCES.dialog_add_node_grouping, COLORS._main_icon); + if(b == 2) PREFERENCES.dialog_add_node_grouping = (PREFERENCES.dialog_add_node_grouping + 1) % 3; if(node_called != noone || junction_hovering != noone) { var txt = node_show_connectable? __txtx("add_node_show_connect", "Showing connectable") : __txtx("add_node_show_all", "Showing all"); diff --git a/scripts/node_mk_flare/node_mk_flare.gml b/scripts/node_mk_flare/node_mk_flare.gml index 8431cde5f..c91eb0c96 100644 --- a/scripts/node_mk_flare/node_mk_flare.gml +++ b/scripts/node_mk_flare/node_mk_flare.gml @@ -23,7 +23,6 @@ function __FlarePart(_type = FLARE_TYPE.circle, _t = 0, _r = 4, _a = 0.5, _seg = function Node_MK_Flare(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) constructor { name = "MK Lens Flare"; - batch_output = false; newInput(0, nodeValue_Surface("Background", self)); @@ -89,7 +88,7 @@ function Node_MK_Flare(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) triggerRender(); } - flare_builder = new Inspector_Custom_Renderer(function(_x, _y, _w, _m, _hover, _focus) { #region + flare_builder = new Inspector_Custom_Renderer(function(_x, _y, _w, _m, _hover, _focus) { var _flares = inputs[5].getValue(); var _amo = array_length(_flares); @@ -104,6 +103,7 @@ function Node_MK_Flare(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) if(flare_editing != noone) { var _flare = _flares[flare_editing]; + CURSOR = cr_size_we; switch(flare_editing_prop) { case "type" : @@ -116,7 +116,9 @@ function Node_MK_Flare(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) if(!struct_has(_flare, "ir")) _flare.ir = 1; if(!struct_has(_flare, "ratio")) _flare.ratio = 1; } + CURSOR = cr_size_all; break; + case "t" : _flare.t = flare_editing_sx + (_m[0] - flare_editing_mx) / 64; if(abs(_flare.t - round(_flare.t * 10) / 10) < 0.02) _flare.t = round(_flare.t * 10) / 10; break; case "r" : _flare.r = flare_editing_sx + (_m[0] - flare_editing_mx) / 64; if(abs(_flare.r - round(_flare.r)) < 0.2) _flare.r = round(_flare.r); break; case "seg" : _flare.seg = round(flare_editing_sx + (_m[0] - flare_editing_mx) / 32); break; @@ -127,7 +129,6 @@ function Node_MK_Flare(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) case "ir" : _flare.ir = flare_editing_sx + (_m[0] - flare_editing_mx) / 64; if(abs(_flare.ir - round(_flare.ir )) < 0.2) _flare.ir = round(_flare.ir ); break; } - CURSOR = cr_size_we; triggerRender(); if(mouse_release(mb_left)) @@ -175,7 +176,7 @@ function Node_MK_Flare(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) var _hov = __frame(_ffx, _ffy, _ffw, _ffh, _m, _hover); draw_sprite_stretched_ext(THEME.ui_panel, 0, _ffx, _ffy, _ffw * clamp(_flare.t, 0., 2.) / 2, _ffh, CDEF.main_dkgrey, 1); - draw_text(_ffx + _ffw / 2, _ffy + _ffh / 2, string(_flare.t)); + draw_text_add(_ffx + _ffw / 2, _ffy + _ffh / 2, string(_flare.t)); if(_hov && mouse_press(mb_left, _focus)) { flare_editing = i; flare_editing_prop = "t"; @@ -185,7 +186,7 @@ function Node_MK_Flare(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) _ffx += _ffw + ui(4); var _hov = __frame(_ffx, _ffy, _ffw, _ffh, _m, _hover); - draw_text(_ffx + _ffw / 2, _ffy + _ffh / 2, string(_flare.r)); + draw_text_add(_ffx + _ffw / 2, _ffy + _ffh / 2, string(_flare.r)); if(_hov && mouse_press(mb_left, _focus)) { flare_editing = i; flare_editing_prop = "r"; @@ -200,7 +201,7 @@ function Node_MK_Flare(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) draw_polygon(_ffx + _ffw / 2, _ffy + _ffh / 2, _ffh / 2 - ui(2), _flare.seg); draw_set_color(COLORS._main_text); - draw_text(_ffx + _ffw / 2, _ffy + _ffh / 2, string(_flare.seg)); + draw_text_add(_ffx + _ffw / 2, _ffy + _ffh / 2, string(_flare.seg)); if(_hov && mouse_press(mb_left, _focus)) { flare_editing = i; flare_editing_prop = "seg"; @@ -212,8 +213,8 @@ function Node_MK_Flare(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) _ffw = ui(80); var _hov = __frame(_ffx, _ffy, _ffw, _ffh, _m, _hover); draw_sprite_stretched_ext(THEME.ui_panel, 0, _ffx + _ffw * _flare.shade[0], _ffy, _ffw * (_flare.shade[1] - _flare.shade[0]), _ffh, CDEF.main_dkgrey, 1); - draw_text(_ffx + _ffw / 4, _ffy + _ffh / 2, string(_flare.shade[0])); - draw_text(_ffx + _ffw / 4 * 3, _ffy + _ffh / 2, string(_flare.shade[1])); + draw_text_add(_ffx + _ffw / 4, _ffy + _ffh / 2, string(_flare.shade[0])); + draw_text_add(_ffx + _ffw / 4 * 3, _ffy + _ffh / 2, string(_flare.shade[1])); if(_hov && mouse_press(mb_left, _focus)) { flare_editing = i; flare_editing_prop = _m[0] < _ffx + _ffw / 2? "r0" : "r1"; @@ -227,8 +228,8 @@ function Node_MK_Flare(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) case FLARE_TYPE.line : _ffw = ui(80); var _hov = __frame(_ffx, _ffy, _ffw, _ffh, _m, _hover); - draw_text(_ffx + _ffw / 4, _ffy + _ffh / 2, string(_flare.th[0])); - draw_text(_ffx + _ffw / 4 * 3, _ffy + _ffh / 2, string(_flare.th[1])); + draw_text_add(_ffx + _ffw / 4, _ffy + _ffh / 2, string(_flare.th[0])); + draw_text_add(_ffx + _ffw / 4 * 3, _ffy + _ffh / 2, string(_flare.th[1])); if(_hov && mouse_press(mb_left, _focus)) { flare_editing = i; flare_editing_prop = _m[0] < _ffx + _ffw / 2? "th0" : "th1"; @@ -241,7 +242,7 @@ function Node_MK_Flare(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) case FLARE_TYPE.star : _ffw = ui(40); var _hov = __frame(_ffx, _ffy, _ffw, _ffh, _m, _hover); - draw_text(_ffx + _ffw / 2, _ffy + _ffh / 2, string(_flare.ir)); + draw_text_add(_ffx + _ffw / 2, _ffy + _ffh / 2, string(_flare.ir)); if(_hov && mouse_press(mb_left, _focus)) { flare_editing = i; flare_editing_prop = "ir"; @@ -296,7 +297,7 @@ function Node_MK_Flare(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) } return _h; - }); #endregion + }); input_display_list = [ new Inspector_Sprite(s_MKFX), ["Surfaces", false], 0, 2, @@ -360,7 +361,7 @@ function Node_MK_Flare(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) BLEND_ADD draw_surface_ext(temp_surface[0], _x - _r, _y - _r, 1, 1, 0, _b, _a); } - static flare_crescent = function(_t, _r, _a, _side = 16, _angle = 0, _s0 = 0, _s1 = 0, _b = c_white, _ir = 0, _dist = 0) { #region + static flare_crescent = function(_t, _r, _a, _side = 16, _angle = 0, _s0 = 0, _s1 = 0, _b = c_white, _ir = 0, _dist = 0) { var _x = lerp(ox, cx, _t); var _y = lerp(oy, cy, _t); @@ -380,9 +381,9 @@ function Node_MK_Flare(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) surface_reset_shader(); BLEND_ADD draw_surface_ext(temp_surface[0], _x - _r, _y - _r, 1, 1, 0, _b, _a); - } #endregion + } - static flare_ring = function(_t, _r, _a, _side = 16, _angle = 0, _s0 = 0, _s1 = 0, _b = c_white, _th = 1) { #region + static flare_ring = function(_t, _r, _a, _side = 16, _angle = 0, _s0 = 0, _s1 = 0, _b = c_white, _th = 1) { var _x = lerp(ox, cx, _t); var _y = lerp(oy, cy, _t); @@ -421,9 +422,9 @@ function Node_MK_Flare(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) surface_reset_shader(); BLEND_ADD draw_surface_ext(temp_surface[0], _x - _r, _y - _r, 1, 1, 0, _b, _a); - } #endregion + } - static flare_star = function(_t, _r, _a, _side = 16, _angle = 0, _s0 = 0, _s1 = 1, _b = c_white, _ir = 0, _rt = 1) { #region + static flare_star = function(_t, _r, _a, _side = 16, _angle = 0, _s0 = 0, _s1 = 1, _b = c_white, _ir = 0, _rt = 1) { var _x = lerp(ox, cx, _t); var _y = lerp(oy, cy, _t); @@ -454,9 +455,9 @@ function Node_MK_Flare(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) surface_reset_shader(); BLEND_ADD draw_surface_ext(temp_surface[0], _x - _r, _y - _r, 1, 1, 0, _b, _a); - } #endregion + } - static flare_line = function(_r, _a, _th, _dir, _b = c_white) { #region + static flare_line = function(_r, _a, _th, _dir, _b = c_white) { var _x = cx; var _y = cy; @@ -496,10 +497,9 @@ function Node_MK_Flare(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) surface_reset_shader(); BLEND_ADD draw_surface_ext(temp_surface[0], _x - _r, _y - _r, 1, 1, 0, _b, _a); - } #endregion + } - static processData = function(_outSurf, _data, _output_index, _array_index) { #region - if(_output_index == 1) return flares[_array_index]; + static processData = function(_outData, _data, _output_index, _array_index) { var _surf = _data[0]; var _origin = _data[1]; @@ -514,8 +514,8 @@ function Node_MK_Flare(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) var _sw = _bg? surface_get_width_safe(_surf) : _dim[0]; var _sh = _bg? surface_get_height_safe(_surf) : _dim[1]; - _outSurf = surface_verify(_outSurf, _sw, _sh); - flares[_array_index] = surface_verify(array_safe_get_fast(flares, _array_index), _sw, _sh); + var _outSurf = surface_verify(_outData[0], _sw, _sh); + var flareSurf = surface_verify(_outData[1], _sw, _sh); ox = _origin[0]; oy = _origin[1]; @@ -527,7 +527,7 @@ function Node_MK_Flare(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) var _x, _y; - surface_set_target(flares[_array_index]); + surface_set_target(flareSurf); draw_clear_alpha(c_black, 0); for( var i = 0, n = array_length(_flares); i < n; i++ ) { @@ -567,19 +567,20 @@ function Node_MK_Flare(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) surface_reset_target(); surface_set_target(_outSurf); - draw_clear_alpha(c_white, 0); if(_bg) { + draw_clear_alpha(c_black, 0); BLEND_OVERRIDE - draw_surface_safe(_surf); - } + draw_surface_safe(_surf); + } else + draw_clear_alpha(c_black, 1); BLEND_ADD - draw_surface_safe(flares[_array_index]); + draw_surface_safe(flareSurf); BLEND_NORMAL surface_reset_target(); - return _outSurf; - } #endregion -} \ No newline at end of file + return _outData; + } +} diff --git a/scripts/node_registry/node_registry.gml b/scripts/node_registry/node_registry.gml index 0e64e7db1..42f86d902 100644 --- a/scripts/node_registry/node_registry.gml +++ b/scripts/node_registry/node_registry.gml @@ -120,7 +120,7 @@ function NodeObject(_name, _spr, _node, _create, tooltip = "", tags = []) constr var _spw = sprite_get_width(spr); var _sph = sprite_get_height(spr); - var _ss = grid_size / max(_spw, _sph) * 0.6; + var _ss = grid_size / max(_spw, _sph) * 0.75; gpu_set_tex_filter(true); draw_sprite_uniform(spr, 0, spr_x, spr_y, _ss); @@ -220,6 +220,8 @@ function NodeObject(_name, _spr, _node, _create, tooltip = "", tags = []) constr draw_sprite_ext(s_patreon_supporter, 1, spr_x, spr_y, 1, 1, 0, COLORS._main_accent, 1); if(point_in_circle(_mx, _my, spr_x, spr_y, 10)) TOOLTIP = __txt("Supporter exclusive"); + + tx += ui(16); } return tx; @@ -516,14 +518,19 @@ function __initNodes() { var input = ds_list_create(); addNodeCatagory("IO", input); ds_list_add(input, "Images"); + ds_list_add(input, "/Importers"); addNodeObject(input, "Image", s_node_image, "Node_Image", [0, Node_create_Image],, "Load a single image from your computer."); addNodeObject(input, "Image GIF", s_node_image_gif, "Node_Image_gif", [0, Node_create_Image_gif],, "Load animated .gif from your computer."); - addNodeObject(input, "Splice Spritesheet", s_node_image_sheet, "Node_Image_Sheet", [1, Node_Image_Sheet],, "Cut up spritesheet into animation or image array."); addNodeObject(input, "Image Array", s_node_image_sequence, "Node_Image_Sequence", [0, Node_create_Image_Sequence],, "Load multiple images from your computer as array."); addNodeObject(input, "Animation", s_node_image_animation, "Node_Image_Animated", [0, Node_create_Image_Animated],, "Load multiple images from your computer as animation."); - addNodeObject(input, "Array to Anim", s_node_image_sequence_to_anim, "Node_Sequence_Anim", [1, Node_Sequence_Anim],, "Convert array of images into animation."); addNodeObject(input, "SVG", s_node_svg, "Node_SVG", [1, Node_SVG],, "Load a SVG file."); - if(!DEMO) addNodeObject(input, "Export", s_node_export, "Node_Export", [0, Node_create_Export],, "Export image, image array to file, image sequence, animation."); + ds_list_add(input, "/Converters"); + addNodeObject(input, "Splice Spritesheet", s_node_image_sheet, "Node_Image_Sheet", [1, Node_Image_Sheet],, "Cut up spritesheet into animation or image array."); + addNodeObject(input, "Array to Anim", s_node_image_sequence_to_anim, "Node_Sequence_Anim", [1, Node_Sequence_Anim],, "Convert array of images into animation."); + if(!DEMO) { + ds_list_add(input, "/Exporters"); + addNodeObject(input, "Export", s_node_export, "Node_Export", [0, Node_create_Export],, "Export image, image array to file, image sequence, animation."); + } ds_list_add(input, "Canvas"); addNodeObject(input, "Canvas", s_node_canvas, "Node_Canvas", [1, Node_Canvas], ["draw"], "Draw on surface using brush, eraser, etc."); @@ -531,11 +538,13 @@ function __initNodes() { addNodeObject(input, "Active Canvas", s_node_active_canvas, "Node_Active_Canvas", [1, Node_Active_Canvas], ["draw"], "Draw using parameterized brush.").setVersion(11570); ds_list_add(input, "Tileset"); + ds_list_add(input, "/Creators"); addNodeObject(input, "Tileset", s_node_tileset, "Node_Tile_Tileset", [1, Node_Tile_Tileset],, "Create tileset object.").setVersion(1_18_03_0); addNodeObject(input, "Tile Drawer", s_node_tileset_drawer, "Node_Tile_Drawer", [1, Node_Tile_Drawer],, "Draw using tileset.").setVersion(1_18_03_0); addNodeObject(input, "Tile Rule", s_node_tileset_rule, "Node_Tile_Rule", [1, Node_Tile_Rule],, "Apply tileset rules.").setVersion(1_18_03_0); + addNodeObject(input, "Convert to Tilemap", s_node_tileset_convert, "Node_Tile_Convert", [1, Node_Tile_Convert],, "Convert color image to tile data.").setVersion(1_18_03_0); + ds_list_add(input, "/Exporters"); addNodeObject(input, "Render Tilemap", s_node_tileset_render, "Node_Tile_Render", [1, Node_Tile_Render],, "Render tilemap to image.").setVersion(1_18_03_0); - addNodeObject(input, "Convert to Tilemap", s_node_tileset_convert, "Node_Tile_Convert", [1, Node_Tile_Convert],, "Render tilemap to image.").setVersion(1_18_03_0); addNodeObject(input, "Export Tilemap", s_node_tileset_export, "Node_Tile_Tilemap_Export", [1, Node_Tile_Tilemap_Export],, "Export tilemap to file.").setVersion(1_18_03_0); ds_list_add(input, "Files"); @@ -572,16 +581,18 @@ function __initNodes() { #region transform var transform = ds_list_create(); addNodeCatagory("Transform", transform); - ds_list_add(transform, "Transformations"); + ds_list_add(transform, "Transforms"); addNodeObject(transform, "Transform", s_node_transform, "Node_Transform", [1, Node_Transform], ["move", "rotate", "scale"], "Move, rotate, and scale image."); addNodeObject(transform, "Scale", s_node_scale, "Node_Scale", [1, Node_Scale], ["resize"], "Simple node for scaling image."); addNodeObject(transform, "Scale Algorithm", s_node_scale_algo, "Node_Scale_Algo", [0, Node_create_Scale_Algo], ["scale2x", "scale3x", "cleanedge"], "Scale image using pixel-art scaling algorithm."); addNodeObject(transform, "Flip", s_node_flip, "Node_Flip", [1, Node_Flip], ["mirror"], "Flip image horizontally or vertically."); addNodeObject(transform, "Offset", s_node_offset, "Node_Offset", [1, Node_Offset], ["shift"], "Shift image with tiling."); - ds_list_add(transform, "Warps"); + ds_list_add(transform, "Crops"); addNodeObject(transform, "Crop", s_node_crop, "Node_Crop", [1, Node_Crop],, "Crop out image to create smaller ones."); addNodeObject(transform, "Crop Content", s_node_crop_content, "Node_Crop_Content", [1, Node_Crop_Content],, "Crop out empty pixel from the image."); + + ds_list_add(transform, "Warps"); addNodeObject(transform, "Bend", s_node_bend, "Node_Bend", [1, Node_Bend], ["wrap"], "Warp an image into a predefined shape.").setVersion(11650); addNodeObject(transform, "Warp", s_node_warp, "Node_Warp", [1, Node_Warp], ["warp corner"], "Warp image by freely moving the corners."); // addNodeObject(transform, "Perspective Warp",s_node_warp, "Node_Warp_Perspective",[1, Node_Warp_Perspective], ["warp perspective"], "Warp image by modifying perspective."); @@ -609,91 +620,104 @@ function __initNodes() { addNodeObject(filter, "Override Channel", s_node_ovreride_channel, "Node_Override_Channel", [1, Node_Override_Channel],, "Replace RGBA value of one surface with another.").setVersion(11640); ds_list_add(filter, "Blurs"); + ds_list_add(filter, "/Kernel-based"); addNodeObject(filter, "Blur", s_node_blur, "Node_Blur", [1, Node_Blur], ["gaussian blur"], "Blur image smoothly."); addNodeObject(filter, "Non-Uniform Blur", s_node_blur_simple, "Node_Blur_Simple", [1, Node_Blur_Simple],, "Blur image using simpler algorithm. Allowing for variable blur strength.").setVersion(1070); addNodeObject(filter, "Directional Blur", s_node_blur_directional,"Node_Blur_Directional",[1, Node_Blur_Directional], ["motion blur"], "Blur image given a direction."); addNodeObject(filter, "Slope Blur", s_node_blur_slope, "Node_Blur_Slope", [1, Node_Blur_Slope], ["motion blur"], "Blur along a gradient of a slope map.").setVersion(11640); addNodeObject(filter, "Zoom Blur", s_node_zoom, "Node_Blur_Zoom", [1, Node_Blur_Zoom],, "Blur image by zooming in/out from a mid point."); addNodeObject(filter, "Radial Blur", s_node_radial, "Node_Blur_Radial", [1, Node_Blur_Radial],, "Blur image by rotating around a mid point.").setVersion(1110); - addNodeObject(filter, "Lens Blur", s_node_bokeh, "Node_Blur_Bokeh", [1, Node_Blur_Bokeh], ["bokeh"], "Create bokeh effect. Blur lighter color in a lens-like manner.").setVersion(1110); addNodeObject(filter, "Contrast Blur", s_node_blur_contrast, "Node_Blur_Contrast", [1, Node_Blur_Contrast],, "Blur only pixel of a similiar color."); addNodeObject(filter, "Shape Blur", s_node_shape_blur, "Node_Blur_Shape", [1, Node_Blur_Shape],, "Blur image using another image as blur map.").setVersion(11650); + addNodeObject(filter, "High Pass", s_node_high_pass, "Node_High_Pass", [1, Node_High_Pass], ["sharpen"], "Apply high pass filter").setVersion(1_18_01_0); + ds_list_add(filter, "/Analytic"); + addNodeObject(filter, "Lens Blur", s_node_bokeh, "Node_Blur_Bokeh", [1, Node_Blur_Bokeh], ["bokeh"], "Create bokeh effect. Blur lighter color in a lens-like manner.").setVersion(1110); addNodeObject(filter, "Path Blur", s_node_blur_path, "Node_Blur_Path", [1, Node_Blur_Path],, "Blur pixel along path.").setVersion(11750); addNodeObject(filter, "Average", s_node_average, "Node_Average", [1, Node_Average],, "Average color of every pixels in the image.").setVersion(1110); addNodeObject(filter, "Smear", s_node_smear, "Node_Smear", [1, Node_Smear],, "Stretch out brighter pixel in one direction.").setVersion(11670); + ds_list_add(filter, "/Artistics"); addNodeObject(filter, "Kuwahara", s_node_kuwahara, "Node_Kuwahara", [1, Node_Kuwahara],, "Apply Kuwahara filter. Creating a watercolor-like effect.").setVersion(11660); - addNodeObject(filter, "High Pass", s_node_high_pass, "Node_High_Pass", [1, Node_High_Pass], ["sharpen"], "Apply high pass filter").setVersion(1_18_01_0); addNodeObject(filter, "Brush", s_node_brush_linear, "Node_Brush_Linear", [1, Node_Brush_Linear],, "Apply brush effect.").patreonExtra(); ds_list_add(filter, "Warps"); + ds_list_add(filter, "/Effects"); addNodeObject(filter, "Mirror", s_node_mirror, "Node_Mirror", [1, Node_Mirror],, "Reflect the image along a reflection line.").setVersion(1070); addNodeObject(filter, "Twirl", s_node_twirl, "Node_Twirl", [1, Node_Twirl], ["twist"], "Twist the image around a mid point."); addNodeObject(filter, "Dilate", s_node_dilate, "Node_Dilate", [1, Node_Dilate], ["inflate"], "Expand the image around a mid point."); addNodeObject(filter, "Spherize", s_node_spherize, "Node_Spherize", [1, Node_Spherize],, "Wrap a texture on to sphere.").setVersion(11630); addNodeObject(filter, "Displace", s_node_displace, "Node_Displace", [1, Node_Displace], ["distort"], "Distort image using another image as a map."); + addNodeObject(filter, "Morph Surface", s_node_morph_surface, "Node_Morph_Surface", [1, Node_Morph_Surface],, "Morph pixel between two surfaces.").setVersion(1141); + addNodeObject(filter, "Liquefy", s_node_liquefy, "Node_Liquefy", [1, Node_Liquefy],, "Distort image using variety of tools.").setVersion(1_18_02_0); + ds_list_add(filter, "/Mappers"); addNodeObject(filter, "Texture Remap", s_node_texture_map, "Node_Texture_Remap", [1, Node_Texture_Remap],, "Remap image using texture map. Where red channel control x position and green channel control y position."); addNodeObject(filter, "Time Remap", s_node_time_map, "Node_Time_Remap", [1, Node_Time_Remap],, "Remap image using texture as time map. Where brighter pixel means using pixel from an older frame."); addNodeObject(filter, "Shape Map", s_node_shape_map, "Node_Shape_Map", [1, Node_Shape_Map],, "Map image into shapes.").setVersion(11660); - addNodeObject(filter, "Morph Surface", s_node_morph_surface, "Node_Morph_Surface", [1, Node_Morph_Surface],, "Morph pixel between two surfaces.").setVersion(1141); - addNodeObject(filter, "Liquefy", s_node_liquefy, "Node_Liquefy", [1, Node_Liquefy],, "Distort image using variety of tools.").setVersion(1_18_02_0); ds_list_add(filter, "Effects"); + ds_list_add(filter, "/Basics"); addNodeObject(filter, "Outline", s_node_border, "Node_Outline", [1, Node_Outline], ["border"], "Add border to the image."); addNodeObject(filter, "Glow", s_node_glow, "Node_Glow", [1, Node_Glow],, "Apply glow to the border of the image."); addNodeObject(filter, "Shadow", s_node_shadow, "Node_Shadow", [1, Node_Shadow],, "Apply shadow behind the image."); + addNodeObject(filter, "Blobify", s_node_blobify, "Node_Blobify", [1, Node_Blobify],, "Round off sharp corner in BW image by bluring and thresholding.").setVersion(11650); + addNodeObject(filter, "SDF", s_node_sdf, "Node_SDF", [1, Node_SDF],, "Create signed distance field using jump flooding algorithm.").setVersion(1130); + addNodeObject(filter, "Replace Image", s_node_image_replace, "Node_Surface_Replace", [1, Node_Surface_Replace], ["image replace"], "Replace instances of an image with a new one.").setVersion(1140); + ds_list_add(filter, "/Post Processing"); addNodeObject(filter, "Bloom", s_node_bloom, "Node_Bloom", [1, Node_Bloom],, "Apply bloom effect, blurring and brighten the bright part of the image."); - addNodeObject(filter, "Trail", s_node_trail, "Node_Trail", [1, Node_Trail],, "Blend animation by filling in the pixel 'in-between' two or more frames.").setVersion(1130); + addNodeObject(filter, "Blend Edge", s_node_blend_edge, "Node_Blend_Edge", [1, Node_Blend_Edge],, "Blend the edges of an image to create tilable patterns.").setVersion(11740); + addNodeObject(filter, "Chromatic Aberration",s_node_chromatic_abarration, "Node_Chromatic_Aberration", [1, Node_Chromatic_Aberration],, "Apply chromatic aberration effect to the image."); + addNodeObject(filter, "FXAA", s_node_FXAA, "Node_FXAA", [1, Node_FXAA], ["anti aliasing"], "Apply fast approximate anti-aliasing to te image."); + addNodeObject(filter, "Vignette", s_node_vignette, "Node_Vignette", [1, Node_Vignette],, "Apply vignette effect to the border.").setVersion(11630); + addNodeObject(filter, "JPEG", s_node_JPEG, "Node_JPEG", [1, Node_JPEG],, "Apply JPEG compression to the image.").setVersion(11730); + addNodeObject(filter, "Grain", s_node_grain, "Node_Grain", [1, Node_Grain],, "Add noise pattern to the image.").setVersion(11770); + ds_list_add(filter, "/Convolutions"); + addNodeObject(filter, "Convolution", s_node_convolution, "Node_Convolution", [1, Node_Convolution], ["kernel"], "Apply convolution operation on each pixel using a custom 3x3 kernel.").setVersion(1090); + addNodeObject(filter, "Edge Detect", s_node_edge_detect, "Node_Edge_Detect", [1, Node_Edge_Detect],, "Edge detect by applying Sobel, Prewitt, or Laplacian kernel."); + addNodeObject(filter, "Local Analyze", s_node_local_analyze, "Node_Local_Analyze", [1, Node_Local_Analyze],, "Apply non-linear operation (minimum, maximum) on each pixel locally.").setVersion(1110); addNodeObject(filter, "Erode", s_node_erode, "Node_Erode", [1, Node_Erode],, "Remove pixel that are close to the border of the image."); addNodeObject(filter, "Round Corner", s_node_corner, "Node_Corner", [1, Node_Corner],, "Round out sharp corner of the image.").setVersion(1110); - addNodeObject(filter, "Blobify", s_node_blobify, "Node_Blobify", [1, Node_Blobify],, "Round off sharp corner in BW image by bluring and thresholding.").setVersion(11650); - addNodeObject(filter, "2D Light", s_node_2d_light, "Node_2D_light", [1, Node_2D_light],, "Apply different shaped light on the image."); - addNodeObject(filter, "Cast Shadow", s_node_shadow_cast, "Node_Shadow_Cast", [1, Node_Shadow_Cast], ["raycast"], "Apply light that create shadow using shadow mask.").setVersion(1100); + ds_list_add(filter, "/Pixel Operations"); + addNodeObject(filter, "Pixel Math", s_node_pixel_math, "Node_Pixel_Math", [0, Node_create_Pixel_Math], global.node_math_keys, "Apply mathematical operation directly on RGBA value.").setVersion(1_18_02_0); addNodeObject(filter, "Pixel Expand", s_node_atlas, "Node_Atlas", [1, Node_Atlas], ["atlas"], "Replace transparent pixel with the closest non-transparent pixel."); addNodeObject(filter, "Pixel Cloud", s_node_pixel_cloud, "Node_Pixel_Cloud", [1, Node_Pixel_Cloud],, "Displace each pixel of the image randomly."); addNodeObject(filter, "Pixel Sort", s_node_pixel_sort, "Node_Pixel_Sort", [1, Node_Pixel_Sort],, "Sort pixel by brightness in horizontal, or vertial axis."); - addNodeObject(filter, "Edge Detect", s_node_edge_detect, "Node_Edge_Detect", [1, Node_Edge_Detect],, "Edge detect by applying Sobel, Prewitt, or Laplacian kernel."); - addNodeObject(filter, "Convolution", s_node_convolution, "Node_Convolution", [1, Node_Convolution], ["kernel"], "Apply convolution operation on each pixel using a custom 3x3 kernel.").setVersion(1090); - addNodeObject(filter, "Local Analyze", s_node_local_analyze, "Node_Local_Analyze", [1, Node_Local_Analyze],, "Apply non-linear operation (minimum, maximum) on each pixel locally.").setVersion(1110); - addNodeObject(filter, "SDF", s_node_sdf, "Node_SDF", [1, Node_SDF],, "Create signed distance field using jump flooding algorithm.").setVersion(1130); - addNodeObject(filter, "Replace Image", s_node_image_replace, "Node_Surface_Replace", [1, Node_Surface_Replace], ["image replace"], "Replace instances of an image with a new one.").setVersion(1140); - addNodeObject(filter, "Chromatic Aberration",s_node_chromatic_abarration, "Node_Chromatic_Aberration", [1, Node_Chromatic_Aberration],, "Apply chromatic aberration effect to the image."); - addNodeObject(filter, "Vignette", s_node_vignette, "Node_Vignette", [1, Node_Vignette],, "Apply vignette effect to the border.").setVersion(11630); - addNodeObject(filter, "FXAA", s_node_FXAA, "Node_FXAA", [1, Node_FXAA], ["anti aliasing"], "Apply fast approximate anti-aliasing to te image."); - addNodeObject(filter, "JPEG", s_node_JPEG, "Node_JPEG", [1, Node_JPEG],, "Apply JPEG compression to the image.").setVersion(11730); - addNodeObject(filter, "Interlace", s_node_interlace, "Node_Interlaced", [1, Node_Interlaced],, "Apply interlace effect to an image.").setVersion(11760); - addNodeObject(filter, "Blend Edge", s_node_blend_edge, "Node_Blend_Edge", [1, Node_Blend_Edge],, "Blend the edges of an image to create tilable patterns.").setVersion(11740); - addNodeObject(filter, "Pixel Math", s_node_pixel_math, "Node_Pixel_Math", [0, Node_create_Pixel_Math], global.node_math_keys, "Apply mathematical operation directly on RGBA value.").setVersion(1_18_02_0); addNodeObject(filter, "Shuffle", s_node_shuffle, "Node_Shuffle", [1, Node_Shuffle],, "Shuffle image while keeping pixel colors.").setVersion(1_18_05_6); + ds_list_add(filter, "/Lights"); + addNodeObject(filter, "2D Light", s_node_2d_light, "Node_2D_light", [1, Node_2D_light],, "Apply different shaped light on the image."); + addNodeObject(filter, "Cast Shadow", s_node_shadow_cast, "Node_Shadow_Cast", [1, Node_Shadow_Cast], ["raycast"], "Apply light that create shadow using shadow mask.").setVersion(1100); + ds_list_add(filter, "/Animations"); + addNodeObject(filter, "Interlace", s_node_interlace, "Node_Interlaced", [1, Node_Interlaced],, "Apply interlace effect to an image.").setVersion(11760); + addNodeObject(filter, "Trail", s_node_trail, "Node_Trail", [1, Node_Trail],, "Blend animation by filling in the pixel 'in-between' two or more frames.").setVersion(1130); ds_list_add(filter, "Colors"); + ds_list_add(filter, "/Replacements"); addNodeObject(filter, "Replace Palette", s_node_replace_palette, "Node_Color_replace", [1, Node_Color_replace], ["isolate color", "select color", "palette swap", "color replace"], "Match image to a palette then remap it to another palette."); addNodeObject(filter, "Replace Colors", s_node_color_replace, "Node_Colors_Replace", [1, Node_Colors_Replace], ["isolate color", "select color", "palette swap", "color replace"], "Replace selected colors with a new one."); addNodeObject(filter, "Remove Color", s_node_color_remove, "Node_Color_Remove", [1, Node_Color_Remove], ["delete color"], "Remove color that match a palette."); + ds_list_add(filter, "/Colorizes"); addNodeObject(filter, "Colorize", s_node_colorize, "Node_Colorize", [1, Node_Colorize], ["recolor"], "Map brightness of a pixel to a color from a gradient."); addNodeObject(filter, "Posterize", s_node_posterize, "Node_Posterize", [1, Node_Posterize],, "Reduce and remap color to match a palette."); addNodeObject(filter, "Dither", s_node_dithering, "Node_Dither", [1, Node_Dither],, "Reduce color and use dithering to preserve original color."); addNodeObject(filter, "Error Diffuse Dither",s_node_error_diffuse, "Node_Dither_Diffuse", [1, Node_Dither_Diffuse],, "Dither image using error diffusion algorithm.").setVersion(1_18_05_1); - addNodeObject(filter, "Color Adjust", s_node_color_adjust, "Node_Color_adjust", [1, Node_Color_adjust], ["brightness", "contrast", "hue", "saturation", "value", "color blend", "alpha"], "Adjust brightness, contrast, hue, saturation, value, alpha, and blend image with color."); addNodeObject(filter, "Palette Shift", s_node_palette_shift, "Node_Palette_Shift", [1, Node_Palette_Shift],, "Shift the order of color in palette.").setVersion(1147); + ds_list_add(filter, "/Conversions"); addNodeObject(filter, "BW", s_node_BW, "Node_BW", [1, Node_BW], ["black and white"], "Convert color image to black and white."); addNodeObject(filter, "Greyscale", s_node_greyscale, "Node_Greyscale", [1, Node_Greyscale], ["grayscale"], "Convert color image to greyscale."); - addNodeObject(filter, "Invert", s_node_invert, "Node_Invert", [1, Node_Invert], ["negate"], "Invert color."); - addNodeObject(filter, "Level", s_node_level, "Node_Level", [1, Node_Level],, "Adjust brightness of an image by changing its brightness range."); - addNodeObject(filter, "Level Selector", s_node_level_selector, "Node_Level_Selector", [1, Node_Level_Selector],, "Isolate part of the image that falls in the selected brightness range."); - addNodeObject(filter, "Curve", s_node_curve_edit, "Node_Curve", [1, Node_Curve],, "Adjust brightness of an image using curves.").setVersion(1120); - addNodeObject(filter, "HSV Curve", s_node_curve_hsv, "Node_Curve_HSV", [1, Node_Curve_HSV],, "Adjust hsv values of an image using curves.").setVersion(11720); - addNodeObject(filter, "Threshold", s_node_threshold, "Node_Threshold", [1, Node_Threshold],, "Set a threshold where pixel darker will becomes black, and brighter to white. Also works with alpha.").setVersion(1080); - addNodeObject(filter, "Alpha Cutoff", s_node_alpha_cut, "Node_Alpha_Cutoff", [1, Node_Alpha_Cutoff], ["remove alpha"], "Remove pixel with low alpha value."); - addNodeObject(filter, "Normalize", s_node_normalize, "Node_Normalize", [1, Node_Normalize],, "Normalize image ranges (brightness, RGB channels) in to [0, 1] range.").setVersion(11710); - addNodeObject(filter, "Gamma Map", s_node_gamma_map, "Node_Gamma_Map", [1, Node_Gamma_Map], ["srgb"], "Apply gamma approximation (pow(2.2)) to an image.").setVersion(11660); - addNodeObject(filter, "Grain", s_node_grain, "Node_Grain", [1, Node_Grain],, "Add noise pattern to the image.").setVersion(11770); - addNodeObject(filter, "ACE", s_node_ace, "Node_Tonemap_ACE", [1, Node_Tonemap_ACE],, "Apply ACE tonemapping.").setVersion(11710); - - ds_list_add(filter, "Conversions"); addNodeObject(filter, "RGBA Extract", s_node_RGB, "Node_RGB_Channel", [1, Node_RGB_Channel], ["channel extract"], "Extract RGBA channel on an image, each channel becomes its own image."); addNodeObject(filter, "HSV Extract", s_node_HSV, "Node_HSV_Channel", [1, Node_HSV_Channel],, "Extract HSVA channel on an image, each channel becomes its own image.").setVersion(1070); addNodeObject(filter, "Alpha to Grey", s_node_alpha_grey, "Node_Alpha_Grey", [1, Node_Alpha_Grey], ["alpha to gray"], "Convert alpha value into solid greyscale."); addNodeObject(filter, "Grey to Alpha", s_node_grey_alpha, "Node_Grey_Alpha", [1, Node_Grey_Alpha], ["gray to alpha"], "Convert greyscale to alpha value."); + ds_list_add(filter, "/Adjustments"); + addNodeObject(filter, "Color Adjust", s_node_color_adjust, "Node_Color_adjust", [1, Node_Color_adjust], ["brightness", "contrast", "hue", "saturation", "value", "color blend", "alpha"], "Adjust brightness, contrast, hue, saturation, value, alpha, and blend image with color."); + addNodeObject(filter, "Level", s_node_level, "Node_Level", [1, Node_Level],, "Adjust brightness of an image by changing its brightness range."); + addNodeObject(filter, "Level Selector", s_node_level_selector, "Node_Level_Selector", [1, Node_Level_Selector],, "Isolate part of the image that falls in the selected brightness range."); + addNodeObject(filter, "Curve", s_node_curve_edit, "Node_Curve", [1, Node_Curve],, "Adjust brightness of an image using curves.").setVersion(1120); + addNodeObject(filter, "HSV Curve", s_node_curve_hsv, "Node_Curve_HSV", [1, Node_Curve_HSV],, "Adjust hsv values of an image using curves.").setVersion(11720); + addNodeObject(filter, "Invert", s_node_invert, "Node_Invert", [1, Node_Invert], ["negate"], "Invert color."); + addNodeObject(filter, "Threshold", s_node_threshold, "Node_Threshold", [1, Node_Threshold],, "Set a threshold where pixel darker will becomes black, and brighter to white. Also works with alpha.").setVersion(1080); + addNodeObject(filter, "Alpha Cutoff", s_node_alpha_cut, "Node_Alpha_Cutoff", [1, Node_Alpha_Cutoff], ["remove alpha"], "Remove pixel with low alpha value."); + addNodeObject(filter, "Normalize", s_node_normalize, "Node_Normalize", [1, Node_Normalize],, "Normalize image ranges (brightness, RGB channels) in to [0, 1] range.").setVersion(11710); + addNodeObject(filter, "Gamma Map", s_node_gamma_map, "Node_Gamma_Map", [1, Node_Gamma_Map], ["srgb"], "Apply gamma approximation (pow(2.2)) to an image.").setVersion(11660); + addNodeObject(filter, "ACE", s_node_ace, "Node_Tonemap_ACE", [1, Node_Tonemap_ACE],, "Apply ACE tonemapping.").setVersion(11710); ds_list_add(filter, "Fixes"); addNodeObject(filter, "De-Corner", s_node_decorner, "Node_De_Corner", [1, Node_De_Corner], ["decorner"], "Attempt to remove single pixel corner from the image."); @@ -711,15 +735,16 @@ function __initNodes() { addNodeObject(d3d, "Sprite Stack", s_node_stack, "Node_Sprite_Stack", [1, Node_Sprite_Stack],, "Create sprite stack either from repeating a single image or stacking different images using array."); addNodeObject(d3d, "Ambient Occlusion", s_node_AO, "Node_Ambient_Occlusion", [1, Node_Ambient_Occlusion], ["ao"], "Apply simple 2D AO effect using height map.").patreonExtra(); - ds_list_add(d3d, "3D"); + ds_list_add(d3d, "Scenes"); addNodeObject(d3d, "3D Camera", s_node_3d_camera, "Node_3D_Camera", [1, Node_3D_Camera],, "Create 3D camera that render scene to surface.").setVersion(11510); addNodeObject(d3d, "3D Camera Set", s_node_3d_camera_set, "Node_3D_Camera_Set", [1, Node_3D_Camera_Set],, "3D camera with built-in key and fill directional lights.").setVersion(11571); - addNodeObject(d3d, "3D Material", s_node_3d_meterial, "Node_3D_Material", [1, Node_3D_Material],, "Create 3D material with adjustable parameters.").setVersion(11510); addNodeObject(d3d, "3D Scene", s_node_3d_scene, "Node_3D_Scene", [1, Node_3D_Scene],, "Combine multiple 3D objects into a single junction.").setVersion(11510); - addNodeObject(d3d, "3D Repeat", s_node_3d_array, "Node_3D_Repeat", [1, Node_3D_Repeat],, "Repeat the same 3D mesh multiple times.").setVersion(11510); - addNodeObject(d3d, "Mesh Export", s_node_3d_obj_export, "Node_3D_Mesh_Export", [1, Node_3D_Mesh_Export],, "Export 3D mesh as .obj file").setVersion(11740); - ds_list_add(d3d, "Mesh"); + ds_list_add(d3d, "Materials"); + addNodeObject(d3d, "3D Material", s_node_3d_meterial, "Node_3D_Material", [1, Node_3D_Material],, "Create 3D material with adjustable parameters.").setVersion(11510); + + ds_list_add(d3d, "Meshes"); + ds_list_add(d3d, "/Creators"); addNodeObject(d3d, "3D Object", s_node_3d_obj, "Node_3D_Mesh_Obj", [0, Node_create_3D_Obj],, "Load .obj file from your computer as a 3D object.").setVersion(11510); addNodeObject(d3d, "3D Plane", s_node_3d_plane, "Node_3D_Mesh_Plane", [1, Node_3D_Mesh_Plane],, "Put 2D image on a plane in 3D space.").setVersion(11510); addNodeObject(d3d, "3D Cube", s_node_3d_cube, "Node_3D_Mesh_Cube", [1, Node_3D_Mesh_Cube]).setVersion(11510); @@ -732,22 +757,28 @@ function __initNodes() { addNodeObject(d3d, "3D Wall Builder", s_node_3d_wall, "Node_3D_Mesh_Wall_Builder",[1, Node_3D_Mesh_Wall_Builder]).setVersion(1_18_01_0); addNodeObject(d3d, "Surface Extrude", s_node_3d_extrude, "Node_3D_Mesh_Extrude", [1, Node_3D_Mesh_Extrude],, "Extrude 2D image into 3D object.").setVersion(11510); addNodeObject(d3d, "Path Extrude", s_node_3d_path_extrude, "Node_3D_Mesh_Path_Extrude",[1, Node_3D_Mesh_Path_Extrude],, "Extrude path into 3D object.").setVersion(11750); + ds_list_add(d3d, "/Exporters"); + addNodeObject(d3d, "Mesh Export", s_node_3d_obj_export, "Node_3D_Mesh_Export", [1, Node_3D_Mesh_Export],, "Export 3D mesh as .obj file").setVersion(11740); + addNodeObject(d3d, "Slice Stack", s_node_3d_stack_slice, "Node_3D_Mesh_Stack_Slice", [1, Node_3D_Mesh_Stack_Slice],, "").setVersion(11750); ds_list_add(d3d, "Light"); addNodeObject(d3d, "Directional Light", s_node_3d_light_directi, "Node_3D_Light_Directional", [1, Node_3D_Light_Directional],, "Create directional light directed at the origin point.").setVersion(11510); addNodeObject(d3d, "Point Light", s_node_3d_light_point, "Node_3D_Light_Point", [1, Node_3D_Light_Point],, "Create point light to illuminate surrounding area.").setVersion(11510); ds_list_add(d3d, "Modify"); + ds_list_add(d3d, "/Meshes"); + addNodeObject(d3d, "Transform", s_node_3d_transform, "Node_3D_Transform", [1, Node_3D_Transform],, "Transform 3D object.").setVersion(11570); + addNodeObject(d3d, "Transform Scene", s_node_3d_transform_scene, "Node_3D_Transform_Scene", [1, Node_3D_Transform_Scene],, "Transform 3D scene, accepts array of transformations for each objects.").setVersion(11570); addNodeObject(d3d, "Discretize vertex", s_node_3d_discretize, "Node_3D_Round_Vertex", [1, Node_3D_Round_Vertex],, "Round out vertex position to a specified step.").setVersion(11560); addNodeObject(d3d, "3D Displace", s_node_3d_displace, "Node_3D_Displace", [1, Node_3D_Displace],, "").setVersion(1_18_01_0); addNodeObject(d3d, "3D Subdivide", s_node_3d_subdivide, "Node_3D_Subdivide", [1, Node_3D_Subdivide],, "").setVersion(1_18_03_0); - addNodeObject(d3d, "Set Material", s_node_3d_set_material, "Node_3D_Set_Material", [1, Node_3D_Set_Material],, "Replace mesh material with a new one.").setVersion(11560); - addNodeObject(d3d, "Transform", s_node_3d_transform, "Node_3D_Transform", [1, Node_3D_Transform],, "Transform 3D object.").setVersion(11570); - addNodeObject(d3d, "Transform Scene", s_node_3d_transform_scene, "Node_3D_Transform_Scene", [1, Node_3D_Transform_Scene],, "Transform 3D scene, accepts array of transformations for each objects.").setVersion(11570); - addNodeObject(d3d, "UV Remap", s_node_uv_remap, "Node_3D_UV_Remap", [1, Node_3D_UV_Remap],, "Remap UV map using plane.").setVersion(11570); - addNodeObject(d3d, "Slice Stack", s_node_3d_stack_slice, "Node_3D_Mesh_Stack_Slice", [1, Node_3D_Mesh_Stack_Slice],, "").setVersion(11750); + ds_list_add(d3d, "/Instances"); + addNodeObject(d3d, "3D Repeat", s_node_3d_array, "Node_3D_Repeat", [1, Node_3D_Repeat],, "Repeat the same 3D mesh multiple times.").setVersion(11510); ///**/ addNodeObject(d3d, "3D Instancer", s_node_3d_set_material, "Node_3D_Instancer", [1, Node_3D_Instancer]).setVersion(11560); ///**/ addNodeObject(d3d, "3D Particle", s_node_3d_set_material, "Node_3D_Particle", [1, Node_3D_Particle]).setVersion(11560); + ds_list_add(d3d, "/Materials"); + addNodeObject(d3d, "Set Material", s_node_3d_set_material, "Node_3D_Set_Material", [1, Node_3D_Set_Material],, "Replace mesh material with a new one.").setVersion(11560); + addNodeObject(d3d, "UV Remap", s_node_uv_remap, "Node_3D_UV_Remap", [1, Node_3D_UV_Remap],, "Remap UV map using plane.").setVersion(11570); ds_list_add(d3d, "Points"); addNodeObject(d3d, "Point Affector", s_node_3d_point_affector, "Node_3D_Point_Affector", [1, Node_3D_Point_Affector],, "Generate array of 3D points interpolating between two values based on the distance.").setVersion(11570); @@ -783,6 +814,7 @@ function __initNodes() { addNodeObject(generator, "Tile Drawer", s_node_tileset_drawer, "Node_Tile_Drawer", [1, Node_Tile_Drawer]).setVersion(1_18_03_0); ds_list_add(generator, "Noises"); + ds_list_add(generator, "/Basics"); addNodeObject(generator, "Noise", s_node_noise, "Node_Noise", [1, Node_Noise],, "Generate white noise."); addNodeObject(generator, "Perlin Noise", s_node_noise_perlin, "Node_Perlin", [1, Node_Perlin],, "Generate perlin noise."); addNodeObject(generator, "Simplex Noise", s_node_noise_simplex, "Node_Noise_Simplex", [1, Node_Noise_Simplex], ["perlin"], "Generate simplex noise, similiar to perlin noise with better fidelity but non-tilable.").setVersion(1080); @@ -790,7 +822,7 @@ function __initNodes() { addNodeObject(generator, "Anisotropic Noise", s_node_noise_aniso, "Node_Noise_Aniso", [1, Node_Noise_Aniso],, "Generate anisotropic noise."); addNodeObject(generator, "Extra Perlins", s_node_perlin_extra, "Node_Perlin_Extra", [1, Node_Perlin_Extra], ["noise"], "Random perlin noise made with different algorithms.").patreonExtra(); addNodeObject(generator, "Extra Voronoi", s_node_voronoi_extra, "Node_Voronoi_Extra", [1, Node_Voronoi_Extra], ["noise"], "Random voronoi noise made with different algorithms.").patreonExtra(); - + ds_list_add(generator, "/Artistics"); addNodeObject(generator, "Fold Noise", s_node_fold_noise, "Node_Fold_Noise", [1, Node_Fold_Noise],, "Generate cloth fold noise").setVersion(11650); addNodeObject(generator, "Strand Noise", s_node_strand_noise, "Node_Noise_Strand", [1, Node_Noise_Strand],, "Generate random srtands noise.").setVersion(11650); addNodeObject(generator, "Gabor Noise", s_node_gabor, "Node_Gabor_Noise", [1, Node_Gabor_Noise],, "Generate Gabor noise").patreonExtra(); @@ -803,16 +835,20 @@ function __initNodes() { addNodeObject(generator, "Honeycomb Noise", s_node_honey, "Node_Honeycomb_Noise", [1, Node_Honeycomb_Noise],, "Generate honeycomb noise").patreonExtra(); ds_list_add(generator, "Patterns"); + ds_list_add(generator, "/Basics"); addNodeObject(generator, "Stripe", s_node_stripe, "Node_Stripe", [1, Node_Stripe],, "Generate stripe pattern."); addNodeObject(generator, "Zigzag", s_node_zigzag, "Node_Zigzag", [1, Node_Zigzag],, "Generate zigzag pattern."); addNodeObject(generator, "Checker", s_node_checker, "Node_Checker", [1, Node_Checker],, "Generate checkerboard pattern."); + ds_list_add(generator, "/Grids"); addNodeObject(generator, "Grid", s_node_grid, "Node_Grid", [1, Node_Grid], ["tile", "mosaic"], "Generate grid pattern."); addNodeObject(generator, "Triangular Grid", s_node_grid_tri, "Node_Grid_Tri", [1, Node_Grid_Tri],, "Generate triangular grid pattern."); addNodeObject(generator, "Hexagonal Grid", s_node_grid_hex, "Node_Grid_Hex", [1, Node_Grid_Hex],, "Generate hexagonal grid pattern."); addNodeObject(generator, "Pentagonal Grid", s_node_grid_pentagonal, "Node_Grid_Pentagonal", [1, Node_Grid_Pentagonal],, "Generate Pentagonal grid pattern.").patreonExtra(); + ds_list_add(generator, "/Tiles"); addNodeObject(generator, "Pytagorean Tile", s_node_pytagorean_tile, "Node_Pytagorean_Tile", [1, Node_Pytagorean_Tile],, "Generate Pytagorean tile pattern.").patreonExtra(); addNodeObject(generator, "Herringbone Tile", s_node_herringbone_tile, "Node_Herringbone_Tile", [1, Node_Herringbone_Tile], "Generate Herringbone tile pattern.").patreonExtra(); addNodeObject(generator, "Random Tile", s_node_random_tile, "Node_Random_Tile", [1, Node_Random_Tile],, "Generate Random tile pattern.").patreonExtra(); + ds_list_add(generator, "/Others"); addNodeObject(generator, "Box Pattern", s_node_box_pattern, "Node_Box_Pattern", [1, Node_Box_Pattern],, "Generate square-based patterns..").setVersion(11750); addNodeObject(generator, "Quasicrystal", s_node_quasicircle, "Node_Quasicrystal", [1, Node_Quasicrystal],, "Generate Quasicrystal pattern.").setVersion(11660); addNodeObject(generator, "Pixel Sampler", s_node_pixel_sampler, "Node_Pixel_Sampler", [1, Node_Pixel_Sampler],, "Map image on to each individual pixels of another image.").setVersion(11730); @@ -868,11 +904,13 @@ function __initNodes() { addNodeObject(compose, "Pack Sprites", s_node_pack_sprite, "Node_Pack_Sprites", [1, Node_Pack_Sprites],, "Combine array of images with different dimension using different algorithms.").setVersion(1140); ds_list_add(compose, "Armature"); + ds_list_add(compose, "/Basics"); addNodeObject(compose, "Armature Create", s_node_armature_create, "Node_Armature", [1, Node_Armature], ["rigging", "bone"], "Create new armature system.").setVersion(1146); addNodeObject(compose, "Armature Pose", s_node_armature_pose, "Node_Armature_Pose", [1, Node_Armature_Pose], ["rigging", "bone"], "Pose armature system.").setVersion(1146); addNodeObject(compose, "Armature Bind", s_node_armature_bind, "Node_Armature_Bind", [1, Node_Armature_Bind], ["rigging", "bone"], "Bind and render image to an armature system.").setVersion(1146); - addNodeObject(compose, "Armature Path", s_node_armature_path, "Node_Armature_Path", [1, Node_Armature_Path], ["rigging", "bone"], "Generate path from armature system.").setVersion(1146); addNodeObject(compose, "Armature Mesh Rig", s_node_armature_mesh_rig, "Node_Armature_Mesh_Rig", [1, Node_Armature_Mesh_Rig], ["rigging", "bone"], "Rig mesh to armature system.").setVersion(1_18_04_0); + ds_list_add(compose, "/Convertors"); + addNodeObject(compose, "Armature Path", s_node_armature_path, "Node_Armature_Path", [1, Node_Armature_Path], ["rigging", "bone"], "Generate path from armature system.").setVersion(1146); addNodeObject(compose, "Armature Sample", s_node_armature_sample, "Node_Armature_Sample", [1, Node_Armature_Sample], ["rigging", "bone"], "Sample point from armature system.").setVersion(1147); if(!DEMO) { @@ -886,60 +924,76 @@ function __initNodes() { addNodeCatagory("Values", values); ds_list_add(values, "Raw data"); addNodeObject(values, "Number", s_node_number, "Node_Number", [1, Node_Number],, "Generate number data."); + addNodeObject(values, "Boolean", s_node_boolean, "Node_Boolean", [1, Node_Boolean],, "Generate boolean (true, false) data.").setVersion(1090); addNodeObject(values, "Text", s_node_text, "Node_String", [1, Node_String],, "Generate text/string data."); addNodeObject(values, "Path", s_node_path, "Node_Path", [1, Node_Path],, "Generate path."); addNodeObject(values, "Area", s_node_area, "Node_Area", [1, Node_Area],, "Generate area data."); - addNodeObject(values, "Boolean", s_node_boolean, "Node_Boolean", [1, Node_Boolean],, "Generate boolean (true, false) data.").setVersion(1090); ds_list_add(values, "Numbers"); + ds_list_add(values, "/Creators"); addNodeObject(values, "Number", s_node_number, "Node_Number", [1, Node_Number],, "Generate number data."); addNodeObject(values, "To Number", s_node_to_number, "Node_To_Number", [1, Node_To_Number],, "Convert string to number, supports scientific format (e.g. 1e-2 = 0.02).").setVersion(1145); + addNodeObject(values, "Random", s_node_random, "Node_Random", [1, Node_Random],, "Generate pseudorandom value based on seed."); + addNodeObject(values, "Scatter Points", s_node_scatter_point, "Node_Scatter_Points", [1, Node_Scatter_Points],, "Generate array of vector 2 points.").setVersion(1120); + addNodeObject(values, "Transform Array", s_node_transform_array, "Node_Transform_Array", [1, Node_Transform_Array],, "Generate transfomation array.").setVersion(1146); + ds_list_add(values, "/Operators"); addNodeObject(values, "Math", s_node_math, "Node_Math", [0, Node_create_Math], global.node_math_keys, "Apply mathematical function to number(s)."); addNodeObject(values, "Equation", s_node_equation, "Node_Equation", [0, Node_create_Equation],, "Evaluate string of equation. With an option for setting variables."); - addNodeObject(values, "Random", s_node_random, "Node_Random", [1, Node_Random],, "Generate pseudorandom value based on seed."); addNodeObject(values, "Statistic", s_node_statistic, "Node_Statistic", [0, Node_create_Statistic], global.node_statistic_keys, "Apply statistical operation (sum, average, median, etc.) to array of numbers."); addNodeObject(values, "Convert Base", s_node_base_conversion, "Node_Base_Convert", [1, Node_Base_Convert], ["base convert", "binary", "hexadecimal"]).setVersion(1140); - addNodeObject(values, "Scatter Points", s_node_scatter_point, "Node_Scatter_Points", [1, Node_Scatter_Points],, "Generate array of vector 2 points.").setVersion(1120); - addNodeObject(values, "Translate Point", s_node_translate_point, "Node_Move_Point", [1, Node_Move_Point],, "Translate array of points.").setVersion(1141); addNodeObject(values, "FFT", s_node_FFT, "Node_FFT", [1, Node_FFT], ["frequency analysis"], "Perform fourier transform on number array.").setVersion(1144); - addNodeObject(values, "Transform Array", s_node_transform_array, "Node_Transform_Array", [1, Node_Transform_Array],, "Generate transfomation array.").setVersion(1146); - addNodeObject(values, "Point in Area", s_node_point_in_area, "Node_Point_In_Area", [1, Node_Point_In_Area],, "Check whether a point lies in an area.").setVersion(1_17_10_0); ds_list_add(values, "Vector"); + ds_list_add(values, "/Creators"); addNodeObject(values, "Vector2", s_node_vec2, "Node_Vector2", [1, Node_Vector2],, "Genearte vector composite of 2 members."); addNodeObject(values, "Vector3", s_node_vec3, "Node_Vector3", [1, Node_Vector3],, "Genearte vector composite of 3 members."); addNodeObject(values, "Vector4", s_node_vec4, "Node_Vector4", [1, Node_Vector4],, "Genearte vector composite of 4 members."); + ds_list_add(values, "/Components"); addNodeObject(values, "Vector Split", s_node_vec_split, "Node_Vector_Split", [1, Node_Vector_Split],, "Split vector (up to 4) into individual components."); + addNodeObject(values, "Swizzle", s_node_swizzle, "Node_Vector_Swizzle", [1, Node_Vector_Swizzle], ["swap axis"], "Rearrange vector using string containing axis indicies (x, y, z, w).").setVersion(1_17_10_0); + ds_list_add(values, "/Operators"); addNodeObject(values, "Magnitude", s_node_magnitude, "Node_Vector_Magnitude", [1, Node_Vector_Magnitude], ["vector length", "vector magnitude"], "Calculate magnitude (length) of a vector.").setVersion(1_17_10_0); addNodeObject(values, "Dot product", s_node_dot_product, "Node_Vector_Dot", [1, Node_Vector_Dot],, "Calculate dot product between vectors.").setVersion(1141); - addNodeObject(values, "Cross product 3D", s_node_cross_product_2d, "Node_Vector_Cross_3D", [1, Node_Vector_Cross_3D],, "Calculate cross product of 2 vec3s.").setVersion(1141); addNodeObject(values, "Cross product 2D", s_node_cross_product_3d, "Node_Vector_Cross_2D", [1, Node_Vector_Cross_2D],, "Calculate cross product of 2 vec2s.").setVersion(1141); - addNodeObject(values, "Swizzle", s_node_swizzle, "Node_Vector_Swizzle", [1, Node_Vector_Swizzle], ["swap axis"], "Rearrange vector using string containing axis indicies (x, y, z, w).").setVersion(1_17_10_0); + addNodeObject(values, "Cross product 3D", s_node_cross_product_2d, "Node_Vector_Cross_3D", [1, Node_Vector_Cross_3D],, "Calculate cross product of 2 vec3s.").setVersion(1141); + ds_list_add(values, "/Points"); + addNodeObject(values, "Translate Point", s_node_translate_point, "Node_Move_Point", [1, Node_Move_Point],, "Translate array of points.").setVersion(1141); + addNodeObject(values, "Point in Area", s_node_point_in_area, "Node_Point_In_Area", [1, Node_Point_In_Area],, "Check whether a point lies in an area.").setVersion(1_17_10_0); ds_list_add(values, "Texts"); + ds_list_add(values, "/Creators"); addNodeObject(values, "Text", s_node_text, "Node_String", [1, Node_String],, "Generate text/string data."); addNodeObject(values, "To Text", s_node_to_text, "Node_To_Text", [1, Node_To_Text]).setVersion(1145); addNodeObject(values, "Unicode", s_node_unicode, "Node_Unicode", [1, Node_Unicode],, "Convert unicode id into string."); + ds_list_add(values, "/Info"); addNodeObject(values, "Text Length", s_node_text_length, "Node_String_Length", [1, Node_String_Length],, "Return number of character in a string.").setVersion(1138); + addNodeObject(values, "Get Character", s_node_text_char_get, "Node_String_Get_Char", [1, Node_String_Get_Char],, "Get a nth character in a string.").setVersion(1100); + ds_list_add(values, "/Operators"); addNodeObject(values, "Combine Texts", s_node_text_combine, "Node_String_Merge", [1, Node_String_Merge], ["join text", "concatenate text"], "Combine multiple strings into one long string."); addNodeObject(values, "Join Text Array", s_node_text_join, "Node_String_Join", [1, Node_String_Join],, "Combine string array with an option to add extra string in-between.").setVersion(1120); addNodeObject(values, "Split Text", s_node_text_splice, "Node_String_Split", [1, Node_String_Split],, "Split string into arrays of substring based on delimiter."); addNodeObject(values, "Trim Text", s_node_text_trim, "Node_String_Trim", [1, Node_String_Trim],, "Remove first and last n character(s) from a string.").setVersion(1080); - addNodeObject(values, "Get Character", s_node_text_char_get, "Node_String_Get_Char", [1, Node_String_Get_Char],, "Get a nth character in a string.").setVersion(1100); + ds_list_add(values, "/RegEx"); addNodeObject(values, "RegEx Match", s_node_regex_match, "Node_String_Regex_Match", [1, Node_String_Regex_Match],, "Check whether regular expression pattern exist in a string.").setVersion(1140); addNodeObject(values, "RegEx Search", s_node_regex_search, "Node_String_Regex_Search", [1, Node_String_Regex_Search],, "Search for instances in a string using regular expression.").setVersion(1140); addNodeObject(values, "RegEx Replace", s_node_regex_replace, "Node_String_Regex_Replace", [1, Node_String_Regex_Replace],, "Replace instances of a string with another using regular expression.").setVersion(1140); + ds_list_add(values, "/Filename"); addNodeObject(values, "Separate File Path", s_node_separate_file_path, "Node_Path_Separate_Folder", [1, Node_Path_Separate_Folder],, "Separate path string into a pair of directory and filename.").setVersion(1145); ds_list_add(values, "Arrays"); + ds_list_add(values, "/Creators"); addNodeObject(values, "Array", s_node_array, "Node_Array", [1, Node_Array],, "Create an array."); - addNodeObject(values, "Array Split", s_node_array_split, "Node_Array_Split", [1, Node_Array_Split],, "Split array members into individual outputs."); addNodeObject(values, "Array Range", s_node_array_range, "Node_Array_Range", [1, Node_Array_Range],, "Create array of numbers by setting start, end and step length."); - addNodeObject(values, "Array Add", s_node_array_add, "Node_Array_Add", [1, Node_Array_Add], ["add array"], "Add elements into an array."); + addNodeObject(values, "Parse CSV", s_node_csv_parse, "Node_Array_CSV_Parse", [1, Node_Array_CSV_Parse],, "Parse CSV string into array.").setVersion(1145); + ds_list_add(values, "/Info"); addNodeObject(values, "Array Length", s_node_array_length, "Node_Array_Length", [1, Node_Array_Length],, "Returns number of members in an array."); addNodeObject(values, "Array Get", s_node_array_get, "Node_Array_Get", [1, Node_Array_Get], ["get array"], "Returns nth member in an array."); - addNodeObject(values, "Array Set", s_node_array_set, "Node_Array_Set", [1, Node_Array_Set], ["set array"], "Set array member based on index.").setVersion(1120); + addNodeObject(values, "Array Sample", s_node_array_sample, "Node_Array_Sample", [1, Node_Array_Sample],, "Sample member from an array to create smaller one.").setVersion(11540); addNodeObject(values, "Array Find", s_node_array_find, "Node_Array_Find", [1, Node_Array_Find], ["find array"], "Returns index of an array member that match a condition.").setVersion(1120); + ds_list_add(values, "/Operators"); + addNodeObject(values, "Array Set", s_node_array_set, "Node_Array_Set", [1, Node_Array_Set], ["set array"], "Set array member based on index.").setVersion(1120); + addNodeObject(values, "Array Add", s_node_array_add, "Node_Array_Add", [1, Node_Array_Add], ["add array"], "Add elements into an array."); + addNodeObject(values, "Array Split", s_node_array_split, "Node_Array_Split", [1, Node_Array_Split],, "Split array members into individual outputs."); addNodeObject(values, "Array Insert", s_node_array_insert, "Node_Array_Insert", [1, Node_Array_Insert], ["insert array"], "Insert member into an array at any position.").setVersion(1120); addNodeObject(values, "Array Remove", s_node_array_remove, "Node_Array_Remove", [1, Node_Array_Remove], ["remove array", "delete array", "array delete"], "Remove member in an array.").setVersion(1120); addNodeObject(values, "Array Reverse", s_node_array_reverse, "Node_Array_Reverse", [1, Node_Array_Reverse], ["reverse array"], "Reverse array order").setVersion(1120); @@ -949,16 +1003,15 @@ function __initNodes() { addNodeObject(values, "Array Copy", s_node_array_copy, "Node_Array_Copy", [1, Node_Array_Copy],, "Copy array or subarray.").setVersion(1144); addNodeObject(values, "Array Convolute", s_node_array_convolute, "Node_Array_Convolute", [1, Node_Array_Convolute],, "Apply convolution between 2 number arrays.").setVersion(11540); addNodeObject(values, "Array Composite", s_node_array_composite, "Node_Array_Composite", [1, Node_Array_Composite],, "Create 2D array by multiplying each member in the first 1D array with the second 1D array.").setVersion(11540); - addNodeObject(values, "Array Sample", s_node_array_sample, "Node_Array_Sample", [1, Node_Array_Sample],, "Sample member from an array to create smaller one.").setVersion(11540); - addNodeObject(values, "Sort Array", s_node_array_sort, "Node_Array_Sort", [1, Node_Array_Sort], ["array sort"], "Sort array using default comparison.").setVersion(1120); addNodeObject(values, "Shuffle Array", s_node_array_shuffle, "Node_Array_Shuffle", [1, Node_Array_Shuffle], ["array shuffle"], "Randomly rearrange the array members.").setVersion(1120); + ds_list_add(values, "/Group Operators"); + addNodeObject(values, "Sort Array", s_node_array_sort, "Node_Array_Sort", [1, Node_Array_Sort], ["array sort"], "Sort array using default comparison.").setVersion(1120); addNodeObject(values, "Loop Array", s_node_loop_array, "Node_Iterate_Each_Inline", [1, Node_Iterate_Each_Inline], ["iterate each", "for each", "array loop"], "Create group that iterate to each member in an array."); addNodeObject(values, "Filter Array", s_node_filter_array, "Node_Iterate_Filter_Inline", [1, Node_Iterate_Filter_Inline], ["array filter"], "Filter array using condition.").setVersion(1140); addNodeObject(values, "Sort Array Inline", s_node_sort_array, "Node_Iterate_Sort_Inline", [1, Node_Iterate_Sort_Inline], ["array sort"], "Sort array using node graph.").setVersion(1143); - addNodeObject(values, "Parse CSV", s_node_csv_parse, "Node_Array_CSV_Parse", [1, Node_Array_CSV_Parse],, "Parse CSV string into array.").setVersion(1145); ds_list_add(values, "Paths"); - // Creation + ds_list_add(values, "/Creators"); addNodeObject(values, "Path", s_node_path, "Node_Path", [1, Node_Path],, "Create path using bezier curve."); addNodeObject(values, "Smooth Path", s_node_path_smooth, "Node_Path_Smooth", [1, Node_Path_Smooth], ["path smooth"], "Create path with automatic smoothness.").setVersion(11640); addNodeObject(values, "Shape Path", s_node_path_shape, "Node_Path_Shape", [1, Node_Path_Shape], ["path shape"], "Create path with predefined shape.").setVersion(1_18_05_6); @@ -968,8 +1021,7 @@ function __initNodes() { addNodeObject(values, "Plot Path", s_node_path_plot, "Node_Path_Plot", [1, Node_Path_Plot],, "Create path from parametric equations.").setVersion(1138); addNodeObject(values, "3D Path", s_node_path_3d, "Node_Path_3D", [1, Node_Path_3D], [ "path 3d" ], "Create path in 3D space.").setVersion(11750); addNodeObject(values, "Path Anchor", s_node_path_anchor, "Node_Path_Anchor", [1, Node_Path_Anchor],, "Create path anchor data.").setVersion(1140); - - // Modify + ds_list_add(values, "/Modifiers"); addNodeObject(values, "Transform Path", s_node_path_transform, "Node_Path_Transform", [1, Node_Path_Transform], ["path transform"], "Move rotate and scale a path.").setVersion(1130); addNodeObject(values, "Remap Path", s_node_path_map, "Node_Path_Map_Area", [1, Node_Path_Map_Area],, "Scale path to fit a given area.").setVersion(1130); addNodeObject(values, "Shift Path", s_node_path_shift, "Node_Path_Shift", [1, Node_Path_Shift],, "Move path along its normal.").setVersion(1130); @@ -977,23 +1029,19 @@ function __initNodes() { addNodeObject(values, "Wave Path", s_node_path_wave, "Node_Path_Wave", [1, Node_Path_Wave], ["zigzag path"], "Apply wave effect along the path.").setVersion(1130); addNodeObject(values, "Path Combine", s_node_path_array, "Node_Path_Array", [1, Node_Path_Array], ["array path"], "Combine multiple path into one.").setVersion(1137); addNodeObject(values, "Reverse Path", s_node_path_reverse, "Node_Path_Reverse", [1, Node_Path_Reverse],, "Reverse path direction.").setVersion(1130); - - // Combine + ds_list_add(values, "/Combine"); addNodeObject(values, "Repeat Path", s_node_path_repeat, "Node_Path_Repeat", [1, Node_Path_Repeat],, "Repeat paths.").setVersion(1_18_05_6); addNodeObject(values, "Scatter Path", s_node_path_scatter, "Node_Path_Scatter", [1, Node_Path_Scatter],, "Scatter paths along another path.").setVersion(11740); addNodeObject(values, "Bridge Path", s_node_path_bridge, "Node_Path_Bridge", [1, Node_Path_Bridge],, "Create new paths that connect multiple paths at the same sample positions.").setVersion(11640); addNodeObject(values, "Blend Path", s_node_path_blend, "Node_Path_Blend", [1, Node_Path_Blend],, "Blend between 2 paths."); - - // To number + ds_list_add(values, "/To Number"); addNodeObject(values, "Sample Path", s_node_path_sample, "Node_Path_Sample", [1, Node_Path_Sample], ["path sample"], "Sample a 2D position from a path"); addNodeObject(values, "Bake Path", s_node_path_bake, "Node_Path_Bake", [1, Node_Path_Bake],, "Bake path data into array of vec2 points.").setVersion(11640); - - // To Surface + ds_list_add(values, "/To Surface"); addNodeObject(values, "Fill Path", s_node_path_fill, "Node_Path_Fill", [1, Node_Path_Fill], ["path fill"], "Fill area inside path.").setVersion(1_18_06_2); addNodeObject(values, "Map Path", s_node_path_mapp, "Node_Path_Map", [1, Node_Path_Map],, "Map a texture between multiple paths.").setVersion(11640); addNodeObject(values, "Morph Path", s_node_path_morph, "Node_Path_Morph", [1, Node_Path_Morph],, "").setVersion(1_18_06_2); - - // Segments + ds_list_add(values, "/Segments"); addNodeObject(values, "Filter Segments",s_node_segment_filter, "Node_Segment_Filter", [1, Node_Segment_Filter],, "Filter segment (vec2 array) based on a conditions.").setVersion(11780); ds_list_add(values, "Boolean"); @@ -1034,14 +1082,18 @@ function __initNodes() { var color = ds_list_create(); addNodeCatagory("Color", color); ds_list_add(color, "Colors"); + ds_list_add(color, "/Creators"); addNodeObject(color, "Color", s_node_color_out, "Node_Color", [1, Node_Color],, "Create color value."); addNodeObject(color, "RGB Color", s_node_color_from_rgb, "Node_Color_RGB", [1, Node_Color_RGB],, "Create (rgb) color from value in RGB color space."); addNodeObject(color, "HSV Color", s_node_color_from_hsv, "Node_Color_HSV", [1, Node_Color_HSV],, "Create (rgb) color from value in HSV color space."); addNodeObject(color, "OKLCH Color", s_node_color_from_oklch,"Node_Color_OKLCH", [1, Node_Color_OKLCH],, ["oklab"], "Create (rgb) color from value in OKLCH color space."); - addNodeObject(color, "Sampler", s_node_sampler, "Node_Sampler", [1, Node_Sampler],, "Sample color from an image."); + ds_list_add(color, "/Data"); addNodeObject(color, "Color Data", s_node_color_data, "Node_Color_Data", [1, Node_Color_Data], ["red", "green", "blue", "alpha", "brightness", "luminance"], "Get data (rgb, hsv, brightness) from color."); - addNodeObject(color, "Find pixel", s_node_pixel_find, "Node_Find_Pixel", [1, Node_Find_Pixel],, "Get the position of the first pixel with a given color.").setVersion(1130); + ds_list_add(color, "/Operators"); addNodeObject(color, "Mix Color", s_node_color_mix, "Node_Color_Mix", [1, Node_Color_Mix],, "Combine two colors.").setVersion(1140); + ds_list_add(color, "/Surfaces"); + addNodeObject(color, "Sampler", s_node_sampler, "Node_Sampler", [1, Node_Sampler],, "Sample color from an image."); + addNodeObject(color, "Find pixel", s_node_pixel_find, "Node_Find_Pixel", [1, Node_Find_Pixel],, "Get the position of the first pixel with a given color.").setVersion(1130); ds_list_add(color, "Palettes"); addNodeObject(color, "Palette", s_node_palette, "Node_Palette", [1, Node_Palette],, "Create palette value. Note that palette is simple an array of colors."); @@ -1064,13 +1116,13 @@ function __initNodes() { addNodeCatagory("Animation", animation); ds_list_add(animation, "Animations"); addNodeObject(animation, "Frame Index", s_node_counter, "Node_Counter", [1, Node_Counter], ["current frame", "counter"], "Output current frame as frame index, or animation progress (0 - 1)."); - addNodeObject(animation, "Evaluate Curve", s_node_curve_eval, "Node_Anim_Curve", [1, Node_Anim_Curve],, "Evaluate value from an animation curve."); addNodeObject(animation, "Rate Remap", s_node_rate_remap, "Node_Rate_Remap", [1, Node_Rate_Remap],, "Remap animation to a new framerate.").setVersion(1147); addNodeObject(animation, "Delay", s_node_delay, "Node_Delay", [1, Node_Delay],, "Delay the animation by fix amount of frames.").setVersion(11640); addNodeObject(animation, "Stagger", s_node_stagger, "Node_Stagger", [1, Node_Stagger],, "Delay the animation based on array index.").setVersion(11640); - addNodeObject(animation, "Revert", s_node_revert, "Node_Revert", [1, Node_Revert],, "Cache the entire animation and replay backward.").setVersion(1_17_11_0); + addNodeObject(animation, "Reverse", s_node_revert, "Node_Revert", [1, Node_Revert],, "Cache the entire animation and replay backward.").setVersion(1_17_11_0); ds_list_add(animation, "Value"); + addNodeObject(animation, "Evaluate Curve", s_node_curve_eval, "Node_Anim_Curve", [1, Node_Anim_Curve],, "Evaluate value from an animation curve."); addNodeObject(animation, "WaveTable", s_node_wave, "Node_Fn_WaveTable", [1, Node_Fn_WaveTable],, "Create value changing overtime in wave pattern.").setVersion(11720); addNodeObject(animation, "Wiggler", s_node_wiggler, "Node_Wiggler", [1, Node_Wiggler],, "Create random value smoothly changing over time."); addNodeObject(animation, "Ease", s_node_ease, "Node_Fn_Ease", [1, Node_Fn_Ease],, "Create easing function.").setVersion(11720); @@ -1078,22 +1130,25 @@ function __initNodes() { addNodeObject(animation, "SmoothStep", s_node_fx_smoothstep, "Node_Fn_SmoothStep", [1, Node_Fn_SmoothStep],, "Apply smoothstop function to a value.").setVersion(11720); ds_list_add(animation, "Audio"); + ds_list_add(animation, "/Files"); addNodeObject(animation, "WAV File In", s_node_wav_file_read, "Node_WAV_File_Read", [0, Node_create_WAV_File_Read],, "Load wav audio file.").setVersion(1144); addNodeObject(animation, "WAV File Out", s_node_wav_file_write, "Node_WAV_File_Write", [1, Node_WAV_File_Write],, "Save wav audio file.").setVersion(1145); - addNodeObject(animation, "FFT", s_node_FFT, "Node_FFT", [1, Node_FFT], ["frequency analysis"], "Perform fourier transform on number array.").setVersion(1144); - addNodeObject(animation, "Bar / Graph", s_node_bar_graph, "Node_Plot_Linear", [0, Node_create_Plot_Linear], global.node_plot_linear_keys, "Plot graph or bar chart from array of number.").setVersion(1144); + ds_list_add(animation, "/Analyzers"); addNodeObject(animation, "Audio Window", s_node_audio_trim, "Node_Audio_Window", [1, Node_Audio_Window],, "Take a slice of an audio array based on the current frame.").setVersion(1144); addNodeObject(animation, "Audio Volume", s_node_audio_volume, "Node_Audio_Loudness", [1, Node_Audio_Loudness],, "Calculate volume of an audio bit array.").setVersion(11540); + addNodeObject(animation, "FFT", s_node_FFT, "Node_FFT", [1, Node_FFT], ["frequency analysis"], "Perform fourier transform on number array.").setVersion(1144); + ds_list_add(animation, "/Renders"); + addNodeObject(animation, "Bar / Graph", s_node_bar_graph, "Node_Plot_Linear", [0, Node_create_Plot_Linear], global.node_plot_linear_keys, "Plot graph or bar chart from array of number.").setVersion(1144); #endregion #region misc var node = ds_list_create(); addNodeCatagory("Misc", node); ds_list_add(node, "Control"); - addNodeObject(node, "Condition", s_node_condition, "Node_Condition", [1, Node_Condition],, "Given a condition, output one value if true, another value is false."); - addNodeObject(node, "Switch", s_node_switch, "Node_Switch", [1, Node_Switch],, "Given an index, output a value labeled by the same index.").setVersion(1090); + addNodeObject(node, "Condition", s_node_condition, "Node_Condition", [1, Node_Condition],, "Output value based on conditions."); + addNodeObject(node, "Switch", s_node_switch, "Node_Switch", [1, Node_Switch],, "Output value based on index.").setVersion(1090); addNodeObject(node, "Animation Control", s_node_animation_control, "Node_Animation_Control", [1, Node_Animation_Control],, "Control animation state with triggers.").setVersion(1145); - + ds_list_add(node, "Groups"); addNodeObject(node, "Group", s_node_group, "Node_Group", [1, Node_Group]); addNodeObject(node, "Feedback", s_node_feedback, "Node_Feedback", [1, Node_Feedback],, "Create a group that reuse output from last frame to the current one.").isDeprecated(); diff --git a/scripts/node_revert/node_revert.gml b/scripts/node_revert/node_revert.gml index a4143a41a..533a4ab4a 100644 --- a/scripts/node_revert/node_revert.gml +++ b/scripts/node_revert/node_revert.gml @@ -1,5 +1,5 @@ function Node_Revert(_x, _y, _group = noone) : Node(_x, _y, _group) constructor { - name = "Revert"; + name = "Reverse"; use_cache = CACHE_USE.manual; newInput(0, nodeValue_Surface("Surface in", self)); diff --git a/scripts/panel_collection/panel_collection.gml b/scripts/panel_collection/panel_collection.gml index 5d41bd77e..e9160803f 100644 --- a/scripts/panel_collection/panel_collection.gml +++ b/scripts/panel_collection/panel_collection.gml @@ -760,9 +760,9 @@ function Panel_Collection() : PanelContent() constructor { case "Collections" : case "Assets" : case "Nodes" : - draw_sprite_stretched(THEME.ui_panel_bg, 1, group_w, content_y, content_w, content_h); - if(pageStr[page] == "Nodes") { + draw_sprite_stretched(THEME.ui_panel_bg, 1, group_w, content_y, content_w, content_h); + nodeListPane.setFocusHover(pFOCUS, pHOVER); nodecontentPane.setFocusHover(pFOCUS, pHOVER); @@ -770,6 +770,8 @@ function Panel_Collection() : PanelContent() constructor { nodecontentPane.draw(group_w + ppd, content_y + ppd, mx - group_w - ppd, my - content_y - ppd); } else { + draw_sprite_stretched(THEME.ui_panel_bg, 1, group_w, content_y, content_w, content_h); + folderPane.setFocusHover(pFOCUS, pHOVER); contentPane.setFocusHover(pFOCUS, pHOVER); @@ -808,6 +810,8 @@ function Panel_Collection() : PanelContent() constructor { } + ////- Title bar + var _x = ui(10); var _y = ui(10); var _w = ui(160); diff --git a/scripts/scrollPane/scrollPane.gml b/scripts/scrollPane/scrollPane.gml index c93e4adc2..1e50963c3 100644 --- a/scripts/scrollPane/scrollPane.gml +++ b/scripts/scrollPane/scrollPane.gml @@ -44,6 +44,11 @@ function scrollPane(_w, _h, ondraw) : widget() constructor { scroll_color_bar_active = COLORS.scrollbar_active; scroll_color_bar_alpha = 1; + static verify = function(_w, _h) { + if(w == _w && h == _h) return; + resize(_w, _h); + } + static resize = function(_w, _h) { w = _w; h = _h; diff --git a/sprites/s_view_group/38e2b62c-ee4b-4f9d-a01f-0af316e872d0.png b/sprites/s_view_group/38e2b62c-ee4b-4f9d-a01f-0af316e872d0.png new file mode 100644 index 000000000..1481db3c9 Binary files /dev/null and b/sprites/s_view_group/38e2b62c-ee4b-4f9d-a01f-0af316e872d0.png differ diff --git a/sprites/s_view_group/a0ef46f4-d3fe-4c3e-a522-7a8823bdf5fb.png b/sprites/s_view_group/a0ef46f4-d3fe-4c3e-a522-7a8823bdf5fb.png new file mode 100644 index 000000000..51509fc4d Binary files /dev/null and b/sprites/s_view_group/a0ef46f4-d3fe-4c3e-a522-7a8823bdf5fb.png differ diff --git a/sprites/s_view_group/a34a2958-7812-4a6f-baf8-c7c0dd1dc285.png b/sprites/s_view_group/a34a2958-7812-4a6f-baf8-c7c0dd1dc285.png deleted file mode 100644 index b4c1ccfe7..000000000 Binary files a/sprites/s_view_group/a34a2958-7812-4a6f-baf8-c7c0dd1dc285.png and /dev/null differ diff --git a/sprites/s_view_group/d55a8988-5427-4644-8ee6-9723cfdc461b.png b/sprites/s_view_group/d55a8988-5427-4644-8ee6-9723cfdc461b.png new file mode 100644 index 000000000..5a7ebab99 Binary files /dev/null and b/sprites/s_view_group/d55a8988-5427-4644-8ee6-9723cfdc461b.png differ diff --git a/sprites/s_view_group/f5daedf6-ae6a-425b-808c-269667d3f11f.png b/sprites/s_view_group/f5daedf6-ae6a-425b-808c-269667d3f11f.png deleted file mode 100644 index bc4804f14..000000000 Binary files a/sprites/s_view_group/f5daedf6-ae6a-425b-808c-269667d3f11f.png and /dev/null differ diff --git a/sprites/s_view_group/layers/38e2b62c-ee4b-4f9d-a01f-0af316e872d0/143b8aa9-5b4f-4002-bb80-0285fc604a22.png b/sprites/s_view_group/layers/38e2b62c-ee4b-4f9d-a01f-0af316e872d0/143b8aa9-5b4f-4002-bb80-0285fc604a22.png new file mode 100644 index 000000000..1481db3c9 Binary files /dev/null and b/sprites/s_view_group/layers/38e2b62c-ee4b-4f9d-a01f-0af316e872d0/143b8aa9-5b4f-4002-bb80-0285fc604a22.png differ diff --git a/sprites/s_view_group/layers/a0ef46f4-d3fe-4c3e-a522-7a8823bdf5fb/143b8aa9-5b4f-4002-bb80-0285fc604a22.png b/sprites/s_view_group/layers/a0ef46f4-d3fe-4c3e-a522-7a8823bdf5fb/143b8aa9-5b4f-4002-bb80-0285fc604a22.png new file mode 100644 index 000000000..51509fc4d Binary files /dev/null and b/sprites/s_view_group/layers/a0ef46f4-d3fe-4c3e-a522-7a8823bdf5fb/143b8aa9-5b4f-4002-bb80-0285fc604a22.png differ diff --git a/sprites/s_view_group/layers/a34a2958-7812-4a6f-baf8-c7c0dd1dc285/41fa2107-8b90-4b3e-b9d0-5397bace4870.png b/sprites/s_view_group/layers/a34a2958-7812-4a6f-baf8-c7c0dd1dc285/41fa2107-8b90-4b3e-b9d0-5397bace4870.png deleted file mode 100644 index b4c1ccfe7..000000000 Binary files a/sprites/s_view_group/layers/a34a2958-7812-4a6f-baf8-c7c0dd1dc285/41fa2107-8b90-4b3e-b9d0-5397bace4870.png and /dev/null differ diff --git a/sprites/s_view_group/layers/d55a8988-5427-4644-8ee6-9723cfdc461b/143b8aa9-5b4f-4002-bb80-0285fc604a22.png b/sprites/s_view_group/layers/d55a8988-5427-4644-8ee6-9723cfdc461b/143b8aa9-5b4f-4002-bb80-0285fc604a22.png new file mode 100644 index 000000000..5a7ebab99 Binary files /dev/null and b/sprites/s_view_group/layers/d55a8988-5427-4644-8ee6-9723cfdc461b/143b8aa9-5b4f-4002-bb80-0285fc604a22.png differ diff --git a/sprites/s_view_group/layers/f5daedf6-ae6a-425b-808c-269667d3f11f/41fa2107-8b90-4b3e-b9d0-5397bace4870.png b/sprites/s_view_group/layers/f5daedf6-ae6a-425b-808c-269667d3f11f/41fa2107-8b90-4b3e-b9d0-5397bace4870.png deleted file mode 100644 index bc4804f14..000000000 Binary files a/sprites/s_view_group/layers/f5daedf6-ae6a-425b-808c-269667d3f11f/41fa2107-8b90-4b3e-b9d0-5397bace4870.png and /dev/null differ diff --git a/sprites/s_view_group/s_view_group.yy b/sprites/s_view_group/s_view_group.yy index 9abde1f47..ba7eb111c 100644 --- a/sprites/s_view_group/s_view_group.yy +++ b/sprites/s_view_group/s_view_group.yy @@ -12,15 +12,16 @@ "edgeFiltering":false, "For3D":false, "frames":[ - {"$GMSpriteFrame":"","%Name":"f5daedf6-ae6a-425b-808c-269667d3f11f","name":"f5daedf6-ae6a-425b-808c-269667d3f11f","resourceType":"GMSpriteFrame","resourceVersion":"2.0",}, - {"$GMSpriteFrame":"","%Name":"a34a2958-7812-4a6f-baf8-c7c0dd1dc285","name":"a34a2958-7812-4a6f-baf8-c7c0dd1dc285","resourceType":"GMSpriteFrame","resourceVersion":"2.0",}, + {"$GMSpriteFrame":"","%Name":"d55a8988-5427-4644-8ee6-9723cfdc461b","name":"d55a8988-5427-4644-8ee6-9723cfdc461b","resourceType":"GMSpriteFrame","resourceVersion":"2.0",}, + {"$GMSpriteFrame":"","%Name":"a0ef46f4-d3fe-4c3e-a522-7a8823bdf5fb","name":"a0ef46f4-d3fe-4c3e-a522-7a8823bdf5fb","resourceType":"GMSpriteFrame","resourceVersion":"2.0",}, + {"$GMSpriteFrame":"","%Name":"38e2b62c-ee4b-4f9d-a01f-0af316e872d0","name":"38e2b62c-ee4b-4f9d-a01f-0af316e872d0","resourceType":"GMSpriteFrame","resourceVersion":"2.0",}, ], "gridX":0, "gridY":0, "height":24, "HTile":false, "layers":[ - {"$GMImageLayer":"","%Name":"41fa2107-8b90-4b3e-b9d0-5397bace4870","blendMode":0,"displayName":"default","isLocked":false,"name":"41fa2107-8b90-4b3e-b9d0-5397bace4870","opacity":100.0,"resourceType":"GMImageLayer","resourceVersion":"2.0","visible":true,}, + {"$GMImageLayer":"","%Name":"143b8aa9-5b4f-4002-bb80-0285fc604a22","blendMode":0,"displayName":"default","isLocked":false,"name":"143b8aa9-5b4f-4002-bb80-0285fc604a22","opacity":100.0,"resourceType":"GMImageLayer","resourceVersion":"2.0","visible":true,}, ], "name":"s_view_group", "nineSlice":null, @@ -50,7 +51,7 @@ }, "eventStubScript":null, "eventToFunction":{}, - "length":2.0, + "length":3.0, "lockOrigin":false, "moments":{ "$KeyframeStore":"", @@ -70,11 +71,14 @@ "tracks":[ {"$GMSpriteFramesTrack":"","builtinName":0,"events":[],"inheritsTrackColour":true,"interpolation":1,"isCreationTrack":false,"keyframes":{"$KeyframeStore":"","Keyframes":[ {"$Keyframe":"","Channels":{ - "0":{"$SpriteFrameKeyframe":"","Id":{"name":"f5daedf6-ae6a-425b-808c-269667d3f11f","path":"sprites/s_view_group/s_view_group.yy",},"resourceType":"SpriteFrameKeyframe","resourceVersion":"2.0",}, - },"Disabled":false,"id":"29a3afe7-8043-42a1-b774-025b98bc33ae","IsCreationKey":false,"Key":0.0,"Length":1.0,"resourceType":"Keyframe","resourceVersion":"2.0","Stretch":false,}, + "0":{"$SpriteFrameKeyframe":"","Id":{"name":"d55a8988-5427-4644-8ee6-9723cfdc461b","path":"sprites/s_view_group/s_view_group.yy",},"resourceType":"SpriteFrameKeyframe","resourceVersion":"2.0",}, + },"Disabled":false,"id":"47529406-5e14-4c12-8a0c-776eef43623f","IsCreationKey":false,"Key":0.0,"Length":1.0,"resourceType":"Keyframe","resourceVersion":"2.0","Stretch":false,}, {"$Keyframe":"","Channels":{ - "0":{"$SpriteFrameKeyframe":"","Id":{"name":"a34a2958-7812-4a6f-baf8-c7c0dd1dc285","path":"sprites/s_view_group/s_view_group.yy",},"resourceType":"SpriteFrameKeyframe","resourceVersion":"2.0",}, - },"Disabled":false,"id":"f2bfd8ed-cd89-49b7-9779-52366c2ffc5f","IsCreationKey":false,"Key":1.0,"Length":1.0,"resourceType":"Keyframe","resourceVersion":"2.0","Stretch":false,}, + "0":{"$SpriteFrameKeyframe":"","Id":{"name":"a0ef46f4-d3fe-4c3e-a522-7a8823bdf5fb","path":"sprites/s_view_group/s_view_group.yy",},"resourceType":"SpriteFrameKeyframe","resourceVersion":"2.0",}, + },"Disabled":false,"id":"4da04ff0-645e-4a5c-9a42-08e8421117c4","IsCreationKey":false,"Key":1.0,"Length":1.0,"resourceType":"Keyframe","resourceVersion":"2.0","Stretch":false,}, + {"$Keyframe":"","Channels":{ + "0":{"$SpriteFrameKeyframe":"","Id":{"name":"38e2b62c-ee4b-4f9d-a01f-0af316e872d0","path":"sprites/s_view_group/s_view_group.yy",},"resourceType":"SpriteFrameKeyframe","resourceVersion":"2.0",}, + },"Disabled":false,"id":"d29869cd-09da-498b-8f03-4abe7bd110ac","IsCreationKey":false,"Key":2.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,