Pixel-Composer/scripts/__path/__path.gml
2024-01-23 17:01:19 +07:00

97 lines
No EOL
2.4 KiB
Text

function Path() constructor {
lengthTotal = 0;
lengths = [];
lengthAccs = [];
boundary = new BoundingBox();
loop = false;
static getBoundary = function() { return boundary; }
static getAccuLength = function() { return lengthAccs; }
static getLength = function() { return lengthTotal; }
static getSegmentCount = function() { return 1; }
static getLineCount = function() { return 1; }
static getTangentRatio = function(_rat) { return 0; }
static getPointDistance = function(_seg, _ind = 0, out = undefined) { return new __vec2(0, 0); }
static getPointRatio = function(_rat, _ind = 0, out = undefined) {
var pix = frac(_rat) * lengthTotal;
return getPointDistance(pix, _ind, out);
}
}
function PathSegment() : Path() constructor {
segments = [];
static getBoundary = function() {
if(getSegmentCount() == 0) return new BoundingBox( 0, 0, 0, 0 );
var minx = segments[0].x, maxx = segments[0].x;
var miny = segments[0].y, maxy = segments[0].y;
for( var i = 0, n = array_length(segments); i < n; i++ ) {
var s = segments[i];
minx = min(minx, s.x);
maxx = max(maxx, s.x);
miny = min(miny, s.y);
maxy = max(maxy, s.y);
}
return new BoundingBox( minx, miny, maxx, maxy );
}
static getSegmentCount = function() { return array_length(segments); }
static getLineCount = function() { return 1; }
static setSegment = function(segment) {
self.segments = segment;
lengths = [];
lengthAccs = [];
lengthTotal = 0;
var op, np;
for( var i = 0, n = array_length(segment); i < n; i++ ) {
np = segment[i];
if(i) {
lengths[i] = point_distance(op.x, op.y, np.x, np.y);
lengthTotal += lengths[i];
lengthAccs[i] = lengthTotal;
}
op = np;
}
}
static getPointDistance = function(_dist) {
for( var i = 1; i < array_length(lengths); i += 1 ) {
if(_dist <= lengths[i]) {
var rat = _dist / lengths[i];
return segments[i - 1].lerpTo(segments[i], rat);
}
_dist -= lengths[i];
}
return new __vec2(0, 0);
}
static getPointRatio = function(_rat) {
return getPointDistance(frac(_rat) * lengthTotal);
}
static getTangentRatio = function(_rat) {
_rat = frac(_rat);
var l = _rat * lengthTotal;
for( var i = 1; i < array_length(lengths); i += 1 ) {
if(l <= lengths[i]) {
var rat = l / lengths[i];
return segments[i - 1].directionTo(segments[i]);
}
l -= lengths[i];
}
return 0;
}
}