{"version":3,"file":"buildContextBatches.mjs","sources":["../../../../../src/scene/graphics/shared/utils/buildContextBatches.ts"],"sourcesContent":["import { extensions, ExtensionType } from '../../../../extensions/Extensions';\nimport { Matrix } from '../../../../maths/matrix/Matrix';\nimport { Rectangle } from '../../../../maths/shapes/Rectangle';\nimport { buildSimpleUvs, buildUvs } from '../../../../rendering/renderers/shared/geometry/utils/buildUvs';\nimport { transformVertices } from '../../../../rendering/renderers/shared/geometry/utils/transformVertices';\nimport { Texture } from '../../../../rendering/renderers/shared/texture/Texture';\nimport { BigPool } from '../../../../utils/pool/PoolGroup';\nimport { BatchableGraphics } from '../BatchableGraphics';\nimport { buildCircle, buildEllipse, buildRoundedRectangle } from '../buildCommands/buildCircle';\nimport { buildLine } from '../buildCommands/buildLine';\nimport { buildPixelLine } from '../buildCommands/buildPixelLine';\nimport { buildPolygon } from '../buildCommands/buildPolygon';\nimport { buildRectangle } from '../buildCommands/buildRectangle';\nimport { buildTriangle } from '../buildCommands/buildTriangle';\nimport { generateTextureMatrix as generateTextureFillMatrix } from './generateTextureFillMatrix';\nimport { triangulateWithHoles } from './triangulateWithHoles';\n\nimport type { Polygon } from '../../../../maths/shapes/Polygon';\nimport type { Topology } from '../../../../rendering/renderers/shared/geometry/const';\nimport type { ShapeBuildCommand } from '../buildCommands/ShapeBuildCommand';\nimport type { ConvertedFillStyle, ConvertedStrokeStyle } from '../FillTypes';\nimport type { GraphicsContext, TextureInstruction } from '../GraphicsContext';\nimport type { GpuGraphicsContext } from '../GraphicsContextSystem';\nimport type { ShapePath, ShapePrimitiveWithHoles } from '../path/ShapePath';\n\n/**\n * A record of shape builders, keyed by shape type.\n * @category scene\n * @advanced\n */\nexport const shapeBuilders: Record<string, ShapeBuildCommand> = {};\n\nextensions.handleByMap(ExtensionType.ShapeBuilder, shapeBuilders);\nextensions.add(buildRectangle, buildPolygon, buildTriangle, buildCircle, buildEllipse, buildRoundedRectangle);\n\nconst tempRect = new Rectangle();\nconst tempTextureMatrix = new Matrix();\n\n/**\n * @param context\n * @param gpuContext\n * @internal\n */\nexport function buildContextBatches(context: GraphicsContext, gpuContext: GpuGraphicsContext)\n{\n    const { geometryData, batches } = gpuContext;\n\n    // reset them..\n    batches.length = 0;\n    geometryData.indices.length = 0;\n    geometryData.vertices.length = 0;\n    geometryData.uvs.length = 0;\n\n    for (let i = 0; i < context.instructions.length; i++)\n    {\n        const instruction = context.instructions[i];\n\n        if (instruction.action === 'texture')\n        {\n            // add a quad!\n            addTextureToGeometryData(instruction.data, batches, geometryData);\n        }\n        else if (instruction.action === 'fill' || instruction.action === 'stroke')\n        {\n            const isStroke = instruction.action === 'stroke';\n\n            // build path collection of polys and shapes points..\n            const shapePath = instruction.data.path.shapePath;\n\n            const style = instruction.data.style;\n\n            const hole = instruction.data.hole;\n\n            if (isStroke && hole)\n            {\n                addShapePathToGeometryData(hole.shapePath, style, true, batches, geometryData);\n            }\n\n            if (hole)\n            {\n                // add the holes to the last shape primitive\n                shapePath.shapePrimitives[shapePath.shapePrimitives.length - 1].holes = hole.shapePath.shapePrimitives;\n            }\n\n            addShapePathToGeometryData(shapePath, style, isStroke, batches, geometryData);\n        }\n    }\n}\n\nfunction addTextureToGeometryData(\n    data: TextureInstruction['data'],\n    batches: BatchableGraphics[],\n    geometryData: {\n        vertices: number[];\n        uvs: number[];\n        indices: number[];\n    }\n)\n{\n    const points: number[] = [];\n\n    const build = shapeBuilders.rectangle;\n\n    const rect = tempRect;\n\n    rect.x = data.dx;\n    rect.y = data.dy;\n    rect.width = data.dw;\n    rect.height = data.dh;\n\n    const matrix = data.transform;\n\n    // TODO - this can be cached...\n    if (!build.build(rect, points))\n    {\n        return;\n    }\n\n    const { vertices, uvs, indices } = geometryData;\n\n    const indexOffset = indices.length;\n    const vertOffset = vertices.length / 2;\n\n    if (matrix)\n    {\n        transformVertices(points, matrix);\n    }\n\n    build.triangulate(points, vertices, 2, vertOffset, indices, indexOffset);\n\n    const texture = data.image;\n    const textureUvs = texture.uvs;\n\n    uvs.push(\n        textureUvs.x0, textureUvs.y0,\n        textureUvs.x1, textureUvs.y1,\n        textureUvs.x3, textureUvs.y3,\n        textureUvs.x2, textureUvs.y2,\n    );\n\n    const graphicsBatch = BigPool.get(BatchableGraphics);\n\n    graphicsBatch.indexOffset = indexOffset;\n    graphicsBatch.indexSize = indices.length - indexOffset;\n\n    graphicsBatch.attributeOffset = vertOffset;\n    graphicsBatch.attributeSize = (vertices.length / 2) - vertOffset;\n\n    graphicsBatch.baseColor = data.style;\n    graphicsBatch.alpha = data.alpha;\n\n    graphicsBatch.texture = texture;\n    graphicsBatch.geometryData = geometryData;\n\n    batches.push(graphicsBatch);\n}\n\nfunction addShapePathToGeometryData(\n    shapePath: ShapePath,\n    style: ConvertedFillStyle | ConvertedStrokeStyle,\n    isStroke: boolean,\n    batches: BatchableGraphics[],\n    geometryData: {\n        vertices: number[];\n        uvs: number[];\n        indices: number[];\n    }\n)\n{\n    const { vertices, uvs, indices } = geometryData;\n\n    shapePath.shapePrimitives.forEach(({ shape, transform: matrix, holes }) =>\n    {\n        const points: number[] = [];\n        const build = shapeBuilders[shape.type];\n        // TODO - this can be cached...\n        // TODO - THIS IS DONE TWICE!!!!!!\n        // ONCE FOR STROKE AND ONCE FOR FILL\n        // move to the ShapePath2D class itself?\n\n        if (!build.build(shape, points))\n        {\n            return;\n        }\n\n        const indexOffset = indices.length;\n        const vertOffset = vertices.length / 2;\n        let topology: Topology = 'triangle-list';\n\n        if (matrix)\n        {\n            transformVertices(points, matrix);\n        }\n\n        if (!isStroke)\n        {\n            if (holes)\n            {\n                const holeIndices: number[] = [];\n\n                const otherPoints = points.slice();\n\n                const holeArrays = getHoleArrays(holes);\n\n                holeArrays.forEach((holePoints) =>\n                {\n                    holeIndices.push(otherPoints.length / 2);\n                    otherPoints.push(...holePoints);\n                });\n\n                triangulateWithHoles(otherPoints, holeIndices, vertices, 2, vertOffset, indices, indexOffset);\n            }\n            else\n            {\n                build.triangulate(points, vertices, 2, vertOffset, indices, indexOffset);\n            }\n        }\n        else\n        {\n            const close = (shape as Polygon).closePath ?? true;\n            const lineStyle = style as ConvertedStrokeStyle;\n\n            if (!lineStyle.pixelLine)\n            {\n                buildLine(points, lineStyle, false, close, vertices, indices);\n            }\n            else\n            {\n                buildPixelLine(points, close, vertices, indices);\n                topology = 'line-list';\n            }\n        }\n\n        const uvsOffset = uvs.length / 2;\n\n        const texture = style.texture;\n\n        if (texture !== Texture.WHITE)\n        {\n            const textureMatrix = generateTextureFillMatrix(tempTextureMatrix, style, shape, matrix);\n\n            buildUvs(vertices, 2, vertOffset, uvs, uvsOffset, 2, (vertices.length / 2) - vertOffset, textureMatrix);\n        }\n        else\n        {\n            buildSimpleUvs(uvs, uvsOffset, 2, (vertices.length / 2) - vertOffset);\n        }\n\n        const graphicsBatch = BigPool.get(BatchableGraphics);\n\n        graphicsBatch.indexOffset = indexOffset;\n        graphicsBatch.indexSize = indices.length - indexOffset;\n\n        graphicsBatch.attributeOffset = vertOffset;\n        graphicsBatch.attributeSize = (vertices.length / 2) - vertOffset;\n\n        graphicsBatch.baseColor = style.color;\n        graphicsBatch.alpha = style.alpha;\n\n        graphicsBatch.texture = texture;\n        graphicsBatch.geometryData = geometryData;\n        graphicsBatch.topology = topology;\n\n        batches.push(graphicsBatch);\n    });\n}\n\nfunction getHoleArrays(holePrimitives: ShapePrimitiveWithHoles[])\n{\n    const holeArrays = [];\n\n    for (let k = 0; k < holePrimitives.length; k++)\n    {\n        const holePrimitive = holePrimitives[k].shape;\n\n        // TODO - need to transform the points via there transform here..\n        const holePoints: number[] = [];\n\n        const holeBuilder = shapeBuilders[holePrimitive.type] as ShapeBuildCommand;\n\n        if (holeBuilder.build(holePrimitive, holePoints))\n        {\n            holeArrays.push(holePoints);\n        }\n    }\n\n    return holeArrays;\n}\n"],"names":["generateTextureFillMatrix"],"mappings":"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"}