[Draw Gradient] Add circular type xy scale.

This commit is contained in:
Tanasart 2024-12-20 09:29:06 +07:00
parent 39d8ea2cae
commit c60d6de266
2 changed files with 25 additions and 21 deletions

View file

@ -53,12 +53,14 @@ function Node_Gradient(_x, _y, _group = noone) : Node_Processor(_x, _y, _group)
////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////
newInput(17, nodeValue_Vec2("Shape", self, [ 1, 1 ]))
newOutput(0, nodeValue_Output("Surface out", self, VALUE_TYPE.surface, noone)); newOutput(0, nodeValue_Output("Surface out", self, VALUE_TYPE.surface, noone));
input_display_list = [ input_display_list = [
["Output", true], 0, 8, ["Output", true], 0, 8,
["Gradient", false], 1, 15, 5, 12, 9, 13, 7, ["Gradient", false], 1, 15, 5, 12, 9, 13, 7,
["Shape", false], 2, 3, 10, 4, 11, 6, 14, ["Shape", false], 2, 3, 10, 4, 11, 6, 14, 17,
]; ];
attribute_surface_depth(); attribute_surface_depth();
@ -66,7 +68,7 @@ function Node_Gradient(_x, _y, _group = noone) : Node_Processor(_x, _y, _group)
static drawOverlay = function(hover, active, _x, _y, _s, _mx, _my, _snx, _sny) { static drawOverlay = function(hover, active, _x, _y, _s, _mx, _my, _snx, _sny) {
PROCESSOR_OVERLAY_CHECK PROCESSOR_OVERLAY_CHECK
var _hov = false; var _hov = false;
var a = inputs[6].drawOverlay(hover, active, _x, _y, _s, _mx, _my, _snx, _sny); active &= !a; _hov |= a; var a = inputs[ 6].drawOverlay(hover, active, _x, _y, _s, _mx, _my, _snx, _sny); active &= !a; _hov |= a;
var a = inputs[16].drawOverlay(hover, active, _x, _y, _s, _mx, _my, _snx, _sny, current_data[0]); active &= !a; _hov |= a; var a = inputs[16].drawOverlay(hover, active, _x, _y, _s, _mx, _my, _snx, _sny, current_data[0]); active &= !a; _hov |= a;
return _hov; return _hov;
@ -78,6 +80,7 @@ function Node_Gradient(_x, _y, _group = noone) : Node_Processor(_x, _y, _group)
inputs[ 3].setVisible(_typ != 1); inputs[ 3].setVisible(_typ != 1);
inputs[ 4].setVisible(_typ == 1); inputs[ 4].setVisible(_typ == 1);
inputs[14].setVisible(_typ); inputs[14].setVisible(_typ);
inputs[17].setVisible(_typ == 1);
inputs[1].mappableStep(); inputs[1].mappableStep();
inputs[3].mappableStep(); inputs[3].mappableStep();
@ -87,12 +90,13 @@ function Node_Gradient(_x, _y, _group = noone) : Node_Processor(_x, _y, _group)
} }
static processData = function(_outSurf, _data, _output_index, _array_index) { static processData = function(_outSurf, _data, _output_index, _array_index) {
var _dim = _data[0]; var _dim = _data[0];
var _typ = _data[2]; var _typ = _data[2];
var _cnt = _data[6]; var _cnt = _data[6];
var _lop = _data[7]; var _lop = _data[7];
var _msk = _data[8]; var _msk = _data[8];
var _uni = _data[14]; var _uni = _data[14];
var _csca = _data[17];
_outSurf = surface_verify(_outSurf, _dim[0], _dim[1], attrDepth()); _outSurf = surface_verify(_outSurf, _dim[0], _dim[1], attrDepth());
@ -102,9 +106,10 @@ function Node_Gradient(_x, _y, _group = noone) : Node_Processor(_x, _y, _group)
shader_set_f("dimension", _dim); shader_set_f("dimension", _dim);
shader_set_i("gradient_loop", _lop); shader_set_i("gradient_loop", _lop);
shader_set_f("center", _cnt[0] / _dim[0], _cnt[1] / _dim[1]); shader_set_f("center", _cnt[0] / _dim[0], _cnt[1] / _dim[1]);
shader_set_i("type", _typ); shader_set_i("type", _typ);
shader_set_i("uniAsp", _uni); shader_set_i("uniAsp", _uni);
shader_set_2("cirScale", _csca);
shader_set_f_map("angle", _data[3], _data[10], inputs[3]); shader_set_f_map("angle", _data[3], _data[10], inputs[3]);
shader_set_f_map("radius", _data[4], _data[11], inputs[4]); shader_set_f_map("radius", _data[4], _data[11], inputs[4]);

View file

@ -1,11 +1,8 @@
// #define TAU 6.283185307179586
// Simple passthrough fragment shader
//
varying vec2 v_vTexcoord; varying vec2 v_vTexcoord;
varying vec4 v_vColour; varying vec4 v_vColour;
#define TAU 6.283185307179586
uniform vec2 center; uniform vec2 center;
uniform vec2 dimension; uniform vec2 dimension;
@ -29,6 +26,8 @@ uniform int type;
uniform int gradient_loop; uniform int gradient_loop;
uniform int uniAsp; uniform int uniAsp;
uniform vec2 cirScale;
#region //////////////////////////////////// GRADIENT //////////////////////////////////// #region //////////////////////////////////// GRADIENT ////////////////////////////////////
#define GRADIENT_LIMIT 128 #define GRADIENT_LIMIT 128
@ -193,14 +192,14 @@ void main() {
vec2 asp = dimension / dimension.y; vec2 asp = dimension / dimension.y;
float prog = 0.; float prog = 0.;
if(type == 0) { if(type == 0) { // linear
prog = .5 + (v_vTexcoord.x - center.x) * cos(ang) - (v_vTexcoord.y - center.y) * sin(ang); prog = .5 + (v_vTexcoord.x - center.x) * cos(ang) - (v_vTexcoord.y - center.y) * sin(ang);
} else if(type == 1) { } else if(type == 1) { // circular
if(uniAsp == 0) prog = distance(v_vTexcoord, center) / rad; vec2 _asp = uniAsp == 0? vec2(1.) : asp;
else prog = distance(v_vTexcoord * asp, center * asp) / rad; prog = length((v_vTexcoord - center) * _asp / cirScale) / rad;
} else if(type == 2) { } else if(type == 2) { // radial
vec2 _p = v_vTexcoord - center; vec2 _p = v_vTexcoord - center;
if(uniAsp == 1) _p *= asp; if(uniAsp == 1) _p *= asp;