in libs/game/animation.ts [39:155]
private static generateNode(p0: Point, command: string, args: number[], metadata: [ Point, PathNode ]): PathNode {
const [ pathStart, lastNode ] = metadata;
let node: PathNode;
switch (command) {
case "M": { // M x y
const p1 = new Point(args[0], args[1]);
node = new MoveTo(p1);
break;
}
case "m": { // m dx dy
const p1 = new Point(p0.x + args[0], p0.y + args[1]);
node = new MoveTo(p1);
break;
}
case "L": { // L x y
const p1 = new Point(args[0], args[1]);
node = new LineTo(p0, p1);
break;
}
case "l": { // l dx dy
const p1 = new Point(p0.x + args[0], p0.y + args[1]);
node = new LineTo(p0, p1);
break;
}
case "H": { // H x
const p1 = new Point(args[0], p0.y);
node = new LineTo(p0, p1);
break;
}
case "h": { // h dx
const p1 = new Point(p0.x + args[0], p0.y);
node = new LineTo(p0, p1);
break;
}
case "V": { // V y
const p1 = new Point(p0.x, args[0]);
node = new LineTo(p0, p1);
break;
}
case "v": { // v dy
const p1 = new Point(p0.x, p0.y + args[0]);
node = new LineTo(p0, p1);
break;
}
case "Q": { // Q x1 y1 x2 y2
const p1 = new Point(args[0], args[1]);
const p2 = new Point(args[2], args[3]);
node = new QuadraticCurveTo(p0, p1, p2);
break;
}
case "q": { // q dx1 dy1 dx2 dy2
const p1 = new Point(p0.x + args[0], p0.y + args[1]);
const p2 = new Point(p0.x + args[2], p0.y + args[3]);
node = new QuadraticCurveTo(p0, p1, p2);
break;
}
case "T": { // T x2 y2
let lastControlPoint: Point = lastNode.getLastControlPoint();
if (!lastControlPoint) break;
const p1 = new Point(p0.x + (p0.x - lastControlPoint.x), p0.y + (p0.y - lastControlPoint.y));
const p2 = new Point(args[0], args[1]);
node = new QuadraticCurveTo(p0, p1, p2);
break;
}
case "t": { // t dx2 dy2
let lastControlPoint: Point = lastNode.getLastControlPoint();
if (!lastControlPoint) break;
const p1 = new Point(p0.x + (p0.x - lastControlPoint.x), p0.y + (p0.y - lastControlPoint.y));
const p2 = new Point(p0.x + args[0], p0.y + args[1]);
node = new QuadraticCurveTo(p0, p1, p2);
break;
}
case "C": { // C x1 y1 x2 y2 x3 y3
const p1 = new Point(args[0], args[1]);
const p2 = new Point(args[2], args[3]);
const p3 = new Point(args[4], args[5]);
node = new CubicCurveTo(p0, p1, p2, p3);
break;
}
case "c": { // c dx1 dy1 dx2 dy2 dx3 dy3
const p1 = new Point(p0.x + args[0], p0.y + args[1]);
const p2 = new Point(p0.x + args[2], p0.y + args[3]);
const p3 = new Point(p0.x + args[4], p0.y + args[5]);
node = new CubicCurveTo(p0, p1, p2, p3);
break;
}
case "S": { // S x2 y2 x3 y3
let lastControlPoint: Point = lastNode.getLastControlPoint();
if (!lastControlPoint) break;
const p1 = new Point(p0.x + (p0.x - lastControlPoint.x), p0.y + (p0.y - lastControlPoint.y));
const p2 = new Point(args[0], args[1]);
const p3 = new Point(args[2], args[3]);
node = new CubicCurveTo(p0, p1, p2, p3);
break;
}
case "s": { // s dx2 dy2 dx3 dy3
let lastControlPoint: Point = lastNode.getLastControlPoint();
if (!lastControlPoint) break;
const p1 = new Point(p0.x + (p0.x - lastControlPoint.x), p0.y + (p0.y - lastControlPoint.y));
const p2 = new Point(p0.x + args[0], p0.y + args[1]);
const p3 = new Point(p0.x + args[2], p0.y + args[3]);
node = new CubicCurveTo(p0, p1, p2, p3);
break;
}
case "Z": // Z
case "z": { // z
node = new LineTo(p0, pathStart);
break;
}
}
return node;
}