{"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\n/**\n * @param points\n * @param sX\n * @param sY\n * @param cp1x\n * @param cp1y\n * @param eX\n * @param eY\n * @param smoothness\n * @internal\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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"}