{"version":3,"file":"buildCircle.mjs","sources":["../../../../../src/scene/graphics/shared/buildCommands/buildCircle.ts"],"sourcesContent":["import { ExtensionType } from '../../../../extensions/Extensions';\n\nimport type { Circle } from '../../../../maths/shapes/Circle';\nimport type { Ellipse } from '../../../../maths/shapes/Ellipse';\nimport type { RoundedRectangle } from '../../../../maths/shapes/RoundedRectangle';\nimport type { ShapeBuildCommand } from './ShapeBuildCommand';\n\ntype RoundedShape = Circle | Ellipse | RoundedRectangle;\n\n/**\n * Builds a rectangle to draw\n *\n * Ignored from docs since it is not directly exposed.\n * @ignore\n * @private\n */\nexport const buildCircle: ShapeBuildCommand<RoundedShape> = {\n    extension: {\n        type: ExtensionType.ShapeBuilder,\n        name: 'circle',\n    },\n\n    build(shape: RoundedShape, points: number[])\n    {\n        let x;\n        let y;\n        let dx;\n        let dy;\n\n        let rx;\n        let ry;\n\n        if (shape.type === 'circle')\n        {\n            const circle = shape as Circle;\n\n            x = circle.x;\n            y = circle.y;\n            rx = ry = circle.radius;\n            dx = dy = 0;\n        }\n\n        else if (shape.type === 'ellipse')\n        {\n            const ellipse = shape as Ellipse;\n\n            x = ellipse.x;\n            y = ellipse.y;\n            rx = ellipse.halfWidth;\n            ry = ellipse.halfHeight;\n            dx = dy = 0;\n        }\n        else\n        {\n            const roundedRect = shape as RoundedRectangle;\n            const halfWidth = roundedRect.width / 2;\n            const halfHeight = roundedRect.height / 2;\n\n            x = roundedRect.x + halfWidth;\n            y = roundedRect.y + halfHeight;\n            rx = ry = Math.max(0, Math.min(roundedRect.radius, Math.min(halfWidth, halfHeight)));\n            dx = halfWidth - rx;\n            dy = halfHeight - ry;\n        }\n\n        if (!(rx >= 0 && ry >= 0 && dx >= 0 && dy >= 0))\n        {\n            return points;\n        }\n\n        // Choose a number of segments such that the maximum absolute deviation from the circle is approximately 0.029\n        const n = Math.ceil(2.3 * Math.sqrt(rx + ry));\n        const m = (n * 8) + (dx ? 4 : 0) + (dy ? 4 : 0);\n\n        if (m === 0)\n        {\n            return points;\n        }\n\n        if (n === 0)\n        {\n            points[0] = points[6] = x + dx;\n            points[1] = points[3] = y + dy;\n            points[2] = points[4] = x - dx;\n            points[5] = points[7] = y - dy;\n\n            return points;\n        }\n\n        let j1 = 0;\n        let j2 = (n * 4) + (dx ? 2 : 0) + 2;\n        let j3 = j2;\n        let j4 = m;\n\n        let x0 = dx + rx;\n        let y0 = dy;\n        let x1 = x + x0;\n        let x2 = x - x0;\n        let y1 = y + y0;\n\n        points[j1++] = x1;\n        points[j1++] = y1;\n        points[--j2] = y1;\n        points[--j2] = x2;\n\n        if (dy)\n        {\n            const y2 = y - y0;\n\n            points[j3++] = x2;\n            points[j3++] = y2;\n            points[--j4] = y2;\n            points[--j4] = x1;\n        }\n\n        for (let i = 1; i < n; i++)\n        {\n            const a = Math.PI / 2 * (i / n);\n            const x0 = dx + (Math.cos(a) * rx);\n            const y0 = dy + (Math.sin(a) * ry);\n            const x1 = x + x0;\n            const x2 = x - x0;\n            const y1 = y + y0;\n            const y2 = y - y0;\n\n            points[j1++] = x1;\n            points[j1++] = y1;\n            points[--j2] = y1;\n            points[--j2] = x2;\n            points[j3++] = x2;\n            points[j3++] = y2;\n            points[--j4] = y2;\n            points[--j4] = x1;\n        }\n\n        x0 = dx;\n        y0 = dy + ry;\n        x1 = x + x0;\n        x2 = x - x0;\n        y1 = y + y0;\n        const y2 = y - y0;\n\n        points[j1++] = x1;\n        points[j1++] = y1;\n        points[--j4] = y2;\n        points[--j4] = x1;\n\n        if (dx)\n        {\n            points[j1++] = x2;\n            points[j1++] = y1;\n            points[--j4] = y2;\n            points[--j4] = x2;\n        }\n\n        return points;\n    },\n\n    triangulate(points, vertices, verticesStride, verticesOffset, indices, indicesOffset)\n    {\n        if (points.length === 0)\n        {\n            return;\n        }\n\n        // Compute center (average of all points)\n        let centerX = 0; let\n            centerY = 0;\n\n        for (let i = 0; i < points.length; i += 2)\n        {\n            centerX += points[i];\n            centerY += points[i + 1];\n        }\n        centerX /= (points.length / 2);\n        centerY /= (points.length / 2);\n\n        // Set center vertex\n        let count = verticesOffset;\n\n        vertices[count * verticesStride] = centerX;\n        vertices[(count * verticesStride) + 1] = centerY;\n        const centerIndex = count++;\n\n        // Set edge vertices and indices\n        for (let i = 0; i < points.length; i += 2)\n        {\n            vertices[count * verticesStride] = points[i];\n            vertices[(count * verticesStride) + 1] = points[i + 1];\n\n            if (i > 0)\n            { // Skip first point for indices\n                indices[indicesOffset++] = count;\n                indices[indicesOffset++] = centerIndex;\n                indices[indicesOffset++] = count - 1;\n            }\n            count++;\n        }\n\n        // Connect last point to the first edge point\n        indices[indicesOffset++] = centerIndex + 1;\n        indices[indicesOffset++] = centerIndex;\n        indices[indicesOffset++] = count - 1;\n    }\n\n};\n\nexport const buildEllipse = { ...buildCircle, extension: { ...buildCircle.extension, name: 'ellipse' } };\nexport const buildRoundedRectangle = { ...buildCircle, extension: { ...buildCircle.extension, name: 'roundedRectangle' } };\n"],"names":["y2","x0","y0","x1","x2","y1"],"mappings":";;;AAgBO,MAAM,WAA+C,GAAA;AAAA,EACxD,SAAW,EAAA;AAAA,IACP,MAAM,aAAc,CAAA,YAAA;AAAA,IACpB,IAAM,EAAA,QAAA;AAAA,GACV;AAAA,EAEA,KAAA,CAAM,OAAqB,MAC3B,EAAA;AACI,IAAI,IAAA,CAAA,CAAA;AACJ,IAAI,IAAA,CAAA,CAAA;AACJ,IAAI,IAAA,EAAA,CAAA;AACJ,IAAI,IAAA,EAAA,CAAA;AAEJ,IAAI,IAAA,EAAA,CAAA;AACJ,IAAI,IAAA,EAAA,CAAA;AAEJ,IAAI,IAAA,KAAA,CAAM,SAAS,QACnB,EAAA;AACI,MAAA,MAAM,MAAS,GAAA,KAAA,CAAA;AAEf,MAAA,CAAA,GAAI,MAAO,CAAA,CAAA,CAAA;AACX,MAAA,CAAA,GAAI,MAAO,CAAA,CAAA,CAAA;AACX,MAAA,EAAA,GAAK,KAAK,MAAO,CAAA,MAAA,CAAA;AACjB,MAAA,EAAA,GAAK,EAAK,GAAA,CAAA,CAAA;AAAA,KACd,MAAA,IAES,KAAM,CAAA,IAAA,KAAS,SACxB,EAAA;AACI,MAAA,MAAM,OAAU,GAAA,KAAA,CAAA;AAEhB,MAAA,CAAA,GAAI,OAAQ,CAAA,CAAA,CAAA;AACZ,MAAA,CAAA,GAAI,OAAQ,CAAA,CAAA,CAAA;AACZ,MAAA,EAAA,GAAK,OAAQ,CAAA,SAAA,CAAA;AACb,MAAA,EAAA,GAAK,OAAQ,CAAA,UAAA,CAAA;AACb,MAAA,EAAA,GAAK,EAAK,GAAA,CAAA,CAAA;AAAA,KAGd,MAAA;AACI,MAAA,MAAM,WAAc,GAAA,KAAA,CAAA;AACpB,MAAM,MAAA,SAAA,GAAY,YAAY,KAAQ,GAAA,CAAA,CAAA;AACtC,MAAM,MAAA,UAAA,GAAa,YAAY,MAAS,GAAA,CAAA,CAAA;AAExC,MAAA,CAAA,GAAI,YAAY,CAAI,GAAA,SAAA,CAAA;AACpB,MAAA,CAAA,GAAI,YAAY,CAAI,GAAA,UAAA,CAAA;AACpB,MAAA,EAAA,GAAK,EAAK,GAAA,IAAA,CAAK,GAAI,CAAA,CAAA,EAAG,IAAK,CAAA,GAAA,CAAI,WAAY,CAAA,MAAA,EAAQ,IAAK,CAAA,GAAA,CAAI,SAAW,EAAA,UAAU,CAAC,CAAC,CAAA,CAAA;AACnF,MAAA,EAAA,GAAK,SAAY,GAAA,EAAA,CAAA;AACjB,MAAA,EAAA,GAAK,UAAa,GAAA,EAAA,CAAA;AAAA,KACtB;AAEA,IAAI,IAAA,EAAE,MAAM,CAAK,IAAA,EAAA,IAAM,KAAK,EAAM,IAAA,CAAA,IAAK,MAAM,CAC7C,CAAA,EAAA;AACI,MAAO,OAAA,MAAA,CAAA;AAAA,KACX;AAGA,IAAM,MAAA,CAAA,GAAI,KAAK,IAAK,CAAA,GAAA,GAAM,KAAK,IAAK,CAAA,EAAA,GAAK,EAAE,CAAC,CAAA,CAAA;AAC5C,IAAA,MAAM,IAAK,CAAI,GAAA,CAAA,IAAM,KAAK,CAAI,GAAA,CAAA,CAAA,IAAM,KAAK,CAAI,GAAA,CAAA,CAAA,CAAA;AAE7C,IAAA,IAAI,MAAM,CACV,EAAA;AACI,MAAO,OAAA,MAAA,CAAA;AAAA,KACX;AAEA,IAAA,IAAI,MAAM,CACV,EAAA;AACI,MAAA,MAAA,CAAO,CAAC,CAAA,GAAI,MAAO,CAAA,CAAC,IAAI,CAAI,GAAA,EAAA,CAAA;AAC5B,MAAA,MAAA,CAAO,CAAC,CAAA,GAAI,MAAO,CAAA,CAAC,IAAI,CAAI,GAAA,EAAA,CAAA;AAC5B,MAAA,MAAA,CAAO,CAAC,CAAA,GAAI,MAAO,CAAA,CAAC,IAAI,CAAI,GAAA,EAAA,CAAA;AAC5B,MAAA,MAAA,CAAO,CAAC,CAAA,GAAI,MAAO,CAAA,CAAC,IAAI,CAAI,GAAA,EAAA,CAAA;AAE5B,MAAO,OAAA,MAAA,CAAA;AAAA,KACX;AAEA,IAAA,IAAI,EAAK,GAAA,CAAA,CAAA;AACT,IAAA,IAAI,EAAM,GAAA,CAAA,GAAI,CAAM,IAAA,EAAA,GAAK,IAAI,CAAK,CAAA,GAAA,CAAA,CAAA;AAClC,IAAA,IAAI,EAAK,GAAA,EAAA,CAAA;AACT,IAAA,IAAI,EAAK,GAAA,CAAA,CAAA;AAET,IAAA,IAAI,KAAK,EAAK,GAAA,EAAA,CAAA;AACd,IAAA,IAAI,EAAK,GAAA,EAAA,CAAA;AACT,IAAA,IAAI,KAAK,CAAI,GAAA,EAAA,CAAA;AACb,IAAA,IAAI,KAAK,CAAI,GAAA,EAAA,CAAA;AACb,IAAA,IAAI,KAAK,CAAI,GAAA,EAAA,CAAA;AAEb,IAAA,MAAA,CAAO,IAAI,CAAI,GAAA,EAAA,CAAA;AACf,IAAA,MAAA,CAAO,IAAI,CAAI,GAAA,EAAA,CAAA;AACf,IAAO,MAAA,CAAA,EAAE,EAAE,CAAI,GAAA,EAAA,CAAA;AACf,IAAO,MAAA,CAAA,EAAE,EAAE,CAAI,GAAA,EAAA,CAAA;AAEf,IAAA,IAAI,EACJ,EAAA;AACI,MAAA,MAAMA,MAAK,CAAI,GAAA,EAAA,CAAA;AAEf,MAAA,MAAA,CAAO,IAAI,CAAI,GAAA,EAAA,CAAA;AACf,MAAA,MAAA,CAAO,IAAI,CAAIA,GAAAA,GAAAA,CAAAA;AACf,MAAO,MAAA,CAAA,EAAE,EAAE,CAAIA,GAAAA,GAAAA,CAAAA;AACf,MAAO,MAAA,CAAA,EAAE,EAAE,CAAI,GAAA,EAAA,CAAA;AAAA,KACnB;AAEA,IAAA,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAI,GAAA,CAAA,EAAG,CACvB,EAAA,EAAA;AACI,MAAA,MAAM,CAAI,GAAA,IAAA,CAAK,EAAK,GAAA,CAAA,IAAK,CAAI,GAAA,CAAA,CAAA,CAAA;AAC7B,MAAA,MAAMC,GAAK,GAAA,EAAA,GAAM,IAAK,CAAA,GAAA,CAAI,CAAC,CAAI,GAAA,EAAA,CAAA;AAC/B,MAAA,MAAMC,GAAK,GAAA,EAAA,GAAM,IAAK,CAAA,GAAA,CAAI,CAAC,CAAI,GAAA,EAAA,CAAA;AAC/B,MAAA,MAAMC,MAAK,CAAIF,GAAAA,GAAAA,CAAAA;AACf,MAAA,MAAMG,MAAK,CAAIH,GAAAA,GAAAA,CAAAA;AACf,MAAA,MAAMI,MAAK,CAAIH,GAAAA,GAAAA,CAAAA;AACf,MAAA,MAAMF,MAAK,CAAIE,GAAAA,GAAAA,CAAAA;AAEf,MAAA,MAAA,CAAO,IAAI,CAAIC,GAAAA,GAAAA,CAAAA;AACf,MAAA,MAAA,CAAO,IAAI,CAAIE,GAAAA,GAAAA,CAAAA;AACf,MAAO,MAAA,CAAA,EAAE,EAAE,CAAIA,GAAAA,GAAAA,CAAAA;AACf,MAAO,MAAA,CAAA,EAAE,EAAE,CAAID,GAAAA,GAAAA,CAAAA;AACf,MAAA,MAAA,CAAO,IAAI,CAAIA,GAAAA,GAAAA,CAAAA;AACf,MAAA,MAAA,CAAO,IAAI,CAAIJ,GAAAA,GAAAA,CAAAA;AACf,MAAO,MAAA,CAAA,EAAE,EAAE,CAAIA,GAAAA,GAAAA,CAAAA;AACf,MAAO,MAAA,CAAA,EAAE,EAAE,CAAIG,GAAAA,GAAAA,CAAAA;AAAA,KACnB;AAEA,IAAK,EAAA,GAAA,EAAA,CAAA;AACL,IAAA,EAAA,GAAK,EAAK,GAAA,EAAA,CAAA;AACV,IAAA,EAAA,GAAK,CAAI,GAAA,EAAA,CAAA;AACT,IAAA,EAAA,GAAK,CAAI,GAAA,EAAA,CAAA;AACT,IAAA,EAAA,GAAK,CAAI,GAAA,EAAA,CAAA;AACT,IAAA,MAAM,KAAK,CAAI,GAAA,EAAA,CAAA;AAEf,IAAA,MAAA,CAAO,IAAI,CAAI,GAAA,EAAA,CAAA;AACf,IAAA,MAAA,CAAO,IAAI,CAAI,GAAA,EAAA,CAAA;AACf,IAAO,MAAA,CAAA,EAAE,EAAE,CAAI,GAAA,EAAA,CAAA;AACf,IAAO,MAAA,CAAA,EAAE,EAAE,CAAI,GAAA,EAAA,CAAA;AAEf,IAAA,IAAI,EACJ,EAAA;AACI,MAAA,MAAA,CAAO,IAAI,CAAI,GAAA,EAAA,CAAA;AACf,MAAA,MAAA,CAAO,IAAI,CAAI,GAAA,EAAA,CAAA;AACf,MAAO,MAAA,CAAA,EAAE,EAAE,CAAI,GAAA,EAAA,CAAA;AACf,MAAO,MAAA,CAAA,EAAE,EAAE,CAAI,GAAA,EAAA,CAAA;AAAA,KACnB;AAEA,IAAO,OAAA,MAAA,CAAA;AAAA,GACX;AAAA,EAEA,YAAY,MAAQ,EAAA,QAAA,EAAU,cAAgB,EAAA,cAAA,EAAgB,SAAS,aACvE,EAAA;AACI,IAAI,IAAA,MAAA,CAAO,WAAW,CACtB,EAAA;AACI,MAAA,OAAA;AAAA,KACJ;AAGA,IAAA,IAAI,OAAU,GAAA,CAAA,CAAA;AAAG,IAAA,IACb,OAAU,GAAA,CAAA,CAAA;AAEd,IAAA,KAAA,IAAS,IAAI,CAAG,EAAA,CAAA,GAAI,MAAO,CAAA,MAAA,EAAQ,KAAK,CACxC,EAAA;AACI,MAAA,OAAA,IAAW,OAAO,CAAC,CAAA,CAAA;AACnB,MAAW,OAAA,IAAA,MAAA,CAAO,IAAI,CAAC,CAAA,CAAA;AAAA,KAC3B;AACA,IAAA,OAAA,IAAY,OAAO,MAAS,GAAA,CAAA,CAAA;AAC5B,IAAA,OAAA,IAAY,OAAO,MAAS,GAAA,CAAA,CAAA;AAG5B,IAAA,IAAI,KAAQ,GAAA,cAAA,CAAA;AAEZ,IAAS,QAAA,CAAA,KAAA,GAAQ,cAAc,CAAI,GAAA,OAAA,CAAA;AACnC,IAAU,QAAA,CAAA,KAAA,GAAQ,cAAkB,GAAA,CAAC,CAAI,GAAA,OAAA,CAAA;AACzC,IAAA,MAAM,WAAc,GAAA,KAAA,EAAA,CAAA;AAGpB,IAAA,KAAA,IAAS,IAAI,CAAG,EAAA,CAAA,GAAI,MAAO,CAAA,MAAA,EAAQ,KAAK,CACxC,EAAA;AACI,MAAA,QAAA,CAAS,KAAQ,GAAA,cAAc,CAAI,GAAA,MAAA,CAAO,CAAC,CAAA,CAAA;AAC3C,MAAA,QAAA,CAAU,QAAQ,cAAkB,GAAA,CAAC,CAAI,GAAA,MAAA,CAAO,IAAI,CAAC,CAAA,CAAA;AAErD,MAAA,IAAI,IAAI,CACR,EAAA;AACI,QAAA,OAAA,CAAQ,eAAe,CAAI,GAAA,KAAA,CAAA;AAC3B,QAAA,OAAA,CAAQ,eAAe,CAAI,GAAA,WAAA,CAAA;AAC3B,QAAQ,OAAA,CAAA,aAAA,EAAe,IAAI,KAAQ,GAAA,CAAA,CAAA;AAAA,OACvC;AACA,MAAA,KAAA,EAAA,CAAA;AAAA,KACJ;AAGA,IAAQ,OAAA,CAAA,aAAA,EAAe,IAAI,WAAc,GAAA,CAAA,CAAA;AACzC,IAAA,OAAA,CAAQ,eAAe,CAAI,GAAA,WAAA,CAAA;AAC3B,IAAQ,OAAA,CAAA,aAAA,EAAe,IAAI,KAAQ,GAAA,CAAA,CAAA;AAAA,GACvC;AAEJ,EAAA;AAEa,MAAA,YAAA,GAAe,EAAE,GAAG,WAAa,EAAA,SAAA,EAAW,EAAE,GAAG,WAAY,CAAA,SAAA,EAAW,IAAM,EAAA,SAAA,EAAY,GAAA;AAC1F,MAAA,qBAAA,GAAwB,EAAE,GAAG,WAAa,EAAA,SAAA,EAAW,EAAE,GAAG,WAAY,CAAA,SAAA,EAAW,IAAM,EAAA,kBAAA,EAAqB;;;;"}