{"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\n/** @internal */\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 * @internal\n */\nexport const buildCircle: ShapeBuildCommand<RoundedShape> = {\n    extension: {\n        type: ExtensionType.ShapeBuilder,\n        name: 'circle',\n    },\n\n    build(shape: RoundedShape, points: number[]): boolean\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            rx = ry = circle.radius;\n            if (rx <= 0)\n            {\n                return false;\n            }\n            x = circle.x;\n            y = circle.y;\n            dx = dy = 0;\n        }\n\n        else if (shape.type === 'ellipse')\n        {\n            const ellipse = shape as Ellipse;\n\n            rx = ellipse.halfWidth;\n            ry = ellipse.halfHeight;\n            if (rx <= 0 || ry <= 0)\n            { // skip zero ellipse\n                return false;\n            }\n            x = ellipse.x;\n            y = ellipse.y;\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 (dx < 0 || dy < 0)\n        {\n            return false;\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 false;\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 true;\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 true;\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\n/** @internal */\nexport const buildEllipse = { ...buildCircle, extension: { ...buildCircle.extension, name: 'ellipse' } };\n/** @internal */\nexport const buildRoundedRectangle = { ...buildCircle, extension: { ...buildCircle.extension, name: 'roundedRectangle' } };\n"],"names":["y2","x0","y0","x1","x2","y1"],"mappings":"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"}