{"version":3,"file":"buildAdaptiveBezier.mjs","sources":["../../../../../src/scene/graphics/shared/buildCommands/buildAdaptiveBezier.ts"],"sourcesContent":["// thanks to https://github.com/mattdesl/adaptive-bezier-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;\nconst mCuspLimit = 0;\n\n/**\n * @param points\n * @param sX\n * @param sY\n * @param cp1x\n * @param cp1y\n * @param cp2x\n * @param cp2y\n * @param eX\n * @param eY\n * @param smoothness\n * @internal\n */\nexport function buildAdaptiveBezier(\n    points: number[],\n    sX: number, sY: number,\n    cp1x: number, cp1y: number,\n    cp2x: number, cp2y: number,\n    eX: number, eY: number,\n    smoothness?: number,\n)\n{\n    // TODO expose as a parameter\n    const scale = 1;\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, cp2x, cp2y, 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    cp2x: number, cp2y: number,\n    eX: number, eY: number,\n    points: number[],\n    distanceTolerance: number\n)\n{\n    // dont need to actually ad this!\n    // points.push(sX, sY);\n    recursive(sX, sY, cp1x, cp1y, cp2x, cp2y, eX, eY, points, distanceTolerance, 0);\n    points.push(eX, eY);\n}\n\n// eslint-disable-next-line max-params\nfunction recursive(\n    x1: number, y1: number,\n    x2: number, y2: number,\n    x3: number, y3: number,\n    x4: number, y4: number,\n    points: number[],\n    distanceTolerance: number,\n    level: number)\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 x34 = (x3 + x4) / 2;\n    const y34 = (y3 + y4) / 2;\n    const x123 = (x12 + x23) / 2;\n    const y123 = (y12 + y23) / 2;\n    const x234 = (x23 + x34) / 2;\n    const y234 = (y23 + y34) / 2;\n    const x1234 = (x123 + x234) / 2;\n    const y1234 = (y123 + y234) / 2;\n\n    if (level > 0)\n    { // Enforce subdivision first time\n        // Try to approximate the full cubic curve by a single straight line\n        // ------------------\n        let dx = x4 - x1;\n        let dy = y4 - y1;\n\n        const d2 = Math.abs(((x2 - x4) * dy) - ((y2 - y4) * dx));\n        const d3 = Math.abs(((x3 - x4) * dy) - ((y3 - y4) * dx));\n\n        let da1; let da2;\n\n        if (d2 > FLT_EPSILON && d3 > FLT_EPSILON)\n        {\n            // Regular care\n            // -----------------\n            if ((d2 + d3) * (d2 + d3) <= distanceTolerance * ((dx * dx) + (dy * dy)))\n            {\n                // If the curvature doesn't exceed the distanceTolerance value\n                // we tend to finish subdivisions.\n                // ----------------------\n                if (mAngleTolerance < curveAngleToleranceEpsilon)\n                {\n                    points.push(x1234, y1234);\n\n                    return;\n                }\n\n                // Angle & Cusp Condition\n                // ----------------------\n                const a23 = Math.atan2(y3 - y2, x3 - x2);\n\n                da1 = Math.abs(a23 - Math.atan2(y2 - y1, x2 - x1));\n                da2 = Math.abs(Math.atan2(y4 - y3, x4 - x3) - a23);\n                if (da1 >= pi) da1 = (2 * pi) - da1;\n                if (da2 >= pi) da2 = (2 * pi) - da2;\n\n                if (da1 + da2 < mAngleTolerance)\n                {\n                    // Finally we can stop the recursion\n                    // ----------------------\n                    points.push(x1234, y1234);\n\n                    return;\n                }\n\n                if (mCuspLimit !== 0.0)\n                {\n                    if (da1 > mCuspLimit)\n                    {\n                        points.push(x2, y2);\n\n                        return;\n                    }\n\n                    if (da2 > mCuspLimit)\n                    {\n                        points.push(x3, y3);\n\n                        return;\n                    }\n                }\n            }\n        }\n        else if (d2 > FLT_EPSILON)\n        {\n            // p1,p3,p4 are collinear, p2 is considerable\n            // ----------------------\n            if (d2 * d2 <= distanceTolerance * ((dx * dx) + (dy * dy)))\n            {\n                if (mAngleTolerance < curveAngleToleranceEpsilon)\n                {\n                    points.push(x1234, y1234);\n\n                    return;\n                }\n\n                // Angle Condition\n                // ----------------------\n                da1 = Math.abs(Math.atan2(y3 - y2, x3 - x2) - Math.atan2(y2 - y1, x2 - x1));\n                if (da1 >= pi) da1 = (2 * pi) - da1;\n\n                if (da1 < mAngleTolerance)\n                {\n                    points.push(x2, y2);\n                    points.push(x3, y3);\n\n                    return;\n                }\n\n                if (mCuspLimit !== 0.0)\n                {\n                    if (da1 > mCuspLimit)\n                    {\n                        points.push(x2, y2);\n\n                        return;\n                    }\n                }\n            }\n        }\n        else if (d3 > FLT_EPSILON)\n        {\n            // p1,p2,p4 are collinear, p3 is considerable\n            // ----------------------\n            if (d3 * d3 <= distanceTolerance * ((dx * dx) + (dy * dy)))\n            {\n                if (mAngleTolerance < curveAngleToleranceEpsilon)\n                {\n                    points.push(x1234, y1234);\n\n                    return;\n                }\n\n                // Angle Condition\n                // ----------------------\n                da1 = Math.abs(Math.atan2(y4 - y3, x4 - x3) - Math.atan2(y3 - y2, x3 - x2));\n                if (da1 >= pi) da1 = (2 * pi) - da1;\n\n                if (da1 < mAngleTolerance)\n                {\n                    points.push(x2, y2);\n                    points.push(x3, y3);\n\n                    return;\n                }\n\n                if (mCuspLimit !== 0.0)\n                {\n                    if (da1 > mCuspLimit)\n                    {\n                        points.push(x3, y3);\n\n                        return;\n                    }\n                }\n            }\n        }\n        else\n        {\n            // Collinear case\n            // -----------------\n            dx = x1234 - ((x1 + x4) / 2);\n            dy = y1234 - ((y1 + y4) / 2);\n            if ((dx * dx) + (dy * dy) <= distanceTolerance)\n            {\n                points.push(x1234, y1234);\n\n                return;\n            }\n        }\n    }\n\n    // Continue subdivision\n    // ----------------------\n    recursive(x1, y1, x12, y12, x123, y123, x1234, y1234, points, distanceTolerance, level + 1);\n    recursive(x1234, y1234, x234, y234, x34, y34, x4, y4, points, distanceTolerance, level + 1);\n}\n\n"],"names":[],"mappings":";;;AAKA,MAAM,eAAA,GAAkB,CAAA;AACxB,MAAM,WAAA,GAAc,YAAA;AACpB,MAAM,qBAAA,GAAwB,CAAA;AAE9B,MAAM,0BAAA,GAA6B,IAAA;AACnC,MAAM,eAAA,GAAkB,CAAA;AACxB,MAAM,UAAA,GAAa,CAAA;AAeZ,SAAS,mBAAA,CACZ,MAAA,EACA,EAAA,EAAY,EAAA,EACZ,IAAA,EAAc,MACd,IAAA,EAAc,IAAA,EACd,EAAA,EAAY,EAAA,EACZ,UAAA,EAEJ;AAEI,EAAA,MAAM,KAAA,GAAQ,CAAA;AACd,EAAA,MAAM,YAAY,IAAA,CAAK,GAAA;AAAA,IACnB,IAAA;AAAA;AAAA,IACA,KAAK,GAAA,CAAI,CAAA,EAAG,UAAA,IAAc,qBAAA,CAAsB,eAAe,gBAAgB;AAAA,GACnF;AACA,EAAA,IAAI,iBAAA,GAAA,CAAqB,wBAAwB,SAAA,IAAa,KAAA;AAE9D,EAAA,iBAAA,IAAqB,iBAAA;AACrB,EAAA,KAAA,CAAM,EAAA,EAAI,IAAI,IAAA,EAAM,IAAA,EAAM,MAAM,IAAA,EAAM,EAAA,EAAI,EAAA,EAAI,MAAA,EAAQ,iBAAiB,CAAA;AAEvE,EAAA,OAAO,MAAA;AACX;AAKA,SAAS,KAAA,CACL,EAAA,EAAY,EAAA,EACZ,IAAA,EAAc,IAAA,EACd,MAAc,IAAA,EACd,EAAA,EAAY,EAAA,EACZ,MAAA,EACA,iBAAA,EAEJ;AAGI,EAAA,SAAA,CAAU,EAAA,EAAI,EAAA,EAAI,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,MAAM,EAAA,EAAI,EAAA,EAAI,MAAA,EAAQ,iBAAA,EAAmB,CAAC,CAAA;AAC9E,EAAA,MAAA,CAAO,IAAA,CAAK,IAAI,EAAE,CAAA;AACtB;AAGA,SAAS,SAAA,CACL,EAAA,EAAY,EAAA,EACZ,EAAA,EAAY,EAAA,EACZ,EAAA,EAAY,EAAA,EACZ,EAAA,EAAY,EAAA,EACZ,MAAA,EACA,iBAAA,EACA,KAAA,EACJ;AACI,EAAA,IAAI,QAAQ,eAAA,EACZ;AAAE,IAAA;AAAA,EAAQ;AAEV,EAAA,MAAM,KAAK,IAAA,CAAK,EAAA;AAIhB,EAAA,MAAM,GAAA,GAAA,CAAO,KAAK,EAAA,IAAM,CAAA;AACxB,EAAA,MAAM,GAAA,GAAA,CAAO,KAAK,EAAA,IAAM,CAAA;AACxB,EAAA,MAAM,GAAA,GAAA,CAAO,KAAK,EAAA,IAAM,CAAA;AACxB,EAAA,MAAM,GAAA,GAAA,CAAO,KAAK,EAAA,IAAM,CAAA;AACxB,EAAA,MAAM,GAAA,GAAA,CAAO,KAAK,EAAA,IAAM,CAAA;AACxB,EAAA,MAAM,GAAA,GAAA,CAAO,KAAK,EAAA,IAAM,CAAA;AACxB,EAAA,MAAM,IAAA,GAAA,CAAQ,MAAM,GAAA,IAAO,CAAA;AAC3B,EAAA,MAAM,IAAA,GAAA,CAAQ,MAAM,GAAA,IAAO,CAAA;AAC3B,EAAA,MAAM,IAAA,GAAA,CAAQ,MAAM,GAAA,IAAO,CAAA;AAC3B,EAAA,MAAM,IAAA,GAAA,CAAQ,MAAM,GAAA,IAAO,CAAA;AAC3B,EAAA,MAAM,KAAA,GAAA,CAAS,OAAO,IAAA,IAAQ,CAAA;AAC9B,EAAA,MAAM,KAAA,GAAA,CAAS,OAAO,IAAA,IAAQ,CAAA;AAE9B,EAAA,IAAI,QAAQ,CAAA,EACZ;AAGI,IAAA,IAAI,KAAK,EAAA,GAAK,EAAA;AACd,IAAA,IAAI,KAAK,EAAA,GAAK,EAAA;AAEd,IAAA,MAAM,EAAA,GAAK,KAAK,GAAA,CAAA,CAAM,EAAA,GAAK,MAAM,EAAA,GAAA,CAAQ,EAAA,GAAK,MAAM,EAAG,CAAA;AACvD,IAAA,MAAM,EAAA,GAAK,KAAK,GAAA,CAAA,CAAM,EAAA,GAAK,MAAM,EAAA,GAAA,CAAQ,EAAA,GAAK,MAAM,EAAG,CAAA;AAEvD,IAAA,IAAI,GAAA;AAAK,IAAA,IAAI,GAAA;AAEb,IAAA,IAAI,EAAA,GAAK,WAAA,IAAe,EAAA,GAAK,WAAA,EAC7B;AAGI,MAAA,IAAA,CAAK,EAAA,GAAK,OAAO,EAAA,GAAK,EAAA,CAAA,IAAO,qBAAsB,EAAA,GAAK,EAAA,GAAO,KAAK,EAAA,CAAA,EACpE;AAII,QAAA,IAAI,kBAAkB,0BAAA,EACtB;AACI,UAAA,MAAA,CAAO,IAAA,CAAK,OAAO,KAAK,CAAA;AAExB,UAAA;AAAA,QACJ;AAIA,QAAA,MAAM,MAAM,IAAA,CAAK,KAAA,CAAM,EAAA,GAAK,EAAA,EAAI,KAAK,EAAE,CAAA;AAEvC,QAAA,GAAA,GAAM,IAAA,CAAK,IAAI,GAAA,GAAM,IAAA,CAAK,MAAM,EAAA,GAAK,EAAA,EAAI,EAAA,GAAK,EAAE,CAAC,CAAA;AACjD,QAAA,GAAA,GAAM,IAAA,CAAK,IAAI,IAAA,CAAK,KAAA,CAAM,KAAK,EAAA,EAAI,EAAA,GAAK,EAAE,CAAA,GAAI,GAAG,CAAA;AACjD,QAAA,IAAI,GAAA,IAAO,EAAA,EAAI,GAAA,GAAO,CAAA,GAAI,EAAA,GAAM,GAAA;AAChC,QAAA,IAAI,GAAA,IAAO,EAAA,EAAI,GAAA,GAAO,CAAA,GAAI,EAAA,GAAM,GAAA;AAEhC,QAAA,IAAI,GAAA,GAAM,MAAM,eAAA,EAChB;AAGI,UAAA,MAAA,CAAO,IAAA,CAAK,OAAO,KAAK,CAAA;AAExB,UAAA;AAAA,QACJ;AAEA,QAAA,IAAI,eAAe,CAAA,EACnB;AACI,UAAA,IAAI,MAAM,UAAA,EACV;AACI,YAAA,MAAA,CAAO,IAAA,CAAK,IAAI,EAAE,CAAA;AAElB,YAAA;AAAA,UACJ;AAEA,UAAA,IAAI,MAAM,UAAA,EACV;AACI,YAAA,MAAA,CAAO,IAAA,CAAK,IAAI,EAAE,CAAA;AAElB,YAAA;AAAA,UACJ;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ,CAAA,MAAA,IACS,KAAK,WAAA,EACd;AAGI,MAAA,IAAI,KAAK,EAAA,IAAM,iBAAA,IAAsB,EAAA,GAAK,EAAA,GAAO,KAAK,EAAA,CAAA,EACtD;AACI,QAAA,IAAI,kBAAkB,0BAAA,EACtB;AACI,UAAA,MAAA,CAAO,IAAA,CAAK,OAAO,KAAK,CAAA;AAExB,UAAA;AAAA,QACJ;AAIA,QAAA,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,KAAA,CAAM,KAAK,EAAA,EAAI,EAAA,GAAK,EAAE,CAAA,GAAI,KAAK,KAAA,CAAM,EAAA,GAAK,EAAA,EAAI,EAAA,GAAK,EAAE,CAAC,CAAA;AAC1E,QAAA,IAAI,GAAA,IAAO,EAAA,EAAI,GAAA,GAAO,CAAA,GAAI,EAAA,GAAM,GAAA;AAEhC,QAAA,IAAI,MAAM,eAAA,EACV;AACI,UAAA,MAAA,CAAO,IAAA,CAAK,IAAI,EAAE,CAAA;AAClB,UAAA,MAAA,CAAO,IAAA,CAAK,IAAI,EAAE,CAAA;AAElB,UAAA;AAAA,QACJ;AAEA,QAAA,IAAI,eAAe,CAAA,EACnB;AACI,UAAA,IAAI,MAAM,UAAA,EACV;AACI,YAAA,MAAA,CAAO,IAAA,CAAK,IAAI,EAAE,CAAA;AAElB,YAAA;AAAA,UACJ;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ,CAAA,MAAA,IACS,KAAK,WAAA,EACd;AAGI,MAAA,IAAI,KAAK,EAAA,IAAM,iBAAA,IAAsB,EAAA,GAAK,EAAA,GAAO,KAAK,EAAA,CAAA,EACtD;AACI,QAAA,IAAI,kBAAkB,0BAAA,EACtB;AACI,UAAA,MAAA,CAAO,IAAA,CAAK,OAAO,KAAK,CAAA;AAExB,UAAA;AAAA,QACJ;AAIA,QAAA,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,KAAA,CAAM,KAAK,EAAA,EAAI,EAAA,GAAK,EAAE,CAAA,GAAI,KAAK,KAAA,CAAM,EAAA,GAAK,EAAA,EAAI,EAAA,GAAK,EAAE,CAAC,CAAA;AAC1E,QAAA,IAAI,GAAA,IAAO,EAAA,EAAI,GAAA,GAAO,CAAA,GAAI,EAAA,GAAM,GAAA;AAEhC,QAAA,IAAI,MAAM,eAAA,EACV;AACI,UAAA,MAAA,CAAO,IAAA,CAAK,IAAI,EAAE,CAAA;AAClB,UAAA,MAAA,CAAO,IAAA,CAAK,IAAI,EAAE,CAAA;AAElB,UAAA;AAAA,QACJ;AAEA,QAAA,IAAI,eAAe,CAAA,EACnB;AACI,UAAA,IAAI,MAAM,UAAA,EACV;AACI,YAAA,MAAA,CAAO,IAAA,CAAK,IAAI,EAAE,CAAA;AAElB,YAAA;AAAA,UACJ;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ,CAAA,MAEA;AAGI,MAAA,EAAA,GAAK,KAAA,GAAA,CAAU,KAAK,EAAA,IAAM,CAAA;AAC1B,MAAA,EAAA,GAAK,KAAA,GAAA,CAAU,KAAK,EAAA,IAAM,CAAA;AAC1B,MAAA,IAAK,EAAA,GAAK,EAAA,GAAO,EAAA,GAAK,EAAA,IAAO,iBAAA,EAC7B;AACI,QAAA,MAAA,CAAO,IAAA,CAAK,OAAO,KAAK,CAAA;AAExB,QAAA;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AAIA,EAAA,SAAA,CAAU,EAAA,EAAI,EAAA,EAAI,GAAA,EAAK,GAAA,EAAK,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,KAAA,EAAO,MAAA,EAAQ,iBAAA,EAAmB,KAAA,GAAQ,CAAC,CAAA;AAC1F,EAAA,SAAA,CAAU,KAAA,EAAO,KAAA,EAAO,IAAA,EAAM,IAAA,EAAM,GAAA,EAAK,GAAA,EAAK,EAAA,EAAI,EAAA,EAAI,MAAA,EAAQ,iBAAA,EAAmB,KAAA,GAAQ,CAAC,CAAA;AAC9F;;;;"}