{"version":3,"file":"DefaultBatcher.mjs","sources":["../../../../src/rendering/batcher/shared/DefaultBatcher.ts"],"sourcesContent":["import { ExtensionType } from '../../../extensions/Extensions';\nimport { Batcher } from './Batcher';\nimport { BatchGeometry } from './BatchGeometry';\nimport { DefaultShader } from './DefaultShader';\n\nimport type { Matrix } from '../../../maths/matrix/Matrix';\nimport type { Shader } from '../../renderers/shared/shader/Shader';\nimport type { BatchableMeshElement, BatchableQuadElement } from './Batcher';\n\nlet defaultShader: Shader = null;\n\n/**\n * Represents the common elements for default batch rendering.\n * This interface defines the properties that are used by the DefaultBatcher\n * to render elements efficiently in a batch.\n * @memberof rendering\n */\nexport interface DefaultBatchElements\n{\n /**\n * The color of the element that will be multiplied with the texture color.\n * This is typically represented as a 32-bit integer in RGBA format.\n */\n color: number;\n\n /**\n * Determines whether the element should be rounded to the nearest pixel.\n * - 0: No rounding (default)\n * - 1: Round to nearest pixel\n * This can help with visual consistency, especially for pixel art styles.\n */\n roundPixels: 0 | 1;\n\n /**\n * The transform matrix of the element.\n * This matrix represents the position, scale, rotation, and skew of the element.\n */\n transform: Matrix;\n}\n\n/**\n * Represents a batchable quad element with default batch properties.\n * @memberof rendering\n */\nexport interface DefaultBatchableQuadElement extends BatchableQuadElement, DefaultBatchElements {}\n\n/**\n * Represents a batchable mesh element with default batch properties.\n * @memberof rendering\n */\nexport interface DefaultBatchableMeshElement extends BatchableMeshElement, DefaultBatchElements {}\n\n/**\n * The default batcher is used to batch quads and meshes. This batcher will batch the following elements:\n * - tints\n * - roundPixels\n * - texture\n * - transform\n * @memberof rendering\n */\nexport class DefaultBatcher extends Batcher\n{\n /** @ignore */\n public static extension = {\n type: [\n ExtensionType.Batcher,\n ],\n name: 'default',\n } as const;\n\n public geometry = new BatchGeometry();\n public shader = defaultShader || (defaultShader = new DefaultShader(this.maxTextures));\n\n public name = DefaultBatcher.extension.name;\n\n /** The size of one attribute. 1 = 32 bit. x, y, u, v, color, textureIdAndRound -> total = 6 */\n public vertexSize = 6;\n\n /**\n * Packs the attributes of a DefaultBatchableMeshElement into the provided views.\n * @param element - The DefaultBatchableMeshElement to pack.\n * @param float32View - The Float32Array view to pack into.\n * @param uint32View - The Uint32Array view to pack into.\n * @param index - The starting index in the views.\n * @param textureId - The texture ID to use.\n */\n public packAttributes(\n element: DefaultBatchableMeshElement,\n float32View: Float32Array,\n uint32View: Uint32Array,\n index: number,\n textureId: number\n )\n {\n const textureIdAndRound = (textureId << 16) | (element.roundPixels & 0xFFFF);\n\n const wt = element.transform;\n\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 { positions, uvs } = element;\n\n const argb = element.color;\n\n const offset = element.attributeOffset;\n const end = offset + element.attributeSize;\n\n for (let i = offset; i < end; i++)\n {\n const i2 = i * 2;\n\n const x = positions[i2];\n const y = positions[(i2) + 1];\n\n float32View[index++] = (a * x) + (c * y) + tx;\n float32View[index++] = (d * y) + (b * x) + ty;\n\n float32View[index++] = uvs[i2];\n float32View[index++] = uvs[(i2) + 1];\n\n uint32View[index++] = argb;\n uint32View[index++] = textureIdAndRound;\n }\n }\n\n /**\n * Packs the attributes of a DefaultBatchableQuadElement into the provided views.\n * @param element - The DefaultBatchableQuadElement to pack.\n * @param float32View - The Float32Array view to pack into.\n * @param uint32View - The Uint32Array view to pack into.\n * @param index - The starting index in the views.\n * @param textureId - The texture ID to use.\n */\n public packQuadAttributes(\n element: DefaultBatchableQuadElement,\n float32View: Float32Array,\n uint32View: Uint32Array,\n index: number,\n textureId: number\n )\n {\n const texture = element.texture;\n\n const wt = element.transform;\n\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 bounds = element.bounds;\n\n const w0 = bounds.maxX;\n const w1 = bounds.minX;\n const h0 = bounds.maxY;\n const h1 = bounds.minY;\n\n const uvs = texture.uvs;\n\n // _ _ _ _\n // a b g r\n const argb = element.color;\n\n const textureIdAndRound = (textureId << 16) | (element.roundPixels & 0xFFFF);\n\n float32View[index + 0] = (a * w1) + (c * h1) + tx;\n float32View[index + 1] = (d * h1) + (b * w1) + ty;\n\n float32View[index + 2] = uvs.x0;\n float32View[index + 3] = uvs.y0;\n\n uint32View[index + 4] = argb;\n uint32View[index + 5] = textureIdAndRound;\n\n // xy\n float32View[index + 6] = (a * w0) + (c * h1) + tx;\n float32View[index + 7] = (d * h1) + (b * w0) + ty;\n\n float32View[index + 8] = uvs.x1;\n float32View[index + 9] = uvs.y1;\n\n uint32View[index + 10] = argb;\n uint32View[index + 11] = textureIdAndRound;\n\n // xy\n float32View[index + 12] = (a * w0) + (c * h0) + tx;\n float32View[index + 13] = (d * h0) + (b * w0) + ty;\n\n float32View[index + 14] = uvs.x2;\n float32View[index + 15] = uvs.y2;\n\n uint32View[index + 16] = argb;\n uint32View[index + 17] = textureIdAndRound;\n\n // xy\n float32View[index + 18] = (a * w1) + (c * h0) + tx;\n float32View[index + 19] = (d * h0) + (b * w1) + ty;\n\n float32View[index + 20] = uvs.x3;\n float32View[index + 21] = uvs.y3;\n\n uint32View[index + 22] = argb;\n uint32View[index + 23] = textureIdAndRound;\n }\n}\n\n"],"names":[],"mappings":"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"}