[Graph, preview panel] Zoom level can now be edit directly.

This commit is contained in:
Tanasart 2024-10-12 13:35:36 +07:00
parent e7397e9de8
commit 08463ddced
1095 changed files with 957 additions and 387 deletions

View File

@ -886,6 +886,7 @@
{"name":"node_group_thumbnail","order":3,"path":"scripts/node_group_thumbnail/node_group_thumbnail.yy",},
{"name":"node_guide","order":8,"path":"scripts/node_guide/node_guide.yy",},
{"name":"node_herringbone_tile","order":7,"path":"scripts/node_herringbone_tile/node_herringbone_tile.yy",},
{"name":"node_high_pass","order":14,"path":"scripts/node_high_pass/node_high_pass.yy",},
{"name":"node_hlsl","order":11,"path":"scripts/node_hlsl/node_hlsl.yy",},
{"name":"node_honey_noise","order":20,"path":"scripts/node_honey_noise/node_honey_noise.yy",},
{"name":"node_hsv_channel","order":1,"path":"scripts/node_hsv_channel/node_hsv_channel.yy",},
@ -1589,6 +1590,7 @@
{"name":"sh_grid_pentagonal","order":7,"path":"shaders/sh_grid_pentagonal/sh_grid_pentagonal.yy",},
{"name":"sh_grid_tri","order":3,"path":"shaders/sh_grid_tri/sh_grid_tri.yy",},
{"name":"sh_herringbone_tile","order":5,"path":"shaders/sh_herringbone_tile/sh_herringbone_tile.yy",},
{"name":"sh_high_pass","order":15,"path":"shaders/sh_high_pass/sh_high_pass.yy",},
{"name":"sh_image_trace","order":34,"path":"shaders/sh_image_trace/sh_image_trace.yy",},
{"name":"sh_interlaced","order":58,"path":"shaders/sh_interlaced/sh_interlaced.yy",},
{"name":"sh_invert","order":17,"path":"shaders/sh_invert/sh_invert.yy",},
@ -2235,6 +2237,7 @@
{"name":"s_node_gui_in","order":37,"path":"sprites/s_node_gui_in/s_node_gui_in.yy",},
{"name":"s_node_gui_out","order":36,"path":"sprites/s_node_gui_out/s_node_gui_out.yy",},
{"name":"s_node_herringbone_tile","order":39,"path":"sprites/s_node_herringbone_tile/s_node_herringbone_tile.yy",},
{"name":"s_node_high_pass","order":10,"path":"sprites/s_node_high_pass/s_node_high_pass.yy",},
{"name":"s_node_hlsl","order":32,"path":"sprites/s_node_hlsl/s_node_hlsl.yy",},
{"name":"s_node_honey","order":66,"path":"sprites/s_node_honey/s_node_honey.yy",},
{"name":"s_node_HSV_combine","order":28,"path":"sprites/s_node_HSV_combine/s_node_HSV_combine.yy",},

View File

@ -1454,6 +1454,7 @@
{"id":{"name":"node_group","path":"scripts/node_group/node_group.yy",},},
{"id":{"name":"node_guide","path":"scripts/node_guide/node_guide.yy",},},
{"id":{"name":"node_herringbone_tile","path":"scripts/node_herringbone_tile/node_herringbone_tile.yy",},},
{"id":{"name":"node_high_pass","path":"scripts/node_high_pass/node_high_pass.yy",},},
{"id":{"name":"node_hlsl","path":"scripts/node_hlsl/node_hlsl.yy",},},
{"id":{"name":"node_honey_noise","path":"scripts/node_honey_noise/node_honey_noise.yy",},},
{"id":{"name":"node_hsv_channel","path":"scripts/node_hsv_channel/node_hsv_channel.yy",},},
@ -2259,6 +2260,7 @@
{"id":{"name":"sh_grid_tri","path":"shaders/sh_grid_tri/sh_grid_tri.yy",},},
{"id":{"name":"sh_grid","path":"shaders/sh_grid/sh_grid.yy",},},
{"id":{"name":"sh_herringbone_tile","path":"shaders/sh_herringbone_tile/sh_herringbone_tile.yy",},},
{"id":{"name":"sh_high_pass","path":"shaders/sh_high_pass/sh_high_pass.yy",},},
{"id":{"name":"sh_image_trace","path":"shaders/sh_image_trace/sh_image_trace.yy",},},
{"id":{"name":"sh_interlaced","path":"shaders/sh_interlaced/sh_interlaced.yy",},},
{"id":{"name":"sh_interpret_number","path":"shaders/sh_interpret_number/sh_interpret_number.yy",},},
@ -2969,6 +2971,7 @@
{"id":{"name":"s_node_gui_in","path":"sprites/s_node_gui_in/s_node_gui_in.yy",},},
{"id":{"name":"s_node_gui_out","path":"sprites/s_node_gui_out/s_node_gui_out.yy",},},
{"id":{"name":"s_node_herringbone_tile","path":"sprites/s_node_herringbone_tile/s_node_herringbone_tile.yy",},},
{"id":{"name":"s_node_high_pass","path":"sprites/s_node_high_pass/s_node_high_pass.yy",},},
{"id":{"name":"s_node_hlsl","path":"sprites/s_node_hlsl/s_node_hlsl.yy",},},
{"id":{"name":"s_node_honey","path":"sprites/s_node_honey/s_node_honey.yy",},},
{"id":{"name":"s_node_HSV_combine","path":"sprites/s_node_HSV_combine/s_node_HSV_combine.yy",},},

View File

@ -42,7 +42,7 @@
LATEST_VERSION = 1_18_00_0;
VERSION = 1_18_01_0;
SAVE_VERSION = 1_18_01_0;
VERSION_STRING = MAC? "1.18.003m" : "1.18.2.002";
VERSION_STRING = MAC? "1.18.003m" : "1.18.2.003";
BUILD_NUMBER = 1_18_01_0;
HOTKEYS = ds_map_create();

View File

@ -192,7 +192,7 @@ function Node_Color_adjust(_x, _y, _group = noone) : Node_Processor(_x, _y, _gro
s = clamp(s * (_sat + 1), 0, 1);
_c = make_color_hsva(h * 255, s * 255, v * 255, a);
_c = merge_color_a(_c, _bl, _bla);
_c = merge_color(_c, _bl, _bla);
_col[i] = _c;
}

View File

