{"version":3,"file":"SmoothGraphics.mjs","sources":["../src/SmoothGraphics.ts"],"sourcesContent":["import {\n    BLEND_MODES,\n    Circle,\n    Color,\n    DRAW_MODES,\n    Ellipse,\n    Matrix,\n    MSAA_QUALITY,\n    PI_2,\n    Point,\n    Polygon,\n    Rectangle,\n    Renderer,\n    RoundedRectangle,\n    Shader,\n    SHAPES,\n    State,\n    Texture,\n    utils,\n} from '@pixi/core';\nimport { Container } from '@pixi/display';\nimport { curves, Graphics, graphicsUtils, LINE_CAP, LINE_JOIN } from '@pixi/graphics';\nimport { IGraphicsBatchSettings } from './core/BatchDrawCall';\nimport { FillStyle } from './core/FillStyle';\nimport { LINE_SCALE_MODE, LineStyle } from './core/LineStyle';\nimport { settings } from './settings';\nimport { SmoothGraphicsGeometry } from './SmoothGraphicsGeometry';\nimport { SmoothGraphicsShader } from './SmoothShader';\n\nimport type { ColorSource, IPointData, IShape } from '@pixi/core';\nimport type { IDestroyOptions } from '@pixi/display';\n\nconst UnsmoothGraphics = Graphics;\nconst { BezierUtils, QuadraticUtils, ArcUtils } = graphicsUtils;\n\n// a default shaders map used by graphics..\nconst DEFAULT_SHADERS: { [key: string]: Shader } = {};\n\nexport interface IFillStyleOptions\n{\n    color?: ColorSource;\n    alpha?: number;\n    texture?: Texture;\n    matrix?: Matrix;\n    smooth?: boolean;\n    shader?: Shader;\n}\n\nexport interface ILineStyleOptions extends IFillStyleOptions\n{\n    width?: number;\n    alignment?: number;\n    scaleMode?: LINE_SCALE_MODE;\n    cap?: LINE_CAP;\n    join?: LINE_JOIN;\n    miterLimit?: number;\n}\n\n/**\n * @memberof PIXI.smooth\n */\nexport class SmoothGraphics extends Container\n{\n    public static readonly curves = curves;\n\n    static _TEMP_POINT = new Point();\n\n    public shader: Shader;\n    public shaderSettings: IGraphicsBatchSettings;\n    public pluginName: string;\n    public currentPath: Polygon;\n\n    protected batches: Array<any>;\n    protected batchTint: number;\n    protected batchDirty: number;\n    protected vertexData: Float32Array;\n\n    protected _fillStyle: FillStyle;\n    protected _lineStyle: LineStyle;\n    protected _matrix: Matrix;\n    protected _holeMode: boolean;\n    protected _transformID: number;\n    protected _tintColor: Color;\n\n    private state: State;\n    private _geometry: SmoothGraphicsGeometry;\n\n    public get geometry(): SmoothGraphicsGeometry\n    {\n        return this._geometry;\n    }\n\n    constructor(geometry: SmoothGraphicsGeometry = null)\n    {\n        super();\n\n        this._geometry = geometry || new SmoothGraphicsGeometry();\n        this._geometry.refCount++;\n\n        this.shader = null;\n\n        this.shaderSettings = {\n            maxStyles: settings.SHADER_MAX_STYLES,\n            maxTextures: settings.SHADER_MAX_TEXTURES,\n            pixelLine: settings.PIXEL_LINE,\n        };\n\n        this.state = State.for2d();\n\n        this._fillStyle = new FillStyle();\n\n        this._lineStyle = new LineStyle();\n\n        this._matrix = null;\n\n        this._holeMode = false;\n\n        this.currentPath = null;\n\n        this.batches = [];\n\n        this.batchTint = -1;\n\n        this.batchDirty = -1;\n\n        this.vertexData = null;\n\n        this.pluginName = 'smooth';\n\n        this._transformID = -1;\n\n        // Set default\n        this._tintColor = new Color(0xFFFFFF);\n        this.blendMode = BLEND_MODES.NORMAL;\n    }\n\n    public clone(): SmoothGraphics\n    {\n        this.finishPoly();\n\n        return new SmoothGraphics(this._geometry);\n    }\n\n    public set blendMode(value: BLEND_MODES)\n    {\n        this.state.blendMode = value;\n    }\n\n    public get blendMode(): BLEND_MODES\n    {\n        return this.state.blendMode;\n    }\n\n    public get tint(): ColorSource\n    {\n        return this._tintColor.value;\n    }\n\n    public set tint(value: ColorSource)\n    {\n        this._tintColor.setValue(value);\n    }\n\n    public get fill(): FillStyle\n    {\n        return this._fillStyle;\n    }\n\n    public get line(): LineStyle\n    {\n        return this._lineStyle;\n    }\n\n    public lineStyle(\n        width: number,\n        color?: ColorSource,\n        alpha?: number,\n        alignment?: number,\n        scaleMode?: LINE_SCALE_MODE): this;\n\n    public lineStyle(options?: ILineStyleOptions): this;\n\n    public lineStyle(options: ILineStyleOptions | number = null,\n        color: ColorSource = 0x0, alpha = 1, alignment = 0.5, scaleMode = settings.LINE_SCALE_MODE): this\n    {\n        // Support non-object params: (width, color, alpha, alignment, native)\n        if (typeof options === 'number')\n        {\n            if (typeof scaleMode === 'boolean')\n            {\n                scaleMode = scaleMode ? LINE_SCALE_MODE.NONE : LINE_SCALE_MODE.NORMAL;\n            }\n            options = { width: options, color, alpha, alignment, scaleMode } as ILineStyleOptions;\n        }\n        else\n        {\n            const native: boolean = (options as any).native;\n\n            if (native !== undefined)\n            {\n                options.scaleMode = native ? LINE_SCALE_MODE.NONE : LINE_SCALE_MODE.NORMAL;\n            }\n        }\n\n        return this.lineTextureStyle(options);\n    }\n\n    public lineTextureStyle(options: ILineStyleOptions): this\n    {\n        // Apply defaults\n        options = Object.assign({\n            width: 0,\n            texture: Texture.WHITE,\n            color: (options && options.texture) ? 0xFFFFFF : 0x0,\n            alpha: 1,\n            matrix: null,\n            alignment: 0.5,\n            native: false,\n            cap: LINE_CAP.BUTT,\n            join: LINE_JOIN.MITER,\n            miterLimit: 10,\n            shader: null,\n            scaleMode: settings.LINE_SCALE_MODE,\n        }, options);\n\n        this.normalizeColor(options);\n\n        if (this.currentPath)\n        {\n            this.startPoly();\n        }\n\n        const visible = options.width > 0 && options.alpha > 0;\n\n        if (!visible)\n        {\n            this._lineStyle.reset();\n        }\n        else\n        {\n            if (options.matrix)\n            {\n                options.matrix = options.matrix.clone();\n                options.matrix.invert();\n            }\n\n            Object.assign(this._lineStyle, { visible }, options);\n        }\n\n        return this;\n    }\n\n    protected startPoly(): void\n    {\n        if (this.currentPath)\n        {\n            const points = this.currentPath.points;\n            const len = this.currentPath.points.length;\n\n            if (len > 2)\n            {\n                this.drawShape(this.currentPath);\n                this.currentPath = new Polygon();\n                this.currentPath.closeStroke = false;\n                this.currentPath.points.push(points[len - 2], points[len - 1]);\n            }\n        }\n        else\n        {\n            this.currentPath = new Polygon();\n            this.currentPath.closeStroke = false;\n        }\n    }\n\n    finishPoly(): void\n    {\n        if (this.currentPath)\n        {\n            if (this.currentPath.points.length > 2)\n            {\n                this.drawShape(this.currentPath);\n                this.currentPath = null;\n            }\n            else\n            {\n                this.currentPath.points.length = 0;\n            }\n        }\n    }\n\n    public moveTo(x: number, y: number): this\n    {\n        this.startPoly();\n        this.currentPath.points[0] = x;\n        this.currentPath.points[1] = y;\n\n        return this;\n    }\n\n    public lineTo(x: number, y: number): this\n    {\n        if (!this.currentPath)\n        {\n            this.moveTo(0, 0);\n        }\n\n        // remove duplicates..\n        const points = this.currentPath.points;\n        const fromX = points[points.length - 2];\n        const fromY = points[points.length - 1];\n\n        if (fromX !== x || fromY !== y)\n        {\n            points.push(x, y);\n        }\n\n        return this;\n    }\n\n    protected _initCurve(x = 0, y = 0): void\n    {\n        if (this.currentPath)\n        {\n            if (this.currentPath.points.length === 0)\n            {\n                this.currentPath.points = [x, y];\n            }\n        }\n        else\n        {\n            this.moveTo(x, y);\n        }\n    }\n\n    public quadraticCurveTo(cpX: number, cpY: number, toX: number, toY: number): this\n    {\n        this._initCurve();\n\n        const points = this.currentPath.points;\n\n        if (points.length === 0)\n        {\n            this.moveTo(0, 0);\n        }\n\n        QuadraticUtils.curveTo(cpX, cpY, toX, toY, points);\n\n        return this;\n    }\n\n    public bezierCurveTo(cpX: number, cpY: number, cpX2: number, cpY2: number, toX: number, toY: number): this\n    {\n        this._initCurve();\n\n        BezierUtils.curveTo(cpX, cpY, cpX2, cpY2, toX, toY, this.currentPath.points);\n\n        return this;\n    }\n\n    public arcTo(x1: number, y1: number, x2: number, y2: number, radius: number): this\n    {\n        this._initCurve(x1, y1);\n\n        const points = this.currentPath.points;\n\n        const result = ArcUtils.curveTo(x1, y1, x2, y2, radius, points);\n\n        if (result)\n        {\n            const { cx, cy, radius, startAngle, endAngle, anticlockwise } = result;\n\n            this.arc(cx, cy, radius, startAngle, endAngle, anticlockwise);\n        }\n\n        return this;\n    }\n\n    public arc(cx: number, cy: number, radius: number, startAngle: number, endAngle: number, anticlockwise = false): this\n    {\n        if (startAngle === endAngle)\n        {\n            return this;\n        }\n\n        if (!anticlockwise && endAngle <= startAngle)\n        {\n            endAngle += PI_2;\n        }\n        else if (anticlockwise && startAngle <= endAngle)\n        {\n            startAngle += PI_2;\n        }\n\n        const sweep = endAngle - startAngle;\n\n        if (sweep === 0)\n        {\n            return this;\n        }\n\n        const startX = cx + (Math.cos(startAngle) * radius);\n        const startY = cy + (Math.sin(startAngle) * radius);\n        const eps = this._geometry.closePointEps;\n\n        // If the currentPath exists, take its points. Otherwise call `moveTo` to start a path.\n        let points = this.currentPath ? this.currentPath.points : null;\n\n        if (points)\n        {\n            // TODO: make a better fix.\n\n            // We check how far our start is from the last existing point\n            const xDiff = Math.abs(points[points.length - 2] - startX);\n            const yDiff = Math.abs(points[points.length - 1] - startY);\n\n            if (xDiff < eps && yDiff < eps)\n            {\n                // If the point is very close, we don't add it, since this would lead to artifacts\n                // during tessellation due to floating point imprecision.\n            }\n            else\n            {\n                points.push(startX, startY);\n            }\n        }\n        else\n        {\n            this.moveTo(startX, startY);\n            points = this.currentPath.points;\n        }\n\n        ArcUtils.arc(startX, startY, cx, cy, radius, startAngle, endAngle, anticlockwise, points);\n\n        return this;\n    }\n\n    public beginFill(color: ColorSource = 0, alpha = 1, smooth = false): this\n    {\n        return this.beginTextureFill({ texture: Texture.WHITE, color, alpha, smooth });\n    }\n\n    private normalizeColor(options: Pick<IFillStyleOptions, 'color' | 'alpha'>): void\n    {\n        const temp = Color.shared.setValue(options.color ?? 0);\n\n        options.color = temp.toNumber();\n        options.alpha ??= temp.alpha;\n    }\n\n    beginTextureFill(options?: IFillStyleOptions): this\n    {\n        // Apply defaults\n        options = Object.assign({\n            texture: Texture.WHITE,\n            color: 0xFFFFFF,\n            alpha: 1,\n            matrix: null,\n            smooth: false,\n        }, options) as IFillStyleOptions;\n\n        this.normalizeColor(options);\n\n        if (this.currentPath)\n        {\n            this.startPoly();\n        }\n\n        const visible = options.alpha > 0;\n\n        if (!visible)\n        {\n            this._fillStyle.reset();\n        }\n        else\n        {\n            if (options.matrix)\n            {\n                options.matrix = options.matrix.clone();\n                options.matrix.invert();\n            }\n\n            Object.assign(this._fillStyle, { visible }, options);\n        }\n\n        return this;\n    }\n\n    public endFill(): this\n    {\n        this.finishPoly();\n\n        this._fillStyle.reset();\n\n        return this;\n    }\n\n    public drawRect(x: number, y: number, width: number, height: number): this\n    {\n        return this.drawShape(new Rectangle(x, y, width, height));\n    }\n\n    public drawRoundedRect(x: number, y: number, width: number, height: number, radius: number): this\n    {\n        return this.drawShape(new RoundedRectangle(x, y, width, height, radius));\n    }\n\n    public drawCircle(x: number, y: number, radius: number): this\n    {\n        return this.drawShape(new Circle(x, y, radius));\n    }\n\n    public drawEllipse(x: number, y: number, width: number, height: number): this\n    {\n        return this.drawShape(new Ellipse(x, y, width, height));\n    }\n\n    public drawPolygon(...path: Array<number> | Array<IPointData>): this;\n    public drawPolygon(path: Array<number> | Array<IPointData> | Polygon): this;\n\n    public drawPolygon(...path: any[]): this\n    {\n        let points: Array<number> | Array<IPointData>;\n        let closeStroke = true;// !!this._fillStyle;\n\n        const poly = path[0] as Polygon;\n\n        // check if data has points..\n        if (poly.points)\n        {\n            closeStroke = poly.closeStroke;\n            points = poly.points;\n        }\n        else if (Array.isArray(path[0]))\n        {\n            points = path[0];\n        }\n        else\n        {\n            points = path;\n        }\n\n        const shape = new Polygon(points);\n\n        shape.closeStroke = closeStroke;\n\n        this.drawShape(shape);\n\n        return this;\n    }\n\n    public drawShape(shape: IShape): this\n    {\n        if (!this._holeMode)\n        {\n            this._geometry.drawShape(\n                shape,\n                this._fillStyle.clone(),\n                this._lineStyle.clone(),\n                this._matrix\n            );\n        }\n        else\n        {\n            this._geometry.drawHole(shape, this._matrix);\n        }\n\n        return this;\n    }\n\n    public clear(): this\n    {\n        this._geometry.clear();\n        this._lineStyle.reset();\n        this._fillStyle.reset();\n\n        this._boundsID++;\n        this._matrix = null;\n        this._holeMode = false;\n        this.currentPath = null;\n\n        return this;\n    }\n\n    public isFastRect(): boolean\n    {\n        const data = this._geometry.graphicsData;\n\n        return data.length === 1\n            && data[0].shape.type === SHAPES.RECT\n            && !data[0].matrix\n            && !data[0].holes.length\n            && !(data[0].lineStyle.visible && data[0].lineStyle.width);\n    }\n\n    protected _renderCanvas(renderer: any): void\n    {\n        (UnsmoothGraphics.prototype as any)._renderCanvas.call(this, renderer);\n    }\n\n    protected _render(renderer: Renderer): void\n    {\n        this.finishPoly();\n\n        const geometry = this._geometry;\n        const hasuint32 = renderer.context.supports.uint32Indices;\n        // batch part..\n        // batch it!\n\n        geometry.checkInstancing(renderer.geometry.hasInstance, hasuint32);\n\n        geometry.updateBatches(this.shaderSettings);\n\n        if (geometry.batchable)\n        {\n            if (this.batchDirty !== geometry.batchDirty)\n            {\n                this._populateBatches();\n            }\n\n            this._renderBatched(renderer);\n        }\n        else\n        {\n            // no batching...\n            renderer.batch.flush();\n\n            this._renderDirect(renderer);\n        }\n    }\n\n    protected _populateBatches(): void\n    {\n        const geometry = this._geometry;\n        const blendMode = this.blendMode;\n        const len = geometry.batches.length;\n\n        this.batchTint = -1;\n        this._transformID = -1;\n        this.batchDirty = geometry.batchDirty;\n        this.batches.length = len;\n\n        this.vertexData = new Float32Array(geometry.points);\n\n        for (let i = 0; i < len; i++)\n        {\n            const gI = geometry.batches[i];\n            const color = gI.style.color;\n            const vertexData = new Float32Array(this.vertexData.buffer,\n                gI.attribStart * 4 * 2,\n                gI.attribSize * 2);\n\n            // const uvs = new Float32Array(geometry.uvsFloat32.buffer,\n            //     gI.attribStart * 4 * 2,\n            //     gI.attribSize * 2);\n\n            // const indices = new Uint16Array(geometry.indicesUint16.buffer,\n            //     gI.start * 2,\n            //     gI.size);\n\n            const batch = {\n                vertexData,\n                blendMode,\n                // indices,\n                // uvs,\n                _batchRGB: utils.hex2rgb(color) as Array<number>,\n                _tintRGB: color,\n                _texture: gI.style.texture,\n                alpha: gI.style.alpha,\n                worldAlpha: 1\n            };\n\n            this.batches[i] = batch;\n        }\n    }\n\n    protected _renderBatched(renderer: Renderer): void\n    {\n        if (!this.batches.length)\n        {\n            return;\n        }\n\n        renderer.batch.setObjectRenderer(renderer.plugins[this.pluginName]);\n\n        this.calculateVertices();\n        this.calculateTints();\n\n        for (let i = 0, l = this.batches.length; i < l; i++)\n        {\n            const batch = this.batches[i];\n\n            batch.worldAlpha = this.worldAlpha * batch.alpha;\n\n            renderer.plugins[this.pluginName].render(batch);\n        }\n    }\n\n    protected _renderDirect(renderer: Renderer): void\n    {\n        const directShader = this._resolveDirectShader(renderer);\n        let shader: Shader = directShader;\n\n        const geometry = this._geometry;\n        const worldAlpha = this.worldAlpha;\n        const uniforms = shader.uniforms;\n        const drawCalls = geometry.drawCalls;\n\n        // lets set the transfomr\n        uniforms.translationMatrix = this.transform.worldTransform;\n\n        // and then lets set the tint..\n        Color.shared.setValue(this._tintColor)\n            .premultiply(worldAlpha)\n            .toArray(uniforms.tint);\n\n        uniforms.resolution = renderer.renderTexture.current\n            ? renderer.renderTexture.current.resolution : renderer.resolution;\n\n        const projTrans = renderer.projection.transform;\n\n        if (projTrans)\n        {\n            // only uniform scale is supported!\n            const scale = Math.sqrt((projTrans.a * projTrans.a) + (projTrans.b * projTrans.b));\n\n            uniforms.resolution *= scale;\n        }\n\n        const multisample = renderer.renderTexture.current\n            ? renderer.renderTexture.current.multisample : renderer.multisample;\n\n        uniforms.expand = (multisample !== MSAA_QUALITY.NONE ? 2 : 1) / uniforms.resolution;\n\n        // the first draw call, we can set the uniforms of the shader directly here.\n\n        // this means that we can tack advantage of the sync function of pixi!\n        // bind and sync uniforms..\n        // there is a way to optimise this..\n        renderer.shader.bind(shader);\n        renderer.geometry.bind(geometry, shader);\n\n        // set state..\n        renderer.state.set(this.state);\n\n        shader = null;\n        // then render the rest of them...\n        for (let i = 0, l = drawCalls.length; i < l; i++)\n        {\n            // TODO: refactor it to another class, that fills uniforms of this shader\n            const drawCall = geometry.drawCalls[i];\n\n            const shaderChange = shader !== drawCall.shader;\n\n            if (shaderChange)\n            {\n                shader = drawCall.shader;\n                if (shader)\n                {\n                    shader.uniforms.translationMatrix = this.transform.worldTransform;\n                    if (shader.uniforms.tint)\n                    {\n                        shader.uniforms.tint[0] = uniforms.tint[0];\n                        shader.uniforms.tint[1] = uniforms.tint[1];\n                        shader.uniforms.tint[2] = uniforms.tint[2];\n                        shader.uniforms.tint[3] = uniforms.tint[3];\n                    }\n                }\n            }\n\n            const { texArray, styleArray, size, start } = drawCall;\n            const groupTextureCount = texArray.count;\n            const shaderHere = shader || directShader;\n\n            const texs = shaderHere.uniforms.styleTextureId;\n            const mats = shaderHere.uniforms.styleMatrix;\n            const lines = shaderHere.uniforms.styleLine;\n\n            for (let i = 0; i < styleArray.count; i++)\n            {\n                texs[i] = styleArray.textureIds[i];\n                lines[i * 2] = styleArray.lines[i * 2];\n                lines[(i * 2) + 1] = styleArray.lines[(i * 2) + 1];\n                const m = styleArray.matrices[i];\n\n                mats[i * 6] = m.a;\n                mats[(i * 6) + 1] = m.c;\n                mats[(i * 6) + 2] = m.tx;\n                mats[(i * 6) + 3] = m.b;\n                mats[(i * 6) + 4] = m.d;\n                mats[(i * 6) + 5] = m.ty;\n            }\n            const sizes = shaderHere.uniforms.samplerSize;\n\n            for (let i = 0; i < groupTextureCount; i++)\n            {\n                sizes[i * 2] = texArray.elements[i].width;\n                sizes[(i * 2) + 1] = texArray.elements[i].height;\n            }\n\n            renderer.shader.bind(shaderHere);\n            if (shaderChange)\n            {\n                renderer.geometry.bind(geometry);\n            }\n\n            // TODO: bind styles!\n            for (let j = 0; j < groupTextureCount; j++)\n            {\n                renderer.texture.bind(texArray.elements[j], j);\n            }\n\n            // bind the geometry...\n            renderer.geometry.draw(DRAW_MODES.TRIANGLES, size, start);\n        }\n    }\n\n    protected _resolveDirectShader(_renderer: Renderer): Shader\n    {\n        let shader = this.shader;\n\n        const pluginName = this.pluginName;\n\n        if (!shader)\n        {\n            if (!DEFAULT_SHADERS[pluginName])\n            {\n                DEFAULT_SHADERS[pluginName] = new SmoothGraphicsShader(this.shaderSettings);\n            }\n            shader = DEFAULT_SHADERS[pluginName];\n        }\n\n        return shader;\n    }\n\n    protected _calculateBounds(): void\n    {\n        this.finishPoly();\n\n        const geometry = this._geometry;\n\n        // skipping when graphics is empty, like a container\n        if (!geometry.graphicsData.length)\n        {\n            return;\n        }\n\n        const { minX, minY, maxX, maxY } = geometry.bounds;\n\n        this._bounds.addFrame(this.transform, minX, minY, maxX, maxY);\n    }\n\n    public containsPoint(point: IPointData): boolean\n    {\n        this.worldTransform.applyInverse(point, SmoothGraphics._TEMP_POINT);\n\n        return this._geometry.containsPoint(SmoothGraphics._TEMP_POINT);\n    }\n\n    protected calculateTints(): void\n    {\n        if (this.batchTint !== this.tint)\n        {\n            this.batchTint = this._tintColor.toNumber();\n\n            for (let i = 0; i < this.batches.length; i++)\n            {\n                const batch = this.batches[i];\n\n                batch._tintRGB = Color.shared\n                    .setValue(this._tintColor)\n                    .multiply(batch._batchRGB)\n                    .toLittleEndianNumber();\n            }\n        }\n    }\n\n    protected calculateVertices(): void\n    {\n        const wtID = this.transform._worldID;\n\n        if (this._transformID === wtID)\n        {\n            return;\n        }\n\n        this._transformID = wtID;\n\n        const wt = this.transform.worldTransform;\n        const a = wt.a;\n        const b = wt.b;\n        const c = wt.c;\n        const d = wt.d;\n        const tx = wt.tx;\n        const ty = wt.ty;\n\n        const data = this._geometry.points;// batch.vertexDataOriginal;\n        const vertexData = this.vertexData;\n\n        let count = 0;\n\n        for (let i = 0; i < data.length; i += 2)\n        {\n            const x = data[i];\n            const y = data[i + 1];\n\n            vertexData[count++] = (a * x) + (c * y) + tx;\n            vertexData[count++] = (d * y) + (b * x) + ty;\n        }\n    }\n\n    public closePath(): this\n    {\n        const currentPath = this.currentPath;\n\n        if (currentPath)\n        {\n            // we don't need to add extra point in the end because buildLine will take care of that\n            currentPath.closeStroke = true;\n        }\n\n        return this;\n    }\n\n    public setMatrix(matrix: Matrix): this\n    {\n        this._matrix = matrix;\n\n        return this;\n    }\n\n    public beginHole(): this\n    {\n        this.finishPoly();\n        this._holeMode = true;\n\n        return this;\n    }\n\n    public endHole(): this\n    {\n        this.finishPoly();\n        this._holeMode = false;\n\n        return this;\n    }\n\n    public destroy(options?: IDestroyOptions | boolean): void\n    {\n        this._geometry.refCount--;\n        if (this._geometry.refCount === 0)\n        {\n            this._geometry.dispose();\n        }\n\n        this._matrix = null;\n        this.currentPath = null;\n        this._lineStyle.destroy();\n        this._lineStyle = null;\n        this._fillStyle.destroy();\n        this._fillStyle = null;\n        this._geometry = null;\n        this.shader = null;\n        this.vertexData = null;\n        this.batches.length = 0;\n        this.batches = null;\n\n        super.destroy(options);\n    }\n}\n"],"names":["radius","i"],"mappings":"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"}