From f2e919d6be963f5d3c9b4cb1d7149392fc8ffe8b Mon Sep 17 00:00:00 2001 From: Tanasart Date: Thu, 17 Oct 2024 09:46:19 +0700 Subject: [PATCH] Add option to set some attributes (interpolation, oversample, format) to "group" which will inherit the value from the parent group. --- .../__node_surface_filter.gml | 2 +- scripts/globals/globals.gml | 2 +- .../node_3d_transform_image.gml | 2 +- .../node_ase_file_read/node_ase_file_read.gml | 4 +- scripts/node_attributes/node_attributes.gml | 76 +++++++++------- scripts/node_bend/node_bend.gml | 2 +- scripts/node_collection/node_collection.gml | 11 ++- scripts/node_convolution/node_convolution.gml | 2 +- scripts/node_data/node_data.gml | 90 ++++++++++++++++--- scripts/node_high_pass/node_high_pass.gml | 2 +- scripts/node_sampler/node_sampler.gml | 3 +- scripts/node_scatter/node_scatter.gml | 2 +- scripts/node_spherize/node_spherize.gml | 2 +- scripts/node_value/node_value.gml | 2 +- scripts/panel_inspector/panel_inspector.gml | 6 +- scripts/scrollBox/scrollBox.gml | 6 +- scripts/shader_functions/shader_functions.gml | 8 +- 17 files changed, 154 insertions(+), 68 deletions(-) diff --git a/scripts/__node_surface_filter/__node_surface_filter.gml b/scripts/__node_surface_filter/__node_surface_filter.gml index 68f1e5a25..60556abe9 100644 --- a/scripts/__node_surface_filter/__node_surface_filter.gml +++ b/scripts/__node_surface_filter/__node_surface_filter.gml @@ -38,7 +38,7 @@ function Node_(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) construc _outSurf = surface_verify(_outSurf, _dim[0], _dim[1]); surface_set_shader(_outSurf, SHADER, true, BLEND.over); - shader_set_i("sampleMode", attributes.oversample); + shader_set_i("sampleMode", getAttribute("oversample")); shader_set_2("dimension", _dim); draw_surface_safe(_data[0]); diff --git a/scripts/globals/globals.gml b/scripts/globals/globals.gml index bf400ebfe..dee79d388 100644 --- a/scripts/globals/globals.gml +++ b/scripts/globals/globals.gml @@ -41,7 +41,7 @@ LATEST_VERSION = 1_18_00_0; VERSION = 1_18_01_0; - SAVE_VERSION = 1_18_01_0; + SAVE_VERSION = 1_18_02_0; VERSION_STRING = MAC? "1.18.003m" : "1.18.2.0077"; BUILD_NUMBER = 1_18_01_0; diff --git a/scripts/node_3d_transform_image/node_3d_transform_image.gml b/scripts/node_3d_transform_image/node_3d_transform_image.gml index c2d79efd3..ecd66479b 100644 --- a/scripts/node_3d_transform_image/node_3d_transform_image.gml +++ b/scripts/node_3d_transform_image/node_3d_transform_image.gml @@ -108,7 +108,7 @@ function Node_3D_Transform_Image(_x, _y, _group = noone) : Node_3D_Mesh(_x, _y, camera_set_view_mat(camera, viewMat); camera_set_proj_mat(camera, projMat); camera_apply(camera); - gpu_set_texfilter(attributes.interpolate); + gpu_set_texfilter(getAttribute("interpolate")); object.transform.submitMatrix(); matrix_set(matrix_world, matrix_stack_top()); diff --git a/scripts/node_ase_file_read/node_ase_file_read.gml b/scripts/node_ase_file_read/node_ase_file_read.gml index 50b618278..47cbceb20 100644 --- a/scripts/node_ase_file_read/node_ase_file_read.gml +++ b/scripts/node_ase_file_read/node_ase_file_read.gml @@ -167,8 +167,8 @@ function Node_ASE_File_Read(_x, _y, _group = noone) : Node(_x, _y, _group) const ]; attributes.layer_visible = []; - attributes.interpolate = 0; - attributes.oversample = 0; + attributes.interpolate = 1; + attributes.oversample = 1; edit_time = 0; attributes.file_checker = true; diff --git a/scripts/node_attributes/node_attributes.gml b/scripts/node_attributes/node_attributes.gml index 290998ea4..b4df04520 100644 --- a/scripts/node_attributes/node_attributes.gml +++ b/scripts/node_attributes/node_attributes.gml @@ -1,5 +1,6 @@ #region attribute global.SURFACE_INTERPOLATION = [ + "-Group", "Pixel", "Bilinear", "Bicubic", @@ -7,6 +8,7 @@ ]; global.SURFACE_OVERSAMPLE = [ + "-Group", "Empty", "Clamp", "Repeat", @@ -15,6 +17,8 @@ function __initSurfaceFormat() { var surface_format = [ + -1, + -2, surface_rgba4unorm, surface_rgba8unorm, surface_rgba16float, @@ -25,6 +29,8 @@ ]; var surface_format_name = [ + "-Input", + "-Group", "4 bit RGBA", "8 bit RGBA", "16 bit RGBA", @@ -38,59 +44,67 @@ global.SURFACE_FORMAT_NAME = []; for( var i = 0, n = array_length(surface_format); i < n; i++ ) { - var sup = surface_format_is_supported(surface_format[i]); - array_push(global.SURFACE_FORMAT, surface_format[i]); - array_push(global.SURFACE_FORMAT_NAME, (sup? "" : "-") + surface_format_name[i]); + var _form = surface_format[i]; + var _supp = _form < 0 || surface_format_is_supported(_form); - if(!sup) log_message("WARNING", "Surface format [" + surface_format_name[i] + "] not supported in this device."); + array_push(global.SURFACE_FORMAT, _form); + array_push(global.SURFACE_FORMAT_NAME, (_supp? "" : "-") + surface_format_name[i]); + + if(!_supp) log_message("WARNING", $"Surface format [{surface_format_name[i]}] not supported in this device."); } + } + + function __attribute_set(node, key, value) { + node.attributes[$ key] = value; + node.triggerRender(); + } + + function attribute_set(key, value) { + if(PANEL_INSPECTOR == noone) return; - global.SURFACE_FORMAT_NAME_PROCESS = [ "Input" ]; - global.SURFACE_FORMAT_NAME_PROCESS = array_append(global.SURFACE_FORMAT_NAME_PROCESS, global.SURFACE_FORMAT_NAME); + if(PANEL_INSPECTOR.inspecting) + __attribute_set(PANEL_INSPECTOR.inspecting, key, value); + + if(PANEL_INSPECTOR.inspectGroup == 1) + for( var i = 0, n = array_length(PANEL_INSPECTOR.inspectings); i < n; i++ ) + __attribute_set(PANEL_INSPECTOR.inspectings[i], key, value); } function attribute_surface_depth(label = true) { - var depth_array = inputs[0].type == VALUE_TYPE.surface? global.SURFACE_FORMAT_NAME_PROCESS : global.SURFACE_FORMAT_NAME; - attributes.color_depth = array_find(depth_array, "8 bit RGBA"); + attr_depth_array = global.SURFACE_FORMAT_NAME; + if(!array_empty(inputs) && inputs[0].type == VALUE_TYPE.surface) + attr_depth_array[0] = "Input"; + + attributes.color_depth = 3; if(label) array_push(attributeEditors, "Surface"); - array_push(attributeEditors, ["Color depth", function() { return attributes.color_depth; }, - new scrollBox(depth_array, function(val) { - attributes.color_depth = val; - triggerRender(); - }, false)]); + array_push(attributeEditors, ["Color depth", function() /*=>*/ {return attributes.color_depth}, + new scrollBox(attr_depth_array, function(val) /*=>*/ { attribute_set("color_depth", val); }, false), "color_depth"]); } function attribute_interpolation(label = false) { - attributes.interpolate = 0; - attributes.oversample = 0; + attributes.interpolate = 1; + attributes.oversample = 1; if(label) array_push(attributeEditors, "Surface"); - array_push(attributeEditors, ["Texture interpolation", function() { return attributes.interpolate; }, - new scrollBox(global.SURFACE_INTERPOLATION, function(val) { - attributes.interpolate = val; - triggerRender(); - }, false)]); + array_push(attributeEditors, ["Texture interpolation", function() /*=>*/ {return attributes.interpolate}, + new scrollBox(global.SURFACE_INTERPOLATION, function(val) /*=>*/ { attribute_set("interpolate", val); }, false), "interpolate"]); } function attribute_oversample(label = false) { - attributes.interpolate = 0; - attributes.oversample = 0; + attributes.interpolate = 1; + attributes.oversample = 1; if(label) array_push(attributeEditors, "Surface"); - array_push(attributeEditors, ["Oversample", function() { return attributes.oversample; }, - new scrollBox(global.SURFACE_OVERSAMPLE, function(val) { - attributes.oversample = val; - triggerRender(); - }, false)]); + array_push(attributeEditors, ["Oversample", function() /*=>*/ {return attributes.oversample}, + new scrollBox(global.SURFACE_OVERSAMPLE, function(val) /*=>*/ { attribute_set("oversample", val); }, false), "oversample"]); } function attribute_auto_execute(label = false) { attributes.auto_exe = false; + if(label) array_push(attributeEditors, "Node"); - array_push(attributeEditors, ["Auto execute", function() { return attributes.auto_exe; }, - new checkBox(function() { - attributes.auto_exe = !attributes.auto_exe; - })]); + array_push(attributeEditors, ["Auto execute", function() /*=>*/ {return attributes.auto_exe}, + new checkBox(function() /*=>*/ { attribute_set("auto_exe", !attributes.auto_exe); })]); } #endregion \ No newline at end of file diff --git a/scripts/node_bend/node_bend.gml b/scripts/node_bend/node_bend.gml index 36100bf60..afa818186 100644 --- a/scripts/node_bend/node_bend.gml +++ b/scripts/node_bend/node_bend.gml @@ -248,7 +248,7 @@ function Node_Bend(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) cons var n = array_length(mesh); - gpu_set_texfilter(attributes.interpolate); + gpu_set_texfilter(getAttribute("interpolate")); for( var k = 0; k < n; k += 100 ) { draw_primitive_begin_texture(pr_trianglelist, surface_get_texture(_surf)); diff --git a/scripts/node_collection/node_collection.gml b/scripts/node_collection/node_collection.gml index ca1b94871..f5e593251 100644 --- a/scripts/node_collection/node_collection.gml +++ b/scripts/node_collection/node_collection.gml @@ -220,9 +220,16 @@ function Node_Collection(_x, _y, _group = noone) : Node(_x, _y, _group) construc onNewInputFromGraph = noone; + /////========== Attributes =========== + + attribute_surface_depth(); + attribute_interpolation(); + attribute_oversample(); + tool_node = noone; draw_input_overlay = true; + array_push(attributeEditors, "Group IO"); array_push(attributeEditors, ["Lock Input", function() /*=>*/ {return attributes.lock_input}, new checkBox(function() /*=>*/ { attributes.lock_input = !attributes.lock_input }) ]); array_push(attributeEditors, ["Edit Input Display", function() /*=>*/ {return 0}, button(function() /*=>*/ { dialogCall(o_dialog_group_input_order).setNode(self, CONNECT_TYPE.input); }) ]); array_push(attributeEditors, ["Edit Output Display", function() /*=>*/ {return 0}, button(function() /*=>*/ { dialogCall(o_dialog_group_input_order).setNode(self, CONNECT_TYPE.output); }) ]); @@ -279,6 +286,7 @@ function Node_Collection(_x, _y, _group = noone) : Node(_x, _y, _group) construc recordAction(ACTION_TYPE.group_added, self, _node); _node.group = self; + _node.checkGroup(); will_refresh = true; node_length = array_length(nodes); @@ -305,7 +313,8 @@ function Node_Collection(_x, _y, _group = noone) : Node(_x, _y, _group) construc if(_hide) _node.disable(); else _node.group = group; - + _node.checkGroup(); + will_refresh = true; node_length = array_length(nodes); onRemove(_node); diff --git a/scripts/node_convolution/node_convolution.gml b/scripts/node_convolution/node_convolution.gml index d1644a17f..04f72bec1 100644 --- a/scripts/node_convolution/node_convolution.gml +++ b/scripts/node_convolution/node_convolution.gml @@ -49,7 +49,7 @@ function Node_Convolution(_x, _y, _group = noone) : Node_Processor(_x, _y, _grou _ker = array_verify(_ker, _siz * _siz); surface_set_shader(_outSurf, sh_convolution, true, BLEND.over); - shader_set_i("sampleMode", attributes.oversample); + shader_set_i("sampleMode", getAttribute("oversample")); shader_set_dim("dimension", _outSurf); shader_set_f("kernel", _ker); shader_set_i("size", _siz); diff --git a/scripts/node_data/node_data.gml b/scripts/node_data/node_data.gml index 4a47585e6..f28f528cc 100644 --- a/scripts/node_data/node_data.gml +++ b/scripts/node_data/node_data.gml @@ -2385,6 +2385,12 @@ function Node(_x, _y, _group = noone) : __Node_Base(_x, _y) constructor { static attributeDeserialize = function(attr) { struct_append(attributes, attr); + + if(LOADING_VERSION < 1_18_02_0) { + if(struct_has(attributes, "color_depth")) attributes.color_depth += inputs[0].type == VALUE_TYPE.surface? 1 : 2; + if(struct_has(attributes, "interpolate")) attributes.interpolate++; + if(struct_has(attributes, "oversample")) attributes.oversample++; + } } static processDeserialize = function() {} @@ -2656,21 +2662,81 @@ function Node(_x, _y, _group = noone) : __Node_Base(_x, _y) constructor { static resetAnimation = function() {} - static attrDepth = function() { - if(struct_has(attributes, "color_depth")) { - var form = attributes.color_depth; - if(inputs[0].type == VALUE_TYPE.surface) - form--; - if(form >= 0) - return array_safe_get_fast(global.SURFACE_FORMAT, form, surface_rgba8unorm); + static getAttribute = function(_key) { + var _val = struct_try_get(attributes, _key, 0); + + switch(_key) { + case "interpolate" : + case "oversample" : + if(group && _val == 0) return group.getAttribute(_key); + _val--; + break; } - var _s = getInputData(0); - while(is_array(_s) && array_length(_s)) _s = _s[0]; - if(!is_surface(_s)) - return surface_rgba8unorm; - return surface_get_format(_s); + return _val; } + static attrDepth = function() { + var form = -1; + + if(struct_has(attributes, "color_depth")) { + form = global.SURFACE_FORMAT[attributes.color_depth]; + if(form >= 0) return form; + } + + if(form == -1) { // input + var _s = getInputData(0); + while(is_array(_s) && array_length(_s)) _s = _s[0]; + if(is_surface(_s)) return surface_get_format(_s); + } + + if(form == -2 && group != noone) // group + return group.attrDepth(); + + return surface_rgba8unorm; + } + + static checkGroup = function() { + + if(group == noone) { + for( var i = 0, n = array_length(attributeEditors); i < n; i++ ) { + var _att = attributeEditors[i]; + if(!is_array(_att)) continue; + + var _wid = _att[2]; + + if(is(_wid, scrollBox)) { + var _l = _wid.data_list; + var _lin = array_get_index(_l, "Group"); + + if(_lin != -1) { + _wid.data_list[_lin] = "-Group"; + var _key = _att[3]; + + if(attributes[$ _key] == _lin) + attributes[$ _key] = 1; + } + } + } + + } else { + for( var i = 0, n = array_length(attributeEditors); i < n; i++ ) { + var _att = attributeEditors[i]; + if(!is_array(_att)) continue; + + var _wid = _att[2]; + + if(is(_wid, scrollBox)) { + var _l = _wid.data_list; + var _lin = array_get_index(_l, "-Group"); + + if(_lin != -1) _wid.data_list[_lin] = "Group"; + } + } + + } + + } checkGroup(); + static toString = function() { return $"Node [{internalName}]: {node_id}"; } } \ No newline at end of file diff --git a/scripts/node_high_pass/node_high_pass.gml b/scripts/node_high_pass/node_high_pass.gml index 15d2f59e2..576796456 100644 --- a/scripts/node_high_pass/node_high_pass.gml +++ b/scripts/node_high_pass/node_high_pass.gml @@ -41,7 +41,7 @@ function Node_High_Pass(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) _outSurf = surface_verify(_outSurf, _dim[0], _dim[1]); surface_set_shader(_outSurf, sh_high_pass, true, BLEND.over); - shader_set_i("sampleMode", attributes.oversample); + shader_set_i("sampleMode", getAttribute("oversample")); shader_set_2("dimension", _dim); shader_set_f("radius", _rad); shader_set_f("intensity", _int); diff --git a/scripts/node_sampler/node_sampler.gml b/scripts/node_sampler/node_sampler.gml index aa9c11db2..5af092cdd 100644 --- a/scripts/node_sampler/node_sampler.gml +++ b/scripts/node_sampler/node_sampler.gml @@ -15,7 +15,6 @@ function Node_Sampler(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) c newOutput(0, nodeValue_Output("Color", self, VALUE_TYPE.color, c_white)); attribute_oversample(true); - attributes.oversample = 1; static getPreviewValues = function() { return getInputData(0); } @@ -70,7 +69,7 @@ function Node_Sampler(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) c var py = _pos[1] + j; if(px < 0 || py < 0 || px >= ww || py >= hh) { - switch(attributes.oversample) { + switch(getAttribute("oversample")) { case 0 : continue; case 1 : diff --git a/scripts/node_scatter/node_scatter.gml b/scripts/node_scatter/node_scatter.gml index c6afd914e..d69c689f5 100644 --- a/scripts/node_scatter/node_scatter.gml +++ b/scripts/node_scatter/node_scatter.gml @@ -373,7 +373,7 @@ function Node_Scatter(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) c #endregion surface_set_target(_outSurf); - gpu_set_tex_filter(attributes.interpolate); + gpu_set_tex_filter(getAttribute("interpolate")); DRAW_CLEAR switch(blend) { diff --git a/scripts/node_spherize/node_spherize.gml b/scripts/node_spherize/node_spherize.gml index 69ad767c7..020f77197 100644 --- a/scripts/node_spherize/node_spherize.gml +++ b/scripts/node_spherize/node_spherize.gml @@ -53,7 +53,7 @@ function Node_Spherize(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) attribute_oversample(); attribute_interpolation(); - attributes.oversample = 2; + attributes.oversample = 3; static drawOverlay = function(hover, active, _x, _y, _s, _mx, _my, _snx, _sny) { #region PROCESSOR_OVERLAY_CHECK diff --git a/scripts/node_value/node_value.gml b/scripts/node_value/node_value.gml index bcc367431..219cf1ac8 100644 --- a/scripts/node_value/node_value.gml +++ b/scripts/node_value/node_value.gml @@ -1505,7 +1505,7 @@ function NodeValue(_name, _node, _connect, _type, _value, _tooltip = "") constru } } - static setValueInspector = function(_val = 0, index = noone, time = CURRENT_FRAME) { + static setValueInspector = function(_val = 0, index = noone, time = CURRENT_FRAME) { // This should be in panel_graph not here. INLINE var res = false; diff --git a/scripts/panel_inspector/panel_inspector.gml b/scripts/panel_inspector/panel_inspector.gml index 32acc02a5..fc1ca8b7f 100644 --- a/scripts/panel_inspector/panel_inspector.gml +++ b/scripts/panel_inspector/panel_inspector.gml @@ -640,7 +640,7 @@ function Panel_Inspector() : PanelContent() constructor { var lby = yy + ui(12); draw_set_alpha(0.5); draw_set_text(f_p1, fa_center, fa_center, COLORS._main_text_sub); - draw_text(xc, lby, edt); + draw_text_add(xc, lby, edt); var lbw = string_width(edt) / 2; draw_set_color(COLORS._main_text_sub); @@ -667,7 +667,7 @@ function Panel_Inspector() : PanelContent() constructor { } draw_set_text(f_p1, fa_left, fa_center, COLORS._main_text); - draw_text(ui(8), yy + hg / 2, edt[0]); + draw_text_add(ui(8), yy + hg / 2, edt[0]); var _param = new widgetParam(wx0, yy, ww, hg, val, {}, _m, x + contentPane.x, y + contentPane.y); _param.s = hg; @@ -1085,7 +1085,7 @@ function Panel_Inspector() : PanelContent() constructor { tb_node_name.setFocusHover(pFOCUS, pHOVER); var txt = inspecting.renamed? inspecting.display_name : inspecting.name; - if(inspectGroup == 1) txt = $"[{array_length(PANEL_GRAPH.nodes_selecting)}] {txt}"; + if(inspectGroup == 1) txt = $"[{array_length(PANEL_GRAPH.nodes_selecting)}] {txt}"; else if(inspectGroup == -1) txt = $"[{array_length(PANEL_GRAPH.nodes_selecting)}] Multiple nodes"; tb_node_name.draw(ui(64), ui(14), w - ui(128), ui(32), txt, [ mx, my ]); diff --git a/scripts/scrollBox/scrollBox.gml b/scripts/scrollBox/scrollBox.gml index 133c4d653..e69849b6d 100644 --- a/scripts/scrollBox/scrollBox.gml +++ b/scripts/scrollBox/scrollBox.gml @@ -76,8 +76,7 @@ function scrollBox(_data, _onModify, update_hover = true) : widget() constructor if(is_numeric(_val)) _selVal = array_safe_get_fast(data, _val); var _text = is_instanceof(_selVal, scrollItem)? _selVal.name : _selVal; - if(is_string(_text)) - _text = string_trim_start(_text, ["-", ">", " "]); + if(is_string(_text)) _text = string_trim_start(_text, ["-", ">", " "]); curr_text = _text; w = _w; @@ -106,9 +105,8 @@ function scrollBox(_data, _onModify, update_hover = true) : widget() constructor if(mouse_press(mb_left, active)) trigger(); - if(mouse_click(mb_left, active)) { + if(mouse_click(mb_left, active)) draw_sprite_stretched_ext(THEME.textbox, 2, _x, _y, w, _h, COLORS._main_accent, 1); - } if(is_array(data_list) && key_mod_press(SHIFT)) { var ind = array_find(data_list, _text); diff --git a/scripts/shader_functions/shader_functions.gml b/scripts/shader_functions/shader_functions.gml index e006fbe27..137e7f62b 100644 --- a/scripts/shader_functions/shader_functions.gml +++ b/scripts/shader_functions/shader_functions.gml @@ -186,10 +186,10 @@ function shader_set_palette(pal, pal_uni = "palette", amo_uni = "paletteAmount", function shader_preset_interpolation(shader = sh_sample) { INLINE - var intp = attributes.interpolate; + var intp = getAttribute("interpolate"); shader_set_uniform_i(shader_get_uniform(shader, "interpolation"), intp); - shader_set_uniform_i(shader_get_uniform(shader, "sampleMode"), attributes.oversample); + shader_set_uniform_i(shader_get_uniform(shader, "sampleMode"), getAttribute("oversample")); } function shader_postset_interpolation() { @@ -207,11 +207,11 @@ function shader_set_palette(pal, pal_uni = "palette", amo_uni = "paletteAmount", function shader_set_interpolation(surface, _dim = noone) { INLINE - var intp = attributes.interpolate; + var intp = getAttribute("interpolate"); shader_set_i("interpolation", intp); shader_set_f("sampleDimension", _dim == noone? surface_get_dimension(surface) : _dim); - shader_set_i("sampleMode", attributes.oversample); + shader_set_i("sampleMode", getAttribute("oversample")); } function surface_set_shader(surface, shader = sh_sample, clear = true, blend = BLEND.alpha) {