{"version":3,"file":"buildAdaptiveQuadratic.mjs","sources":["../../../../../src/scene/graphics/shared/buildCommands/buildAdaptiveQuadratic.ts"],"sourcesContent":["// thanks to https://github.com/mattdesl/adaptive-quadratic-curve\n// for the original code!\n\nimport { GraphicsContextSystem } from '../GraphicsContextSystem';\n\nconst RECURSION_LIMIT = 8;\nconst FLT_EPSILON = 1.19209290e-7;\nconst PATH_DISTANCE_EPSILON = 1.0;\n\nconst curveAngleToleranceEpsilon = 0.01;\nconst mAngleTolerance = 0;\n\nexport function buildAdaptiveQuadratic(\n    points: number[],\n    sX: number, sY: number,\n    cp1x: number, cp1y: number,\n    eX: number, eY: number,\n    smoothness?: number,\n)\n{\n    const scale = 1.0;\n    const smoothing = Math.min(\n        0.99, // a value of 1.0 actually inverts smoothing, so we cap it at 0.99\n        Math.max(0, smoothness ?? GraphicsContextSystem.defaultOptions.bezierSmoothness)\n    );\n    let distanceTolerance = (PATH_DISTANCE_EPSILON - smoothing) / scale;\n\n    distanceTolerance *= distanceTolerance;\n    begin(sX, sY, cp1x, cp1y, eX, eY, points, distanceTolerance);\n\n    return points;\n}\n\n// //// Based on:\n// //// https://github.com/pelson/antigrain/blob/master/agg-2.4/src/agg_curves.cpp\n\nfunction begin(\n    sX: number, sY: number,\n    cp1x: number, cp1y: number,\n    eX: number, eY: number,\n    points: number[],\n    distanceTolerance: number\n)\n{\n    recursive(points, sX, sY, cp1x, cp1y, eX, eY, distanceTolerance, 0);\n\n    points.push(eX, eY);\n}\n\nfunction recursive(\n    points: number[],\n    x1: number, y1: number,\n    x2: number, y2: number,\n    x3: number, y3: number,\n    distanceTolerance: number,\n    level: number\n)\n{\n    if (level > RECURSION_LIMIT)\n    { return; }\n\n    const pi = Math.PI;\n\n    // Calculate all the mid-points of the line segments\n    // ----------------------\n    const x12 = (x1 + x2) / 2;\n    const y12 = (y1 + y2) / 2;\n    const x23 = (x2 + x3) / 2;\n    const y23 = (y2 + y3) / 2;\n    const x123 = (x12 + x23) / 2;\n    const y123 = (y12 + y23) / 2;\n\n    let dx = x3 - x1;\n    let dy = y3 - y1;\n    const d = Math.abs((((x2 - x3) * dy) - ((y2 - y3) * dx)));\n\n    if (d > FLT_EPSILON)\n    {\n        // Regular care\n        // -----------------\n        if (d * d <= distanceTolerance * ((dx * dx) + (dy * dy)))\n        {\n            // If the curvature doesn't exceed the distance_tolerance value\n            // we tend to finish subdivisions.\n            // ----------------------\n            if (mAngleTolerance < curveAngleToleranceEpsilon)\n            {\n                points.push(x123, y123);\n\n                return;\n            }\n\n            // Angle & Cusp Condition\n            // ----------------------\n            let da = Math.abs(Math.atan2(y3 - y2, x3 - x2) - Math.atan2(y2 - y1, x2 - x1));\n\n            if (da >= pi) da = (2 * pi) - da;\n\n            if (da < mAngleTolerance)\n            {\n                // Finally we can stop the recursion\n                // ----------------------\n                points.push(x123, y123);\n\n                return;\n            }\n        }\n    }\n    else\n    {\n        // Collinear case\n        // -----------------\n        dx = x123 - ((x1 + x3) / 2);\n        dy = y123 - ((y1 + y3) / 2);\n        if ((dx * dx) + (dy * dy) <= distanceTolerance)\n        {\n            points.push(x123, y123);\n\n            return;\n        }\n    }\n\n    // Continue subdivision\n    // ----------------------\n    recursive(points, x1, y1, x12, y12, x123, y123, distanceTolerance, level + 1);\n    recursive(points, x123, y123, x23, y23, x3, y3, distanceTolerance, level + 1);\n}\n\n"],"names":[],"mappings":"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"}