This commit is contained in:
Tanasart 2024-04-11 20:43:03 +07:00
parent 9263e5c499
commit 67780283c1
21 changed files with 733 additions and 213 deletions

View file

@ -1157,8 +1157,8 @@
{"name":"sh_active_canvas_ink","order":13,"path":"shaders/sh_active_canvas_ink/sh_active_canvas_ink.yy",},
{"name":"sh_alpha_grey","order":1,"path":"shaders/sh_alpha_grey/sh_alpha_grey.yy",},
{"name":"sh_alpha_hash","order":2,"path":"shaders/sh_alpha_hash/sh_alpha_hash.yy",},
{"name":"sh_atlas","order":12,"path":"shaders/sh_atlas/sh_atlas.yy",},
{"name":"sh_atlas_scan","order":51,"path":"shaders/sh_atlas_scan/sh_atlas_scan.yy",},
{"name":"sh_atlas","order":12,"path":"shaders/sh_atlas/sh_atlas.yy",},
{"name":"sh_bend_arc","order":13,"path":"shaders/sh_bend_arc/sh_bend_arc.yy",},
{"name":"sh_bevel_highp","order":3,"path":"shaders/sh_bevel_highp/sh_bevel_highp.yy",},
{"name":"sh_bevel","order":2,"path":"shaders/sh_bevel/sh_bevel.yy",},
@ -1303,6 +1303,7 @@
{"name":"sh_flip","order":7,"path":"shaders/sh_flip/sh_flip.yy",},
{"name":"sh_flood_fill_it","order":1,"path":"shaders/sh_flood_fill_it/sh_flood_fill_it.yy",},
{"name":"sh_flood_fill_replace","order":2,"path":"shaders/sh_flood_fill_replace/sh_flood_fill_replace.yy",},
{"name":"sh_freeform_fill_pass2","order":1,"path":"shaders/sh_freeform_fill_pass2/sh_freeform_fill_pass2.yy",},
{"name":"sh_FXAA","order":29,"path":"shaders/sh_FXAA/sh_FXAA.yy",},
{"name":"sh_gamma_map","order":38,"path":"shaders/sh_gamma_map/sh_gamma_map.yy",},
{"name":"sh_glow","order":18,"path":"shaders/sh_glow/sh_glow.yy",},
@ -1443,6 +1444,7 @@
{"name":"sh_widget_rotator_range","order":5,"path":"shaders/sh_widget_rotator_range/sh_widget_rotator_range.yy",},
{"name":"sh_widget_rotator","order":4,"path":"shaders/sh_widget_rotator/sh_widget_rotator.yy",},
{"name":"sh_zigzag","order":2,"path":"shaders/sh_zigzag/sh_zigzag.yy",},
{"name":"sh_freeform_fill_cleanup","order":2,"path":"shaders/sh_freeform_fill_cleanup/sh_freeform_fill_cleanup.yy",},
{"name":"credit_badge_popular","order":2,"path":"sprites/credit_badge_popular/credit_badge_popular.yy",},
{"name":"credit_badge_value","order":1,"path":"sprites/credit_badge_value/credit_badge_value.yy",},
{"name":"s_biterator_b_grey_long","order":7,"path":"sprites/s_biterator_b_grey_long/s_biterator_b_grey_long.yy",},

View file

@ -250,6 +250,7 @@
{"$GMFolder":"","%Name":"legacy","folderPath":"folders/shader/3d/legacy.yy","name":"legacy","resourceType":"GMFolder","resourceVersion":"2.0",},
{"$GMFolder":"","%Name":"ssao","folderPath":"folders/shader/3d/ssao.yy","name":"ssao","resourceType":"GMFolder","resourceVersion":"2.0",},
{"$GMFolder":"","%Name":"blend","folderPath":"folders/shader/blend.yy","name":"blend","resourceType":"GMFolder","resourceVersion":"2.0",},
{"$GMFolder":"","%Name":"canvas","folderPath":"folders/shader/canvas.yy","name":"canvas","resourceType":"GMFolder","resourceVersion":"2.0",},
{"$GMFolder":"","%Name":"color_picker","folderPath":"folders/shader/color_picker.yy","name":"color_picker","resourceType":"GMFolder","resourceVersion":"2.0",},
{"$GMFolder":"","%Name":"color_selector","folderPath":"folders/shader/color_selector.yy","name":"color_selector","resourceType":"GMFolder","resourceVersion":"2.0",},
{"$GMFolder":"","%Name":"draw","folderPath":"folders/shader/draw.yy","name":"draw","resourceType":"GMFolder","resourceVersion":"2.0",},
@ -274,7 +275,6 @@
{"$GMFolder":"","%Name":"Flag","folderPath":"folders/shader/MK effects/Flag.yy","name":"Flag","resourceType":"GMFolder","resourceVersion":"2.0",},
{"$GMFolder":"","%Name":"Tile","folderPath":"folders/shader/MK effects/Tile.yy","name":"Tile","resourceType":"GMFolder","resourceVersion":"2.0",},
{"$GMFolder":"","%Name":"pixel_builder","folderPath":"folders/shader/pixel_builder.yy","name":"pixel_builder","resourceType":"GMFolder","resourceVersion":"2.0",},
{"$GMFolder":"","%Name":"simulation","folderPath":"folders/shader/simulation.yy","name":"simulation","resourceType":"GMFolder","resourceVersion":"2.0",},
{"$GMFolder":"","%Name":"sprites","folderPath":"folders/shader/sprites.yy","name":"sprites","resourceType":"GMFolder","resourceVersion":"2.0",},
{"$GMFolder":"","%Name":"transition","folderPath":"folders/shader/transition.yy","name":"transition","resourceType":"GMFolder","resourceVersion":"2.0",},
{"$GMFolder":"","%Name":"UI","folderPath":"folders/shader/UI.yy","name":"UI","resourceType":"GMFolder","resourceVersion":"2.0",},
@ -1650,8 +1650,8 @@
{"id":{"name":"sh_alpha_grey","path":"shaders/sh_alpha_grey/sh_alpha_grey.yy",},},
{"id":{"name":"sh_alpha_hash","path":"shaders/sh_alpha_hash/sh_alpha_hash.yy",},},
{"id":{"name":"sh_ani_noise","path":"shaders/sh_ani_noise/sh_ani_noise.yy",},},
{"id":{"name":"sh_atlas","path":"shaders/sh_atlas/sh_atlas.yy",},},
{"id":{"name":"sh_atlas_scan","path":"shaders/sh_atlas_scan/sh_atlas_scan.yy",},},
{"id":{"name":"sh_atlas","path":"shaders/sh_atlas/sh_atlas.yy",},},
{"id":{"name":"sh_average","path":"shaders/sh_average/sh_average.yy",},},
{"id":{"name":"sh_bend_arc","path":"shaders/sh_bend_arc/sh_bend_arc.yy",},},
{"id":{"name":"sh_bevel_highp","path":"shaders/sh_bevel_highp/sh_bevel_highp.yy",},},
@ -1816,6 +1816,8 @@
{"id":{"name":"sh_flood_fill_replace","path":"shaders/sh_flood_fill_replace/sh_flood_fill_replace.yy",},},
{"id":{"name":"sh_flood_fill_thres","path":"shaders/sh_flood_fill_thres/sh_flood_fill_thres.yy",},},
{"id":{"name":"sh_fluid_bleach","path":"shaders/sh_fluid_bleach/sh_fluid_bleach.yy",},},
{"id":{"name":"sh_freeform_fill_pass1","path":"shaders/sh_freeform_fill_pass1/sh_freeform_fill_pass1.yy",},},
{"id":{"name":"sh_freeform_fill_pass2","path":"shaders/sh_freeform_fill_pass2/sh_freeform_fill_pass2.yy",},},
{"id":{"name":"sh_FXAA","path":"shaders/sh_FXAA/sh_FXAA.yy",},},
{"id":{"name":"sh_gamma_map","path":"shaders/sh_gamma_map/sh_gamma_map.yy",},},
{"id":{"name":"sh_glow","path":"shaders/sh_glow/sh_glow.yy",},},
@ -1979,6 +1981,7 @@
{"id":{"name":"sh_widget_rotator_range","path":"shaders/sh_widget_rotator_range/sh_widget_rotator_range.yy",},},
{"id":{"name":"sh_widget_rotator","path":"shaders/sh_widget_rotator/sh_widget_rotator.yy",},},
{"id":{"name":"sh_zigzag","path":"shaders/sh_zigzag/sh_zigzag.yy",},},
{"id":{"name":"sh_freeform_fill_cleanup","path":"shaders/sh_freeform_fill_cleanup/sh_freeform_fill_cleanup.yy",},},
{"id":{"name":"credit_badge_popular","path":"sprites/credit_badge_popular/credit_badge_popular.yy",},},
{"id":{"name":"credit_badge_value","path":"sprites/credit_badge_value/credit_badge_value.yy",},},
{"id":{"name":"node_credit","path":"sprites/node_credit/node_credit.yy",},},

