[Checker] Add diagonal mode.

This commit is contained in:
Tanasart 2025-03-02 11:26:14 +07:00
parent 178f14241f
commit 8d441aad2f
2 changed files with 33 additions and 8 deletions

View file

@ -34,11 +34,13 @@ function Node_Checker(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) c
newInput(8, nodeValue_Enum_Button("Type", self, 0, [ "Solid", "Smooth", "AA" ]));
newInput(9, nodeValue_Bool("Diagonal", self, false));
newOutput(0, nodeValue_Output("Surface Out", self, VALUE_TYPE.surface, noone));
input_display_list = [
["Output", true], 0,
["Pattern", false], 1, 6, 2, 7, 3,
["Pattern", false], 9, 1, 6, 2, 7, 3,
["Render", false], 8, 4, 5,
];
@ -63,20 +65,23 @@ function Node_Checker(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) c
static processData = function(_outSurf, _data, _output_index, _array_index) {
var _dim = _data[0];
var _pos = _data[3];
var _pos = _data[3]
inputs[2].setVisible(!_data[9]);
_outSurf = surface_verify(_outSurf, _dim[0], _dim[1], attrDepth());
surface_set_shader(_outSurf, sh_checkerboard);
shader_set_f("dimension", surface_get_width_safe(_outSurf), surface_get_height_safe(_outSurf));
shader_set_2("dimension", _dim);
shader_set_i("diagonal", _data[9]);
shader_set_f("position", _pos[0] / _dim[0], _pos[1] / _dim[1]);
shader_set_f_map("amount", _data[1], _data[6], inputs[1]);
shader_set_f_map("angle", _data[2], _data[7], inputs[2]);
shader_set_color("col1", _data[4]);
shader_set_color("col2", _data[5]);
shader_set_i("blend", _data[8]);
shader_set_i("blend", _data[8]);
draw_sprite_ext(s_fx_pixel, 0, 0, 0, _dim[0], _dim[1], 0, c_white, 1);
draw_empty();
surface_reset_shader();
return _outSurf;

View file

@ -5,6 +5,7 @@ varying vec4 v_vColour;
uniform vec2 dimension;
uniform vec2 position;
uniform int diagonal;
uniform int blend;
uniform vec2 amount;
@ -28,7 +29,6 @@ float check(vec2 c, float amo, float ang) {
float mm = mod(floor(_x / _a) + floor(_y / _a), 2.);
return mm < .5? 0.5 + dd : 0.5 - dd;
//return mod(floor(_x / _a) + floor(_y / _a), 2.);
}
void main() {
@ -49,8 +49,28 @@ void main() {
vec2 a = dimension / dimension.y;
vec2 c = (v_vTexcoord - position) * a;
float ch;
if(diagonal == 0 || blend != 0) {
if(diagonal == 1) {
ang += PI / 4.;
amo *= sqrt(2.);
}
ch = check(c, amo, ang);
} else {
vec2 pa = floor(dimension / amo);
vec2 px = floor(dimension * c);
px = mod(px, pa);
bool d1 = px.x > px.y;
bool d2 = (pa.x - px.x) > px.y;
bool chk = (d1 && d2) || (!d1 && !d2);
ch = chk? 1. : 0.;
}
float ch = check(c, amo, ang);
if(blend == 0) gl_FragColor = ch < 0.5? col1 : col2;
else if(blend == 1) {