From 7ffec2633114f3e0e868387e2162fca9a1918cf5 Mon Sep 17 00:00:00 2001 From: Tanasart Date: Mon, 22 Jan 2024 16:46:04 +0700 Subject: [PATCH] Mappable gradient for cpu nodes --- scripts/node_plot_linear/node_plot_linear.gml | 50 ++++++++++++++----- scripts/node_repeat/node_repeat.gml | 38 ++++++++++---- scripts/node_scatter/node_scatter.gml | 31 +++++++++--- 3 files changed, 91 insertions(+), 28 deletions(-) diff --git a/scripts/node_plot_linear/node_plot_linear.gml b/scripts/node_plot_linear/node_plot_linear.gml index 53e76d062..d7682346a 100644 --- a/scripts/node_plot_linear/node_plot_linear.gml +++ b/scripts/node_plot_linear/node_plot_linear.gml @@ -34,7 +34,8 @@ function Node_Plot_Linear(_x, _y, _group = noone) : Node_Processor(_x, _y, _grou inputs[| 12] = nodeValue("Value Offset", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 0); - inputs[| 13] = nodeValue("Color Over Sample", self, JUNCTION_CONNECT.input, VALUE_TYPE.gradient, new gradientObject(c_white)); + inputs[| 13] = nodeValue("Color Over Sample", self, JUNCTION_CONNECT.input, VALUE_TYPE.gradient, new gradientObject(c_white)) + .setMappable(27); inputs[| 14] = nodeValue("Trim mode", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 0) .setDisplay(VALUE_DISPLAY.enum_scroll, [ "Range", "Window" ]); @@ -59,19 +60,32 @@ function Node_Plot_Linear(_x, _y, _group = noone) : Node_Processor(_x, _y, _grou inputs[| 23] = nodeValue("Smooth", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 0) .setDisplay(VALUE_DISPLAY.slider); - inputs[| 24] = nodeValue("Color Over Value", self, JUNCTION_CONNECT.input, VALUE_TYPE.gradient, new gradientObject(c_white)); + inputs[| 24] = nodeValue("Color Over Value", self, JUNCTION_CONNECT.input, VALUE_TYPE.gradient, new gradientObject(c_white)) + .setMappable(29); inputs[| 25] = nodeValue("Value range", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, [ 0, 1 ] ) .setDisplay(VALUE_DISPLAY.range); inputs[| 26] = nodeValue("Absolute", self, JUNCTION_CONNECT.input, VALUE_TYPE.boolean, false); + ////////////////////////////////////////////////////////////////////////////////////////////////// + + inputs[| 27] = nodeValueMap("Sample Gradient map", self); + + inputs[| 28] = nodeValueGradientRange("Sample Gradient map range", self, inputs[| 13]); + + inputs[| 29] = nodeValueMap("Value Gradient map", self); + + inputs[| 30] = nodeValueGradientRange("Value Gradient map range", self, inputs[| 24]); + + ////////////////////////////////////////////////////////////////////////////////////////////////// + outputs[| 0] = nodeValue("Surface out", self, JUNCTION_CONNECT.output, VALUE_TYPE.surface, noone); input_display_list = [ 0, ["Data", true], 1, 12, 21, 14, 2, 3, 15, 16, ["Plot", false], 11, 4, 10, 20, 5, 22, 23, - ["Render", false], 6, 13, 24, 25, 26, 7, 17, 18, 19, + ["Render", false], 6, 13, 27, 24, 29, 25, 26, 7, 17, 18, 19, ["Background", true, 8], 9, ]; @@ -97,13 +111,21 @@ function Node_Plot_Linear(_x, _y, _group = noone) : Node_Processor(_x, _y, _grou inputs[| 4].setVisible(!_use_path); inputs[| 10].setVisible(!_use_path); + + inputs[| 13].mappableStep(); + inputs[| 24].mappableStep(); } static drawOverlay = function(active, _x, _y, _s, _mx, _my, _snx, _sny) { var _use_path = getSingleValue(20) != noone; - if(!_use_path) - inputs[| 4].drawOverlay(active, _x, _y, _s, _mx, _my, _snx, _sny); + if(!_use_path) { + var a = inputs[| 4].drawOverlay(active, _x, _y, _s, _mx, _my, _snx, _sny); + active &= !a; + } + + var a = inputs[| 28].drawOverlay(active, _x, _y, _s, _mx, _my, _snx, _sny, getSingleValue(0)); active &= !a; + var a = inputs[| 30].drawOverlay(active, _x, _y, _s, _mx, _my, _snx, _sny, getSingleValue(0)); active &= !a; } static processData = function(_outSurf, _data, _output_index, _array_index) { @@ -134,11 +156,15 @@ function Node_Plot_Linear(_x, _y, _group = noone) : Node_Processor(_x, _y, _grou var _loop = _data[22]; var _smt = _data[23]; - var _lcl = _data[ 6]; - var _cls = _data[13]; - var _clv = _data[24]; - var _clv_r = _data[25]; - var _clv_a = _data[26]; + var _lcl = _data[ 6]; + var _cls = _data[13]; + var _cls_map = _data[27]; + var _cls_rng = _data[28]; + var _clv = _data[24]; + var _clv_map = _data[29]; + var _clv_rng = _data[30]; + var _clv_r = _data[25]; + var _clv_a = _data[26]; _outSurf = surface_verify(_outSurf, _dim[0], _dim[1], attrDepth()); @@ -199,11 +225,11 @@ function Node_Plot_Linear(_x, _y, _group = noone) : Node_Processor(_x, _y, _grou _ang_nor = _ang + 90; _val = _smp_data[i] + _off; - _col_sam = _cls.eval(i / amo); + _col_sam = evaluate_gradient_map(i / amo, _cls, _cls_map, _cls_rng, inputs[| 13]); var _val_p = _clv_a? abs(_val) : _val; var _val_prog = (_val_p - _clv_r[0]) / (_clv_r[1] - _clv_r[0]); - _col_val = _clv.eval(_val_prog); + _col_val = evaluate_gradient_map(_val_prog, _clv, _clv_map, _clv_rng, inputs[| 24]); var _c1 = colorMultiply(_lcl, _col_sam); var _c2 = _col_val; diff --git a/scripts/node_repeat/node_repeat.gml b/scripts/node_repeat/node_repeat.gml index 0ccc6d3f8..4abd23fd7 100644 --- a/scripts/node_repeat/node_repeat.gml +++ b/scripts/node_repeat/node_repeat.gml @@ -39,7 +39,8 @@ function Node_Repeat(_x, _y, _group = noone) : Node(_x, _y, _group) constructor inputs[| 13] = nodeValue("Path shift", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 0); - inputs[| 14] = nodeValue("Color over copy", self, JUNCTION_CONNECT.input, VALUE_TYPE.gradient, new gradientObject(cola(c_white)) ); + inputs[| 14] = nodeValue("Color over copy", self, JUNCTION_CONNECT.input, VALUE_TYPE.gradient, new gradientObject(cola(c_white)) ) + .setMappable(30); inputs[| 15] = nodeValue("Alpha over copy", self, JUNCTION_CONNECT.input, VALUE_TYPE.curve, CURVE_DEF_11 ); @@ -81,6 +82,14 @@ function Node_Repeat(_x, _y, _group = noone) : Node(_x, _y, _group) constructor inputs[| 29] = nodeValue("Animator", self, JUNCTION_CONNECT.input, VALUE_TYPE.boolean, false) + ////////////////////////////////////////////////////////////////////////////////////////////////// + + inputs[| 30] = nodeValueMap("Gradient map", self); + + inputs[| 31] = nodeValueGradientRange("Gradient map range", self, inputs[| 14]); + + ////////////////////////////////////////////////////////////////////////////////////////////////// + outputs[| 0] = nodeValue("Surface out", self, JUNCTION_CONNECT.output, VALUE_TYPE.surface, noone); input_display_list = [ @@ -88,7 +97,7 @@ function Node_Repeat(_x, _y, _group = noone) : Node(_x, _y, _group) constructor ["Pattern", false], 3, 9, 2, 18, 7, 8, ["Path", true], 11, 12, 13, ["Transform", false], 4, 26, 19, 5, 6, 10, - ["Render", false], 14, + ["Render", false], 14, 30, ["Animator", true, 29], 20, 21, 25, 22, 23, 24, 27, ]; @@ -107,8 +116,7 @@ function Node_Repeat(_x, _y, _group = noone) : Node(_x, _y, _group) constructor } static drawOverlay = function(active, _x, _y, _s, _mx, _my, _snx, _sny) { - if(inputs[| 9].drawOverlay(active, _x, _y, _s, _mx, _my, _snx, _sny, THEME.anchor)) - active = false; + var a = inputs[| 9].drawOverlay(active, _x, _y, _s, _mx, _my, _snx, _sny, THEME.anchor); active &= !a; var _pat = getInputData(3); var _spos = getInputData(9); @@ -117,14 +125,22 @@ function Node_Repeat(_x, _y, _group = noone) : Node(_x, _y, _group) constructor var py = _y + _spos[1] * _s; if(_pat == 0 || _pat == 1) { - if(inputs[| 4].drawOverlay(active, px, py, _s, _mx, _my, _snx, _sny)) - active = false; + var a = inputs[| 4].drawOverlay(active, px, py, _s, _mx, _my, _snx, _sny); + active &= !a; + } else if(_pat == 2) { - if(inputs[| 8].drawOverlay(active, px, py, _s, _mx, _my, _snx, _sny)) - active = false; + var a = inputs[| 8].drawOverlay(active, px, py, _s, _mx, _my, _snx, _sny); + active &= !a; + } + + var a = inputs[| 31].drawOverlay(active, _x, _y, _s, _mx, _my, _snx, _sny, getInputData(1)); active &= !a; } + static step = function() { #region + inputs[| 14].mappableStep(); + } #endregion + function doRepeat(_outSurf, _inSurf) { var _dim = getInputData( 1); var _amo = getInputData( 2); @@ -145,7 +161,9 @@ function Node_Repeat(_x, _y, _group = noone) : Node(_x, _y, _group) constructor var _prng = getInputData(12); var _prsh = getInputData(13); - var _grad = getInputData(14); + var _grad = getInputData(14); + var _grad_map = getInputData(30); + var _grad_range = getInputData(31); var _arr = getInputData(16); var _sed = getInputData(17); @@ -240,7 +258,7 @@ function Node_Repeat(_x, _y, _group = noone) : Node(_x, _y, _group) constructor } var pos = point_rotate(-sw / 2, -sh / 2, 0, 0, rot); - var cc = _grad.eval(i / (_amo - 1)); + var cc = evaluate_gradient_map(i / (_amo - 1), _grad, _grad_map, _grad_range, inputs[| 14]); var aa = _color_get_alpha(cc); cc = colda(cc); diff --git a/scripts/node_scatter/node_scatter.gml b/scripts/node_scatter/node_scatter.gml index cdbae4b82..a0f6e3fc2 100644 --- a/scripts/node_scatter/node_scatter.gml +++ b/scripts/node_scatter/node_scatter.gml @@ -40,7 +40,8 @@ function Node_Scatter(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) c inputs[| 10] = nodeValue("Seed", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, irandom(9999999)); - inputs[| 11] = nodeValue("Random blend", self, JUNCTION_CONNECT.input, VALUE_TYPE.gradient, new gradientObject(c_white) ); + inputs[| 11] = nodeValue("Random blend", self, JUNCTION_CONNECT.input, VALUE_TYPE.gradient, new gradientObject(c_white) ) + .setMappable(28); inputs[| 12] = nodeValue("Alpha", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, [ 1, 1 ]) .setDisplay(VALUE_DISPLAY.slider_range); @@ -86,6 +87,14 @@ function Node_Scatter(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) c inputs[| 27] = nodeValue("Animated array end", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 0) .setDisplay(VALUE_DISPLAY.enum_scroll, [ "Loop", "Ping Pong" ]); + ////////////////////////////////////////////////////////////////////////////////////////////////// + + inputs[| 28] = nodeValueMap("Gradient map", self); + + inputs[| 29] = nodeValueGradientRange("Gradient map range", self, inputs[| 11]); + + ////////////////////////////////////////////////////////////////////////////////////////////////// + outputs[| 0] = nodeValue("Surface out", self, JUNCTION_CONNECT.output, VALUE_TYPE.surface, noone); outputs[| 1] = nodeValue("Atlas data", self, JUNCTION_CONNECT.output, VALUE_TYPE.surface, []) @@ -96,7 +105,7 @@ function Node_Scatter(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) c ["Scatter", false], 5, 6, 13, 14, 17, 9, 2, ["Path", false], 19, 20, 21, 22, ["Transform", false], 3, 8, 7, 4, - ["Render", false], 18, 11, 12, 16, 23, + ["Render", false], 18, 11, 28, 12, 16, 23, ]; attribute_surface_depth(); @@ -104,9 +113,14 @@ function Node_Scatter(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) c scatter_data = []; static drawOverlay = function(active, _x, _y, _s, _mx, _my, _snx, _sny) { #region - var _distType = current_data[6]; - if(_distType < 3) - inputs[| 5].drawOverlay(active, _x, _y, _s, _mx, _my, _snx, _sny); + var _distType = current_data[6]; + + if(_distType < 3) { + var a = inputs[| 5].drawOverlay(active, _x, _y, _s, _mx, _my, _snx, _sny); + active &= !a; + } + + var a = inputs[| 29].drawOverlay(active, _x, _y, _s, _mx, _my, _snx, _sny, getSingleValue(1)); active &= !a; } #endregion static onValueUpdate = function(index) { #region @@ -138,6 +152,8 @@ function Node_Scatter(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) c inputs[| 27].setVisible(_arr); update_on_frame = _arr && (_amn[0] != 0 || _amn[1] != 0); + + inputs[| 11].mappableStep(); } #endregion static processData = function(_outSurf, _data, _output_index, _array_index) { #region @@ -164,6 +180,9 @@ function Node_Scatter(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) c var seed = _data[10]; var color = _data[11]; + var clr_map = _data[28]; + var clr_rng = _data[29]; + var alpha = _data[12]; var _arr = _data[15]; var mulpA = _data[16]; @@ -340,7 +359,7 @@ function Node_Scatter(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) c if(vCol && _v != noone) grSamp *= _v; - var clr = color.eval(grSamp); + var clr = evaluate_gradient_map(grSamp, color, clr_map, clr_rng, inputs[| 11]); var alp = random_range_seed(alpha[0], alpha[1], posS); posS++; var _atl = array_safe_get(scatter_data, _sct_len);