1 line
9.1 KiB
Plaintext
1 line
9.1 KiB
Plaintext
{"version":3,"file":"BatcherPipe.mjs","sources":["../../../../src/rendering/batcher/shared/BatcherPipe.ts"],"sourcesContent":["import { extensions, ExtensionType } from '../../../extensions/Extensions';\nimport { State } from '../../renderers/shared/state/State';\nimport { DefaultBatcher } from './DefaultBatcher';\n\nimport type { Geometry } from '../../renderers/shared/geometry/Geometry';\nimport type { InstructionSet } from '../../renderers/shared/instructions/InstructionSet';\nimport type { BatchPipe, InstructionPipe } from '../../renderers/shared/instructions/RenderPipe';\nimport type { Shader } from '../../renderers/shared/shader/Shader';\nimport type { Renderer } from '../../renderers/types';\nimport type { Batch, BatchableElement, Batcher } from './Batcher';\n\nexport interface BatcherAdaptor\n{\n start(batchPipe: BatcherPipe, geometry: Geometry, shader: Shader): void\n init?(batchPipe: BatcherPipe): void;\n execute(batchPipe: BatcherPipe, batch: Batch): void\n contextChange?(): void;\n}\n\n/**\n * A pipe that batches elements into batches and sends them to the renderer.\n *\n * You can install new Batchers using ExtensionType.Batcher. Each render group will\n * have a default batcher and any required ones will be created on demand.\n * @memberof rendering\n */\nexport class BatcherPipe implements InstructionPipe<Batch>, BatchPipe\n{\n /** @ignore */\n public static extension = {\n type: [\n ExtensionType.WebGLPipes,\n ExtensionType.WebGPUPipes,\n ExtensionType.CanvasPipes,\n ],\n name: 'batch',\n } as const;\n\n public state: State = State.for2d();\n public renderer: Renderer;\n\n private readonly _batchersByInstructionSet: Record<number, Record<string, Batcher>> = Object.create(null);\n\n private _adaptor: BatcherAdaptor;\n\n /** A record of all active batchers, keyed by their names */\n private _activeBatches: Record<string, Batcher> = Object.create(null);\n\n /** The currently active batcher being used to batch elements */\n private _activeBatch: Batcher;\n\n public static _availableBatchers: Record<string, new () => Batcher> = Object.create(null);\n\n public static getBatcher(name: string): Batcher\n {\n return new this._availableBatchers[name as keyof typeof this._availableBatchers]();\n }\n\n constructor(renderer: Renderer, adaptor: BatcherAdaptor)\n {\n this.renderer = renderer;\n this._adaptor = adaptor;\n\n this._adaptor.init?.(this);\n }\n\n public buildStart(instructionSet: InstructionSet)\n {\n let batchers = this._batchersByInstructionSet[instructionSet.uid];\n\n if (!batchers)\n {\n batchers = this._batchersByInstructionSet[instructionSet.uid] = Object.create(null);\n batchers.default ||= new DefaultBatcher();\n }\n\n this._activeBatches = batchers;\n\n this._activeBatch = this._activeBatches.default;\n\n for (const i in this._activeBatches)\n {\n this._activeBatches[i].begin();\n }\n }\n\n public addToBatch(batchableObject: BatchableElement, instructionSet: InstructionSet)\n {\n if (this._activeBatch.name !== batchableObject.batcherName)\n {\n this._activeBatch.break(instructionSet);\n\n let batch = this._activeBatches[batchableObject.batcherName];\n\n if (!batch)\n {\n batch = this._activeBatches[batchableObject.batcherName]\n = BatcherPipe.getBatcher(batchableObject.batcherName);\n batch.begin();\n }\n\n this._activeBatch = batch;\n }\n\n this._activeBatch.add(batchableObject);\n }\n\n public break(instructionSet: InstructionSet)\n {\n this._activeBatch.break(instructionSet);\n }\n\n public buildEnd(instructionSet: InstructionSet)\n {\n this._activeBatch.break(instructionSet);\n\n const batches = this._activeBatches;\n\n for (const i in batches)\n {\n const batch = batches[i as keyof typeof batches];\n const geometry = batch.geometry;\n\n geometry.indexBuffer.setDataWithSize(batch.indexBuffer, batch.indexSize, true);\n\n geometry.buffers[0].setDataWithSize(batch.attributeBuffer.float32View, batch.attributeSize, false);\n }\n }\n\n public upload(instructionSet: InstructionSet)\n {\n const batchers = this._batchersByInstructionSet[instructionSet.uid];\n\n for (const i in batchers)\n {\n const batcher = batchers[i as keyof typeof batchers];\n const geometry = batcher.geometry;\n\n if (batcher.dirty)\n {\n batcher.dirty = false;\n\n geometry.buffers[0].update(batcher.attributeSize * 4);\n }\n }\n }\n\n public execute(batch: Batch)\n {\n if (batch.action === 'startBatch')\n {\n const batcher = batch.batcher;\n const geometry = batcher.geometry;\n const shader = batcher.shader;\n\n this._adaptor.start(this, geometry, shader);\n }\n\n this._adaptor.execute(this, batch);\n }\n\n public destroy()\n {\n this.state = null;\n this.renderer = null;\n\n this._adaptor = null;\n\n for (const i in this._activeBatches)\n {\n this._activeBatches[i].destroy();\n }\n\n this._activeBatches = null;\n }\n}\n\nextensions.handleByMap(ExtensionType.Batcher, BatcherPipe._availableBatchers);\n\nextensions.add(DefaultBatcher);\n"],"names":[],"mappings":"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"} |