UNPKG

@pixi/core

Version:
84 lines (83 loc) 2.85 kB
import { ExtensionType, extensions } from "@pixi/extensions"; import { ObjectRenderer } from "./ObjectRenderer.mjs"; class BatchSystem { /** * @param renderer - The renderer this System works for. */ constructor(renderer) { this.renderer = renderer, this.emptyRenderer = new ObjectRenderer(renderer), this.currentRenderer = this.emptyRenderer; } /** * Changes the current renderer to the one given in parameter * @param objectRenderer - The object renderer to use. */ setObjectRenderer(objectRenderer) { this.currentRenderer !== objectRenderer && (this.currentRenderer.stop(), this.currentRenderer = objectRenderer, this.currentRenderer.start()); } /** * This should be called if you wish to do some custom rendering * It will basically render anything that may be batched up such as sprites */ flush() { this.setObjectRenderer(this.emptyRenderer); } /** Reset the system to an empty renderer */ reset() { this.setObjectRenderer(this.emptyRenderer); } /** * Handy function for batch renderers: copies bound textures in first maxTextures locations to array * sets actual _batchLocation for them * @param arr - arr copy destination * @param maxTextures - number of copied elements */ copyBoundTextures(arr, maxTextures) { const { boundTextures } = this.renderer.texture; for (let i = maxTextures - 1; i >= 0; --i) arr[i] = boundTextures[i] || null, arr[i] && (arr[i]._batchLocation = i); } /** * Assigns batch locations to textures in array based on boundTextures state. * All textures in texArray should have `_batchEnabled = _batchId`, * and their count should be less than `maxTextures`. * @param texArray - textures to bound * @param boundTextures - current state of bound textures * @param batchId - marker for _batchEnabled param of textures in texArray * @param maxTextures - number of texture locations to manipulate */ boundArray(texArray, boundTextures, batchId, maxTextures) { const { elements, ids, count } = texArray; let j = 0; for (let i = 0; i < count; i++) { const tex = elements[i], loc = tex._batchLocation; if (loc >= 0 && loc < maxTextures && boundTextures[loc] === tex) { ids[i] = loc; continue; } for (; j < maxTextures; ) { const bound = boundTextures[j]; if (bound && bound._batchEnabled === batchId && bound._batchLocation === j) { j++; continue; } ids[i] = j, tex._batchLocation = j, boundTextures[j] = tex; break; } } } /** * @ignore */ destroy() { this.renderer = null; } } BatchSystem.extension = { type: ExtensionType.RendererSystem, name: "batch" }; extensions.add(BatchSystem); export { BatchSystem }; //# sourceMappingURL=BatchSystem.mjs.map