1 line
14 KiB
Plaintext
1 line
14 KiB
Plaintext
{"version":3,"file":"buildContextBatches.mjs","sources":["../../../../../src/scene/graphics/shared/utils/buildContextBatches.ts"],"sourcesContent":["import { extensions, ExtensionType } from '../../../../extensions/Extensions';\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 { buildPolygon } from '../buildCommands/buildPolygon';\nimport { buildRectangle } from '../buildCommands/buildRectangle';\nimport { buildTriangle } from '../buildCommands/buildTriangle';\nimport { triangulateWithHoles } from './triangulateWithHoles';\n\nimport type { Polygon } from '../../../../maths/shapes/Polygon';\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 { GraphicsPath } from '../path/GraphicsPath';\nimport type { ShapePath } from '../path/ShapePath';\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();\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, null, true, batches, geometryData);\n }\n\n addShapePathToGeometryData(shapePath, style, hole, 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 { vertices, uvs, indices } = geometryData;\n\n const indexOffset = indices.length;\n const vertOffset = vertices.length / 2;\n\n const points: number[] = [];\n\n const build = shapeBuilders.rectangle;\n\n const rect = tempRect;\n\n const texture = data.image;\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 build.build(rect, points);\n\n if (matrix)\n {\n transformVertices(points, matrix);\n }\n\n build.triangulate(points, vertices, 2, vertOffset, indices, indexOffset);\n\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 hole: GraphicsPath,\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 const lastIndex = shapePath.shapePrimitives.length - 1;\n\n shapePath.shapePrimitives.forEach(({ shape, transform: matrix }, i) =>\n {\n const indexOffset = indices.length;\n const vertOffset = vertices.length / 2;\n\n const points: number[] = [];\n\n const build = shapeBuilders[shape.type];\n\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 build.build(shape, points);\n\n if (matrix)\n {\n transformVertices(points, matrix);\n }\n\n if (!isStroke)\n {\n if (hole && lastIndex === i)\n {\n if (lastIndex !== 0)\n {\n console.warn('[Pixi Graphics] only the last shape have be cut out');\n }\n\n const holeIndices: number[] = [];\n\n const otherPoints = points.slice();\n\n const holeArrays = getHoleArrays(hole.shapePath);\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 buildLine(points, lineStyle, false, close, vertices, 2, vertOffset, indices, indexOffset);\n }\n\n const uvsOffset = uvs.length / 2;\n\n const texture = style.texture;\n\n if (texture !== Texture.WHITE)\n {\n const textureMatrix = style.matrix;\n\n if (textureMatrix)\n {\n // todo can prolly do this before calculating uvs..\n if (matrix)\n {\n textureMatrix.append(matrix.clone().invert());\n }\n\n buildUvs(vertices, 2, vertOffset, uvs, uvsOffset, 2, (vertices.length / 2) - vertOffset, textureMatrix);\n }\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\n batches.push(graphicsBatch);\n });\n}\n\nfunction getHoleArrays(shape: ShapePath)\n{\n if (!shape) return [];\n\n const holePrimitives = shape.shapePrimitives;\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 holeBuilder.build(holePrimitive, holePoints);\n\n holeArrays.push(holePoints);\n }\n\n return holeArrays;\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;AAsBO,MAAM,gBAAmD,GAAC;AAEjE,UAAW,CAAA,WAAA,CAAY,aAAc,CAAA,YAAA,EAAc,aAAa,CAAA,CAAA;AAChE,UAAA,CAAW,IAAI,cAAgB,EAAA,YAAA,EAAc,aAAe,EAAA,WAAA,EAAa,cAAc,qBAAqB,CAAA,CAAA;AAE5G,MAAM,QAAA,GAAW,IAAI,SAAU,EAAA,CAAA;AAEf,SAAA,mBAAA,CAAoB,SAA0B,UAC9D,EAAA;AACI,EAAM,MAAA,EAAE,YAAc,EAAA,OAAA,EAAY,GAAA,UAAA,CAAA;AAGlC,EAAA,OAAA,CAAQ,MAAS,GAAA,CAAA,CAAA;AACjB,EAAA,YAAA,CAAa,QAAQ,MAAS,GAAA,CAAA,CAAA;AAC9B,EAAA,YAAA,CAAa,SAAS,MAAS,GAAA,CAAA,CAAA;AAC/B,EAAA,YAAA,CAAa,IAAI,MAAS,GAAA,CAAA,CAAA;AAE1B,EAAA,KAAA,IAAS,IAAI,CAAG,EAAA,CAAA,GAAI,OAAQ,CAAA,YAAA,CAAa,QAAQ,CACjD,EAAA,EAAA;AACI,IAAM,MAAA,WAAA,GAAc,OAAQ,CAAA,YAAA,CAAa,CAAC,CAAA,CAAA;AAE1C,IAAI,IAAA,WAAA,CAAY,WAAW,SAC3B,EAAA;AAEI,MAAyB,wBAAA,CAAA,WAAA,CAAY,IAAM,EAAA,OAAA,EAAS,YAAY,CAAA,CAAA;AAAA,eAE3D,WAAY,CAAA,MAAA,KAAW,MAAU,IAAA,WAAA,CAAY,WAAW,QACjE,EAAA;AACI,MAAM,MAAA,QAAA,GAAW,YAAY,MAAW,KAAA,QAAA,CAAA;AAGxC,MAAM,MAAA,SAAA,GAAY,WAAY,CAAA,IAAA,CAAK,IAAK,CAAA,SAAA,CAAA;AAExC,MAAM,MAAA,KAAA,GAAQ,YAAY,IAAK,CAAA,KAAA,CAAA;AAE/B,MAAM,MAAA,IAAA,GAAO,YAAY,IAAK,CAAA,IAAA,CAAA;AAE9B,MAAA,IAAI,YAAY,IAChB,EAAA;AACI,QAAA,0BAAA,CAA2B,KAAK,SAAW,EAAA,KAAA,EAAO,IAAM,EAAA,IAAA,EAAM,SAAS,YAAY,CAAA,CAAA;AAAA,OACvF;AAEA,MAAA,0BAAA,CAA2B,SAAW,EAAA,KAAA,EAAO,IAAM,EAAA,QAAA,EAAU,SAAS,YAAY,CAAA,CAAA;AAAA,KACtF;AAAA,GACJ;AACJ,CAAA;AAEA,SAAS,wBAAA,CACL,IACA,EAAA,OAAA,EACA,YAMJ,EAAA;AACI,EAAA,MAAM,EAAE,QAAA,EAAU,GAAK,EAAA,OAAA,EAAY,GAAA,YAAA,CAAA;AAEnC,EAAA,MAAM,cAAc,OAAQ,CAAA,MAAA,CAAA;AAC5B,EAAM,MAAA,UAAA,GAAa,SAAS,MAAS,GAAA,CAAA,CAAA;AAErC,EAAA,MAAM,SAAmB,EAAC,CAAA;AAE1B,EAAA,MAAM,QAAQ,aAAc,CAAA,SAAA,CAAA;AAE5B,EAAA,MAAM,IAAO,GAAA,QAAA,CAAA;AAEb,EAAA,MAAM,UAAU,IAAK,CAAA,KAAA,CAAA;AAErB,EAAA,IAAA,CAAK,IAAI,IAAK,CAAA,EAAA,CAAA;AACd,EAAA,IAAA,CAAK,IAAI,IAAK,CAAA,EAAA,CAAA;AACd,EAAA,IAAA,CAAK,QAAQ,IAAK,CAAA,EAAA,CAAA;AAClB,EAAA,IAAA,CAAK,SAAS,IAAK,CAAA,EAAA,CAAA;AAEnB,EAAA,MAAM,SAAS,IAAK,CAAA,SAAA,CAAA;AAGpB,EAAM,KAAA,CAAA,KAAA,CAAM,MAAM,MAAM,CAAA,CAAA;AAExB,EAAA,IAAI,MACJ,EAAA;AACI,IAAA,iBAAA,CAAkB,QAAQ,MAAM,CAAA,CAAA;AAAA,GACpC;AAEA,EAAA,KAAA,CAAM,YAAY,MAAQ,EAAA,QAAA,EAAU,CAAG,EAAA,UAAA,EAAY,SAAS,WAAW,CAAA,CAAA;AAEvE,EAAA,MAAM,aAAa,OAAQ,CAAA,GAAA,CAAA;AAE3B,EAAI,GAAA,CAAA,IAAA;AAAA,IACA,UAAW,CAAA,EAAA;AAAA,IAAI,UAAW,CAAA,EAAA;AAAA,IAC1B,UAAW,CAAA,EAAA;AAAA,IAAI,UAAW,CAAA,EAAA;AAAA,IAC1B,UAAW,CAAA,EAAA;AAAA,IAAI,UAAW,CAAA,EAAA;AAAA,IAC1B,UAAW,CAAA,EAAA;AAAA,IAAI,UAAW,CAAA,EAAA;AAAA,GAC9B,CAAA;AAEA,EAAM,MAAA,aAAA,GAAgB,OAAQ,CAAA,GAAA,CAAI,iBAAiB,CAAA,CAAA;AAEnD,EAAA,aAAA,CAAc,WAAc,GAAA,WAAA,CAAA;AAC5B,EAAc,aAAA,CAAA,SAAA,GAAY,QAAQ,MAAS,GAAA,WAAA,CAAA;AAE3C,EAAA,aAAA,CAAc,eAAkB,GAAA,UAAA,CAAA;AAChC,EAAc,aAAA,CAAA,aAAA,GAAiB,QAAS,CAAA,MAAA,GAAS,CAAK,GAAA,UAAA,CAAA;AAEtD,EAAA,aAAA,CAAc,YAAY,IAAK,CAAA,KAAA,CAAA;AAC/B,EAAA,aAAA,CAAc,QAAQ,IAAK,CAAA,KAAA,CAAA;AAE3B,EAAA,aAAA,CAAc,OAAU,GAAA,OAAA,CAAA;AACxB,EAAA,aAAA,CAAc,YAAe,GAAA,YAAA,CAAA;AAE7B,EAAA,OAAA,CAAQ,KAAK,aAAa,CAAA,CAAA;AAC9B,CAAA;AAEA,SAAS,2BACL,SACA,EAAA,KAAA,EACA,IACA,EAAA,QAAA,EACA,SACA,YAMJ,EAAA;AACI,EAAA,MAAM,EAAE,QAAA,EAAU,GAAK,EAAA,OAAA,EAAY,GAAA,YAAA,CAAA;AACnC,EAAM,MAAA,SAAA,GAAY,SAAU,CAAA,eAAA,CAAgB,MAAS,GAAA,CAAA,CAAA;AAErD,EAAU,SAAA,CAAA,eAAA,CAAgB,QAAQ,CAAC,EAAE,OAAO,SAAW,EAAA,MAAA,IAAU,CACjE,KAAA;AACI,IAAA,MAAM,cAAc,OAAQ,CAAA,MAAA,CAAA;AAC5B,IAAM,MAAA,UAAA,GAAa,SAAS,MAAS,GAAA,CAAA,CAAA;AAErC,IAAA,MAAM,SAAmB,EAAC,CAAA;AAE1B,IAAM,MAAA,KAAA,GAAQ,aAAc,CAAA,KAAA,CAAM,IAAI,CAAA,CAAA;AAMtC,IAAM,KAAA,CAAA,KAAA,CAAM,OAAO,MAAM,CAAA,CAAA;AAEzB,IAAA,IAAI,MACJ,EAAA;AACI,MAAA,iBAAA,CAAkB,QAAQ,MAAM,CAAA,CAAA;AAAA,KACpC;AAEA,IAAA,IAAI,CAAC,QACL,EAAA;AACI,MAAI,IAAA,IAAA,IAAQ,cAAc,CAC1B,EAAA;AACI,QAAA,IAAI,cAAc,CAClB,EAAA;AACI,UAAA,OAAA,CAAQ,KAAK,qDAAqD,CAAA,CAAA;AAAA,SACtE;AAEA,QAAA,MAAM,cAAwB,EAAC,CAAA;AAE/B,QAAM,MAAA,WAAA,GAAc,OAAO,KAAM,EAAA,CAAA;AAEjC,QAAM,MAAA,UAAA,GAAa,aAAc,CAAA,IAAA,CAAK,SAAS,CAAA,CAAA;AAE/C,QAAW,UAAA,CAAA,OAAA,CAAQ,CAAC,UACpB,KAAA;AACI,UAAY,WAAA,CAAA,IAAA,CAAK,WAAY,CAAA,MAAA,GAAS,CAAC,CAAA,CAAA;AACvC,UAAY,WAAA,CAAA,IAAA,CAAK,GAAG,UAAU,CAAA,CAAA;AAAA,SACjC,CAAA,CAAA;AAED,QAAA,oBAAA,CAAqB,aAAa,WAAa,EAAA,QAAA,EAAU,CAAG,EAAA,UAAA,EAAY,SAAS,WAAW,CAAA,CAAA;AAAA,OAGhG,MAAA;AACI,QAAA,KAAA,CAAM,YAAY,MAAQ,EAAA,QAAA,EAAU,CAAG,EAAA,UAAA,EAAY,SAAS,WAAW,CAAA,CAAA;AAAA,OAC3E;AAAA,KAGJ,MAAA;AACI,MAAM,MAAA,KAAA,GAAS,MAAkB,SAAa,IAAA,IAAA,CAAA;AAC9C,MAAA,MAAM,SAAY,GAAA,KAAA,CAAA;AAElB,MAAU,SAAA,CAAA,MAAA,EAAQ,WAAW,KAAO,EAAA,KAAA,EAAO,UAAU,CAAG,EAAA,UAAA,EAAY,SAAS,WAAW,CAAA,CAAA;AAAA,KAC5F;AAEA,IAAM,MAAA,SAAA,GAAY,IAAI,MAAS,GAAA,CAAA,CAAA;AAE/B,IAAA,MAAM,UAAU,KAAM,CAAA,OAAA,CAAA;AAEtB,IAAI,IAAA,OAAA,KAAY,QAAQ,KACxB,EAAA;AACI,MAAA,MAAM,gBAAgB,KAAM,CAAA,MAAA,CAAA;AAE5B,MAAA,IAAI,aACJ,EAAA;AAEI,QAAA,IAAI,MACJ,EAAA;AACI,UAAA,aAAA,CAAc,MAAO,CAAA,MAAA,CAAO,KAAM,EAAA,CAAE,QAAQ,CAAA,CAAA;AAAA,SAChD;AAEA,QAAS,QAAA,CAAA,QAAA,EAAU,CAAG,EAAA,UAAA,EAAY,GAAK,EAAA,SAAA,EAAW,GAAI,QAAS,CAAA,MAAA,GAAS,CAAK,GAAA,UAAA,EAAY,aAAa,CAAA,CAAA;AAAA,OAC1G;AAAA,KAGJ,MAAA;AACI,MAAA,cAAA,CAAe,KAAK,SAAW,EAAA,CAAA,EAAI,QAAS,CAAA,MAAA,GAAS,IAAK,UAAU,CAAA,CAAA;AAAA,KACxE;AAEA,IAAM,MAAA,aAAA,GAAgB,OAAQ,CAAA,GAAA,CAAI,iBAAiB,CAAA,CAAA;AAEnD,IAAA,aAAA,CAAc,WAAc,GAAA,WAAA,CAAA;AAC5B,IAAc,aAAA,CAAA,SAAA,GAAY,QAAQ,MAAS,GAAA,WAAA,CAAA;AAE3C,IAAA,aAAA,CAAc,eAAkB,GAAA,UAAA,CAAA;AAChC,IAAc,aAAA,CAAA,aAAA,GAAiB,QAAS,CAAA,MAAA,GAAS,CAAK,GAAA,UAAA,CAAA;AAEtD,IAAA,aAAA,CAAc,YAAY,KAAM,CAAA,KAAA,CAAA;AAChC,IAAA,aAAA,CAAc,QAAQ,KAAM,CAAA,KAAA,CAAA;AAE5B,IAAA,aAAA,CAAc,OAAU,GAAA,OAAA,CAAA;AACxB,IAAA,aAAA,CAAc,YAAe,GAAA,YAAA,CAAA;AAE7B,IAAA,OAAA,CAAQ,KAAK,aAAa,CAAA,CAAA;AAAA,GAC7B,CAAA,CAAA;AACL,CAAA;AAEA,SAAS,cAAc,KACvB,EAAA;AACI,EAAA,IAAI,CAAC,KAAA;AAAO,IAAA,OAAO,EAAC,CAAA;AAEpB,EAAA,MAAM,iBAAiB,KAAM,CAAA,eAAA,CAAA;AAE7B,EAAA,MAAM,aAAa,EAAC,CAAA;AAEpB,EAAA,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAI,GAAA,cAAA,CAAe,QAAQ,CAC3C,EAAA,EAAA;AACI,IAAM,MAAA,aAAA,GAAgB,cAAe,CAAA,CAAC,CAAE,CAAA,KAAA,CAAA;AAGxC,IAAA,MAAM,aAAuB,EAAC,CAAA;AAE9B,IAAM,MAAA,WAAA,GAAc,aAAc,CAAA,aAAA,CAAc,IAAI,CAAA,CAAA;AAEpD,IAAY,WAAA,CAAA,KAAA,CAAM,eAAe,UAAU,CAAA,CAAA;AAE3C,IAAA,UAAA,CAAW,KAAK,UAAU,CAAA,CAAA;AAAA,GAC9B;AAEA,EAAO,OAAA,UAAA,CAAA;AACX;;;;"} |