Binary file not shown.

View file

@ -1,4 +1,4 @@
function polygon_simplify(points, tolerance = 4) {
function polygon_simplify(points, tolerance = 4) { #region
var remSt = ds_stack_create();
var len = array_length(points);
@ -25,9 +25,9 @@ function polygon_simplify(points, tolerance = 4) {
ds_stack_destroy(remSt);
return points;
}
} #endregion
function polygon_points_classify(points) {
function polygon_points_classify(points) { #region
var len = array_length(points);
var maxx = -99999;
@ -65,9 +65,9 @@ function polygon_points_classify(points) {
}
return [ convexs, reflects, _side ];
}
} #endregion
function polygon_triangulate_convex(points) {
function polygon_triangulate_convex(points) { #region
var triangles = [];
var len = array_length(points);
@ -81,19 +81,19 @@ function polygon_triangulate_convex(points) {
}
return triangles;
}
} #endregion
function polygon_triangulate(points, tolerance = 4) {
function polygon_triangulate(points, tolerance = 4) { #region
points = polygon_simplify(points, tolerance);
var classes = polygon_points_classify(points);
var convexes = classes[0];
var reflected = classes[1];
var checkSide = classes[2];
var pointInd = [];
if(array_length(reflected) == 0)
return polygon_triangulate_convex(points);
var pointInd = array_create(array_length(points));
for( var i = 0, n = array_length(points); i < n; i++ )
pointInd[i] = i;
@ -104,10 +104,10 @@ function polygon_triangulate(points, tolerance = 4) {
if(array_length(convexes) == 0) return triangles;
var len = array_length(pointInd);
var c0 = convexes[0];
var c0 = convexes[0];
var c0i = array_find(pointInd, c0);
var c1 = pointInd[safe_mod(c0i - 1 + len, len)];
var c2 = pointInd[safe_mod(c0i + 1, len)];
var c1 = pointInd[safe_mod(c0i - 1 + len, len)];
var c2 = pointInd[safe_mod(c0i + 1, len)];
var p0 = points[c0];
var p1 = points[c1];
@ -171,7 +171,7 @@ function polygon_triangulate(points, tolerance = 4) {
array_push(convexes, c0);
if(repeated++ > len) {
print("mesh error")
//print("mesh error")
break;
}
}
@ -181,9 +181,9 @@ function polygon_triangulate(points, tolerance = 4) {
array_push(triangles, [points[pointInd[0]], points[pointInd[1]], points[pointInd[2]]]);
return triangles;
}
} #endregion
function polygon_triangulate_convex_fan(points) {
function polygon_triangulate_convex_fan(points) { #region
var triangles = [];
var amo = array_length(points);
@ -202,4 +202,4 @@ function polygon_triangulate_convex_fan(points) {
array_push(triangles, [ points[i], points[(i + 1) % amo], pc ]);
}
return triangles;
}
} #endregion

View file

@ -35,6 +35,12 @@
keyboard_key_release(vk_alt);
}
function key_mod_press_any() {
INLINE
return CTRL == KEYBOARD_STATUS.pressing || ALT == KEYBOARD_STATUS.pressing || SHIFT == KEYBOARD_STATUS.pressing;
}
function key_mod_press(key) {
INLINE

View file

@ -6,12 +6,12 @@ function draw_rectangle_width(x0, y0, x1, y1, th = 1) {
draw_line_width(x1, y0 - th / 2, x1, y1 + th / 2, th);
}
function draw_rectangle_dashed(x0, y0, x1, y1, th = 1, dash = 8) {
draw_line_dashed(x0 - th / 2, y0, x1 + th / 2, y0, th, dash);
draw_line_dashed(x0 - th / 2, y1, x1 + th / 2, y1, th, dash);
function draw_rectangle_dashed(x0, y0, x1, y1, th = 1, dash = 8, shift = 0) {
draw_line_dashed(x0 - th / 2, y0, x1 + th / 2, y0, th, dash, shift);
draw_line_dashed(x0 - th / 2, y1, x1 + th / 2, y1, th, dash, shift);
draw_line_dashed(x0, y0 - th / 2, x0, y1 + th / 2, th, dash);
draw_line_dashed(x1, y0 - th / 2, x1, y1 + th / 2, th, dash);
draw_line_dashed(x0, y0 - th / 2, x0, y1 + th / 2, th, dash, shift);
draw_line_dashed(x1, y0 - th / 2, x1, y1 + th / 2, th, dash, shift);
}
function draw_ellipse_width(x0, y0, x1, y1, th = 1) {

View file

@ -199,6 +199,12 @@ function gradientObject(color = c_black) constructor { #region
var key_count = ceil(lerp(array_length(keys), array_length(target.keys), amount));
if(key_count == 0) return grad;
if(key_count == 1) {
grad.keys[0] = new gradientKey(0, merge_color(eval(0), target.eval(0), amount));
return grad;
}
for( var i = 0; i < key_count; i++ ) {
var rat = i / (key_count - 1);

View file

@ -154,6 +154,8 @@ function Node_Canvas(_x, _y, _group = noone) : Node(_x, _y, _group) constructor
return 8 + _h;
}); #endregion
temp_surface = array_create(1);
input_display_list = [
["Output", false], 0, frame_renderer, 12, 13,
["Brush", true], 6, 15, 17, 16,
@ -216,7 +218,9 @@ function Node_Canvas(_x, _y, _group = noone) : Node(_x, _y, _group) constructor
brush_rand_dir = [ 0, 0, 0, 0, 0 ];
brush_seed = irandom_range(100000, 999999);
brush_next_dist = 0;
freeform_shape = [];
draw_stack = ds_list_create();
#endregion
@ -246,7 +250,7 @@ function Node_Canvas(_x, _y, _group = noone) : Node(_x, _y, _group) constructor
tool_fil8 = [ "Diagonal", tool_fil8_edit, "fill8", tool_attribute ];
tools = [
new NodeTool( "Selection", [ THEME.canvas_tools_selection_rectangle, THEME.canvas_tools_selection_circle ]),
new NodeTool( "Selection", [ THEME.canvas_tools_selection_rectangle, THEME.canvas_tools_selection_circle, THEME.canvas_tools_freeform_selection ]),
new NodeTool( "Pencil", THEME.canvas_tools_pencil)
.setSetting(tool_size),
@ -260,12 +264,47 @@ function Node_Canvas(_x, _y, _group = noone) : Node(_x, _y, _group) constructor
new NodeTool( "Ellipse", [ THEME.canvas_tools_ellip, THEME.canvas_tools_ellip_fill ])
.setSetting(tool_size),
new NodeTool( "Freefrom", THEME.canvas_tools_freeform)
.setSetting(tool_size),
new NodeTool( "Fill", THEME.canvas_tools_bucket)
.setSetting(tool_thrs)
.setSetting(tool_fil8),
];
#endregion
#region fix size points
fix_points = [];
fix_points[0] = [];
fix_points[1] = [];
fix_points[2] = [[ 0, 0 ], [ 1, 0 ], [ 0, 1 ], [ 1, 1 ]];
fix_points[3] = [[ 0, 0 ], [ -1, 0 ], [ 0, -1 ], [ 1, 0 ], [ 0, 1 ]];
fix_points[4] = [[ 0, 0 ], [ -1, 0 ], [ 0, -1 ], [ -1, -1 ], [ -2, -1 ], [ -2, 0 ], [ -1, -2 ], [ 0, -2 ], [ 1, -1 ], [ 1, 0 ], [ -1, 1 ], [ 0, 1 ]];
fix_points[5] = [
[ 0, 0 ],
[ -1, -1 ], [ 0, -1 ], [ 1, -1 ], [ -1, 0 ], [ 1, 0 ], [ -1, 1 ], [ 0, 1 ], [ 1, 1 ],
[ -1, -2 ], [ 0, -2 ], [ 1, -2 ], [ -1, 2 ], [ 0, 2 ], [ 1, 2 ], [ -2, -1 ], [ -2, 0 ], [ -2, 1 ], [ 2, -1 ], [ 2, 0 ], [ 2, 1 ],
];
fix_points[6] = [
[ 0, 0 ],
[ -1, -1 ], [ 0, -1 ], [ 1, -1 ], [ -1, 0 ], [ 1, 0 ], [ -1, 1 ], [ 0, 1 ], [ 1, 1 ],
[ -1, -2 ], [ 0, -2 ], [ 1, -2 ], [ -1, 2 ], [ 0, 2 ], [ -2, -1 ], [ -2, 0 ], [ -2, 1 ], [ 2, -1 ], [ 2, 0 ], [ -2, -2 ],
[ -1, -3 ], [ 0, -3 ], [ -3, -1 ], [ -3, 0 ],
];
fix_points[7] = [
[ 0, 0 ],
[ -1, -1 ], [ 0, -1 ], [ 1, -1 ], [ -1, 0 ], [ 1, 0 ], [ -1, 1 ], [ 0, 1 ], [ 1, 1 ],
[ -1, -2 ], [ 0, -2 ], [ 1, -2 ], [ -1, 2 ], [ 0, 2 ], [ 1, 2 ], [ -2, -1 ], [ -2, 0 ], [ -2, 1 ], [ 2, -1 ], [ 2, 0 ], [ 2, 1 ], [ -2, -2 ], [ 2, -2 ], [ -2, 2 ], [ 2, 2 ],
[ -1, -3 ], [ 0, -3 ], [ 1, -3 ], [ -1, 3 ], [ 0, 3 ], [ 1, 3 ], [ -3, -1 ], [ -3, 0 ], [ -3, 1 ], [ 3, -1 ], [ 3, 0 ], [ 3, 1 ],
];
fix_points[8] = array_append(variable_clone(fix_points[7]), [ [-4, -2], [-4, -1], [-4, 0], [-4, 1], [-3, -3], [-3, -2], [-3, 2], [-2, -4], [-2, -3], [-2, 3], [-1, -4], [0, -4], [1, -4], [2, -3], [3, -2] ]);
fix_points[9] = array_append(variable_clone(fix_points[7]), [ [-4, -1], [-4, 0], [-4, 1], [-3, -2], [-3, -2], [-3, 2], [-2, -3], [-2, 3], [-1, -4], [-1, 4], [0, -4], [0, 4], [1, -4], [1, 4], [2, -3], [2, 3], [3, -2], [3, 2], [4, -1], [4, 0], [4, 1] ]);
fix_points_amount = array_length(fix_points);
#endregion
function setToolColor(color) { tool_attribute.color = color; }
static drawTools = function(_mx, _my, xx, yy, tool_size, hover, focus) { #region
@ -336,11 +375,15 @@ function Node_Canvas(_x, _y, _group = noone) : Node(_x, _y, _group) constructor
} #endregion
function refreshFrames() { #region
var fr = attributes.frames;
var fr = attributes.frames;
var _dim = attributes.dimension;
if(array_length(canvas_surface) < fr) {
for( var i = array_length(canvas_surface); i < fr; i++ ) {
canvas_surface[i] = surface_create_empty(1, 1);
canvas_surface[i] = surface_create(_dim[0], _dim[1]);
surface_set_target(canvas_surface[i]);
DRAW_CLEAR
surface_reset_target();
}
} else
array_resize(canvas_surface, fr);
@ -449,21 +492,18 @@ function Node_Canvas(_x, _y, _group = noone) : Node(_x, _y, _group) constructor
function draw_point_size(_x, _y, _draw = false) { #region
if(brush_surface == noone) {
if(brush_size <= 1)
draw_point(_x, _y);
else if(brush_size == 2) {
draw_point(_x, _y);
draw_point(_x + 1, _y);
draw_point(_x, _y + 1);
draw_point(_x + 1, _y + 1);
} else if(brush_size == 3) {
draw_point(_x, _y);
draw_point(_x - 1, _y);
draw_point(_x, _y - 1);
draw_point(_x + 1, _y);
draw_point(_x, _y + 1);
else if(brush_size < fix_points_amount) {
var fx = fix_points[brush_size];
for( var i = 0, n = array_length(fx); i < n; i++ )
draw_point(_x + fx[i][0], _y + fx[i][1]);
} else
draw_circle_prec(_x, _y, brush_size / 2, 0);
} else {
var _sw = surface_get_width_safe(brush_surface);
var _sh = surface_get_height_safe(brush_surface);
@ -478,13 +518,27 @@ function Node_Canvas(_x, _y, _group = noone) : Node(_x, _y, _group) constructor
function draw_line_size(_x0, _y0, _x1, _y1, _draw = false) { #region
if(brush_size == 1 && brush_surface == noone) {
if(_x1 > _x0) _x0--;
if(_y1 > _y0) _y0--;
if(_y1 < _y0) _y1--;
if(_x1 < _x0) _x1--;
draw_line(_x0, _y0, _x1, _y1);
if(brush_surface == noone) {
if(brush_size < fix_points_amount) {
if(_x1 > _x0) _x0--;
if(_y1 > _y0) _y0--;
if(_y1 < _y0) _y1--;
if(_x1 < _x0) _x1--;
}
if(brush_size == 1) {
draw_line(_x0, _y0, _x1, _y1);
} else if(brush_size < fix_points_amount) {
var fx = fix_points[brush_size];
for( var i = 0, n = array_length(fx); i < n; i++ )
draw_line(_x0 + fx[i][0], _y0 + fx[i][1], _x1 + fx[i][0], _y1 + fx[i][1]);
} else
draw_line_width(_x0, _y0, _x1, _y1, brush_size);
} else {
var diss = point_distance(_x0, _y0, _x1, _y1);
var dirr = point_direction(_x0, _y0, _x1, _y1);
@ -536,15 +590,15 @@ function Node_Canvas(_x, _y, _group = noone) : Node(_x, _y, _group) constructor
var _min_y = min(_y0, _y1);
var _may_y = max(_y0, _y1);
if(_fill) {
draw_rectangle(_min_x, _min_y, _max_x, _may_y, 0);
} else if(brush_size == 1 && brush_surface == noone)
if(_fill) draw_rectangle(_min_x, _min_y, _max_x, _may_y, 0);
if(brush_size == 1 && brush_surface == noone)
draw_rectangle(_min_x + 1, _min_y + 1, _max_x - 1, _may_y - 1, 1);
else {
draw_line_size(_min_x, _min_y, _max_x, _min_y);
draw_line_size(_min_x, _min_y, _min_x, _may_y);
draw_line_size(_max_x, _may_y, _max_x, _min_y);
draw_line_size(_max_x, _may_y, _min_x, _may_y);
draw_set_color(c_red); draw_line_size(_min_x, _min_y, _max_x, _min_y);
draw_set_color(c_blue); draw_line_size(_min_x, _min_y, _min_x, _may_y);
draw_set_color(c_green); draw_line_size(_max_x, _may_y, _max_x, _min_y);
draw_set_color(c_yellow); draw_line_size(_max_x, _may_y, _min_x, _may_y);
}
} #endregion
@ -569,25 +623,23 @@ function Node_Canvas(_x, _y, _group = noone) : Node(_x, _y, _group) constructor
var _min_y = min(_y0, _y1) - 1;
var _max_y = max(_y0, _y1);
if(_fill) {
draw_ellipse(_min_x, _min_y, _max_x, _max_y, 0);
} else {
var samp = 64;
var cx = (_min_x + _max_x) / 2;
var cy = (_min_y + _max_y) / 2;
var rx = abs(_x0 - _x1) / 2;
var ry = abs(_y0 - _y1) / 2;
if(_fill) draw_ellipse(_min_x, _min_y, _max_x, _max_y, 0);
var samp = 64;
var cx = (_min_x + _max_x) / 2;
var cy = (_min_y + _max_y) / 2;
var rx = abs(_x0 - _x1) / 2;
var ry = abs(_y0 - _y1) / 2;
var ox, oy, nx, ny;
for( var i = 0; i <= samp; i++ ) {
nx = cx + lengthdir_x(rx, 360 / samp * i);
ny = cy + lengthdir_y(ry, 360 / samp * i);
var ox, oy, nx, ny;
for( var i = 0; i <= samp; i++ ) {
nx = cx + lengthdir_x(rx, 360 / samp * i);
ny = cy + lengthdir_y(ry, 360 / samp * i);
if(i) draw_line_size(ox, oy, nx, ny);
if(i) draw_line_size(ox, oy, nx, ny);
ox = nx;
oy = ny;
}
ox = nx;
oy = ny;
}
} #endregion
@ -708,6 +760,75 @@ function Node_Canvas(_x, _y, _group = noone) : Node(_x, _y, _group) constructor
draw_set_alpha(1);
} #endregion
function freeform_step(active, _x, _y, _s, _mx, _my, _draw) { #region
var _dim = attributes.dimension;
var _mmx = (_mx - _x) / _s;
var _mmy = (_my - _y) / _s;
brush_size = 1;
if(mouse_holding) {
if(abs(_mmx - mouse_pre_x) + abs(_mmy - mouse_pre_y) >= 1) {
if(_draw) {
surface_set_target(drawing_surface);
draw_line_size(round(mouse_pre_x - 0.5), round(mouse_pre_y - 0.5), round(_mmx - 0.5), round(_mmy - 0.5), true);
surface_reset_target();
}
mouse_pre_x = _mmx;
mouse_pre_y = _mmy;
array_push(freeform_shape, new __vec2(_mmx, _mmy) );
}
if(mouse_release(mb_left)) {
surface_set_target(drawing_surface);
draw_line_size(_mmx, _mmy, freeform_shape[0].x, freeform_shape[0].y, true);
surface_reset_target();
if(array_length(freeform_shape) > 3) {
var _triangles = polygon_triangulate(freeform_shape, 1);
temp_surface[0] = surface_verify(temp_surface[0], _dim[0], _dim[1]);
surface_set_target(temp_surface[0]);
draw_primitive_begin(pr_trianglelist);
for( var i = 0, n = array_length(_triangles); i < n; i++ ) {
var p0 = _triangles[i][0];
var p1 = _triangles[i][1];
var p2 = _triangles[i][2];
draw_vertex(round(p0.x), round(p0.y));
draw_vertex(round(p1.x), round(p1.y));
draw_vertex(round(p2.x), round(p2.y));
}
draw_primitive_end();
draw_surface(drawing_surface, 0, 0);
surface_reset_target();
surface_set_shader(drawing_surface, sh_freeform_fill_cleanup);
shader_set_f("dimension", _dim);
draw_surface_ext(temp_surface[0], 0, 0, 1, 1, 0, draw_get_color(), draw_get_alpha());
surface_reset_shader();
}
mouse_holding = false;
}
} else if(mouse_press(mb_left, active)) {
mouse_pre_x = _mmx;
mouse_pre_y = _mmy;
mouse_holding = true;
freeform_shape = [ new __vec2(_mmx, _mmy) ];
surface_clear(drawing_surface);
}
} #endregion
static drawOverlay = function(hover, active, _x, _y, _s, _mx, _my, _snx, _sny) { #region
if(instance_exists(o_dialog_color_picker)) return;
@ -726,6 +847,8 @@ function Node_Canvas(_x, _y, _group = noone) : Node(_x, _y, _group) constructor
var _brushRotD = getInputData(16);
var _brushRotR = getInputData(17);
var _applySelection = false;
if(PEN_USE && tool_attribute.pressure)
brush_size = round(lerp(tool_attribute.pressure_size[0], tool_attribute.pressure_size[1], power(PEN_PRESSURE / 1024, 2)));
else
@ -786,11 +909,13 @@ function Node_Canvas(_x, _y, _group = noone) : Node(_x, _y, _group) constructor
draw_set_color(_col);
if(!isUsingTool("Selection"))
gpu_set_colorwriteenable(tool_attribute.channel[0], tool_attribute.channel[1], tool_attribute.channel[2], tool_attribute.channel[3]);
if(!isUsingTool("Selection")) gpu_set_colorwriteenable(tool_attribute.channel[0], tool_attribute.channel[1], tool_attribute.channel[2], tool_attribute.channel[3]);
var _tool_resizable = false;
if(isUsingTool("Selection")) { #region
if(is_selected) {
if(is_selected) { #region selected
if(!is_surface(selection_surface)) {
is_selected = false;
} else {
@ -827,61 +952,107 @@ function Node_Canvas(_x, _y, _group = noone) : Node(_x, _y, _group) constructor
surface_reset_target();
surface_store_buffer();
surface_free(selection_surface);
_applySelection = true;
}
}
}
}
if(!is_selected) {
if(is_selecting) {
var sel_x0 = min(selection_sx, mouse_cur_x);
var sel_y0 = min(selection_sy, mouse_cur_y);
var sel_x1 = max(selection_sx, mouse_cur_x);
var sel_y1 = max(selection_sy, mouse_cur_y);
} else { #region selection
var sel_w = sel_x1 - sel_x0 + 1;
var sel_h = sel_y1 - sel_y0 + 1;
selection_mask = surface_verify(selection_mask, sel_w, sel_h);
surface_set_target(selection_mask);
DRAW_CLEAR
draw_set_color(c_white);
if(isUsingTool("Selection", 0))
draw_rectangle(0, 0, sel_w, sel_h, false);
else if(isUsingTool("Selection", 1))
draw_ellipse(0, 0, sel_w - 1, sel_h - 1, false);
surface_reset_target();
if(mouse_release(mb_left)) {
is_selecting = false;
if(isUsingTool("Selection", 2) && mouse_press(mb_left, active)) {
is_selecting = true;
surface_free_safe(selection_mask);
}
if(sel_x0 != sel_x1 && sel_y0 != sel_y1) {
is_selected = true;
selection_surface = surface_create(sel_w, sel_h);
surface_set_target(selection_surface);
DRAW_CLEAR
draw_surface_safe(_canvas_surface, -sel_x0, -sel_y0);
if(is_selecting) {
var sel_x0, sel_y0, sel_x1, sel_y1;
var sel_w = 1, sel_h = 1;
if(isUsingTool("Selection", 2)) { #region freeform
freeform_step(active, _x, _y, _s, _mx, _my, false);
if(mouse_release(mb_left)) {
is_selecting = false;
BLEND_MULTIPLY
draw_surface_safe(selection_mask, 0, 0);
BLEND_NORMAL
surface_reset_target();
sel_x0 = _dim[0];
sel_y0 = _dim[1];
sel_x1 = 0;
sel_y1 = 0;
storeAction();
surface_set_target(_canvas_surface);
gpu_set_blendmode(bm_subtract);
draw_surface_safe(selection_surface, sel_x0, sel_y0);
gpu_set_blendmode(bm_normal);
surface_reset_target();
surface_store_buffer();
selection_position = [ sel_x0, sel_y0 ];
for( var i = 0, n = array_length(freeform_shape); i < n; i++ ) {
var _f = freeform_shape[i];
sel_x0 = min(sel_x0, round(_f.x - 0.5));
sel_y0 = min(sel_y0, round(_f.y - 0.5));
sel_x1 = max(sel_x1, round(_f.x - 0.5));
sel_y1 = max(sel_y1, round(_f.y - 0.5));
}
sel_w = sel_x1 - sel_x0 + 1;
sel_h = sel_y1 - sel_y0 + 1;
if(sel_w > 1 && sel_h > 1) {
selection_mask = surface_verify(selection_mask, sel_w, sel_h);
surface_set_target(selection_mask);
DRAW_CLEAR
draw_surface(drawing_surface, -sel_x0, -sel_y0);
surface_reset_target();
}
surface_clear(drawing_surface);
}
#endregion
} else { #region shape
sel_x0 = min(selection_sx, mouse_cur_x);
sel_y0 = min(selection_sy, mouse_cur_y);
sel_x1 = max(selection_sx, mouse_cur_x);
sel_y1 = max(selection_sy, mouse_cur_y);
sel_w = sel_x1 - sel_x0 + 1;
sel_h = sel_y1 - sel_y0 + 1;
selection_mask = surface_verify(selection_mask, sel_w, sel_h);
surface_set_target(selection_mask);
DRAW_CLEAR
draw_set_color(c_white);
if(isUsingTool("Selection", 0))
draw_rectangle(0, 0, sel_w, sel_h, false);
else if(isUsingTool("Selection", 1)) {
draw_set_circle_precision(32);
draw_ellipse(0, 0, sel_w - 1, sel_h - 1, false);
}
surface_reset_target();
#endregion
}
if(mouse_release(mb_left)) is_selecting = false;
if(mouse_release(mb_left) && sel_w > 1 && sel_h > 1) {
is_selected = true;
selection_surface = surface_create(sel_w, sel_h);
surface_set_target(selection_surface);
DRAW_CLEAR
draw_surface_safe(_canvas_surface, -sel_x0, -sel_y0);
BLEND_MULTIPLY
draw_surface_safe(selection_mask, 0, 0);
BLEND_NORMAL
surface_reset_target();
storeAction();
surface_set_target(_canvas_surface);
gpu_set_blendmode(bm_subtract);
draw_surface_safe(selection_surface, sel_x0, sel_y0);
gpu_set_blendmode(bm_normal);
surface_reset_target();
surface_store_buffer();
selection_position = [ sel_x0, sel_y0 ];
}
} else {
if(mouse_press(mb_left, active)) {
is_selecting = true;
@ -891,9 +1062,11 @@ function Node_Canvas(_x, _y, _group = noone) : Node(_x, _y, _group) constructor
surface_free_safe(selection_mask);
}
}
}
} #endregion
#endregion
} else if(isUsingTool("Pencil") || isUsingTool("Eraser")) { #region
if(mouse_pre_draw_x != undefined && mouse_pre_draw_y != undefined && key_mod_press(SHIFT) && key_mod_press(CTRL)) {
var aa = point_direction(mouse_pre_draw_x, mouse_pre_draw_y, mouse_cur_x, mouse_cur_y);
var dd = point_distance(mouse_pre_draw_x, mouse_pre_draw_y, mouse_cur_x, mouse_cur_y);
@ -952,24 +1125,11 @@ function Node_Canvas(_x, _y, _group = noone) : Node(_x, _y, _group) constructor
mouse_pre_x = mouse_cur_x;
mouse_pre_y = mouse_cur_y;
if(brush_sizing) {
var s = brush_sizing_s + (_mx - brush_sizing_mx) / 16;
s = max(1, s);
tool_attribute.size = s;
if(mouse_release(mb_right))
brush_sizing = false;
} else if(mouse_press(mb_right, active) && key_mod_press(SHIFT) && brush_surface == noone) {
brush_sizing = true;
brush_sizing_s = _siz;
brush_sizing_mx = _mx;
brush_sizing_my = _my;
brush_sizing_dx = mouse_cur_x;
brush_sizing_dy = mouse_cur_y;
}
_tool_resizable = true;
#endregion
} else if(isUsingTool("Rectangle") || isUsingTool("Ellipse")) { #region
if(mouse_holding && key_mod_press(SHIFT)) {
var ww = mouse_cur_x - mouse_pre_x;
var hh = mouse_cur_y - mouse_pre_y;
@ -979,13 +1139,6 @@ function Node_Canvas(_x, _y, _group = noone) : Node(_x, _y, _group) constructor
mouse_cur_y = mouse_pre_y + ss * sign(hh);
}
if(mouse_press(mb_left, active)) {
mouse_pre_x = mouse_cur_x;
mouse_pre_y = mouse_cur_y;
mouse_holding = true;
}
if(mouse_holding) {
drawing_surface = surface_verify(drawing_surface, _dim[0], _dim[1], attrDepth());
@ -1000,26 +1153,25 @@ function Node_Canvas(_x, _y, _group = noone) : Node(_x, _y, _group) constructor
apply_draw_surface();
mouse_holding = false;
}
} else if(mouse_press(mb_left, active)) {
mouse_pre_x = mouse_cur_x;
mouse_pre_y = mouse_cur_y;
mouse_holding = true;
}
if(brush_sizing) {
var s = brush_sizing_s + (_mx - brush_sizing_mx) / 16;
s = max(1, s);
inputs[| 2].setValue(s);
if(mouse_release(mb_right))
brush_sizing = false;
} else if(mouse_press(mb_right, active) && key_mod_press(SHIFT) && brush_surface == noone) {
brush_sizing = true;
brush_sizing_s = brush_size;
brush_sizing_mx = _mx;
brush_sizing_my = _my;
brush_sizing_dx = mouse_cur_x;
brush_sizing_dy = mouse_cur_y;
}
_tool_resizable = true;
#endregion
} else if(isUsingTool("Freefrom")) { #region
freeform_step(active, _x, _y, _s, _mx, _my, true);
if(mouse_release(mb_left))
apply_draw_surface();
#endregion
} else if(isUsingTool("Fill") || (DRAGGING && DRAGGING.type == "Color")) { #region
var fill = DRAGGING? mouse_release(mb_left, active) : mouse_press(mb_left, active);
if(fill && point_in_rectangle(mouse_cur_x, mouse_cur_y, 0, 0, _surf_w - 1, _surf_h - 1)) {
@ -1040,9 +1192,37 @@ function Node_Canvas(_x, _y, _group = noone) : Node(_x, _y, _group) constructor
surface_store_buffer();
surface_reset_target();
}
#endregion
}
if(_tool_resizable) { #region tools size
if(hover && key_mod_press(CTRL)) {
if(mouse_wheel_down()) tool_attribute.size = max( 1, tool_attribute.size - 1);
if(mouse_wheel_up()) tool_attribute.size = min(64, tool_attribute.size + 1);
}
if(brush_sizing) {
var s = brush_sizing_s + (_mx - brush_sizing_mx) / 16;
s = max(1, s);
tool_attribute.size = s;
if(mouse_release(mb_right))
brush_sizing = false;
} else if(mouse_press(mb_right, active) && key_mod_press(SHIFT) && brush_surface == noone) {
brush_sizing = true;
brush_sizing_s = _siz;
brush_sizing_mx = _mx;
brush_sizing_my = _my;
brush_sizing_dx = mouse_cur_x;
brush_sizing_dy = mouse_cur_y;
}
} #endregion
draw_set_alpha(1);
gpu_set_colorwriteenable(true, true, true, true);
@ -1063,13 +1243,17 @@ function Node_Canvas(_x, _y, _group = noone) : Node(_x, _y, _group) constructor
draw_set_color(_col);
if(isUsingTool("Selection")) {
if(is_selected)
if(is_selected || _applySelection)
draw_surface_safe(selection_surface, selection_position[0], selection_position[1]);
else if(is_selecting) {
var sel_x0 = min(selection_sx, mouse_cur_x);
var sel_y0 = min(selection_sy, mouse_cur_y);
draw_surface_safe(selection_mask, sel_x0, sel_y0);
}
if(_applySelection) surface_free(selection_surface);
} else if(isUsingTool("Pencil") || isUsingTool("Eraser")) {
if(isUsingTool("Eraser")) draw_set_color(c_white);
@ -1081,6 +1265,7 @@ function Node_Canvas(_x, _y, _group = noone) : Node(_x, _y, _group) constructor
else
draw_point_size(mouse_cur_x, mouse_cur_y);
}
} else if(isUsingTool("Rectangle")) {
if(brush_sizing)
draw_point_size(brush_sizing_dx, brush_sizing_dy);
@ -1088,6 +1273,7 @@ function Node_Canvas(_x, _y, _group = noone) : Node(_x, _y, _group) constructor
draw_rect_size(mouse_pre_x, mouse_pre_y, mouse_cur_x, mouse_cur_y, isUsingTool("Rectangle", 1));
else
draw_point_size(mouse_cur_x, mouse_cur_y);
} else if(isUsingTool("Ellipse")) {
if(brush_sizing)
draw_point_size(brush_sizing_dx, brush_sizing_dy);
@ -1095,27 +1281,35 @@ function Node_Canvas(_x, _y, _group = noone) : Node(_x, _y, _group) constructor
draw_ellp_size(mouse_pre_x, mouse_pre_y, mouse_cur_x, mouse_cur_y, isUsingTool("Ellipse", 1));
else
draw_point_size(mouse_cur_x, mouse_cur_y);
} else if(isUsingTool("Freefrom")) {
draw_point_size(mouse_cur_x, mouse_cur_y);
}
surface_reset_shader();
if((active || mouse_holding) && isUsingTool()) {
if(isUsingTool("Selection")) {
if(is_selected) {
var pos_x = _x + selection_position[0] * _s;
var pos_y = _y + selection_position[1] * _s;
var sel_w = surface_get_width_safe(selection_surface) * _s;
var sel_h = surface_get_height_safe(selection_surface) * _s;
if(isUsingTool()) {
var _drawSelection = isUsingTool("Selection") && is_selected;
if(_drawSelection) { #region
var pos_x = _x + selection_position[0] * _s;
var pos_y = _y + selection_position[1] * _s;
var sel_w = surface_get_width_safe(selection_surface) * _s;
var sel_h = surface_get_height_safe(selection_surface) * _s;
draw_surface_ext_safe(selection_surface, pos_x, pos_y, _s, _s, 0, c_white, 1);
draw_set_color(c_black);
draw_rectangle(pos_x, pos_y, pos_x + sel_w, pos_y + sel_h, true);
draw_set_color(c_white);
draw_rectangle_dashed(pos_x, pos_y, pos_x + sel_w, pos_y + sel_h, true, 4);
draw_surface_ext_safe(selection_surface, pos_x, pos_y, _s, _s, 0, c_white, 1);
}
} else {
draw_set_color(c_white);
draw_rectangle_dashed(pos_x, pos_y, pos_x + sel_w, pos_y + sel_h, true, 6, current_time / 100);
} #endregion
if(!isUsingTool("Selection") && (active || mouse_holding)) { #region
gpu_set_colorwriteenable(tool_attribute.channel[0], tool_attribute.channel[1], tool_attribute.channel[2], tool_attribute.channel[3]);
draw_surface_ext_safe(preview_draw_surface, _x, _y, _s, _s, 0, isUsingTool("Eraser")? c_red : c_white, isUsingTool("Eraser")? 0.2 : _alp);
gpu_set_colorwriteenable(true, true, true, true);
}
} #endregion
surface_set_target(_preview_draw_surface);
DRAW_CLEAR
@ -1123,9 +1317,25 @@ function Node_Canvas(_x, _y, _group = noone) : Node(_x, _y, _group) constructor
surface_reset_target();
shader_set(sh_brush_outline);
shader_set_f("dimension", surface_get_width_safe(_preview_draw_surface), surface_get_height_safe(_preview_draw_surface));
shader_set_f("dimension", surface_get_width(_preview_draw_surface), surface_get_height(_preview_draw_surface));
draw_surface_ext_safe(_preview_draw_surface, 0, 0, 1, 1, 0, c_white, 1);
shader_reset();
if(isUsingTool("Selection", 2) && mouse_holding) { #region
var ox, oy, nx, ny;
draw_set_color(c_white);
for( var i = 0, n = array_length(freeform_shape); i < n; i++ ) {
nx = _x + freeform_shape[i].x * _s;
ny = _y + freeform_shape[i].y * _s;
if(i) draw_line(ox, oy, nx, ny);
ox = nx;
oy = ny;
}
} #endregion
}
#endregion

View file

@ -622,7 +622,8 @@ function Node(_x, _y, _group = noone) : __Node_Base(_x, _y) constructor {
INLINE
inputs_data[index] = value;
input_value_map[$ inputs[| index].internalName] = value;
var _inp = inputs[| index];
if(is_struct(_inp)) input_value_map[$ _inp.internalName] = value;
} #endregion
static getInputs = function(frame = CURRENT_FRAME) { #region

View file

@ -63,49 +63,34 @@ function Node_Group_Input(_x, _y, _group = noone) : Node(_x, _y, _group) constru
#endregion
inputs[| 0] = nodeValue("Display type", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 0)
.setDisplay(VALUE_DISPLAY.enum_scroll, { data: display_list[0], update_hover: false })
.uncache()
.rejectArray();
.setDisplay(VALUE_DISPLAY.enum_scroll, { data: display_list[0], update_hover: false });
inputs[| 1] = nodeValue("Range", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, [0, 1])
inputs[| 1] = nodeValue("Range", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, [ 0, 1 ])
.setDisplay(VALUE_DISPLAY.range)
.uncache()
.setVisible(false)
.rejectArray();
.setVisible(false);
inputs[| 2] = nodeValue("Input type", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 11)
.setDisplay(VALUE_DISPLAY.enum_scroll, { data: data_type_list, update_hover: false })
.uncache()
.rejectArray();
.setDisplay(VALUE_DISPLAY.enum_scroll, { data: data_type_list, update_hover: false });
inputs[| 3] = nodeValue("Enum label", self, JUNCTION_CONNECT.input, VALUE_TYPE.text, "")
.setVisible(false)
.uncache()
.rejectArray();
.setVisible(false);
inputs[| 4] = nodeValue("Vector size", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 0)
.setDisplay(VALUE_DISPLAY.enum_button, [ "2", "3", "4" ])
.setVisible(false)
.uncache()
.rejectArray();
.setVisible(false);
inputs[| 5] = nodeValue("Order", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 0)
.uncache()
.rejectArray();
inputs[| 6] = nodeValue("Display preview gizmo", self, JUNCTION_CONNECT.input, VALUE_TYPE.boolean, true)
.uncache()
.rejectArray();
inputs[| 5] = nodeValue("Order", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 0);
inputs[| 6] = nodeValue("Display preview gizmo", self, JUNCTION_CONNECT.input, VALUE_TYPE.boolean, true);
inputs[| 7] = nodeValue("Step", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 0.01)
.setVisible(false)
.uncache()
.rejectArray();
.setVisible(false);
inputs[| 8] = nodeValue("Button Label", self, JUNCTION_CONNECT.input, VALUE_TYPE.text, "Trigger")
.setVisible(false)
.uncache()
.rejectArray();
.setVisible(false);
for( var i = 0, n = ds_list_size(inputs); i < n; i++ )
inputs[| i].uncache().rejectArray();
input_display_list = [
["Display", false], 6,

View file

@ -783,7 +783,7 @@ function Panel_Graph(project = PROJECT) : PanelContent() constructor {
if(mouse_on_graph && pHOVER && graph_draggable) {
var _s = graph_s;
if(mouse_wheel_down()) { //zoom out
if(mouse_wheel_down() && !key_mod_press_any()) { //zoom out
for( var i = 1, n = array_length(scale); i < n; i++ ) {
if(scale[i - 1] < graph_s_to && graph_s_to <= scale[i]) {
graph_s_to = scale[i - 1];
@ -791,7 +791,7 @@ function Panel_Graph(project = PROJECT) : PanelContent() constructor {
}
}
}
if(mouse_wheel_up()) { // zoom in
if(mouse_wheel_up() && !key_mod_press_any()) { // zoom in
for( var i = 1, n = array_length(scale); i < n; i++ ) {
if(scale[i - 1] <= graph_s_to && graph_s_to < scale[i]) {
graph_s_to = scale[i];

View file

@ -462,8 +462,9 @@ function Panel_Preview() : PanelContent() constructor {
else if(canvas_s > 3) inc = 0.5;
else if(canvas_s > 1) inc = 0.25;
if(mouse_wheel_down()) canvas_s = max(round(canvas_s / inc) * inc - inc, 0.10);
if(mouse_wheel_up()) canvas_s = min(round(canvas_s / inc) * inc + inc, 64);
if(mouse_wheel_down() && !key_mod_press_any()) canvas_s = max(round(canvas_s / inc) * inc - inc, 0.10);
if(mouse_wheel_up() && !key_mod_press_any()) canvas_s = min(round(canvas_s / inc) * inc + inc, 64);
if(_canvas_s != canvas_s) {
var dx = (canvas_s - _canvas_s) * ((mx - canvas_x) / _canvas_s);
var dy = (canvas_s - _canvas_s) * ((my - canvas_y) / _canvas_s);
@ -1088,8 +1089,8 @@ function Panel_Preview() : PanelContent() constructor {
if(pHOVER && my > h - toolbar_height - prev_size - ui(16) && my > toolbar_height) {
canvas_hover = false;
if(mouse_wheel_down()) preview_x_to = clamp(preview_x_to - prev_size * SCROLL_SPEED, - preview_x_max, 0);
if(mouse_wheel_up()) preview_x_to = clamp(preview_x_to + prev_size * SCROLL_SPEED, - preview_x_max, 0);
if(mouse_wheel_down() && !key_mod_press_any()) preview_x_to = clamp(preview_x_to - prev_size * SCROLL_SPEED, - preview_x_max, 0);
if(mouse_wheel_up() && !key_mod_press_any()) preview_x_to = clamp(preview_x_to + prev_size * SCROLL_SPEED, - preview_x_max, 0);
}
#region surface array
@ -1319,7 +1320,7 @@ function Panel_Preview() : PanelContent() constructor {
tool_y_max += _h;
tool_y_max = max(0, tool_y_max - h + toolbar_height * 2);
if(thov) {
if(thov && !key_mod_press_any()) {
if(mouse_wheel_up()) tool_y_to = clamp(tool_y_to + ui(64) * SCROLL_SPEED, -tool_y_max, 0);
if(mouse_wheel_down()) tool_y_to = clamp(tool_y_to - ui(64) * SCROLL_SPEED, -tool_y_max, 0);
}
@ -1369,7 +1370,8 @@ function Panel_Preview() : PanelContent() constructor {
}
var params = new widgetParam(tolx, toly, tolw, tolh, atr[$ key],, [ mx, my ])
params.s = tolh;
params.s = tolh;
params.font = f_p3;
wdg.drawParam(params);
@ -1378,7 +1380,7 @@ function Panel_Preview() : PanelContent() constructor {
}
tol_max_w = max(0, tol_max_w - w);
if(point_in_rectangle(mx, my, 0, 0, w, toolbar_height)) {
if(point_in_rectangle(mx, my, 0, 0, w, toolbar_height) && !key_mod_press_any()) {
if(mouse_wheel_up()) tool_x_to = clamp(tool_x_to + ui(64) * SCROLL_SPEED, -tol_max_w, 0);
if(mouse_wheel_down()) tool_x_to = clamp(tool_x_to - ui(64) * SCROLL_SPEED, -tol_max_w, 0);
}

View file

@ -0,0 +1,20 @@
varying vec2 v_vTexcoord;
varying vec4 v_vColour;
uniform vec2 dimension;
void main() {
vec2 tx = 1. / dimension;
gl_FragColor = texture2D( gm_BaseTexture, v_vTexcoord );
if(gl_FragColor == v_vColour) return;
float chk = 0.;
if(texture2D( gm_BaseTexture, v_vTexcoord + vec2( tx.x, 0.) ) == v_vColour) chk++;
if(texture2D( gm_BaseTexture, v_vTexcoord + vec2(-tx.x, 0.) ) == v_vColour) chk++;
if(texture2D( gm_BaseTexture, v_vTexcoord + vec2(0., tx.y) ) == v_vColour) chk++;
if(texture2D( gm_BaseTexture, v_vTexcoord + vec2(0., -tx.y) ) == v_vColour) chk++;
if(chk >= 3.) gl_FragColor = v_vColour;
}

View file

@ -0,0 +1,19 @@
//
// Simple passthrough vertex shader
//
attribute vec3 in_Position; // (x,y,z)
//attribute vec3 in_Normal; // (x,y,z) unused in this shader.
attribute vec4 in_Colour; // (r,g,b,a)
attribute vec2 in_TextureCoord; // (u,v)
varying vec2 v_vTexcoord;
varying vec4 v_vColour;
void main()
{
vec4 object_space_pos = vec4( in_Position.x, in_Position.y, in_Position.z, 1.0);
gl_Position = gm_Matrices[MATRIX_WORLD_VIEW_PROJECTION] * object_space_pos;
v_vColour = in_Colour;
v_vTexcoord = in_TextureCoord;
}

View file

@ -0,0 +1,12 @@
{
"$GMShader":"",
"%Name":"sh_freeform_fill_cleanup",
"name":"sh_freeform_fill_cleanup",
"parent":{
"name":"canvas",
"path":"folders/shader/canvas.yy",
},
"resourceType":"GMShader",
"resourceVersion":"2.0",
"type":1,
}

View file

@ -0,0 +1,95 @@
varying vec2 v_vTexcoord;
varying vec4 v_vColour;
uniform vec2 dimension;
uniform float itr;
float isInside(vec2 axis) {
vec2 tx = 1. / dimension;
vec2 ax = axis * tx;
float overlap = 0.;
float filling = 0.;
for(float i = 1.; i < itr; i++) {
vec2 sx = v_vTexcoord + ax * i;
if(sx.x > 1. || sx.y > 1. || sx.x < 0. || sx.y < 0.) break;
vec4 cc = texture2D( gm_BaseTexture, sx );
if(cc == v_vColour) {
vec2 px_p = sx - ax + ax.yx;
vec2 px_n = sx - ax - ax.yx;
vec4 cp = texture2D( gm_BaseTexture, px_p );
vec4 cn = texture2D( gm_BaseTexture, px_n );
if(filling == 0.) {
if(cp == v_vColour && cn == v_vColour) {
filling = 2.;
overlap++;
} else if(cp == v_vColour || cn == v_vColour) {
if(cp == v_vColour) {
filling = 1.;
overlap++;
}
if(cn == v_vColour) {
filling = -1.;
overlap++;
}
} else {
vec4 ccp = texture2D( gm_BaseTexture, px_p + ax );
vec4 ccn = texture2D( gm_BaseTexture, px_n + ax );
if(ccp == v_vColour && ccn == v_vColour) {
filling = 2.;
overlap++;
}
}
}
} else if(filling != 0.) {
vec2 px_p = sx - ax + ax.yx;
vec2 px_n = sx - ax - ax.yx;
vec4 cp = texture2D( gm_BaseTexture, px_p );
vec4 cn = texture2D( gm_BaseTexture, px_n );
if(filling == 1. && cp == v_vColour)
overlap++;
if(filling == -1. && cn == v_vColour)
overlap++;
filling = 0.;
}
}
return mod(overlap, 2.);
}
void main() {
vec4 c = texture2D( gm_BaseTexture, v_vTexcoord );
gl_FragColor = vec4(0.);
if(c == v_vColour) {
gl_FragColor = vec4(1.);
return;
}
float chk = 0.;
chk += isInside(vec2(-1., 0.));
chk += isInside(vec2( 1., 0.));
chk += isInside(vec2( 0., -1.));
chk += isInside(vec2( 0., 1.));
if(chk == 1.) gl_FragColor = vec4(1., 0., 0., 1.);
else if(chk == 2.) gl_FragColor = vec4(0., 1., 0., 1.);
else if(chk == 3.) gl_FragColor = vec4(0., 0., 1., 1.);
else if(chk == 4.) gl_FragColor = vec4(1.);
}

View file

@ -0,0 +1,19 @@
//
// Simple passthrough vertex shader
//
attribute vec3 in_Position; // (x,y,z)
//attribute vec3 in_Normal; // (x,y,z) unused in this shader.
attribute vec4 in_Colour; // (r,g,b,a)
attribute vec2 in_TextureCoord; // (u,v)
varying vec2 v_vTexcoord;
varying vec4 v_vColour;
void main()
{
vec4 object_space_pos = vec4( in_Position.x, in_Position.y, in_Position.z, 1.0);
gl_Position = gm_Matrices[MATRIX_WORLD_VIEW_PROJECTION] * object_space_pos;
v_vColour = in_Colour;
v_vTexcoord = in_TextureCoord;
}

View file

@ -0,0 +1,12 @@
{
"$GMShader":"",
"%Name":"sh_freeform_fill_pass1",
"name":"sh_freeform_fill_pass1",
"parent":{
"name":"canvas",
"path":"folders/shader/canvas.yy",
},
"resourceType":"GMShader",
"resourceVersion":"2.0",
"type":1,
}

View file

@ -0,0 +1,97 @@
varying vec2 v_vTexcoord;
varying vec4 v_vColour;
uniform vec2 dimension;
uniform float itr;
float isInside(vec2 axis) {
vec2 tx = 1. / dimension;
float overlap = 0.;
bool filling = false;
for(float i = 1.; i < itr; i++) {
vec2 sx = v_vTexcoord + axis * tx * i;
if(sx.x > 1. || sx.y > 1. || sx.x < 0. || sx.y < 0.) break;
vec4 cc = texture2D( gm_BaseTexture, sx );
if(cc == v_vColour) {
if(!filling) overlap++;
filling = true;
} else
filling = false;
}
return mod(overlap, 2.);
}
void main() {
vec2 tx = 1. / dimension;
vec4 c = texture2D( gm_BaseTexture, v_vTexcoord );
gl_FragColor = vec4(0.);
gl_FragColor = c; return;
if(c == vec4(1.)) {
gl_FragColor = v_vColour;
return;
}
if(c == vec4(1., 0., 0., 1.)) {
float _chk = 0.;
c = texture2D( gm_BaseTexture, v_vTexcoord + vec2(-tx.x, 0.) );
if(c == vec4(1.) || c == vec4(0., 1., 0., 1.) || c == vec4(0., 0., 1., 1.)) _chk++;
c = texture2D( gm_BaseTexture, v_vTexcoord + vec2( tx.x, 0.) );
if(c == vec4(1.) || c == vec4(0., 1., 0., 1.) || c == vec4(0., 0., 1., 1.)) _chk++;
c = texture2D( gm_BaseTexture, v_vTexcoord + vec2(0., -tx.y) );
if(c == vec4(1.) || c == vec4(0., 1., 0., 1.) || c == vec4(0., 0., 1., 1.)) _chk++;
c = texture2D( gm_BaseTexture, v_vTexcoord + vec2(0., tx.y) );
if(c == vec4(1.) || c == vec4(0., 1., 0., 1.) || c == vec4(0., 0., 1., 1.)) _chk++;
if(_chk < 2.) return;
} else if(c == vec4(0., 1., 0., 1.)) {
float _chk = 0.;
c = texture2D( gm_BaseTexture, v_vTexcoord + vec2(-tx.x, 0.) );
if(c == vec4(1.) || c == vec4(0., 1., 0., 1.) || c == vec4(0., 0., 1., 1.)) _chk++;
c = texture2D( gm_BaseTexture, v_vTexcoord + vec2( tx.x, 0.) );
if(c == vec4(1.) || c == vec4(0., 1., 0., 1.) || c == vec4(0., 0., 1., 1.)) _chk++;
c = texture2D( gm_BaseTexture, v_vTexcoord + vec2(0., -tx.y) );
if(c == vec4(1.) || c == vec4(0., 1., 0., 1.) || c == vec4(0., 0., 1., 1.)) _chk++;
c = texture2D( gm_BaseTexture, v_vTexcoord + vec2(0., tx.y) );
if(c == vec4(1.) || c == vec4(0., 1., 0., 1.) || c == vec4(0., 0., 1., 1.)) _chk++;
if(_chk < 2.) return;
} else if(c == vec4(0., 0., 1., 1.)) {
float _chk = 0.;
c = texture2D( gm_BaseTexture, v_vTexcoord + vec2(-tx.x, 0.) );
if(c == vec4(1.) || c == vec4(0., 0., 1., 1.)) _chk++;
c = texture2D( gm_BaseTexture, v_vTexcoord + vec2( tx.x, 0.) );
if(c == vec4(1.) || c == vec4(0., 0., 1., 1.)) _chk++;
c = texture2D( gm_BaseTexture, v_vTexcoord + vec2(0., -tx.y) );
if(c == vec4(1.) || c == vec4(0., 0., 1., 1.)) _chk++;
c = texture2D( gm_BaseTexture, v_vTexcoord + vec2(0., tx.y) );
if(c == vec4(1.) || c == vec4(0., 0., 1., 1.)) _chk++;
if(_chk < 2.) return;
} else
return;
gl_FragColor = v_vColour;
}

View file

@ -0,0 +1,19 @@
//
// Simple passthrough vertex shader
//
attribute vec3 in_Position; // (x,y,z)
//attribute vec3 in_Normal; // (x,y,z) unused in this shader.
attribute vec4 in_Colour; // (r,g,b,a)
attribute vec2 in_TextureCoord; // (u,v)
varying vec2 v_vTexcoord;
varying vec4 v_vColour;
void main()
{
vec4 object_space_pos = vec4( in_Position.x, in_Position.y, in_Position.z, 1.0);
gl_Position = gm_Matrices[MATRIX_WORLD_VIEW_PROJECTION] * object_space_pos;
v_vColour = in_Colour;
v_vTexcoord = in_TextureCoord;
}

View file

@ -0,0 +1,12 @@
{
"$GMShader":"",
"%Name":"sh_freeform_fill_pass2",
"name":"sh_freeform_fill_pass2",
"parent":{
"name":"canvas",
"path":"folders/shader/canvas.yy",
},
"resourceType":"GMShader",
"resourceVersion":"2.0",
"type":1,
}