Path improvement

This commit is contained in:
Tanasart 2024-01-22 20:23:35 +07:00
parent 7ffec26331
commit 2132e33957
19 changed files with 376 additions and 182 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 80 KiB

After

Width:  |  Height:  |  Size: 80 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 80 KiB

After

Width:  |  Height:  |  Size: 80 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 58 KiB

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 58 KiB

After

Width:  |  Height:  |  Size: 58 KiB

View file

@ -1,7 +1,6 @@
function Node_Array_Range(_x, _y, _group = noone) : Node(_x, _y, _group) constructor {
name = "Array Range";
w = 96;
w = 96;
inputs[| 0] = nodeValue("Start", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 0)
.rejectArray();
@ -15,14 +14,18 @@ function Node_Array_Range(_x, _y, _group = noone) : Node(_x, _y, _group) constru
outputs[| 0] = nodeValue("Array", self, JUNCTION_CONNECT.output, VALUE_TYPE.float, []);
static update = function(frame = CURRENT_FRAME) {
var st = getInputData(0);
var ed = getInputData(1);
var step = getInputData(2);
var arr = [];
var st = getInputData(0);
var ed = getInputData(1);
var stp = getInputData(2);
var arr = [];
if((step > 0 && st <= ed) || (step < 0 && st >= ed)) {
for( var i = st; i <= ed; i += step )
array_push(arr, i);
if(st == ed) {
arr = array_create(stp, st);
} else if(sign(stp) == sign(ed - st)) {
var _amo = floor(abs((ed - st) / stp));
for( var i = 0; i < _amo; i++ )
array_push(arr, st + i * stp);
}
outputs[| 0].setValue(arr);
@ -33,11 +36,20 @@ function Node_Array_Range(_x, _y, _group = noone) : Node(_x, _y, _group) constru
var str = getInputData(0);
var edd = getInputData(1);
var stp = getInputData(2);
var arr = outputs[| 0].getValue();
var str = "[" + string(str) + ", " + string(str + stp) + ", ... ," + string(edd) + "]";
var str = "";
switch(array_length(arr)) {
case 0 : str = $"[]" break;
case 1 :
case 2 :
case 3 : str = $"{arr}" break;
default : str = $"[{arr[0]}, {arr[1]}, ..., {array_safe_get(arr, -1,, ARRAY_OVERFLOW.loop)}]"; break;
}
var bbox = drawGetBbox(xx, yy, _s);
var ss = string_scale(str, bbox.w, bbox.h);
var ss = string_scale(str, bbox.w, bbox.h);
draw_text_transformed(bbox.xc, bbox.yc, str, ss, ss, 0);
}
}

View file

@ -27,13 +27,6 @@ function Node_Path(_x, _y, _group = noone) : Node(_x, _y, _group) constructor {
inputs[| 3] = nodeValue("Round anchor", self, JUNCTION_CONNECT.input, VALUE_TYPE.boolean, false)
.rejectArray();
input_display_list = [
["Path", false], 0, 2, 1, 3,
["Anchors", false],
];
setIsDynamicInput(1);
outputs[| 0] = nodeValue("Position out", self, JUNCTION_CONNECT.output, VALUE_TYPE.float, [ 0, 0 ])
.setDisplay(VALUE_DISPLAY.vector);
@ -43,6 +36,13 @@ function Node_Path(_x, _y, _group = noone) : Node(_x, _y, _group) constructor {
.setVisible(false)
.setArrayDepth(1);
input_display_list = [
["Path", false], 0, 2, 1, 3,
["Anchors", false],
];
setIsDynamicInput(1);
tool_pathDrawer = new NodeTool( "Draw path", THEME.path_tools_draw )
.addSetting("Smoothness", VALUE_TYPE.float, function(val) { tool_pathDrawer.attribute.thres = val; }, "thres", 4)
.addSetting("Replace", VALUE_TYPE.boolean, function() { tool_pathDrawer.attribute.create = !tool_pathDrawer.attribute.create; }, "create", true);
@ -635,7 +635,9 @@ function Node_Path(_x, _y, _group = noone) : Node(_x, _y, _group) constructor {
}
draw_sprite_colored(THEME.anchor_selector, 0, xx, yy);
draw_set_text(f_p1, fa_left, fa_bottom, COLORS._main_accent);
draw_text(xx + ui(4), yy - ui(4), i + 1);
if(drag_point == i) {
draw_sprite_colored(THEME.anchor_selector, 1, xx, yy);
} else if(point_in_circle(_mx, _my, xx, yy, 8)) {

View file

@ -13,7 +13,7 @@ function Node_Path_Anchor(_x, _y, _group = noone) : Node_Processor(_x, _y, _grou
inputs[| 2] = nodeValue("Control point 2", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, [ 16, 0 ] )
.setDisplay(VALUE_DISPLAY.vector);
inputs[| 3] = nodeValue("Mirror control point", self, JUNCTION_CONNECT.input, VALUE_TYPE.boolean, false );
inputs[| 3] = nodeValue("Mirror control point", self, JUNCTION_CONNECT.input, VALUE_TYPE.boolean, true );
outputs[| 0] = nodeValue("Anchor", self, JUNCTION_CONNECT.output, VALUE_TYPE.float, [ 0, 0, 0, 0, 0, 0 ])
.setDisplay(VALUE_DISPLAY.vector);

View file

@ -137,8 +137,4 @@ function Node_Path_Array(_x, _y, _group = noone) : Node(_x, _y, _group) construc
static update = function(frame = CURRENT_FRAME) { #region
outputs[| 0].setValue(self);
} #endregion
static onDrawNode = function(xx, yy, _mx, _my, _s, _hover, _focus) { #region
} #endregion
}

View file

@ -1,7 +1,6 @@
function Node_Path_Blend(_x, _y, _group = noone) : Node(_x, _y, _group) constructor {
name = "Blend Path";
w = 96;
name = "Blend Path";
w = 96;
length = 0;
inputs[| 0] = nodeValue("Path 1", self, JUNCTION_CONNECT.input, VALUE_TYPE.pathnode, noone)
@ -18,12 +17,41 @@ function Node_Path_Blend(_x, _y, _group = noone) : Node(_x, _y, _group) construc
outputs[| 0] = nodeValue("Path", self, JUNCTION_CONNECT.output, VALUE_TYPE.pathnode, self);
static getLineCount = function() {
static drawOverlay = function(active, _x, _y, _s, _mx, _my, _snx, _sny) { #region
var _p0 = getInputData(0);
var _p1 = getInputData(1);
if(_p0) _p0.drawOverlay(active, _x, _y, _s, _mx, _my, _snx, _sny);
if(_p1) _p1.drawOverlay(active, _x, _y, _s, _mx, _my, _snx, _sny);
draw_set_color(COLORS._main_icon);
var _amo = getLineCount();
for( var i = 0; i < _amo; i++ ) {
var _len = getLength(_amo);
var _stp = 1 / clamp(_len * _s, 1, 64);
var ox, oy, nx, ny;
var _p = new __vec2();
for( var j = 0; j < 1; j += _stp ) {
_p = getPointRatio(j, i, _p);
nx = _x + _p.x * _s;
ny = _y + _p.y * _s;
if(j > 0) draw_line_width(ox, oy, nx, ny, 3);
ox = nx;
oy = ny;
}
}
} #endregion
static getLineCount = function() { #region
var _path = getInputData(0);
return struct_has(_path, "getLineCount")? _path.getLineCount() : 1;
}
} #endregion
static getSegmentCount = function(ind = 0) {
static getSegmentCount = function(ind = 0) { #region
var _path1 = getInputData(0);
var _path2 = getInputData(1);
var _lerp = getInputData(2);
@ -36,9 +64,9 @@ function Node_Path_Blend(_x, _y, _group = noone) : Node(_x, _y, _group) construc
if(!p1 && p2) return _path2.getSegmentCount(ind);
return max(_path1.getSegmentCount(ind), _path2.getSegmentCount(ind));
}
} #endregion
static getLength = function(ind = 0) {
static getLength = function(ind = 0) { #region
var _path1 = getInputData(0);
var _path2 = getInputData(1);
var _lerp = getInputData(2);
@ -54,9 +82,9 @@ function Node_Path_Blend(_x, _y, _group = noone) : Node(_x, _y, _group) construc
var _p2 = _path2.getLength(ind);
return lerp(_p1, _p2, _lerp);
}
} #endregion
static getAccuLength = function(ind = 0) {
static getAccuLength = function(ind = 0) { #region
var _path1 = getInputData(0);
var _path2 = getInputData(1);
var _lerp = getInputData(2);
@ -82,9 +110,9 @@ function Node_Path_Blend(_x, _y, _group = noone) : Node(_x, _y, _group) construc
}
return res;
}
} #endregion
static getPointRatio = function(_rat, ind = 0, out = undefined) {
static getPointRatio = function(_rat, ind = 0, out = undefined) { #region
if(out == undefined) out = new __vec2(); else { out.x = 0; out.y = 0; }
var _path1 = getInputData(0);
@ -105,11 +133,11 @@ function Node_Path_Blend(_x, _y, _group = noone) : Node(_x, _y, _group) construc
out.y = lerp(_p1.y, _p2.y, _lerp);
return out;
}
} #endregion
static getPointDistance = function(_dist, ind = 0, out = undefined) { return getPointRatio(_dist / getLength(ind), ind, out); }
static getBoundary = function(ind = 0) {
static getBoundary = function(ind = 0) { #region
var _path1 = getInputData(0);
var _path2 = getInputData(1);
var _lerp = getInputData(2);
@ -125,14 +153,14 @@ function Node_Path_Blend(_x, _y, _group = noone) : Node(_x, _y, _group) construc
var _p2 = _path2.getBoundary(ind);
return _p1.lerpTo(_p2, _lerp);
}
} #endregion
static update = function() {
static update = function() { #region
outputs[| 0].setValue(self);
}
} #endregion
static onDrawNode = function(xx, yy, _mx, _my, _s, _hover, _focus) {
static onDrawNode = function(xx, yy, _mx, _my, _s, _hover, _focus) { #region
var bbox = drawGetBbox(xx, yy, _s);
draw_sprite_fit(s_node_path_blend, 0, bbox.xc, bbox.yc, bbox.w, bbox.h);
}
} #endregion
}

View file

@ -1,7 +1,7 @@
function Node_Path_Builder(_x, _y, _group = noone) : Node(_x, _y, _group) constructor {
name = "Path Builder";
name = "Path Builder";
w = 96;
w = 96;
length = [];
lengthAcc = [];

View file

@ -1,55 +1,59 @@
function Node_Path_Reverse(_x, _y, _group = noone) : Node(_x, _y, _group) constructor {
name = "Reverse Path";
w = 96;
name = "Reverse Path";
w = 96;
inputs[| 0] = nodeValue("Path", self, JUNCTION_CONNECT.input, VALUE_TYPE.pathnode, noone)
.setVisible(true, true);
outputs[| 0] = nodeValue("Path", self, JUNCTION_CONNECT.output, VALUE_TYPE.pathnode, self);
static getLineCount = function() {
static drawOverlay = function(active, _x, _y, _s, _mx, _my, _snx, _sny) { #region
var _path = getInputData(0);
if(_path) _path.drawOverlay(active, _x, _y, _s, _mx, _my, _snx, _sny);
} #endregion
static getLineCount = function() { #region
var _path = getInputData(0);
return struct_has(_path, "getLineCount")? _path.getLineCount() : 1;
}
} #endregion
static getSegmentCount = function(ind = 0) {
static getSegmentCount = function(ind = 0) { #region
var _path = getInputData(0);
return struct_has(_path, "getSegmentCount")? _path.getSegmentCount(ind) : 0;
}
} #endregion
static getLength = function(ind = 0) {
static getLength = function(ind = 0) { #region
var _path = getInputData(0);
return struct_has(_path, "getLength")? _path.getLength(ind) : 0;
}
} #endregion
static getAccuLength = function(ind = 0) {
static getAccuLength = function(ind = 0) { #region
var _path = getInputData(0);
return struct_has(_path, "getAccuLength")? array_reverse(_path.getAccuLength(ind)) : [];
}
} #endregion
static getBoundary = function(ind = 0) {
static getBoundary = function(ind = 0) { #region
var _path = getInputData(0);
return struct_has(_path, "getBoundary")? _path.getBoundary(ind) : new BoundingBox(0, 0, 1, 1);
}
} #endregion
static getPointRatio = function(_rat, ind = 0, out = undefined) {
static getPointRatio = function(_rat, ind = 0, out = undefined) { #region
if(out == undefined) out = new __vec2(); else { out.x = 0; out.y = 0; }
var _path = getInputData(0);
if(!is_struct(_path) || !struct_has(_path, "getPointRatio"))
return out;
return _path.getPointRatio(1 - _rat, ind, out);
}
} #endregion
static getPointDistance = function(_dist, ind = 0, out = undefined) { return getPointRatio(_dist / getLength(), ind, out); }
static update = function() {
static update = function() { #region
outputs[| 0].setValue(self);
}
} #endregion
static onDrawNode = function(xx, yy, _mx, _my, _s, _hover, _focus) {
static onDrawNode = function(xx, yy, _mx, _my, _s, _hover, _focus) { #region
var bbox = drawGetBbox(xx, yy, _s);
draw_sprite_fit(s_node_path_trim, 0, bbox.xc, bbox.yc, bbox.w, bbox.h);
}
} #endregion
}

View file

@ -1,7 +1,6 @@
function Node_Path_Sample(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) constructor {
name = "Sample Path";
w = 96;
name = "Sample Path";
w = 96;
inputs[| 0] = nodeValue("Path", self, JUNCTION_CONNECT.input, VALUE_TYPE.pathnode, noone)
.setVisible(true, true);
@ -16,7 +15,24 @@ function Node_Path_Sample(_x, _y, _group = noone) : Node_Processor(_x, _y, _grou
outputs[| 1] = nodeValue("Direction", self, JUNCTION_CONNECT.output, VALUE_TYPE.float, 0);
static processData = function(_output, _data, _output_index, _array_index = 0) {
static drawOverlay = function(active, _x, _y, _s, _mx, _my, _snx, _sny) { #region
var _path = getInputData(0);
if(_path) _path.drawOverlay(active, _x, _y, _s, _mx, _my, _snx, _sny);
var _pnt = outputs[| 0].getValue();
if(process_amount == 1) _pnt = [ _pnt ];
draw_set_color(COLORS._main_accent);
for( var i = 0, n = array_length(_pnt); i < n; i++ ) {
var _p = _pnt[i];
var _px = _x + _p[0] * _s;
var _py = _y + _p[1] * _s;
draw_circle(_px, _py, 4, false);
}
} #endregion
static processData = function(_output, _data, _output_index, _array_index = 0) { #region
var _path = _data[0];
var _rat = _data[1];
var _mod = _data[2];
@ -54,10 +70,10 @@ function Node_Path_Sample(_x, _y, _group = noone) : Node_Processor(_x, _y, _grou
var dir = inv? p1.directionTo(p0) : p0.directionTo(p1);
return dir;
}
}
} #endregion
static onDrawNode = function(xx, yy, _mx, _my, _s, _hover, _focus) {
static onDrawNode = function(xx, yy, _mx, _my, _s, _hover, _focus) { #region
var bbox = drawGetBbox(xx, yy, _s);
draw_sprite_fit(THEME.node_draw_path, 0, bbox.xc, bbox.yc, bbox.w, bbox.h);
}
} #endregion
}

View file

@ -10,27 +10,53 @@ function Node_Path_Shift(_x, _y, _group = noone) : Node(_x, _y, _group) construc
outputs[| 0] = nodeValue("Path", self, JUNCTION_CONNECT.output, VALUE_TYPE.pathnode, self);
static getLineCount = function() {
static drawOverlay = function(active, _x, _y, _s, _mx, _my, _snx, _sny) { #region
var _path = getInputData(0);
if(_path) _path.drawOverlay(active, _x, _y, _s, _mx, _my, _snx, _sny);
draw_set_color(COLORS._main_icon);
var _amo = getLineCount();
for( var i = 0; i < _amo; i++ ) {
var _len = getLength(_amo);
var _stp = 1 / clamp(_len * _s, 1, 64);
var ox, oy, nx, ny;
var _p = new __vec2();
for( var j = 0; j < 1; j += _stp ) {
_p = getPointRatio(j, i, _p);
nx = _x + _p.x * _s;
ny = _y + _p.y * _s;
if(j > 0) draw_line_width(ox, oy, nx, ny, 3);
ox = nx;
oy = ny;
}
}
} #endregion
static getLineCount = function() { #region
var _path = getInputData(0);
return struct_has(_path, "getLineCount")? _path.getLineCount() : 1;
}
} #endregion
static getSegmentCount = function(ind = 0) {
static getSegmentCount = function(ind = 0) { #region
var _path = getInputData(0);
return struct_has(_path, "getSegmentCount")? _path.getSegmentCount(ind) : 0;
}
} #endregion
static getLength = function(ind = 0) {
static getLength = function(ind = 0) { #region
var _path = getInputData(0);
return struct_has(_path, "getLength")? _path.getLength(ind) : 0;
}
} #endregion
static getAccuLength = function(ind = 0) {
static getAccuLength = function(ind = 0) { #region
var _path = getInputData(0);
return struct_has(_path, "getAccuLength")? _path.getAccuLength(ind) : [];
}
} #endregion
static getPointRatio = function(_rat, ind = 0, out = undefined) {
static getPointRatio = function(_rat, ind = 0, out = undefined) { #region
if(out == undefined) out = new __vec2(); else { out.x = 0; out.y = 0; }
var _path = getInputData(0);
@ -54,21 +80,21 @@ function Node_Path_Shift(_x, _y, _group = noone) : Node(_x, _y, _group) construc
out.y += _p.y + lengthdir_y(_shf, dir);
return out;
}
} #endregion
static getPointDistance = function(_dist, ind = 0, out = undefined) { return getPointRatio(_dist / getLength(), ind, out); }
static getBoundary = function(ind = 0) {
static getBoundary = function(ind = 0) { #region
var _path = getInputData(0);
return struct_has(_path, "getBoundary")? _path.getBoundary(ind) : new BoundingBox( 0, 0, 1, 1 );
}
} #endregion
static update = function() {
static update = function() { #region
outputs[| 0].setValue(self);
}
} #endregion
static onDrawNode = function(xx, yy, _mx, _my, _s, _hover, _focus) {
static onDrawNode = function(xx, yy, _mx, _my, _s, _hover, _focus) { #region
var bbox = drawGetBbox(xx, yy, _s);
draw_sprite_fit(s_node_path_shift, 0, bbox.xc, bbox.yc, bbox.w, bbox.h);
}
} #endregion
}

View file

@ -1,7 +1,6 @@
function Node_Path_Trim(_x, _y, _group = noone) : Node(_x, _y, _group) constructor {
name = "Trim Path";
w = 96;
name = "Trim Path";
w = 96;
inputs[| 0] = nodeValue("Path", self, JUNCTION_CONNECT.input, VALUE_TYPE.pathnode, noone)
.setVisible(true, true);
@ -11,27 +10,53 @@ function Node_Path_Trim(_x, _y, _group = noone) : Node(_x, _y, _group) construct
outputs[| 0] = nodeValue("Path", self, JUNCTION_CONNECT.output, VALUE_TYPE.pathnode, self);
static getLineCount = function() {
static drawOverlay = function(active, _x, _y, _s, _mx, _my, _snx, _sny) { #region
var _path = getInputData(0);
if(_path) _path.drawOverlay(active, _x, _y, _s, _mx, _my, _snx, _sny);
draw_set_color(COLORS._main_icon);
var _amo = getLineCount();
for( var i = 0; i < _amo; i++ ) {
var _len = getLength(_amo);
var _stp = 1 / clamp(_len * _s, 1, 64);
var ox, oy, nx, ny;
var _p = new __vec2();
for( var j = 0; j < 1; j += _stp ) {
_p = getPointRatio(j, i, _p);
nx = _x + _p.x * _s;
ny = _y + _p.y * _s;
if(j > 0) draw_line_width(ox, oy, nx, ny, 3);
ox = nx;
oy = ny;
}
}
} #endregion
static getLineCount = function() { #region
var _path = getInputData(0);
return struct_has(_path, "getLineCount")? _path.getLineCount() : 1;
}
} #endregion
static getSegmentCount = function(ind = 0) {
static getSegmentCount = function(ind = 0) { #region
var _path = getInputData(0);
return struct_has(_path, "getSegmentCount")? _path.getSegmentCount(ind) : 0;
}
} #endregion
static getLength = function(ind = 0) {
static getLength = function(ind = 0) { #region
var _path = getInputData(0);
return struct_has(_path, "getLength")? _path.getLength(ind) : 0;
}
} #endregion
static getAccuLength = function(ind = 0) {
static getAccuLength = function(ind = 0) { #region
var _path = getInputData(0);
return struct_has(_path, "getAccuLength")? _path.getAccuLength(ind) : [];
}
} #endregion
static getPointRatio = function(_rat, ind = 0, out = undefined) {
static getPointRatio = function(_rat, ind = 0, out = undefined) { #region
if(out == undefined) out = new __vec2(); else { out.x = 0; out.y = 0; }
var _path = getInputData(0);
@ -47,21 +72,21 @@ function Node_Path_Trim(_x, _y, _group = noone) : Node(_x, _y, _group) construct
_rat = _rng[0] + _rat * (_rng[1] - _rng[0]);
return _path.getPointRatio(_rat, ind, out);
}
} #endregion
static getPointDistance = function(_dist, ind = 0, out = undefined) { return getPointRatio(_dist / getLength(), ind, out); }
static getBoundary = function(ind = 0) {
static getBoundary = function(ind = 0) { #region
var _path = getInputData(0);
return struct_has(_path, "getBoundary")? _path.getBoundary(ind) : new BoundingBox( 0, 0, 1, 1 );
}
} #endregion
static update = function() {
static update = function() { #region
outputs[| 0].setValue(self);
}
} #endregion
static onDrawNode = function(xx, yy, _mx, _my, _s, _hover, _focus) {
var bbox = drawGetBbox(xx, yy, _s);
draw_sprite_fit(s_node_path_trim, 0, bbox.xc, bbox.yc, bbox.w, bbox.h);
}
} #endregion
}

View file

@ -1,69 +1,142 @@
function Node_Path_Wave(_x, _y, _group = noone) : Node(_x, _y, _group) constructor {
name = "Wave Path";
w = 96;
name = "Wave Path";
w = 96;
inputs[| 0] = nodeValue("Path", self, JUNCTION_CONNECT.input, VALUE_TYPE.pathnode, noone)
.setVisible(true, true);
inputs[| 1] = nodeValue("Frequency", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 4);
inputs[| 1] = nodeValue("Frequency", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, [ 4, 4 ])
.setDisplay(VALUE_DISPLAY.range, { linked : true });
inputs[| 2] = nodeValue("Size", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 4);
inputs[| 2] = nodeValue("Amplitude", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, [ 4, 4 ])
.setDisplay(VALUE_DISPLAY.range, { linked : true });
inputs[| 3] = nodeValue("Shift", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 0);
inputs[| 3] = nodeValue("Shift", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, [ 0, 0 ])
.setDisplay(VALUE_DISPLAY.range, { linked : true });
inputs[| 4] = nodeValue("Smooth", self, JUNCTION_CONNECT.input, VALUE_TYPE.boolean, false);
inputs[| 5] = nodeValue("Seed", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, seed_random());
inputs[| 6] = nodeValue("Wiggle", self, JUNCTION_CONNECT.input, VALUE_TYPE.boolean, false);
inputs[| 7] = nodeValue("Wiggle Amplitude", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, [ -2, 2 ])
.setDisplay(VALUE_DISPLAY.range, { linked : true });
inputs[| 8] = nodeValue("Wiggle Frequency", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 8);
inputs[| 9] = nodeValue("Amplitude over length", self, JUNCTION_CONNECT.input, VALUE_TYPE.curve, CURVE_DEF_11);
outputs[| 0] = nodeValue("Path", self, JUNCTION_CONNECT.output, VALUE_TYPE.pathnode, self);
input_display_list = [
input_display_list = [ 5,
["Path", true], 0,
["Wave", false], 1, 2, 3, 4,
]
["Wave", false], 1, 2, 9, 3, 4,
["Wiggle", true, 6], 7, 8,
];
static getLineCount = function() {
var _path = getInputData(0);
return struct_has(_path, "getLineCount")? _path.getLineCount() : 1;
}
path = 0;
fre = 0;
amp = 0;
shf = 0;
smt = 0;
seed = 0;
static getSegmentCount = function(ind = 0) {
var _path = getInputData(0);
return struct_has(_path, "getSegmentCount")? _path.getSegmentCount(ind) : 0;
}
static getLength = function(ind = 0) {
var _path = getInputData(0);
var _fre = getInputData(1); _fre = max(1, abs(_fre));
var _amo = getInputData(2);
wig = 0
wigs = 0
wigf = 0
var _len = struct_has(_path, "getLength")? _path.getLength(ind) : 0;
_len *= _fre * sqrt(_amo + 1 / _fre);
wig_map = noone;
amp_curve = noone;
p0 = new __vec2();
p = new __vec2();
p1 = new __vec2();
static drawOverlay = function(active, _x, _y, _s, _mx, _my, _snx, _sny) { #region
var _path = getInputData(0);
if(_path) _path.drawOverlay(active, _x, _y, _s, _mx, _my, _snx, _sny);
draw_set_color(COLORS._main_icon);
var _amo = getLineCount();
for( var i = 0; i < _amo; i++ ) {
var _len = getLength(i);
var _stp = 1 / clamp(_len * _s, 1, 64);
var ox, oy, nx, ny;
var _p = new __vec2();
for( var j = 0; j < 1; j += _stp ) {
_p = getPointRatio(j, i, _p);
nx = _x + _p.x * _s;
ny = _y + _p.y * _s;
if(j > 0) draw_line_width(ox, oy, nx, ny, 3);
ox = nx;
oy = ny;
}
}
} #endregion
static getLineCount = function() { #region
return struct_has(path, "getLineCount")? path.getLineCount() : 1;
} #endregion
static getSegmentCount = function(ind = 0) { #region
return struct_has(path, "getSegmentCount")? path.getSegmentCount(ind) : 0;
} #endregion
static getLength = function(ind = 0) { #region
var _fre = fre ; _fre = max(_fre[0], _fre[1]);
var _amo = amp ; _amo = max(_amo[0], _amo[1]);
_fre = max(1, abs(_fre));
var _len = struct_has(path, "getLength")? path.getLength(ind) : 0;
_len *= _fre * sqrt(abs(_amo) + 1 / _fre);
return _len;
}
} #endregion
static getAccuLength = function(ind = 0) {
var _path = getInputData(0);
var _fre = getInputData(1); _fre = max(1, abs(_fre));
var _amo = getInputData(2);
static getAccuLength = function(ind = 0) { #region
var _fre = fre ; _fre = max(_fre[0], _fre[1]);
var _amo = amp ; _amo = max(_amo[0], _amo[1]);
var _len = struct_has(_path, "getAccuLength")? _path.getAccuLength(ind) : [];
var _mul = _fre * sqrt(_amo + 1 / _fre);
_fre = max(1, abs(_fre));
var _len = struct_has(path, "getAccuLength")? path.getAccuLength(ind) : [];
var _mul = _fre * sqrt(abs(_amo) + 1 / _fre);
for( var i = 0, n = array_length(_len); i < n; i++ )
_len[i] *= _mul;
return _len;
}
} #endregion
static getPointRatio = function(_rat, ind = 0, out = undefined) {
static getPointRatio = function(_rat, ind = 0, out = undefined) { #region
if(out == undefined) out = new __vec2(); else { out.x = 0; out.y = 0; }
var _path = getInputData(0);
var _fre = getInputData(1); _fre = max(0.01, abs(_fre));
var _amo = getInputData(2);
var _shf = getInputData(3);
var _smt = getInputData(4);
var _path = path;
var _fre = fre ;
var _amp = amp ;
var _shf = shf ;
var _smt = smt ;
var _seed = seed + ind;
var _wig = wig ;
var _wigs = wigs;
var _wigf = wigf;
_amp = random_range_seed(_amp[0], _amp[1], _seed + ind);
_shf = random_range_seed(_shf[0], _shf[1], _seed + 1 + ind);
_fre = random_range_seed(_fre[0], _fre[1], _seed + 2 + ind);
_fre = max(0.01, abs(_fre));
var _t = _shf + _rat * _fre;
if(_wig) {
var _w = wiggle(_wigs[0], _wigs[1], _wigf, _t, _seed);
_amp += _w;
}
if(is_array(_path)) {
_path = array_safe_get(_path, ind);
@ -73,35 +146,51 @@ function Node_Path_Wave(_x, _y, _group = noone) : Node(_x, _y, _group) construct
if(!is_struct(_path) || !struct_has(_path, "getPointRatio"))
return out;
var _p0 = _path.getPointRatio(clamp(_rat - 0.001, 0, 0.999999), ind);
var _p = _path.getPointRatio(_rat, ind).clone();
var _p1 = _path.getPointRatio(clamp(_rat + 0.001, 0, 0.999999), ind);
p0 = _path.getPointRatio(clamp(_rat - 0.001, 0, 0.999999), ind, p0);
p = _path.getPointRatio(_rat, ind, p);
p1 = _path.getPointRatio(clamp(_rat + 0.001, 0, 0.999999), ind, p1);
var dir = point_direction(_p0.x, _p0.y, _p1.x, _p1.y) + 90;
var dir = point_direction(p0.x, p0.y, p1.x, p1.y) + 90;
var prg;
if(_smt) prg = cos((_shf + _rat * _fre) * pi * 2);
else prg = (abs(frac(_shf + _rat * _fre) * 2 - 1) - 0.5) * 2;
if(_smt) prg = cos(_t * pi * 2);
else prg = (abs(frac(_t) * 2 - 1) - 0.5) * 2;
out.x = _p.x + lengthdir_x(prg * _amo, dir);
out.y = _p.y + lengthdir_y(prg * _amo, dir);
if(amp_curve) prg *= amp_curve.get(_rat);
out.x = p.x + lengthdir_x(_amp * prg, dir);
out.y = p.y + lengthdir_y(_amp * prg, dir);
return out;
}
} #endregion
static getPointDistance = function(_dist, ind = 0, out = undefined) { return getPointRatio(_dist / getLength(), ind, out); }
static getBoundary = function(ind = 0) {
var _path = getInputData(0);
return struct_has(_path, "getBoundary")? _path.getBoundary(ind) : new BoundingBox( 0, 0, 1, 1 );
}
static getBoundary = function(ind = 0) { #region
return struct_has(path, "getBoundary")? path.getBoundary(ind) : new BoundingBox( 0, 0, 1, 1 );
} #endregion
static update = function() {
static update = function() { #region
path = getInputData(0);
fre = getInputData(1);
amp = getInputData(2);
shf = getInputData(3);
smt = getInputData(4);
seed = getInputData(5);
wig = getInputData(6);
wigs = getInputData(7);
wigf = getInputData(8);
var _ampc = getInputData(9);
amp_curve = new curveMap(_ampc, 128);
outputs[| 0].setValue(self);
}
} #endregion
static onDrawNode = function(xx, yy, _mx, _my, _s, _hover, _focus) {
static onDrawNode = function(xx, yy, _mx, _my, _s, _hover, _focus) { #region
var bbox = drawGetBbox(xx, yy, _s);
draw_sprite_fit(s_node_path_wave, 0, bbox.xc, bbox.yc, bbox.w, bbox.h);
}
} #endregion
}

View file

@ -59,11 +59,14 @@ function Node_Shape(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) con
inputs[| 18] = nodeValue("Tile", self, JUNCTION_CONNECT.input, VALUE_TYPE.boolean, false);
inputs[| 19] = nodeValue("Shape Rotation", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 0)
.setDisplay(VALUE_DISPLAY.rotation);
outputs[| 0] = nodeValue("Surface out", self, JUNCTION_CONNECT.output, VALUE_TYPE.surface, noone);
input_display_list = [
["Output", false], 0, 6,
["Transform", false], 15, 3, 16, 17,
["Transform", false], 15, 3, 16, 17, 19,
["Shape", false], 14, 2, 9, 4, 13, 5, 7, 8,
["Render", true], 10, 12, 18,
["Background", true, 1], 11,
@ -105,6 +108,7 @@ function Node_Shape(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) con
var _posTyp = _data[15];
var _tile = _data[18];
var _rotat = _data[19];
var _center = [ 0, 0 ];
var _scale = [ 0, 0 ];
@ -275,7 +279,7 @@ function Node_Shape(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) con
break;
case NODE_SHAPE_TYPE.crescent :
inputs[| 5].setVisible(true);
inputs[| 7].setVisible(true);
inputs[| 7].setVisible(true);
inputs[| 13].setVisible(true);
inputs[| 5].name = "Shift";
@ -304,6 +308,7 @@ function Node_Shape(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) con
shader_set_f("center", _center);
shader_set_f("scale", _scale );
shader_set_f("rotation", degtorad(_rotat));
draw_sprite_stretched_ext(s_fx_pixel, 0, 0, 0, _dim[0], _dim[1], _color, _color_get_alpha(_color));
surface_reset_shader();

View file

@ -702,21 +702,8 @@ function Panel_Inspector() : PanelContent() constructor {
}
#region color picker
//if(color_picker_selecting == noone)
// picker_selecting = 0;
if(key_mod_press(ALT) && color_picker_index) {
if(key_mod_press(ALT) && color_picker_index && textBox_slider.tb == noone) {
pickers[picker_index].editWidget.onColorPick();
//var _p = picker_index;
//if(mouse_wheel_down()) picker_index = safe_mod(picker_index + 1 + color_picker_index, color_picker_index);
//if(mouse_wheel_up()) picker_index = safe_mod(picker_index - 1 + color_picker_index, color_picker_index);
//if(_p != picker_index) {
// instance_destroy(o_dialog_color_selector);
// pickers[picker_index].editWidget.onColorPick();
//}
}
if(MESSAGE != noone && MESSAGE.type == "Color") {

View file

@ -121,23 +121,26 @@ function wiggleMap(_seed, _freq, _length) constructor { #region
len = _length;
amp = 1;
map = array_create(_length);
shf = 0;
static generate = function() {
INLINE
for(var i = 0; i < len; i++) map[i] = wiggle(-1, 1, freq, i, seed);
for(var i = 0; i < len; i++) map[i] = wiggle(-1, 1, freq, i + shf, seed);
}
static check = function(_amp, _freq, _seed) {
static check = function(_amp, _freq, _seed, _shf = 0) {
INLINE
amp = _amp;
if(seed == _seed && freq == _freq) return;
if(seed == _seed && freq == _freq && shf == _shf) return;
//print($"Check {seed}:{_seed}, {freq}:{_freq} ({irandom(999999)})");
seed = _seed;
freq = _freq;
shf = _shf;
generate();
return self;
}
static get = function(i) {

View file

@ -10,6 +10,7 @@ uniform int sides;
uniform int drawDF;
uniform int tile;
uniform float rotation;
uniform float angle;
uniform float inner;
uniform float outer;
@ -125,14 +126,14 @@ float sdDonut(vec2 p, float s) { #region
void main() {
float color = 0.;
vec2 coord = (v_vTexcoord - center) / scale;
vec2 coord = (v_vTexcoord - center) * mat2(cos(rotation), -sin(rotation), sin(rotation), cos(rotation)) / scale;
vec2 ratio = dimension / dimension.y;
float d;
if(tile == 1) coord = mod(coord + 1., 2.) - 1.;
if(shape == 0) {
d = sdBox( (v_vTexcoord - center) * ratio, (scale * ratio - corner));
d = sdBox( (v_vTexcoord - center) * mat2(cos(rotation), -sin(rotation), sin(rotation), cos(rotation)) * ratio, (scale * ratio - corner));
d -= corner;
} else if(shape == 1) {
d = length(coord) - 1.;