private static generateNode()

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;
        }