Pixel-Composer/scripts/__path/__path.gml
2023-04-09 21:24:16 +02:00

102 lines
No EOL
2.5 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) { return new Point(0, 0); }
static getPointSegment = function(_seg) { return new Point(0, 0); }
static getPointRatio = function(_rat) { return new Point(0, 0); }
}
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; i < array_length(segments); 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; i < array_length(segment); 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 Point(0, 0);
}
static getPointSegment = function(_seg) {
var fr = (floor(_seg)) % getSegmentCount();
var to = (fr + 1) % getSegmentCount();
var st = frac(_seg);
return segments[fr].lerpTo(to, st);
}
static getPointRatio = function(_rat) {
return getPointSegment(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;
}
}