@ -44,16 +44,15 @@ function Node_Convolution(_x, _y, _group = noone) : Node_Processor(_x, _y, _grou
var _ker = _data[1];
var _nrm = _data[9];
var _siz = max(3, _data[10]);
var _sam = struct_try_get(attributes, "oversample");
inputs[1].editWidget.setSize(_siz);
_ker = array_verify(_ker, _siz * _siz);
surface_set_shader(_outSurf, sh_convolution, true, BLEND.over);
shader_set_i("sampleMode", attributes.oversample);
shader_set_dim("dimension", _outSurf);
shader_set_f("kernel", _ker);
shader_set_i("size", _siz);
shader_set_i("sampleMode", _sam);
shader_set_i("normalized", _nrm);
draw_surface_safe(_data[0]);

View File

@ -1352,8 +1352,8 @@ function Node(_x, _y, _group = noone) : __Node_Base(_x, _y) constructor {
static drawNodeOverlay = function(xx, yy, _mx, _my, _s) {}
__draw_bbox = BBOX();
static drawGetBbox = function(xx, yy, _s) {
var pad_label = draw_name && display_parameter.avoid_label;
static drawGetBbox = function(xx, yy, _s, label = true) {
var pad_label = (display_parameter.avoid_label || label) && draw_name;
var x0 = xx;
var x1 = xx + w * _s;
@ -1394,8 +1394,10 @@ function Node(_x, _y, _group = noone) : __Node_Base(_x, _y) constructor {
var aa = (.25 + .5 * renderActive) * (.25 + .75 * isHighlightingInGraph());
var cc = getColor();
var nh = previewable? name_height * _s : h * _s;
var ba = aa;
draw_sprite_stretched_ext(THEME.node_bg, 2, xx, yy, w * _s, nh, cc, aa);
if(_panel && _panel.node_hovering == self) ba = .1;
draw_sprite_stretched_ext(THEME.node_bg, 2, xx, yy, w * _s, nh, cc, ba);
var cc = COLORS._main_text;
if(PREFERENCES.node_show_render_status && !rendered)
@ -1428,7 +1430,10 @@ function Node(_x, _y, _group = noone) : __Node_Base(_x, _y) constructor {
draw_set_text(f_sdf, fa_left, fa_center, cc, aa);
var _txt = string_cut(_name, tw, "...", _ts);
BLEND_ALPHA_MULP
draw_text_transformed(_tx, _ty, _txt, _ts, _ts, 0);
draw_set_color(0); draw_set_alpha(1); draw_text_transformed(_tx + 1, _ty + 1, _txt, _ts, _ts, 0);
draw_set_color(cc); draw_set_alpha(1); draw_text_transformed(_tx, _ty, _txt, _ts, _ts, 0);
BLEND_NORMAL
draw_set_alpha(1);
@ -1789,7 +1794,7 @@ function Node(_x, _y, _group = noone) : __Node_Base(_x, _y) constructor {
__preview_sw = surface_get_width_safe(preview_surface);
__preview_sh = surface_get_height_safe(preview_surface);
var bbox = drawGetBbox(xx, yy, _s);
var bbox = drawGetBbox(xx, yy, _s, false);
var aa = 0.5 + 0.5 * renderActive;
if(!isHighlightingInGraph()) aa *= 0.25;

View File

@ -19,9 +19,9 @@ function Node_Grid_Warp(_x, _y, _group = noone) : Node_Processor(_x, _y, _group)
var i = index - input_fix_len;
newInput(index, nodeValue_Vec2($"Anchor {i}", self, [ 0, 0 ]))
.setUnitRef(function(index) /*=>*/ {return getDimension(index)});
.setUnitRef(function(index) /*=>*/ {return getDimension(index)}, VALUE_UNIT.reference);
array_push(input_display_list, index);
inputs[index].overlay_draw_text = false;
return inputs[index];
}
@ -35,37 +35,129 @@ function Node_Grid_Warp(_x, _y, _group = noone) : Node_Processor(_x, _y, _group)
attribute_surface_depth();
attribute_interpolation();
static resetDisplay = function() {
static resetInput = function() {
input_display_list = array_clone(input_display_list_raw, 1);
for( var i = input_display_len, n = array_length(inputs); i < n; i++ )
array_push(input_display_list, i);
array_resize(inputs, input_fix_len);
var _grid = getInputData(2);
var _st = _grid? 1 / _grid : 1;
var _ind = input_fix_len;
var _dim = getDimension(0);
for(var i = 0; i <= _grid; i++)
for(var j = 0; j <= _grid; j++) {
array_push(input_display_list, _ind++);
var _inp = createNewInput();
_inp.setValueInspector([ j * _st * _dim[0], i * _st * _dim[1] ]);
}
}
static drawOverlay = function(hover, active, _x, _y, _s, _mx, _my, _snx, _sny) {
var mx = (_mx - _x) / _s;
var my = (_my - _y) / _s;
var _surf = getInputData(0);
var _grid = getInputData(2);
var _aamo = (_grid + 1) * (_grid + 1);
var _iamo = getInputAmount();
if(_iamo != _aamo) return;
var _hov = false;
var _an = array_create(_iamo);
for( var i = input_fix_len, n = array_length(inputs); i < n; i++ ) {
var _i = i - input_fix_len;
_an[_i] = inputs[i].getValue();
_an[_i][0] = _x + _an[_i][0] * _s;
_an[_i][1] = _y + _an[_i][1] * _s;
}
draw_set_color(COLORS._main_accent);
for( var i = 0; i < _grid; i++ )
for( var j = 0; j <= _grid; j++ ) {
var _a0 = _an[(i ) * (_grid + 1) + j];
var _a1 = _an[(i + 1) * (_grid + 1) + j];
draw_line(_a0[0], _a0[1], _a1[0], _a1[1]);
}
for( var i = 0; i <= _grid; i++ )
for( var j = 0; j < _grid; j++ ) {
var _a0 = _an[i * (_grid + 1) + (j )];
var _a1 = _an[i * (_grid + 1) + (j + 1)];
draw_line(_a0[0], _a0[1], _a1[0], _a1[1]);
}
for( var i = input_fix_len, n = array_length(inputs); i < n; i++ ) {
var hv = inputs[i].drawOverlay(hover, active, _x, _y, _s, _mx, _my, _snx, _sny); active &= !hv; _hov |= hv;
}
return _hov;
}
static step = function() {
}
static preGetInputs = function() {
var _grid = inputs[2].getValue();
var _aamo = (_grid + 1) * (_grid + 1);
var _iamo = getInputAmount();
if(_iamo != _aamo) resetInput();
}
static draw_vertex_rectangle = function(_x0, _y0, _x1, _y1, _x2, _y2, _x3, _y3, _u0, _v0, _u1, _v1) {
draw_vertex_texture(_x0, _y0, _u0, _v0);
draw_vertex_texture(_x1, _y1, _u1, _v0);
draw_vertex_texture(_x2, _y2, _u0, _v1);
draw_vertex_texture(_x1, _y1, _u1, _v0);
draw_vertex_texture(_x2, _y2, _u0, _v1);
draw_vertex_texture(_x3, _y3, _u1, _v1);
}
static processData = function(_outSurf, _data, _output_index, _array_index) {
var _surf = _data[0];
var _grid = _data[2];
var _aamo = (_grid + 1) * (_grid + 1);
var _iamo = getInputAmount();
if(!is_surface(_surf)) return _outSurf;
if(_iamo < _aamo) {
repeat(_aamo - _iamo) createNewInput();
resetDisplay();
} else if(_iamo > _aamo) {
array_resize(inputs, input_fix_len + _aamo);
resetDisplay();
}
var _dim = surface_get_dimension(_surf);
var _st = _grid? 1 / _grid : 1;
var _smp = 2;
surface_set_target(_outSurf);
DRAW_CLEAR
BLEND_OVERRIDE
draw_set_color(c_white);
draw_set_alpha(1);
draw_primitive_begin_texture(pr_trianglelist, surface_get_texture(_surf));
for( var i = 0; i < _grid; i++ )
for( var j = 0; j < _grid; j++ ) {
var _a0 = _data[input_fix_len + (i ) * (_grid + 1) + (j )];
var _a1 = _data[input_fix_len + (i ) * (_grid + 1) + (j + 1)];
var _a2 = _data[input_fix_len + (i + 1) * (_grid + 1) + (j )];
var _a3 = _data[input_fix_len + (i + 1) * (_grid + 1) + (j + 1)];
var _u0 = _st * (j );
var _u1 = _st * (j + 1);
var _v0 = _st * (i );
var _v1 = _st * (i + 1);
draw_vertex_rectangle(_a0[0], _a0[1], _a1[0], _a1[1], _a2[0], _a2[1], _a3[0], _a3[1], _u0, _v0, _u1, _v1);
}
draw_primitive_end();
BLEND_NORMAL
surface_reset_target();
return _outSurf;
}
}

View File

@ -0,0 +1,37 @@
function Node_create_BW(_x, _y) {
var node = new Node_BW(_x, _y);
ds_list_add(PANEL_GRAPH.nodes_list, node);
return node;
}
function Node_BW(_x, _y) : Node_Processor(_x, _y) constructor {
name = "BW";
uniform_exp = shader_get_uniform(sh_bw, "brightness");
uniform_con = shader_get_uniform(sh_bw, "contrast");
newInput(| 0, NodeValue(0, "Surface in", self, JUNCTION_CONNECT.input, VALUE_TYPE.surface, 0));
newInput(| 1, NodeValue_Float(1, "Brightness", self, 0));
inputs[| 1].setDisplay(VALUE_DISPLAY.slider, [ -1, 1, 0.01]);
newInput(| 2, NodeValue_Float(2, "Contrast", self, 1));
inputs[| 2].setDisplay(VALUE_DISPLAY.slider, [ -1, 4, 0.01]);
outputs[| 0] = new nodeValue_Output(0, "Surface out", self, VALUE_TYPE.surface, surface_create(1, 1));
function process_data(_inSurf, _outSurf, _data) {
var _exp = _data[1];
var _con = _data[2];
surface_set_target(_outSurf);
draw_clear_alpha(0, 0);
shader_set(sh_bw);
shader_set_uniform_f(uniform_exp, _exp);
shader_set_uniform_f(uniform_con, _con);
draw_surface(_inSurf, 0, 0);
shader_reset();
surface_reset_target();
return _outSurf;
}
}

View File

@ -0,0 +1,12 @@
{
"isDnD": false,
"isCompatibility": false,
"parent": {
"name": "filter",
"path": "folders/nodes/data/filter.yy",
},
"resourceVersion": "1.0",
"name": "node_bw",
"tags": [],
"resourceType": "GMScript",
}

View File

@ -0,0 +1,12 @@
{
"isDnD": false,
"isCompatibility": false,
"parent": {
"name": "filter",
"path": "folders/nodes/data/filter.yy",
},
"resourceVersion": "1.0",
"name": "node_color_adjustment",
"tags": [],
"resourceType": "GMScript",
}

View File

@ -0,0 +1,12 @@
{
"isDnD": false,
"isCompatibility": false,
"parent": {
"name": "process",
"path": "folders/nodes/data/process.yy",
},
"resourceVersion": "1.0",
"name": "node_color_replacement",
"tags": [],
"resourceType": "GMScript",
}

View File

@ -0,0 +1,12 @@
{
"isDnD": false,
"isCompatibility": false,
"parent": {
"name": "filter",
"path": "folders/nodes/data/filter.yy",
},
"resourceVersion": "1.0",
"name": "node_greyscale",
"tags": [],
"resourceType": "GMScript",
}

View File

@ -0,0 +1,58 @@
function Node_High_Pass(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) constructor {
name = "High_Pass";
newInput(0, nodeValue_Surface("Surface in", self));
newInput(1, nodeValue_Bool("Active", self, true));
active_index = 1;
newInput(2, nodeValue_Surface("Mask", self));
newInput(3, nodeValue_Float("Mix", self, 1))
.setDisplay(VALUE_DISPLAY.slider);
newInput(4, nodeValue_Toggle("Channel", self, 0b1111, { data: array_create(4, THEME.inspector_channel) }));
__init_mask_modifier(2); // inputs 5, 6,
newInput(7, nodeValue_Int("Radius", self, 1));
newInput(8, nodeValue_Float("Intensity", self, 1));
input_display_list = [ 1, 4,
["Surfaces", true], 0, 2, 3, 5, 6,
["Sharpen", false], 7, 8,
]
newOutput(0, nodeValue_Output("Surface out", self, VALUE_TYPE.surface, noone));
attribute_surface_depth();
attribute_oversample();
static step = function() {
__step_mask_modifier();
}
static processData = function(_outSurf, _data, _output_index, _array_index) {
var _rad = _data[7];
var _int = _data[8];
var _dim = surface_get_dimension(_data[0]);
_outSurf = surface_verify(_outSurf, _dim[0], _dim[1]);
surface_set_shader(_outSurf, sh_high_pass, true, BLEND.over);
shader_set_i("sampleMode", attributes.oversample);
shader_set_2("dimension", _dim);
shader_set_f("radius", _rad);
shader_set_f("intensity", _int);
draw_surface_safe(_data[0]);
surface_reset_shader();
__process_mask_modifier(_data);
_outSurf = mask_apply(_data[0], _outSurf, _data[2], _data[3]);
_outSurf = channel_apply(_data[0], _outSurf, _data[4]);
return _outSurf;
}
}

View File

@ -0,0 +1,13 @@
{
"$GMScript":"v1",
"%Name":"node_high_pass",
"isCompatibility":false,
"isDnD":false,
"name":"node_high_pass",
"parent":{
"name":"blur",
"path":"folders/nodes/data/filter/blur.yy",
},
"resourceType":"GMScript",
"resourceVersion":"2.0",
}

View File

@ -0,0 +1,12 @@
{
"isDnD": false,
"isCompatibility": false,
"parent": {
"name": "process",
"path": "folders/nodes/data/process.yy",
},
"resourceVersion": "1.0",
"name": "node_outline",
"tags": [],
"resourceType": "GMScript",
}

View File

@ -12,20 +12,18 @@ function Node_HTTP_request(_x, _y, _group = noone) : Node(_x, _y, _group) constr
address_domain = "";
static update = function() {
insp1UpdateTooltip = "Trigger";
insp1UpdateIcon = [ THEME.sequence_control, 1, COLORS._main_value_positive ];
static onInspector1Update = function() {
request();
}
static request = function() {
var _addr = getInputData(0);
var _type = getInputData(1);
var _post = getInputData(2);
inputs[2].setVisible(_type == 1, _type == 1);
if(_addr == "") return;
var _addrs = string_split(_addr, "/", true);
address_domain = array_safe_get(_addrs, 1, "");
draw_set_font(f_p0);
address_domain = string_cut_line(address_domain, 128);
switch(_type) {
case 0 :
asyncCall(http_get(_addr), function(param, data) /*=>*/ {
@ -45,6 +43,21 @@ function Node_HTTP_request(_x, _y, _group = noone) : Node(_x, _y, _group) constr
}
}
static update = function() {
var _addr = getInputData(0);
var _type = getInputData(1);
var _post = getInputData(2);
inputs[2].setVisible(_type == 1, _type == 1);
if(_addr == "") return;
draw_set_font(f_p0);
var _addrs = string_split(_addr, "/", true);
address_domain = array_safe_get(_addrs, 1, "");
address_domain = string_cut_line(address_domain, 128);
}
static onDrawNode = function(xx, yy, _mx, _my, _s, _hover, _focus) {
var addr = getInputData(0);
var bbox = drawGetBbox(xx, yy, _s);

View File

@ -11,16 +11,21 @@ function Node_Json_File_Write(_x, _y, _group = noone) : Node(_x, _y, _group) con
newInput(1, nodeValue_Struct("Struct", self, {}))
.setVisible(true, true);
input_display_list = [ 0, 1 ]
newInput(2, nodeValue_Bool("Pretty print", self, false));
input_display_list = [ 0, 1, 2 ]
static writeFile = function() {
var path = getInputData(0);
if(path == "") return;
if(filename_ext(path) != ".json")
path += ".json";
var cont = getInputData(1);
json_save_struct(path, cont);
var pret = getInputData(2);
json_save_struct(path, cont, pret);
}
static update = function(frame = CURRENT_FRAME) {

View File

@ -25,7 +25,7 @@ function Node_Polar(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) con
new scrollItem("Inverse Square", s_node_curve, 1),
new scrollItem("Logarithm", s_node_curve, 3), ]));
newInput(10, nodeValue_Bool("Swap", self, false))
newInput(10, nodeValue_Bool("Swap", self, false));
//////////////////////////////////////////////////////////////////////////////////////////////////
@ -35,21 +35,22 @@ function Node_Polar(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) con
newInput(12, nodeValue_Vec2("Tile", self, [ 1, 1 ] ));
newInput(13, nodeValue_Rotation_Range("Range", self, [ 0, 360 ]));
newOutput(0, nodeValue_Output("Surface out", self, VALUE_TYPE.surface, noone));
input_display_list = [ 3, 4,
["Surfaces", false], 0, 1, 2, 7, 8, 12,
["Effect", false], 5, 6, 11, 9, 10,
["Effect", false], 5, 6, 11, 9, 10, 13,
]
attribute_surface_depth();
attribute_interpolation();
static step = function() { #region
static step = function() {
__step_mask_modifier();
inputs[6].mappableStep();
} #endregion
}
static processData = function(_outSurf, _data, _output_index, _array_index) {
@ -60,6 +61,7 @@ function Node_Polar(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) con
shader_set_f_map("blend", _data[6], _data[11], inputs[6]);
shader_set_i("swap", _data[10]);
shader_set_2("tile", _data[12]);
shader_set_2("range", _data[13]);
draw_surface_safe(_data[0]);
surface_reset_shader();

View File

@ -508,7 +508,7 @@ function __initNodes() {
//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\
global.__startPage = ds_list_size(NODE_CATEGORY);
global.__startPage = ds_list_size(NODE_CATEGORY);
#region io
var input = ds_list_create();
@ -568,6 +568,7 @@ function __initNodes() {
addNodeObject(transform, "Warp", s_node_warp, "Node_Warp", [1, Node_Warp], ["warp corner"], "Warp image by freely moving the corners.");
// addNodeObject(transform, "Perspective Warp",s_node_warp, "Node_Warp_Perspective",[1, Node_Warp_Perspective], ["warp perspective"], "Warp image by modifying perspective.");
addNodeObject(transform, "Skew", s_node_skew, "Node_Skew", [1, Node_Skew], ["shear"], "Skew image horizontally, or vertically.");
// addNodeObject(transform, "Grid Warp", s_node_warp_mesh, "Node_Grid_Warp", [1, Node_Grid_Warp], ["grid wrap"], "Wrap image by modifying mesh lacttice.");
addNodeObject(transform, "Mesh Warp", s_node_warp_mesh, "Node_Mesh_Warp", [1, Node_Mesh_Warp], ["mesh wrap"], "Wrap image by converting it to mesh, and using control points.");
addNodeObject(transform, "Polar", s_node_polar, "Node_Polar", [1, Node_Polar],, "Convert image to polar coordinate.");
addNodeObject(transform, "Area Warp", s_node_warp_area, "Node_Wrap_Area", [1, Node_Wrap_Area],, "Wrap image to fit area value (x, y, w, h).");
@ -603,6 +604,7 @@ function __initNodes() {
addNodeObject(filter, "Average", s_node_average, "Node_Average", [1, Node_Average],, "Average color of every pixels in the image.").setVersion(1110);
addNodeObject(filter, "Smear", s_node_smear, "Node_Smear", [1, Node_Smear],, "Stretch out brighter pixel in one direction.").setVersion(11670);
addNodeObject(filter, "Kuwahara", s_node_kuwahara, "Node_Kuwahara", [1, Node_Kuwahara],, "Apply Kuwahara filter. Creating a watercolor-like effect.").setVersion(11660);
addNodeObject(filter, "High Pass", s_node_high_pass, "Node_High_Pass", [1, Node_High_Pass], ["sharpen"], "Apply high pass filter").setVersion(1_18_01_0);
addNodeObject(filter, "Brush", s_node_brush_linear, "Node_Brush_Linear", [1, Node_Brush_Linear],, "Apply brush effect.").patreonExtra();
ds_list_add(filter, "Warps");

View File

@ -340,8 +340,8 @@ function Node_Repeat(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) co
var _grad_map = _data[30];
var _grad_range = _data[31];
var _arr = _data[16];
var _sed = _data[17];
var _arr = _data[16];
var _sed = _data[17];
var _col = _data[18];
var _cls = _data[19];
@ -517,11 +517,11 @@ function Node_Repeat(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) co
if(_an_selt == 0) { // index
if(i < _an_sind - _an_srng - _an_sfal || i > _an_sind + _an_srng + _an_sfal)
_inf = 0;
else if (_an_sfal > 0 && (i < _an_sind - _an_srng || i > _an_sind + _an_srng))
_inf = 1 - clamp(min(abs(i - (_an_sind - _an_srng)), abs(i - (_an_sind + _an_srng))) / _an_sfal, 0, 1);
else
_inf = 1;
else if (_an_sfal > 0 && (i < _an_sind - _an_srng || i > _an_sind + _an_srng))
_inf = clamp(min(abs(i - (_an_sind - _an_srng)), abs(i - (_an_sind + _an_srng))) / _an_sfal, 0, 1);
else
_inf = 0;
} else if(_an_selt == 1) { // area
_inf = 1 - area_point_in_fallout(_an_sare, _x, _y, _an_sfal);

View File

@ -2001,7 +2001,7 @@ function NodeValue(_name, _node, _connect, _type, _value, _tooltip = "") constru
return drawJuncConnection(value_from, self, params);
}
static drawConnectionMouse = function(params, _mx, _my, target) {
static drawConnectionMouse = function(params, _mx, _my, target = noone) {
var ss = params.s;
var aa = params.aa; // 1
@ -2023,7 +2023,8 @@ function NodeValue(_name, _node, _connect, _type, _value, _tooltip = "") constru
_mx *= aa;
_my *= aa;
var col = color_display;
var _fade = PREFERENCES.connection_line_highlight_fade;
var col = merge_color(_fade, color_display, .5);
draw_set_color(col);
var _action = type == VALUE_TYPE.action;
@ -2031,6 +2032,7 @@ function NodeValue(_name, _node, _connect, _type, _value, _tooltip = "") constru
switch(PREFERENCES.curve_connection_line) {
case 0 : draw_line_width(sx, sy, _mx, _my, th); break;
case 1 :
if(drawCorner) {
if(_action) draw_line_curve_corner(_mx, _my, sx, sy, ss, th, col, col);
@ -2040,6 +2042,7 @@ function NodeValue(_name, _node, _connect, _type, _value, _tooltip = "") constru
else draw_line_curve_color(sx, sy, _mx, _my,,, ss, th, col, col);
}
break;
case 2 :
if(drawCorner) {
if(_action) draw_line_elbow_corner(_mx, _my, sx, sy, ss, th, col, col, corner);
@ -2049,6 +2052,7 @@ function NodeValue(_name, _node, _connect, _type, _value, _tooltip = "") constru
else draw_line_elbow_color(_mx, _my, sx, sy,,, ss, th, col, col, corner);
}
break;
case 3 :
if(drawCorner) {
if(_action) draw_line_elbow_diag_corner(_mx, _my, sx, sy, ss, th, col, col, corner);
@ -2059,6 +2063,9 @@ function NodeValue(_name, _node, _connect, _type, _value, _tooltip = "") constru
}
break;
}
__draw_sprite_ext(THEME.node_junctions_bg_x2, draw_junction_index, _mx, _my, ss / 2, ss / 2, 0, draw_bg, 1);
__draw_sprite_ext(THEME.node_junctions_outline_x2, draw_junction_index, _mx, _my, ss / 2, ss / 2, 0, col, 1);
}
/////========== EXPRESSION ==========

View File

@ -5,18 +5,18 @@ function ValueValidator() constructor {
function VV_min(minimum) { return new __VV_min(minimum); };
function __VV_min(minimum) : ValueValidator() constructor {
self.minimum = minimum;
static validate = function(val) { return max(minimum, val); }
static validate = function(val) { return is_array(val)? array_map(val, function(v) /*=>*/ {return validate(v)}) : max(minimum, val); }
}
function VV_max(maximum) { return new __VV_max(maximum); };
function __VV_max(maximum) : ValueValidator() constructor {
self.maximum = maximum;
static validate = function(val) { return min(maximum, val); }
static validate = function(val) { return is_array(val)? array_map(val, function(v) /*=>*/ {return validate(v)}) : min(maximum, val); }
}
function VV_clamp(minimum, maximum) { return new __VV_clamp(minimum, maximum); };
function __VV_clamp(minimum, maximum) : ValueValidator() constructor {
self.minimum = minimum;
self.maximum = maximum;
static validate = function(val) { return clamp(val, minimum, maximum); }
static validate = function(val) { return is_array(val)? array_map(val, function(v) /*=>*/ {return validate(v)}) : clamp(val, minimum, maximum); }
}

View File

@ -279,7 +279,7 @@ function Panel_Collection() : PanelContent() constructor {
tb_search = new textBox(TEXTBOX_INPUT.text, function(str) /*=>*/ { search_string = string(str); doSearch(); });
tb_search.auto_update = true;
grid_size = ui(48);
grid_size = ui(56);
grid_size_to = grid_size;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@ -667,7 +667,7 @@ function Panel_Collection() : PanelContent() constructor {
}
}
var ss = grid_size / 96;
var ss = grid_size / (max(sprite_get_width(_node.spr), sprite_get_height(_node.spr)) + 16);
var sx = _boxx + grid_size / 2;
var sy = yy + grid_size / 2;

View File

@ -271,7 +271,7 @@ function Panel_Graph(project = PROJECT) : PanelContent() constructor {
show_dimension : true,
show_compute : true,
avoid_label : true,
avoid_label : false,
preview_scale : 100,
highlight : false,
@ -295,6 +295,22 @@ function Panel_Graph(project = PROJECT) : PanelContent() constructor {
tooltip_overlay[$ title] = keys;
}
tb_zoom_level = new textBox(TEXTBOX_INPUT.number, function(z) /*=>*/ {
var _s = graph_s;
graph_s_to = clamp(z, 0.01, 2);
graph_s = graph_s_to;
if(_s != graph_s) {
graph_x += w / 2 * ((1 / graph_s) - (1 / _s));
graph_y += h / 2 * ((1 / graph_s) - (1 / _s));
}
});
tb_zoom_level.color = c_white;
tb_zoom_level.align = fa_right;
tb_zoom_level.hide = 3;
tb_zoom_level.font = f_p2;
#endregion
#region // ---- position ----
@ -382,9 +398,7 @@ function Panel_Graph(project = PROJECT) : PanelContent() constructor {
node_hover = noone;
junction_hovering = noone;
add_node_draw_junc = false;
add_node_draw_x_fix = 0;
add_node_draw_y_fix = 0;
add_node_draw_junc = noone;
add_node_draw_x = 0;
add_node_draw_y = 0;
@ -1478,179 +1492,189 @@ function Panel_Graph(project = PROJECT) : PanelContent() constructor {
printIf(log, $"Draw active: {get_timer() - t}"); t = get_timer();
// draw connections
var aa = floor(min(8192 / w, 8192 / h, PREFERENCES.connection_line_aa));
connection_surface = surface_verify(connection_surface, w * aa, h * aa);
connection_surface_aa = surface_verify(connection_surface_aa, w, h);
surface_set_target(connection_surface);
DRAW_CLEAR
var aa = floor(min(8192 / w, 8192 / h, PREFERENCES.connection_line_aa));
var hov = noone;
var hoverable = !bool(node_dragging) && pHOVER;
var param = connection_param;
param.active = hoverable;
param.setPos(gr_x, gr_y, graph_s, mx, my);
param.setBoundary(-64, -64, w + 64, h + 64);
param.setProp(array_length(nodes_list), display_parameter.highlight);
param.setDraw(aa, bg_color);
for(var i = 0; i < array_length(nodes_list); i++) {
var _node = nodes_list[i];
if(!display_parameter.show_control && _node.is_controller) continue;
param.cur_layer = i + 1;
var _hov = _node.drawConnections(param);
if(_hov != noone && is_struct(_hov)) hov = _hov;
}
connection_surface = surface_verify(connection_surface, w * aa, h * aa);
connection_surface_aa = surface_verify(connection_surface_aa, w, h);
surface_set_target(connection_surface);
DRAW_CLEAR
var hov = noone;
var hoverable = !bool(node_dragging) && pHOVER;
var param = connection_param;
if(value_dragging && connection_draw_mouse != noone && !key_mod_press(SHIFT)) {
var _cmx = connection_draw_mouse[0];
var _cmy = connection_draw_mouse[1];
var _cmt = connection_draw_target;
param.active = hoverable;
param.setPos(gr_x, gr_y, graph_s, mx, my);
param.setBoundary(-64, -64, w + 64, h + 64);
param.setProp(array_length(nodes_list), display_parameter.highlight);
param.setDraw(aa, bg_color);
for(var i = 0; i < array_length(nodes_list); i++) {
var _node = nodes_list[i];
if(!display_parameter.show_control && _node.is_controller) continue;
param.cur_layer = i + 1;
var _hov = _node.drawConnections(param);
if(_hov != noone && is_struct(_hov)) hov = _hov;
}
if(value_dragging && connection_draw_mouse != noone && !key_mod_press(SHIFT)) {
var _cmx = connection_draw_mouse[0];
var _cmy = connection_draw_mouse[1];
var _cmt = connection_draw_target;
if(array_empty(value_draggings))
value_dragging.drawConnectionMouse(param, _cmx, _cmy, _cmt);
else {
var _stIndex = array_find(value_draggings, value_dragging);
for( var i = 0, n = array_length(value_draggings); i < n; i++ ) {
var _dmx = _cmx;
var _dmy = value_draggings[i].connect_type == CONNECT_TYPE.output? _cmy + (i - _stIndex) * 24 * graph_s : _cmy;
if(array_empty(value_draggings))
value_dragging.drawConnectionMouse(param, _cmx, _cmy, _cmt);
else {
var _stIndex = array_find(value_draggings, value_dragging);
for( var i = 0, n = array_length(value_draggings); i < n; i++ ) {
var _dmx = _cmx;
var _dmy = value_draggings[i].connect_type == CONNECT_TYPE.output? _cmy + (i - _stIndex) * 24 * graph_s : _cmy;
value_draggings[i].drawConnectionMouse(param, _dmx, _dmy, _cmt);
}
value_draggings[i].drawConnectionMouse(param, _dmx, _dmy, _cmt);
}
}
surface_reset_target();
gpu_set_texfilter(true);
surface_set_shader(connection_surface_aa, sh_downsample);
shader_set_f("down", aa);
shader_set_dim("dimension", connection_surface);
draw_surface_safe(connection_surface);
surface_reset_shader();
gpu_set_texfilter(false);
BLEND_ALPHA_MULP
draw_surface_safe(connection_surface_aa);
BLEND_NORMAL
junction_hovering = node_hovering == noone? hov : noone;
} else if(add_node_draw_junc != noone) {
if(!instance_exists(o_dialog_add_node))
add_node_draw_junc = noone;
else {
var _amx = gr_x + add_node_draw_x * graph_s;
var _amy = gr_y + add_node_draw_y * graph_s;
add_node_draw_junc.drawConnectionMouse(param, _amx, _amy);
}
}
surface_reset_target();
gpu_set_texfilter(true);
surface_set_shader(connection_surface_aa, sh_downsample);
shader_set_f("down", aa);
shader_set_dim("dimension", connection_surface);
draw_surface_safe(connection_surface);
surface_reset_shader();
gpu_set_texfilter(false);
BLEND_ALPHA_MULP
draw_surface_safe(connection_surface_aa);
BLEND_NORMAL
junction_hovering = node_hovering == noone? hov : noone;
printIf(log, $"Draw connection: {get_timer() - t}"); t = get_timer();
// draw node
_value_focus = value_focus;
value_focus = noone;
var t = get_timer();
for(var i = 0; i < array_length(nodes_list); i++) {
var _node = nodes_list[i];
if(!display_parameter.show_control && _node.is_controller) continue;
nodes_list[i].drawNodeBehind(gr_x, gr_y, mx, my, graph_s);
}
_value_focus = value_focus;
value_focus = noone;
var t = get_timer();
for(var i = 0; i < array_length(nodes_list); i++) {
var _node = nodes_list[i];
for( var i = 0, n = array_length(value_draggings); i < n; i++ )
value_draggings[i].graph_selecting = true;
for(var i = 0; i < array_length(nodes_list); i++) {
var _node = nodes_list[i];
if(!display_parameter.show_control && _node.is_controller) continue;
if(is_instanceof(_node, Node_Frame)) continue;
try {
var val = _node.drawNode(gr_x, gr_y, mx, my, graph_s, display_parameter, self);
if(val) {
value_focus = val;
if(key_mod_press(SHIFT)) TOOLTIP = [ val.getValue(), val.type ];
}
} catch(e) {
log_warning("NODE DRAW", exception_print(e));
}
}
for(var i = 0; i < array_length(nodes_list); i++) {
var _node = nodes_list[i];
if(!display_parameter.show_control && _node.is_controller) continue;
if(!is_instanceof(nodes_list[i], Node_Frame))
nodes_list[i].drawBadge(gr_x, gr_y, graph_s);
}
for(var i = 0; i < array_length(nodes_list); i++) {
var _node = nodes_list[i];
if(!display_parameter.show_control && _node.is_controller) continue;
nodes_list[i].drawNodeFG(gr_x, gr_y, mx, my, graph_s, display_parameter, self);
}
if(PANEL_INSPECTOR && PANEL_INSPECTOR.prop_hover != noone)
value_focus = PANEL_INSPECTOR.prop_hover;
if(!display_parameter.show_control && _node.is_controller) continue;
nodes_list[i].drawNodeBehind(gr_x, gr_y, mx, my, graph_s);
}
for( var i = 0, n = array_length(value_draggings); i < n; i++ )
value_draggings[i].graph_selecting = true;
for(var i = 0; i < array_length(nodes_list); i++) {
var _node = nodes_list[i];
if(!display_parameter.show_control && _node.is_controller) continue;
if(is_instanceof(_node, Node_Frame)) continue;
try {
var val = _node.drawNode(gr_x, gr_y, mx, my, graph_s, display_parameter, self);
if(val) {
value_focus = val;
if(key_mod_press(SHIFT)) TOOLTIP = [ val.getValue(), val.type ];
}
} catch(e) {
log_warning("NODE DRAW", exception_print(e));
}
}
for(var i = 0; i < array_length(nodes_list); i++) {
var _node = nodes_list[i];
if(!display_parameter.show_control && _node.is_controller) continue;
if(!is_instanceof(nodes_list[i], Node_Frame))
nodes_list[i].drawBadge(gr_x, gr_y, graph_s);
}
for(var i = 0; i < array_length(nodes_list); i++) {
var _node = nodes_list[i];
if(!display_parameter.show_control && _node.is_controller) continue;
nodes_list[i].drawNodeFG(gr_x, gr_y, mx, my, graph_s, display_parameter, self);
}
if(PANEL_INSPECTOR && PANEL_INSPECTOR.prop_hover != noone)
value_focus = PANEL_INSPECTOR.prop_hover;
printIf(log, $"Draw node: {get_timer() - t}"); t = get_timer();
// dragging
if(mouse_press(mb_left))
node_dragging = noone;
if(mouse_press(mb_left))
node_dragging = noone;
for(var i = 0; i < array_length(nodes_list); i++)
nodes_list[i].groupCheck(gr_x, gr_y, graph_s, mx, my);
if(node_dragging && !key_mod_press(ALT)) {
addKeyOverlay("Dragging node(s)", [[ "Ctrl", "Disable snapping" ]]);
for(var i = 0; i < array_length(nodes_list); i++)
nodes_list[i].groupCheck(gr_x, gr_y, graph_s, mx, my);
if(node_dragging && !key_mod_press(ALT)) {
addKeyOverlay("Dragging node(s)", [[ "Ctrl", "Disable snapping" ]]);
var nx = node_drag_sx + (mouse_graph_x - node_drag_mx);
var ny = node_drag_sy + (mouse_graph_y - node_drag_my);
var nx = node_drag_sx + (mouse_graph_x - node_drag_mx);
var ny = node_drag_sy + (mouse_graph_y - node_drag_my);
if(!key_mod_press(CTRL) && project.graphGrid.snap) {
nx = round(nx / project.graphGrid.size) * project.graphGrid.size;
ny = round(ny / project.graphGrid.size) * project.graphGrid.size;
}
if(node_drag_ox == -1 || node_drag_oy == -1) {
node_drag_ox = nx;
node_drag_oy = ny;
} else if(nx != node_drag_ox || ny != node_drag_oy) {
var dx = nx - node_drag_ox;
var dy = ny - node_drag_oy;
for(var i = 0; i < array_length(nodes_selecting); i++) {
var _node = nodes_selecting[i];
var _nx = _node.x + dx;
var _ny = _node.y + dy;
if(!key_mod_press(CTRL) && project.graphGrid.snap) {
_nx = round(_nx / project.graphGrid.size) * project.graphGrid.size;
_ny = round(_ny / project.graphGrid.size) * project.graphGrid.size;
}
_node.move(_nx, _ny, graph_s);
}
node_drag_ox = nx;
node_drag_oy = ny;
}
if(mouse_release(mb_left) && (nx != node_drag_sx || ny != node_drag_sy)) {
var shfx = node_drag_sx - nx;
var shfy = node_drag_sy - ny;
UNDO_HOLDING = false;
for(var i = 0; i < array_length(nodes_selecting); i++) {
var _n = nodes_selecting[i];
if(_n == noone) continue;
recordAction(ACTION_TYPE.var_modify, _n, [ _n.x + shfx, "x", "node x position" ]);
recordAction(ACTION_TYPE.var_modify, _n, [ _n.y + shfy, "y", "node y position" ]);
}
}
if(!key_mod_press(CTRL) && project.graphGrid.snap) {
nx = round(nx / project.graphGrid.size) * project.graphGrid.size;
ny = round(ny / project.graphGrid.size) * project.graphGrid.size;
}
if(mouse_release(mb_left))
node_dragging = noone;
if(node_drag_ox == -1 || node_drag_oy == -1) {
node_drag_ox = nx;
node_drag_oy = ny;
} else if(nx != node_drag_ox || ny != node_drag_oy) {
var dx = nx - node_drag_ox;
var dy = ny - node_drag_oy;
for(var i = 0; i < array_length(nodes_selecting); i++) {
var _node = nodes_selecting[i];
var _nx = _node.x + dx;
var _ny = _node.y + dy;
if(!key_mod_press(CTRL) && project.graphGrid.snap) {
_nx = round(_nx / project.graphGrid.size) * project.graphGrid.size;
_ny = round(_ny / project.graphGrid.size) * project.graphGrid.size;
}
_node.move(_nx, _ny, graph_s);
}
node_drag_ox = nx;
node_drag_oy = ny;
}
if(mouse_release(mb_left) && (nx != node_drag_sx || ny != node_drag_sy)) {
var shfx = node_drag_sx - nx;
var shfy = node_drag_sy - ny;
UNDO_HOLDING = false;
for(var i = 0; i < array_length(nodes_selecting); i++) {
var _n = nodes_selecting[i];
if(_n == noone) continue;
recordAction(ACTION_TYPE.var_modify, _n, [ _n.x + shfx, "x", "node x position" ]);
recordAction(ACTION_TYPE.var_modify, _n, [ _n.y + shfy, "y", "node y position" ]);
}
}
}
if(mouse_release(mb_left))
node_dragging = noone;
printIf(log, $"Drag node time : {get_timer() - t}"); t = get_timer();
@ -1680,70 +1704,70 @@ function Panel_Graph(project = PROJECT) : PanelContent() constructor {
}
// draw selection frame
if(nodes_select_drag) {
if(point_distance(nodes_select_mx, nodes_select_my, mx, my) > 16)
nodes_select_drag = 2;
if(nodes_select_drag) {
if(point_distance(nodes_select_mx, nodes_select_my, mx, my) > 16)
nodes_select_drag = 2;
if(nodes_select_drag == 2) {
draw_sprite_stretched_points_clamp(THEME.ui_selection, 0, nodes_select_mx, nodes_select_my, mx, my, COLORS._main_accent);
if(nodes_select_drag == 2) {
draw_sprite_stretched_points_clamp(THEME.ui_selection, 0, nodes_select_mx, nodes_select_my, mx, my, COLORS._main_accent);
for(var i = 0; i < array_length(nodes_list); i++) {
var _node = nodes_list[i];
for(var i = 0; i < array_length(nodes_list); i++) {
var _node = nodes_list[i];
if(!display_parameter.show_control && _node.is_controller) continue;
if(!_node.selectable) continue;
if(is_instanceof(_node, Node_Frame) && !nodes_select_frame) continue;
var _x = (_node.x + graph_x) * graph_s;
var _y = (_node.y + graph_y) * graph_s;
var _w = _node.w * graph_s;
var _h = _node.h * graph_s;
var _sel = _w && _h && rectangle_in_rectangle(_x, _y, _x + _w, _y + _h, nodes_select_mx, nodes_select_my, mx, my);
if(!array_exists(nodes_selecting, _node) && _sel)
array_push(nodes_selecting, _node);
if(array_exists(nodes_selecting, _node) && !_sel)
array_remove(nodes_selecting, _node);
}
if(!display_parameter.show_control && _node.is_controller) continue;
if(!_node.selectable) continue;
if(is_instanceof(_node, Node_Frame) && !nodes_select_frame) continue;
var _x = (_node.x + graph_x) * graph_s;
var _y = (_node.y + graph_y) * graph_s;
var _w = _node.w * graph_s;
var _h = _node.h * graph_s;
var _sel = _w && _h && rectangle_in_rectangle(_x, _y, _x + _w, _y + _h, nodes_select_mx, nodes_select_my, mx, my);
if(!array_exists(nodes_selecting, _node) && _sel)
array_push(nodes_selecting, _node);
if(array_exists(nodes_selecting, _node) && !_sel)
array_remove(nodes_selecting, _node);
}
if(mouse_release(mb_left))
nodes_select_drag = 0;
}
if(mouse_release(mb_left))
nodes_select_drag = 0;
}
if(nodes_junction_d != noone) {
var shx = nodes_junction_dx + (mx - nodes_select_mx) / graph_s;
var shy = nodes_junction_dy + (my - nodes_select_my) / graph_s;
if(nodes_junction_d != noone) {
var shx = nodes_junction_dx + (mx - nodes_select_mx) / graph_s;
var shy = nodes_junction_dy + (my - nodes_select_my) / graph_s;
shx = value_snap(shx, key_mod_press(CTRL)? 1 : 4);
shy = value_snap(shy, key_mod_press(CTRL)? 1 : 4);
nodes_junction_d.draw_line_shift_x = shx;
nodes_junction_d.draw_line_shift_y = shy;
if(mouse_release(mb_left))
nodes_junction_d = noone;
}
if(mouse_on_graph && !node_bg_hovering && mouse_press(mb_left, _focus) && !graph_dragging_key && !graph_zooming_key) {
if(is_instanceof(junction_hovering, NodeValue) && junction_hovering.draw_line_shift_hover) {
nodes_select_mx = mx;
nodes_select_my = my;
nodes_junction_d = junction_hovering;
nodes_junction_dx = junction_hovering.draw_line_shift_x;
nodes_junction_dy = junction_hovering.draw_line_shift_y;
shx = value_snap(shx, key_mod_press(CTRL)? 1 : 4);
shy = value_snap(shy, key_mod_press(CTRL)? 1 : 4);
} else if(array_empty(nodes_selecting) && !value_focus && !drag_locking) {
nodes_select_drag = 1;
nodes_select_frame = frame_hovering == noone;
nodes_junction_d.draw_line_shift_x = shx;
nodes_junction_d.draw_line_shift_y = shy;
if(mouse_release(mb_left))
nodes_junction_d = noone;
nodes_select_mx = mx;
nodes_select_my = my;
}
if(mouse_on_graph && !node_bg_hovering && mouse_press(mb_left, _focus) && !graph_dragging_key && !graph_zooming_key) {
if(is_instanceof(junction_hovering, NodeValue) && junction_hovering.draw_line_shift_hover) {
nodes_select_mx = mx;
nodes_select_my = my;
nodes_junction_d = junction_hovering;
nodes_junction_dx = junction_hovering.draw_line_shift_x;
nodes_junction_dy = junction_hovering.draw_line_shift_y;
} else if(array_empty(nodes_selecting) && !value_focus && !drag_locking) {
nodes_select_drag = 1;
nodes_select_frame = frame_hovering == noone;
nodes_select_mx = mx;
nodes_select_my = my;
}
drag_locking = false;
}
drag_locking = false;
}
printIf(log, $"Draw selection frame : {get_timer() - t}"); t = get_timer();
}
@ -1835,6 +1859,10 @@ function Panel_Graph(project = PROJECT) : PanelContent() constructor {
alarm[0] = 1;
}
add_node_draw_junc = value_dragging;
add_node_draw_x = mouse_grid_x;
add_node_draw_y = mouse_grid_y;
}
}
@ -2501,13 +2529,31 @@ function Panel_Graph(project = PROJECT) : PanelContent() constructor {
drawNodes();
draw_set_text(f_p2, fa_right, fa_top, COLORS._main_text_sub);
draw_text_add(w - ui(8), ovy, $"x{graph_s_to}");
drawJunctionConnect();
drawContextFrame();
mouse_on_graph = true;
#region draw metadata
draw_set_text(f_p2, fa_right, fa_top, COLORS._main_text_sub);
var _zms = $"x{graph_s_to}";
var _zmw = string_width(_zms) + ui(16);
var _zmh = string_height(_zms);
var _zmx = w;
var _zmc = tb_zoom_level.selecting || tb_zoom_level.hovering || tb_zoom_level.sliding? COLORS._main_text : COLORS._main_text_sub;
if(tb_zoom_level.hovering) mouse_on_graph = false;
tb_zoom_level.rx = x;
tb_zoom_level.ry = y;
tb_zoom_level.setFocusHover(pFOCUS, pHOVER);
tb_zoom_level.postBlend = _zmc;
tb_zoom_level.draw(_zmx, ovy, _zmw, _zmh, string(graph_s_to), [ mx, my ], fa_right);
draw_set_text(f_p2, fa_right, fa_top, _zmc);
if(!tb_zoom_level.selecting && !tb_zoom_level.sliding)
draw_text(_zmx - _zmw + ui(14), ovy + ui(1), "x");
#endregion
drawToolBar();
drawMinimap();

View File

@ -219,6 +219,24 @@ function Panel_Preview() : PanelContent() constructor {
show_view_control = 1;
resetViewOnDoubleClick = true;
tb_zoom_level = new textBox(TEXTBOX_INPUT.number, function(z) /*=>*/ {
var _s = canvas_s;
canvas_s = clamp(z, 0.10, 64);
if(_s != canvas_s) {
var dx = (canvas_s - _s) * ((w / 2 - canvas_x) / _s);
var dy = (canvas_s - _s) * ((h / 2 - canvas_y) / _s);
canvas_x -= dx;
canvas_y -= dy;
}
});
tb_zoom_level.color = c_white;
tb_zoom_level.align = fa_right;
tb_zoom_level.hide = 3;
tb_zoom_level.font = f_p2;
tb_framerate = new textBox(TEXTBOX_INPUT.number, function(val) { preview_rate = real(val); });
#endregion
#region ---- tool ----
@ -323,8 +341,6 @@ function Panel_Preview() : PanelContent() constructor {
#endregion
#endregion
tb_framerate = new textBox(TEXTBOX_INPUT.number, function(val) { preview_rate = real(val); });
#region ++++ toolbars & actions ++++
static set_tile_off = function() /*=>*/ { tileMode = 0; }
static set_tile_horizontal = function() /*=>*/ { tileMode = 1; }
@ -1401,8 +1417,25 @@ function Panel_Preview() : PanelContent() constructor {
if(d3_active == NODE_3D.none) {
right_menu_y += _lh;
draw_text(right_menu_x, right_menu_y, $"x{canvas_s}");
var _zms = $"x{canvas_s}";
var _zmw = string_width(_zms) + ui(16);
var _zmx = right_menu_x + ui(8);
var _zmc = tb_zoom_level.selecting || tb_zoom_level.hovering || tb_zoom_level.sliding? COLORS._main_text : COLORS._main_text_sub;
if(tb_zoom_level.hovering) mouse_on_preview = false;
tb_zoom_level.rx = x;
tb_zoom_level.ry = y;
tb_zoom_level.setFocusHover(pFOCUS, pHOVER);
tb_zoom_level.postBlend = _zmc;
tb_zoom_level.draw(_zmx, right_menu_y, _zmw, _lh, string(canvas_s), [ mx, my ], fa_right);
draw_set_text(f_p2, fa_right, fa_top, _zmc);
if(!tb_zoom_level.selecting && !tb_zoom_level.sliding)
draw_text(_zmx - _zmw + ui(14), right_menu_y + ui(1), "x");
draw_set_color(COLORS._main_text_sub);
if(pHOVER) {
right_menu_y += _lh;
var mpx = floor((mx - canvas_x) / canvas_s);
@ -1784,7 +1817,7 @@ function Panel_Preview() : PanelContent() constructor {
if(pFOCUS && WIDGET_CURRENT == noone) {
var _key = tool.checkHotkey();
if(keyboard_check_pressed(ord(string(i + 1))) || (_key != noone && _key.isPressing()))
if(_key != noone && _key.isPressing())
tool.toggleKeyboard();
}
@ -1897,7 +1930,7 @@ function Panel_Preview() : PanelContent() constructor {
if(pFOCUS && WIDGET_CURRENT == noone) {
var _key = tool.checkHotkey();
if(keyboard_check_pressed(ord(string(i + 1))) || (_key != noone && _key.isPressing()))
if(_key != noone && _key.isPressing())
tool.toggleKeyboard();
}
@ -1906,7 +1939,7 @@ function Panel_Preview() : PanelContent() constructor {
draw_sprite_stretched_ext(THEME.button_hide, 3, _x0 + pd, _y0 + pd, tool_size - pd * 2, tool_size - pd * 2, COLORS._main_accent, 1);
}
if(tool.subtools > 0) draw_sprite_colored(tool.spr[tool.selecting], 0, xx, yy);
if(tool.subtools > 0) draw_sprite_colored(tool.spr[tool.selecting], 0, xx, yy);
else draw_sprite_colored(tool.spr, 0, xx, yy);
}

View File

@ -67,8 +67,10 @@ function preview_overlay_vector(interact, active, _x, _y, _s, _mx, _my, _snx, _s
__overlay_hover[0] = lerp_float(__overlay_hover[0], _index, 4);
draw_anchor(__overlay_hover[0], _ax, _ay, _r, _type);
draw_set_text(_f_p2b, fa_center, fa_bottom, COLORS._main_accent);
draw_text_add(round(_ax), round(_ay - 4), name);
if(overlay_draw_text) {
draw_set_text(_f_p2b, fa_center, fa_bottom, COLORS._main_accent);
draw_text_add(round(_ax), round(_ay - 4), name);
}
return hover;
}

View File

@ -66,7 +66,7 @@
show_dimension : true,
show_compute : true,
avoid_label : true,
avoid_label : false,
preview_scale : 100,
highlight : false,

View File

@ -7,6 +7,8 @@ function textBox(_input, _onModify) : textInput(_input, _onModify) constructor {
hide = false;
color = COLORS._main_text;
boxColor = c_white;
postBlend = c_white;
postAlpha = 1;
format = TEXT_AREA_FORMAT._default;
precision = 5;
padding = ui(8);
@ -380,7 +382,7 @@ function textBox(_input, _onModify) : textInput(_input, _onModify) constructor {
draw_text_add(_tx, _y, "."); _tx += _dt_w;
draw_text_add(_tx, _y, _dc);
} else if(sliding == 2) {
} else if(sliding == 2 && align == fa_center) {
var _wh_w = string_width(_text);
draw_text_add(_w / 2 - _wh_w - padding, _y, _text);
@ -434,7 +436,7 @@ function textBox(_input, _onModify) : textInput(_input, _onModify) constructor {
return draw(params.x, params.y, params.w, params.h, params.data, params.m, params.halign, params.valign);
}
static draw = function(_x, _y, _w, _h, _text = "", _m = mouse_ui, halign = fa_left, valign = fa_top) { #region
static draw = function(_x, _y, _w, _h, _text = "", _m = mouse_ui, halign = fa_left, valign = fa_top) {
x = _x;
y = _y;
w = _w;
@ -516,7 +518,7 @@ function textBox(_input, _onModify) : textInput(_input, _onModify) constructor {
}
if(_w > ui(48)) {
if(sliding == 2) {
if(sliding == 2 && hide < 3) {
var _ax0 = _x + ui(10);
var _ax1 = _x + _w - ui(10);
var _ay = _y + _h / 2;
@ -561,14 +563,23 @@ function textBox(_input, _onModify) : textInput(_input, _onModify) constructor {
}
sliding = 2;
slider_object = instance_create_depth(rx + _x, ry + _y, -16000, slider_Slider, { w: _w, h: _h });
slider_object.text = self;
if(hide < 3) {
slider_object = instance_create_depth(rx + _x, ry + _y, -16000, slider_Slider, { w: _w, h: _h });
slider_object.text = self;
}
}
var _mdx = slidePen? PEN_X_DELTA : window_mouse_get_delta_x();
var _mdy = slidePen? PEN_Y_DELTA : window_mouse_get_delta_y();
if(sliding == 2) {
if(slider_object) {
slider_object.x = rx + _x;
slider_object.y = ry + _y;
slider_object.w = slider_object.w;
slider_object.h = slider_object.h;
}
if(!slidePen && PREFERENCES.slider_lock_mouse) CURSOR_LOCK = true;
if(abs(_mdy) > abs(_mdx))
@ -741,7 +752,7 @@ function textBox(_input, _onModify) : textInput(_input, _onModify) constructor {
}
BLEND_ALPHA
draw_surface(text_surface, tb_surf_x, tb_surf_y);
draw_surface_ext(text_surface, tb_surf_x, tb_surf_y, 1, 1, 0, postBlend, postAlpha);
BLEND_NORMAL
draw_set_color(COLORS._main_text_accent);
@ -761,8 +772,8 @@ function textBox(_input, _onModify) : textInput(_input, _onModify) constructor {
if(hover && hoverRect) {
hovering = true;
draw_sprite_stretched_ext(THEME.textbox, 1, _x, _y, _w, _h, boxColor, 0.5 + (0.5 * interactable));
if(hide < 3) draw_sprite_stretched_ext(THEME.textbox, 1, _x, _y, _w, _h, boxColor, 0.5 + (0.5 * interactable));
if(mouse_press(mb_left, active))
activate();
@ -806,9 +817,9 @@ function textBox(_input, _onModify) : textInput(_input, _onModify) constructor {
display_text(tx - tb_surf_x, _h / 2 - th / 2, _display_text, _w - ui(4));
surface_reset_shader();
}
BLEND_ALPHA
draw_surface(text_surface, tb_surf_x, tb_surf_y);
draw_surface_ext(text_surface, tb_surf_x, tb_surf_y, 1, 1, 0, postBlend, postAlpha);
BLEND_NORMAL
}
}
@ -825,7 +836,7 @@ function textBox(_input, _onModify) : textInput(_input, _onModify) constructor {
resetFocus();
sprite_index = -1;
return _h;
} #endregion
}
static clone = function() {
var cln = new textBox(input, onModify);

View File

@ -0,0 +1,42 @@
varying vec2 v_vTexcoord;
varying vec4 v_vColour;
uniform vec2 dimension;
uniform int sampleMode;
uniform float radius;
uniform float intensity;
vec4 sampleTexture(vec2 pos) {
if(pos.x >= 0. && pos.y >= 0. && pos.x <= 1. && pos.y <= 1.)
return texture2D(gm_BaseTexture, pos);
if(sampleMode == 0) return vec4(0.);
else if(sampleMode == 1) return texture2D(gm_BaseTexture, clamp(pos, 0., 1.));
else if(sampleMode == 2) return texture2D(gm_BaseTexture, fract(pos));
else if(sampleMode == 3) return vec4(vec3(0.), 1.);
return vec4(0.);
}
void main() {
vec2 tx = 1. / dimension;
vec4 ss = vec4(0.);
float ww = 0.;
for(float i = -radius; i <= radius; i++)
for(float j = -radius; j <= radius; j++) {
if(i == 0. && j == 0.) continue;
vec2 sx = v_vTexcoord + vec2(i, j) * tx;
float w = (radius - (abs(i) + abs(j)) + 1.) / radius / 4.;
if(w <= 0.) continue;
ss -= sampleTexture( sx ) * w;
ww += w;
}
vec4 sc = sampleTexture( v_vTexcoord );
ss += sc * ww;
gl_FragColor = vec4(ss.rgb * intensity, sc.a);
}

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_high_pass",
"name":"sh_high_pass",
"parent":{
"name":"blur",
"path":"folders/shader/filter/blur.yy",
},
"resourceType":"GMShader",
"resourceVersion":"2.0",
"type":1,
}

View File

@ -11,6 +11,7 @@ uniform vec2 tile;
uniform vec2 blend;
uniform int blendUseSurf;
uniform sampler2D blendSurf;
uniform vec2 range;
#region /////////////// SAMPLING ///////////////
@ -88,7 +89,8 @@ vec4 texture2Dintp( sampler2D texture, vec2 uv ) {
void main() {
vec2 center = vec2(0.5, 0.5);
vec2 coord;
vec2 _tile = swap == 1? tile.yx : tile;
vec2 til = tile/* * vec2(1., PI * 2.)*/;
vec2 _tile = swap == 1? til.yx : til;
float bld = blend.x;
if(blendUseSurf == 1) {
@ -96,23 +98,37 @@ void main() {
bld = mix(blend.x, blend.y, (_vMap.r + _vMap.g + _vMap.b) / 3.);
}
float rad0 = radians(range.x);
float rad1 = radians(range.y);
float radr = (range.y - range.x) / 360.;
gl_FragColor = vec4(0.);
if(invert == 0) {
float dist = distance(v_vTexcoord, center) / (sqrt(2.) * .5);
if(distMode == 1) dist = sqrt(dist);
else if(distMode == 2) dist = log(dist);
vec2 cenPos = v_vTexcoord - center;
float angle = (atan(cenPos.y, cenPos.x) / PI + 1.) / 2.;
float angle = atan(cenPos.y, -cenPos.x) + PI;
angle = (angle - rad0) / radr;
if(angle < rad0 || angle > rad1) return;
angle /= PI * 2.;
coord = fract(vec2(dist, angle) * _tile);
} else if(invert == 1) {
float dist = v_vTexcoord.x * 0.5;
if(distMode == 1) dist = sqrt(dist);
else if(distMode == 2) dist = log(dist);
float ang = v_vTexcoord.y * PI * 2.;
float angle = v_vTexcoord.y * PI * 2.;
coord = fract(center + vec2(cos(ang), sin(ang)) * dist * _tile);
angle = (angle - rad0) / radr;
if(angle < rad0 || angle > rad1) return;
coord = fract(center + vec2(cos(angle), sin(angle)) * dist * _tile);
}
if(swap == 1) coord.xy = coord.yx;

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.5 KiB

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.7 KiB

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.1 KiB

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.4 KiB

After

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.8 KiB

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.0 KiB

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.2 KiB

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.5 KiB

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.0 KiB

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.3 KiB

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.7 KiB

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.7 KiB

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.0 KiB

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.5 KiB

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.8 KiB

After

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.3 KiB

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.5 KiB

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.1 KiB

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.4 KiB

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.1 KiB

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.3 KiB

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.8 KiB

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.0 KiB

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.3 KiB

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.6 KiB

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.0 KiB

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.0 KiB

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.1 KiB

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.0 KiB

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.3 KiB

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.5 KiB

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.8 KiB

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.6 KiB

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.8 KiB

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.2 KiB

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.5 KiB

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.0 KiB

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.3 KiB

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.9 KiB

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.1 KiB

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.5 KiB

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.7 KiB

After

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.1 KiB

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.1 KiB

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.9 KiB

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.7 KiB

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.4 KiB

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.6 KiB

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 816 B

After

Width:  |  Height:  |  Size: 816 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 KiB

After

Width:  |  Height:  |  Size: 1.0 KiB

Some files were not shown because too many files have changed in this diff Show More