Add option to set some attributes (interpolation, oversample, format) to "group" which will inherit the value from the parent group.

This commit is contained in:
Tanasart 2024-10-17 09:46:19 +07:00
parent 87a9b3ae05
commit f2e919d6be
17 changed files with 154 additions and 68 deletions

View File

@ -38,7 +38,7 @@ function Node_(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) construc
_outSurf = surface_verify(_outSurf, _dim[0], _dim[1]); _outSurf = surface_verify(_outSurf, _dim[0], _dim[1]);
surface_set_shader(_outSurf, SHADER, true, BLEND.over); 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); shader_set_2("dimension", _dim);
draw_surface_safe(_data[0]); draw_surface_safe(_data[0]);

View File

@ -41,7 +41,7 @@
LATEST_VERSION = 1_18_00_0; LATEST_VERSION = 1_18_00_0;
VERSION = 1_18_01_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"; VERSION_STRING = MAC? "1.18.003m" : "1.18.2.0077";
BUILD_NUMBER = 1_18_01_0; BUILD_NUMBER = 1_18_01_0;

View File

@ -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_view_mat(camera, viewMat);
camera_set_proj_mat(camera, projMat); camera_set_proj_mat(camera, projMat);
camera_apply(camera); camera_apply(camera);
gpu_set_texfilter(attributes.interpolate); gpu_set_texfilter(getAttribute("interpolate"));
object.transform.submitMatrix(); object.transform.submitMatrix();
matrix_set(matrix_world, matrix_stack_top()); matrix_set(matrix_world, matrix_stack_top());

View File

@ -167,8 +167,8 @@ function Node_ASE_File_Read(_x, _y, _group = noone) : Node(_x, _y, _group) const
]; ];
attributes.layer_visible = []; attributes.layer_visible = [];
attributes.interpolate = 0; attributes.interpolate = 1;
attributes.oversample = 0; attributes.oversample = 1;
edit_time = 0; edit_time = 0;
attributes.file_checker = true; attributes.file_checker = true;

View File

