mirror of
https://github.com/Ttanasart-pt/Pixel-Composer.git
synced 2024-11-10 20:45:35 +01:00
path mask bigs
This commit is contained in:
parent
fd70ca9292
commit
35cf8d023c
@ -104,6 +104,8 @@ function Node_Line(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) cons
|
||||
y1 = _y + y1 * _s;
|
||||
|
||||
draw_line(x0, y0, x1, y1);
|
||||
|
||||
draw_circle(x0, y0, 4, false);
|
||||
}
|
||||
}
|
||||
} #endregion
|
||||
@ -230,8 +232,7 @@ function Node_Line(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) cons
|
||||
var _prog_next = 0;
|
||||
var _prog = _prog_curr + 1; //Record previous position to delete from _total
|
||||
var _prog_total = 0; //Record the distance the pointer has moved so far
|
||||
var points = is_array(lines[i])? lines[i] : [];
|
||||
var pointArrLen = array_length(points);
|
||||
var points = [];
|
||||
var pointAmo = 0;
|
||||
var wght;
|
||||
var _pathPng;
|
||||
@ -296,6 +297,7 @@ function Node_Line(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) cons
|
||||
|
||||
_nx = p.x;
|
||||
_ny = p.y;
|
||||
// print($"{_nx}, {_ny}");
|
||||
|
||||
if(_total < _pathEnd) { //Do not wiggle the last point.
|
||||
var _d = point_direction(_ox, _oy, _nx, _ny);
|
||||
@ -304,26 +306,13 @@ function Node_Line(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) cons
|
||||
}
|
||||
|
||||
if(_prog_total >= _pathStr) { //Do not add point before range start. Do this instead of starting at _rtStr to prevent wiggle.
|
||||
var _pntData;
|
||||
if(pointAmo < pointArrLen && is_struct(points[pointAmo])) {
|
||||
_pntData = points[pointAmo];
|
||||
_pntData.x = _nx;
|
||||
_pntData.y = _ny;
|
||||
_pntData.prog = (_prog_total - _pathStr) / (_pathEnd - _pathStr);
|
||||
_pntData.progCrop = _prog_curr / _pathLength;
|
||||
_pntData.weight = wght;
|
||||
} else {
|
||||
_pntData = {
|
||||
x: _nx,
|
||||
y: _ny,
|
||||
prog: (_prog_total - _pathStr) / (_pathEnd - _pathStr),
|
||||
progCrop: _prog_curr / _pathLength,
|
||||
weight: wght
|
||||
}
|
||||
points[pointAmo] = _pntData;
|
||||
}
|
||||
|
||||
pointAmo++;
|
||||
points[pointAmo++] = {
|
||||
x: _nx,
|
||||
y: _ny,
|
||||
prog: (_prog_total - _pathStr) / (_pathEnd - _pathStr),
|
||||
progCrop: _prog_curr / _pathLength,
|
||||
weight: wght
|
||||
}
|
||||
}
|
||||
|
||||
if(_total <= 0) break;
|
||||
@ -346,6 +335,7 @@ function Node_Line(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) cons
|
||||
}
|
||||
|
||||
array_resize(points, pointAmo);
|
||||
|
||||
lines[_lineAmo++] = points;
|
||||
}
|
||||
|
||||
|
@ -27,37 +27,45 @@ function Node_Path_From_Mask(_x, _y, _group = noone) : Node(_x, _y, _group) cons
|
||||
static getSegmentCount = function() { return 1; }
|
||||
static getLineCount = function() { return 1; }
|
||||
|
||||
static getPointDistance = function(_seg, _ind = 0, out = undefined) { #region
|
||||
static getPointDistance = function(_dist, _ind = 0, out = undefined) { #region
|
||||
if(out == undefined) out = new __vec2(); else { out.x = 0; out.y = 0; }
|
||||
|
||||
var _cKey = $"{_seg},{_ind}";
|
||||
var _cKey = $"{_dist},{_ind}";
|
||||
if(ds_map_exists(cached_pos, _cKey)) {
|
||||
var _p = cached_pos[? _cKey];
|
||||
out.x = _p.x;
|
||||
out.y = _p.y;
|
||||
|
||||
// print($"Getting cache {_cKey} : {_dist} > {out}");
|
||||
return out;
|
||||
}
|
||||
|
||||
var _aid = 0;
|
||||
var _dst = _seg;
|
||||
var _dst = _dist;
|
||||
|
||||
for( var i = 0, n = array_length(lengthAccs); i < n; i++ ) {
|
||||
if(_seg == lengthAccs[i]) {
|
||||
out.x = anchors[i][0];
|
||||
out.y = anchors[i][1];
|
||||
if(_dist == lengthAccs[i]) {
|
||||
out.x = anchors[i + 1][0];
|
||||
out.y = anchors[i + 1][1];
|
||||
|
||||
return out;
|
||||
}
|
||||
|
||||
if(_seg < lengthAccs[i]) {
|
||||
if(_dist < lengthAccs[i]) {
|
||||
_aid = i;
|
||||
if(i) _dst = _seg - lengthAccs[i - 1];
|
||||
if(i) _dst = _dist - lengthAccs[i - 1];
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
out.x = lerp(anchors[i][0], anchors[i + 1][0], _dst / lengths[_aid]);
|
||||
out.y = lerp(anchors[i][1], anchors[i + 1][1], _dst / lengths[_aid]);
|
||||
var _a0 = anchors[i];
|
||||
var _a1 = anchors[i + 1];
|
||||
var _rat = _dst / lengths[_aid];
|
||||
|
||||
out.x = lerp(_a0[0], _a1[0], _rat);
|
||||
out.y = lerp(_a0[1], _a1[1], _rat);
|
||||
|
||||
// print($"Getting position {_cKey} : {_dist} - {i} > {out}");
|
||||
|
||||
cached_pos[? _cKey] = out.clone();
|
||||
|
||||
@ -99,43 +107,44 @@ function Node_Path_From_Mask(_x, _y, _group = noone) : Node(_x, _y, _group) cons
|
||||
anchors = [];
|
||||
if(!is_surface(_surf)) return;
|
||||
|
||||
var _dim = surface_get_dimension(_surf);
|
||||
var _sca = min(1, attributes.maximum_dim / _dim[0], attributes.maximum_dim / _dim[1]);
|
||||
_dim[0] *= _sca;
|
||||
_dim[1] *= _sca;
|
||||
|
||||
temp_surface[0] = surface_verify(temp_surface[0], _dim[0], _dim[1]);
|
||||
|
||||
surface_set_shader(temp_surface[0], sh_image_trace);
|
||||
shader_set_f("dimension", _dim);
|
||||
draw_surface_stretched(_surf, 0, 0, _dim[0], _dim[1]);
|
||||
surface_reset_shader();
|
||||
|
||||
var _w = _dim[0], _h = _dim[1];
|
||||
var _x = 0, _y = 0;
|
||||
|
||||
var _buff = buffer_from_surface(temp_surface[0], false);
|
||||
var _emp = true;
|
||||
var _ind = 0;
|
||||
|
||||
buffer_seek(_buff, buffer_seek_start, 0);
|
||||
repeat(_w * _h) {
|
||||
var _b = buffer_read(_buff, buffer_u32);
|
||||
if(_b > 0) {
|
||||
_emp = false;
|
||||
_x = _ind % _w;
|
||||
_y = floor(_ind / _w);
|
||||
break;
|
||||
#region content extract
|
||||
var _dim = surface_get_dimension(_surf);
|
||||
var _sca = min(1, attributes.maximum_dim / _dim[0], attributes.maximum_dim / _dim[1]);
|
||||
_dim[0] *= _sca;
|
||||
_dim[1] *= _sca;
|
||||
|
||||
temp_surface[0] = surface_verify(temp_surface[0], _dim[0], _dim[1]);
|
||||
|
||||
surface_set_shader(temp_surface[0], sh_image_trace);
|
||||
shader_set_f("dimension", _dim);
|
||||
draw_surface_stretched(_surf, 0, 0, _dim[0], _dim[1]);
|
||||
surface_reset_shader();
|
||||
|
||||
var _w = _dim[0], _h = _dim[1];
|
||||
var _x = 0, _y = 0;
|
||||
|
||||
var _buff = buffer_from_surface(temp_surface[0], false);
|
||||
var _emp = true;
|
||||
var _ind = 0;
|
||||
|
||||
buffer_seek(_buff, buffer_seek_start, 0);
|
||||
repeat(_w * _h) {
|
||||
var _b = buffer_read(_buff, buffer_u32);
|
||||
if(_b > 0) {
|
||||
_emp = false;
|
||||
_x = _ind % _w;
|
||||
_y = floor(_ind / _w);
|
||||
break;
|
||||
}
|
||||
_ind++;
|
||||
}
|
||||
_ind++;
|
||||
}
|
||||
#endregion
|
||||
|
||||
if(_emp) { print("Empty surface"); return; }
|
||||
|
||||
var _sx = _x;
|
||||
var _sy = _y;
|
||||
var _px = _x;
|
||||
var _py = _y;
|
||||
var _sx = _x, _sy = _y;
|
||||
var _px = _x, _py = _y;
|
||||
var _nx = _x, _ny = _y;
|
||||
var _amo = _w * _h;
|
||||
var _rep = 0;
|
||||
|
||||
@ -144,8 +153,17 @@ function Node_Path_From_Mask(_x, _y, _group = noone) : Node(_x, _y, _group) cons
|
||||
|
||||
do {
|
||||
buffer_write_at(_buff, (_y * _w + _x) * 4, buffer_u32, 0);
|
||||
_a[_ind++] = _x / _sca + 0.5;
|
||||
_a[_ind++] = _y / _sca + 0.5;
|
||||
|
||||
_nx = _x / _sca + 0.5;
|
||||
_ny = _y / _sca + 0.5;
|
||||
|
||||
if(_ind == 0 || _px != _nx || _py != _ny) {
|
||||
_a[_ind++] = _nx;
|
||||
_a[_ind++] = _ny;
|
||||
}
|
||||
|
||||
_px = _nx;
|
||||
_py = _ny;
|
||||
|
||||
if(_x < _w - 1 && buffer_read_at(_buff, ((_y ) * _w + _x + 1) * 4, buffer_u32)) { _x++; }
|
||||
else if(_y < _h - 1 && buffer_read_at(_buff, ((_y + 1) * _w + _x ) * 4, buffer_u32)) { _y++; }
|
||||
@ -165,44 +183,44 @@ function Node_Path_From_Mask(_x, _y, _group = noone) : Node(_x, _y, _group) cons
|
||||
anchors = array_verify(anchors, _ind / 2);
|
||||
var _aind = 0;
|
||||
|
||||
var lx = _a[0];
|
||||
var ly = _a[1];
|
||||
var ox, oy, nx, ny;
|
||||
var ox, oy, cx, cy, nx, ny;
|
||||
var a0, a1;
|
||||
|
||||
for( var i = 0; i < _ind; i += 2 ) {
|
||||
nx = _a[i + 0];
|
||||
ny = _a[i + 1];
|
||||
var _aamo = _ind / 2;
|
||||
if(_aamo <= 2) return;
|
||||
|
||||
for( var i = 0; i < _aamo; i++ ) {
|
||||
ox = _a[(i - 1 + _aamo) % _aamo * 2 + 0];
|
||||
oy = _a[(i - 1 + _aamo) % _aamo * 2 + 1];
|
||||
cx = _a[i * 2 + 0];
|
||||
cy = _a[i * 2 + 1];
|
||||
nx = _a[(i + 1 + _aamo) % _aamo * 2 + 0];
|
||||
ny = _a[(i + 1 + _aamo) % _aamo * 2 + 1];
|
||||
|
||||
if(i) {
|
||||
var na = point_direction(ox, oy, nx, ny);
|
||||
var la = point_direction(lx, ly, nx, ny);
|
||||
|
||||
if(abs(angle_difference(na, la)) > _smt) {
|
||||
lx = ox;
|
||||
ly = oy;
|
||||
|
||||
anchors[_aind++] = [ ox, oy ];
|
||||
}
|
||||
}
|
||||
a0 = point_direction(ox, oy, cx, cy);
|
||||
a1 = point_direction(cx, cy, nx, ny);
|
||||
|
||||
if(abs(angle_difference(a0, a1)) > _smt)
|
||||
anchors[_aind++] = [ cx, cy ];
|
||||
|
||||
ox = nx;
|
||||
oy = ny;
|
||||
}
|
||||
|
||||
anchors[_aind++] = [ _a[0], _a[1] ];
|
||||
array_resize(anchors, _aind);
|
||||
|
||||
var _ancAmo = _aind;
|
||||
array_resize(anchors, _ancAmo);
|
||||
|
||||
var ox, oy, nx, ny;
|
||||
lengthTotal = 0;
|
||||
lengths = array_verify(lengths, (_ind / 2) - 1);
|
||||
lengthAccs = array_verify(lengthAccs, (_ind / 2) - 1);
|
||||
lengths = array_verify(lengths, _ancAmo - 1);
|
||||
lengthAccs = array_verify(lengthAccs, _ancAmo - 1);
|
||||
boundary = new BoundingBox();
|
||||
|
||||
var _lind = 0;
|
||||
|
||||
for( var i = 0; i < _ind; i += 2 ) {
|
||||
nx = _a[i + 0];
|
||||
ny = _a[i + 1];
|
||||
for( var i = 0; i < _ancAmo; i++ ) {
|
||||
nx = anchors[i][0];
|
||||
ny = anchors[i][1];
|
||||
|
||||
boundary.addPoint(nx, ny);
|
||||
|
||||
@ -218,6 +236,11 @@ function Node_Path_From_Mask(_x, _y, _group = noone) : Node(_x, _y, _group) cons
|
||||
ox = nx;
|
||||
oy = ny;
|
||||
}
|
||||
|
||||
// print($"\n=========== Path ===========");
|
||||
// print($"Anchors : {anchors}");
|
||||
// print($"Lengths : {lengths}");
|
||||
// print($"Len Accs : {lengthAccs}");
|
||||
} #endregion
|
||||
|
||||
static getGraphPreviewSurface = function() { return /*temp_surface[0]*/ getInputData(0); }
|
||||
|
Loading…
Reference in New Issue
Block a user