@ -1,5 +1,6 @@
#region attribute #region attribute
global.SURFACE_INTERPOLATION = [ global.SURFACE_INTERPOLATION = [
"-Group",
"Pixel", "Pixel",
"Bilinear", "Bilinear",
"Bicubic", "Bicubic",
@ -7,6 +8,7 @@
]; ];
global.SURFACE_OVERSAMPLE = [ global.SURFACE_OVERSAMPLE = [
"-Group",
"Empty", "Empty",
"Clamp", "Clamp",
"Repeat", "Repeat",
@ -15,6 +17,8 @@
function __initSurfaceFormat() { function __initSurfaceFormat() {
var surface_format = [ var surface_format = [
-1,
-2,
surface_rgba4unorm, surface_rgba4unorm,
surface_rgba8unorm, surface_rgba8unorm,
surface_rgba16float, surface_rgba16float,
@ -25,6 +29,8 @@
]; ];
var surface_format_name = [ var surface_format_name = [
"-Input",
"-Group",
"4 bit RGBA", "4 bit RGBA",
"8 bit RGBA", "8 bit RGBA",
"16 bit RGBA", "16 bit RGBA",
@ -38,59 +44,67 @@
global.SURFACE_FORMAT_NAME = []; global.SURFACE_FORMAT_NAME = [];
for( var i = 0, n = array_length(surface_format); i < n; i++ ) { for( var i = 0, n = array_length(surface_format); i < n; i++ ) {
var sup = surface_format_is_supported(surface_format[i]); var _form = surface_format[i];
array_push(global.SURFACE_FORMAT, surface_format[i]); var _supp = _form < 0 || surface_format_is_supported(_form);
array_push(global.SURFACE_FORMAT_NAME, (sup? "" : "-") + surface_format_name[i]);
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.");
}
} }
global.SURFACE_FORMAT_NAME_PROCESS = [ "Input" ]; function __attribute_set(node, key, value) {
global.SURFACE_FORMAT_NAME_PROCESS = array_append(global.SURFACE_FORMAT_NAME_PROCESS, global.SURFACE_FORMAT_NAME); node.attributes[$ key] = value;
node.triggerRender();
}
function attribute_set(key, value) {
if(PANEL_INSPECTOR == noone) return;
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) { function attribute_surface_depth(label = true) {
var depth_array = inputs[0].type == VALUE_TYPE.surface? global.SURFACE_FORMAT_NAME_PROCESS : global.SURFACE_FORMAT_NAME; attr_depth_array = global.SURFACE_FORMAT_NAME;
attributes.color_depth = array_find(depth_array, "8 bit RGBA"); 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"); if(label) array_push(attributeEditors, "Surface");
array_push(attributeEditors, ["Color depth", function() { return attributes.color_depth; }, array_push(attributeEditors, ["Color depth", function() /*=>*/ {return attributes.color_depth},
new scrollBox(depth_array, function(val) { new scrollBox(attr_depth_array, function(val) /*=>*/ { attribute_set("color_depth", val); }, false), "color_depth"]);
attributes.color_depth = val;
triggerRender();
}, false)]);
} }
function attribute_interpolation(label = false) { function attribute_interpolation(label = false) {
attributes.interpolate = 0; attributes.interpolate = 1;
attributes.oversample = 0; attributes.oversample = 1;
if(label) array_push(attributeEditors, "Surface"); if(label) array_push(attributeEditors, "Surface");
array_push(attributeEditors, ["Texture interpolation", function() { return attributes.interpolate; }, array_push(attributeEditors, ["Texture interpolation", function() /*=>*/ {return attributes.interpolate},
new scrollBox(global.SURFACE_INTERPOLATION, function(val) { new scrollBox(global.SURFACE_INTERPOLATION, function(val) /*=>*/ { attribute_set("interpolate", val); }, false), "interpolate"]);
attributes.interpolate = val;
triggerRender();
}, false)]);
} }
function attribute_oversample(label = false) { function attribute_oversample(label = false) {
attributes.interpolate = 0; attributes.interpolate = 1;
attributes.oversample = 0; attributes.oversample = 1;
if(label) array_push(attributeEditors, "Surface"); if(label) array_push(attributeEditors, "Surface");
array_push(attributeEditors, ["Oversample", function() { return attributes.oversample; }, array_push(attributeEditors, ["Oversample", function() /*=>*/ {return attributes.oversample},
new scrollBox(global.SURFACE_OVERSAMPLE, function(val) { new scrollBox(global.SURFACE_OVERSAMPLE, function(val) /*=>*/ { attribute_set("oversample", val); }, false), "oversample"]);
attributes.oversample = val;
triggerRender();
}, false)]);
} }
function attribute_auto_execute(label = false) { function attribute_auto_execute(label = false) {
attributes.auto_exe = false; attributes.auto_exe = false;
if(label) array_push(attributeEditors, "Node"); if(label) array_push(attributeEditors, "Node");
array_push(attributeEditors, ["Auto execute", function() { return attributes.auto_exe; }, array_push(attributeEditors, ["Auto execute", function() /*=>*/ {return attributes.auto_exe},
new checkBox(function() { new checkBox(function() /*=>*/ { attribute_set("auto_exe", !attributes.auto_exe); })]);
attributes.auto_exe = !attributes.auto_exe;
})]);
} }
#endregion #endregion

View File

@ -248,7 +248,7 @@ function Node_Bend(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) cons
var n = array_length(mesh); var n = array_length(mesh);
gpu_set_texfilter(attributes.interpolate); gpu_set_texfilter(getAttribute("interpolate"));
for( var k = 0; k < n; k += 100 ) { for( var k = 0; k < n; k += 100 ) {
draw_primitive_begin_texture(pr_trianglelist, surface_get_texture(_surf)); draw_primitive_begin_texture(pr_trianglelist, surface_get_texture(_surf));

View File

@ -220,9 +220,16 @@ function Node_Collection(_x, _y, _group = noone) : Node(_x, _y, _group) construc
onNewInputFromGraph = noone; onNewInputFromGraph = noone;
/////========== Attributes ===========
attribute_surface_depth();
attribute_interpolation();
attribute_oversample();
tool_node = noone; tool_node = noone;
draw_input_overlay = true; 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, ["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 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); }) ]); 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); recordAction(ACTION_TYPE.group_added, self, _node);
_node.group = self; _node.group = self;
_node.checkGroup();
will_refresh = true; will_refresh = true;
node_length = array_length(nodes); node_length = array_length(nodes);
@ -305,6 +313,7 @@ function Node_Collection(_x, _y, _group = noone) : Node(_x, _y, _group) construc
if(_hide) _node.disable(); if(_hide) _node.disable();
else _node.group = group; else _node.group = group;
_node.checkGroup();
will_refresh = true; will_refresh = true;
node_length = array_length(nodes); node_length = array_length(nodes);

View File

@ -49,7 +49,7 @@ function Node_Convolution(_x, _y, _group = noone) : Node_Processor(_x, _y, _grou
_ker = array_verify(_ker, _siz * _siz); _ker = array_verify(_ker, _siz * _siz);
surface_set_shader(_outSurf, sh_convolution, true, BLEND.over); 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_dim("dimension", _outSurf);
shader_set_f("kernel", _ker); shader_set_f("kernel", _ker);
shader_set_i("size", _siz); shader_set_i("size", _siz);

View File

@ -2385,6 +2385,12 @@ function Node(_x, _y, _group = noone) : __Node_Base(_x, _y) constructor {
static attributeDeserialize = function(attr) { static attributeDeserialize = function(attr) {
struct_append(attributes, 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() {} static processDeserialize = function() {}
@ -2656,21 +2662,81 @@ function Node(_x, _y, _group = noone) : __Node_Base(_x, _y) constructor {
static resetAnimation = function() {} static resetAnimation = function() {}
static attrDepth = function() { static getAttribute = function(_key) {
if(struct_has(attributes, "color_depth")) { var _val = struct_try_get(attributes, _key, 0);
var form = attributes.color_depth;
if(inputs[0].type == VALUE_TYPE.surface) switch(_key) {
form--; case "interpolate" :
if(form >= 0) case "oversample" :
return array_safe_get_fast(global.SURFACE_FORMAT, form, surface_rgba8unorm); if(group && _val == 0) return group.getAttribute(_key);
_val--;
break;
} }
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); var _s = getInputData(0);
while(is_array(_s) && array_length(_s)) _s = _s[0]; while(is_array(_s) && array_length(_s)) _s = _s[0];
if(!is_surface(_s)) if(is_surface(_s)) return surface_get_format(_s);
return surface_rgba8unorm;
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}"; } static toString = function() { return $"Node [{internalName}]: {node_id}"; }
} }

View File

@ -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]); _outSurf = surface_verify(_outSurf, _dim[0], _dim[1]);
surface_set_shader(_outSurf, sh_high_pass, true, BLEND.over); 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_2("dimension", _dim);
shader_set_f("radius", _rad); shader_set_f("radius", _rad);
shader_set_f("intensity", _int); shader_set_f("intensity", _int);

View File

@ -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)); newOutput(0, nodeValue_Output("Color", self, VALUE_TYPE.color, c_white));
attribute_oversample(true); attribute_oversample(true);
attributes.oversample = 1;
static getPreviewValues = function() { return getInputData(0); } 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; var py = _pos[1] + j;
if(px < 0 || py < 0 || px >= ww || py >= hh) { if(px < 0 || py < 0 || px >= ww || py >= hh) {
switch(attributes.oversample) { switch(getAttribute("oversample")) {
case 0 : continue; case 0 : continue;
case 1 : case 1 :

View File

@ -373,7 +373,7 @@ function Node_Scatter(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) c
#endregion #endregion
surface_set_target(_outSurf); surface_set_target(_outSurf);
gpu_set_tex_filter(attributes.interpolate); gpu_set_tex_filter(getAttribute("interpolate"));
DRAW_CLEAR DRAW_CLEAR
switch(blend) { switch(blend) {

View File

@ -53,7 +53,7 @@ function Node_Spherize(_x, _y, _group = noone) : Node_Processor(_x, _y, _group)
attribute_oversample(); attribute_oversample();
attribute_interpolation(); attribute_interpolation();
attributes.oversample = 2; attributes.oversample = 3;
static drawOverlay = function(hover, active, _x, _y, _s, _mx, _my, _snx, _sny) { #region static drawOverlay = function(hover, active, _x, _y, _s, _mx, _my, _snx, _sny) { #region
PROCESSOR_OVERLAY_CHECK PROCESSOR_OVERLAY_CHECK

View File

@ -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 INLINE
var res = false; var res = false;

View File

@ -640,7 +640,7 @@ function Panel_Inspector() : PanelContent() constructor {
var lby = yy + ui(12); var lby = yy + ui(12);
draw_set_alpha(0.5); draw_set_alpha(0.5);
draw_set_text(f_p1, fa_center, fa_center, COLORS._main_text_sub); 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; var lbw = string_width(edt) / 2;
draw_set_color(COLORS._main_text_sub); 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_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); var _param = new widgetParam(wx0, yy, ww, hg, val, {}, _m, x + contentPane.x, y + contentPane.y);
_param.s = hg; _param.s = hg;

View File

@ -76,8 +76,7 @@ function scrollBox(_data, _onModify, update_hover = true) : widget() constructor
if(is_numeric(_val)) _selVal = array_safe_get_fast(data, _val); if(is_numeric(_val)) _selVal = array_safe_get_fast(data, _val);
var _text = is_instanceof(_selVal, scrollItem)? _selVal.name : _selVal; var _text = is_instanceof(_selVal, scrollItem)? _selVal.name : _selVal;
if(is_string(_text)) if(is_string(_text)) _text = string_trim_start(_text, ["-", ">", " "]);
_text = string_trim_start(_text, ["-", ">", " "]);
curr_text = _text; curr_text = _text;
w = _w; w = _w;
@ -106,9 +105,8 @@ function scrollBox(_data, _onModify, update_hover = true) : widget() constructor
if(mouse_press(mb_left, active)) if(mouse_press(mb_left, active))
trigger(); 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); draw_sprite_stretched_ext(THEME.textbox, 2, _x, _y, w, _h, COLORS._main_accent, 1);
}
if(is_array(data_list) && key_mod_press(SHIFT)) { if(is_array(data_list) && key_mod_press(SHIFT)) {
var ind = array_find(data_list, _text); var ind = array_find(data_list, _text);

View File

@ -186,10 +186,10 @@ function shader_set_palette(pal, pal_uni = "palette", amo_uni = "paletteAmount",
function shader_preset_interpolation(shader = sh_sample) { function shader_preset_interpolation(shader = sh_sample) {
INLINE 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, "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() { 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) { function shader_set_interpolation(surface, _dim = noone) {
INLINE INLINE
var intp = attributes.interpolate; var intp = getAttribute("interpolate");
shader_set_i("interpolation", intp); shader_set_i("interpolation", intp);
shader_set_f("sampleDimension", _dim == noone? surface_get_dimension(surface) : _dim); 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) { function surface_set_shader(surface, shader = sh_sample, clear = true, blend = BLEND.alpha) {