199 lines
11 KiB
JavaScript
199 lines
11 KiB
JavaScript
shadow$provide.module$node_modules$pixi_DOT_js$lib$rendering$batcher$shared$Batcher = function(global, require, module, exports) {
|
|
var uid = require("module$node_modules$pixi_DOT_js$lib$utils$data$uid"), ViewableBuffer = require("module$node_modules$pixi_DOT_js$lib$utils$data$ViewableBuffer"), deprecation = require("module$node_modules$pixi_DOT_js$lib$utils$logging$deprecation");
|
|
global = require("module$node_modules$pixi_DOT_js$lib$utils$pool$GlobalResourceRegistry");
|
|
var fastCopy = require("module$node_modules$pixi_DOT_js$lib$rendering$renderers$shared$buffer$utils$fastCopy"), getAdjustedBlendModeBlend = require("module$node_modules$pixi_DOT_js$lib$rendering$renderers$shared$state$getAdjustedBlendModeBlend"), maxRecommendedTextures = require("module$node_modules$pixi_DOT_js$lib$rendering$batcher$gl$utils$maxRecommendedTextures"), BatchTextureArray = require("module$node_modules$pixi_DOT_js$lib$rendering$batcher$shared$BatchTextureArray");
|
|
"use strict";
|
|
class Batch {
|
|
constructor() {
|
|
this.renderPipeId = "batch";
|
|
this.action = "startBatch";
|
|
this.size = this.start = 0;
|
|
this.textures = new BatchTextureArray.BatchTextureArray();
|
|
this.blendMode = "normal";
|
|
this.topology = "triangle-strip";
|
|
this.canBundle = !0;
|
|
}
|
|
destroy() {
|
|
this.elements = this.batcher = this.bindGroup = this.gpuBindGroup = this.textures = null;
|
|
}
|
|
}
|
|
const batchPool = [];
|
|
let batchPoolIndex = 0;
|
|
global.GlobalResourceRegistry.register({clear:() => {
|
|
if (0 < batchPool.length) {
|
|
for (const item of batchPool) {
|
|
item && item.destroy();
|
|
}
|
|
}
|
|
batchPoolIndex = batchPool.length = 0;
|
|
}});
|
|
let BATCH_TICK = 0;
|
|
const node_modules$pixi_DOT_js$lib$rendering$batcher$shared$Batcher$classdecl$var13 = class {
|
|
constructor(options) {
|
|
this.uid = uid.uid("batcher");
|
|
this.dirty = !0;
|
|
this.batchIndex = 0;
|
|
this.batches = [];
|
|
this._elements = [];
|
|
options = {...node_modules$pixi_DOT_js$lib$rendering$batcher$shared$Batcher$classdecl$var13.defaultOptions, ...options};
|
|
options.maxTextures || (deprecation.deprecation("v8.8.0", "maxTextures is a required option for Batcher now, please pass it in the options"), options.maxTextures = maxRecommendedTextures.getMaxTexturesPerBatch());
|
|
const {maxTextures, attributesInitialSize, indicesInitialSize} = options;
|
|
this.attributeBuffer = new ViewableBuffer.ViewableBuffer(4 * attributesInitialSize);
|
|
this.indexBuffer = new Uint16Array(indicesInitialSize);
|
|
this.maxTextures = maxTextures;
|
|
}
|
|
begin() {
|
|
this.attributeSize = this.indexSize = this.elementStart = this.elementSize = 0;
|
|
for (let i = 0; i < this.batchIndex; i++) {
|
|
var batch = this.batches[i];
|
|
batch.elements = null;
|
|
batchPool[batchPoolIndex++] = batch;
|
|
}
|
|
this._batchIndexSize = this._batchIndexStart = this.batchIndex = 0;
|
|
this.dirty = !0;
|
|
}
|
|
add(batchableObject) {
|
|
this._elements[this.elementSize++] = batchableObject;
|
|
batchableObject._indexStart = this.indexSize;
|
|
batchableObject._attributeStart = this.attributeSize;
|
|
batchableObject._batcher = this;
|
|
this.indexSize += batchableObject.indexSize;
|
|
this.attributeSize += batchableObject.attributeSize * this.vertexSize;
|
|
}
|
|
checkAndUpdateTexture(batchableObject, texture) {
|
|
const textureId = batchableObject._batch.textures.ids[texture._source.uid];
|
|
if (!textureId && 0 !== textureId) {
|
|
return !1;
|
|
}
|
|
batchableObject._textureId = textureId;
|
|
batchableObject.texture = texture;
|
|
return !0;
|
|
}
|
|
updateElement(batchableObject) {
|
|
this.dirty = !0;
|
|
const attributeBuffer = this.attributeBuffer;
|
|
batchableObject.packAsQuad ? this.packQuadAttributes(batchableObject, attributeBuffer.float32View, attributeBuffer.uint32View, batchableObject._attributeStart, batchableObject._textureId) : this.packAttributes(batchableObject, attributeBuffer.float32View, attributeBuffer.uint32View, batchableObject._attributeStart, batchableObject._textureId);
|
|
}
|
|
break(instructionSet) {
|
|
const elements = this._elements;
|
|
if (elements[this.elementStart]) {
|
|
var batch = 0 < batchPoolIndex ? batchPool[--batchPoolIndex] : new Batch(), textureBatch = batch.textures;
|
|
textureBatch.clear();
|
|
var firstElement = elements[this.elementStart], blendMode = getAdjustedBlendModeBlend.getAdjustedBlendModeBlend(firstElement.blendMode, firstElement.texture._source);
|
|
firstElement = firstElement.topology;
|
|
4 * this.attributeSize > this.attributeBuffer.size && this._resizeAttributeBuffer(4 * this.attributeSize);
|
|
this.indexSize > this.indexBuffer.length && this._resizeIndexBuffer(this.indexSize);
|
|
var f32 = this.attributeBuffer.float32View, u32 = this.attributeBuffer.uint32View, indexBuffer = this.indexBuffer, size = this._batchIndexSize, start = this._batchIndexStart, action = "startBatch", batchElements = [], maxTextures = this.maxTextures;
|
|
for (let i = this.elementStart; i < this.elementSize; ++i) {
|
|
const element = elements[i];
|
|
elements[i] = null;
|
|
const source = element.texture._source, adjustedBlendMode = getAdjustedBlendModeBlend.getAdjustedBlendModeBlend(element.blendMode, source), breakRequired = blendMode !== adjustedBlendMode || firstElement !== element.topology;
|
|
if (source._batchTick !== BATCH_TICK || breakRequired) {
|
|
source._batchTick = BATCH_TICK;
|
|
if (textureBatch.count >= maxTextures || breakRequired) {
|
|
this._finishBatch(batch, start, size - start, textureBatch, blendMode, firstElement, instructionSet, action, batchElements), action = "renderBatch", start = size, blendMode = adjustedBlendMode, firstElement = element.topology, batch = 0 < batchPoolIndex ? batchPool[--batchPoolIndex] : new Batch(), textureBatch = batch.textures, textureBatch.clear(), batchElements = [], ++BATCH_TICK;
|
|
}
|
|
element._textureId = source._textureBindLocation = textureBatch.count;
|
|
textureBatch.ids[source.uid] = textureBatch.count;
|
|
textureBatch.textures[textureBatch.count++] = source;
|
|
element._batch = batch;
|
|
batchElements.push(element);
|
|
size += element.indexSize;
|
|
element.packAsQuad ? (this.packQuadAttributes(element, f32, u32, element._attributeStart, element._textureId), this.packQuadIndex(indexBuffer, element._indexStart, element._attributeStart / this.vertexSize)) : (this.packAttributes(element, f32, u32, element._attributeStart, element._textureId), this.packIndex(element, indexBuffer, element._indexStart, element._attributeStart / this.vertexSize));
|
|
} else {
|
|
element._textureId = source._textureBindLocation, size += element.indexSize, element.packAsQuad ? (this.packQuadAttributes(element, f32, u32, element._attributeStart, element._textureId), this.packQuadIndex(indexBuffer, element._indexStart, element._attributeStart / this.vertexSize)) : (this.packAttributes(element, f32, u32, element._attributeStart, element._textureId), this.packIndex(element, indexBuffer, element._indexStart, element._attributeStart / this.vertexSize)), element._batch =
|
|
batch, batchElements.push(element);
|
|
}
|
|
}
|
|
0 < textureBatch.count && (this._finishBatch(batch, start, size - start, textureBatch, blendMode, firstElement, instructionSet, action, batchElements), start = size, ++BATCH_TICK);
|
|
this.elementStart = this.elementSize;
|
|
this._batchIndexStart = start;
|
|
this._batchIndexSize = size;
|
|
}
|
|
}
|
|
_finishBatch(batch, indexStart, indexSize, textureBatch, blendMode, topology, instructionSet, action, elements) {
|
|
batch.gpuBindGroup = null;
|
|
batch.bindGroup = null;
|
|
batch.action = action;
|
|
batch.batcher = this;
|
|
batch.textures = textureBatch;
|
|
batch.blendMode = blendMode;
|
|
batch.topology = topology;
|
|
batch.start = indexStart;
|
|
batch.size = indexSize;
|
|
batch.elements = elements;
|
|
++BATCH_TICK;
|
|
this.batches[this.batchIndex++] = batch;
|
|
instructionSet.add(batch);
|
|
}
|
|
finish(instructionSet) {
|
|
this.break(instructionSet);
|
|
}
|
|
ensureAttributeBuffer(size) {
|
|
4 * size <= this.attributeBuffer.size || this._resizeAttributeBuffer(4 * size);
|
|
}
|
|
ensureIndexBuffer(size) {
|
|
size <= this.indexBuffer.length || this._resizeIndexBuffer(size);
|
|
}
|
|
_resizeAttributeBuffer(size) {
|
|
size = new ViewableBuffer.ViewableBuffer(Math.max(size, 2 * this.attributeBuffer.size));
|
|
fastCopy.fastCopy(this.attributeBuffer.rawBinaryData, size.rawBinaryData);
|
|
this.attributeBuffer = size;
|
|
}
|
|
_resizeIndexBuffer(size) {
|
|
const indexBuffer = this.indexBuffer;
|
|
size = Math.max(size, 1.5 * indexBuffer.length);
|
|
size += size % 2;
|
|
size = 65535 < size ? new Uint32Array(size) : new Uint16Array(size);
|
|
if (size.BYTES_PER_ELEMENT !== indexBuffer.BYTES_PER_ELEMENT) {
|
|
for (let i = 0; i < indexBuffer.length; i++) {
|
|
size[i] = indexBuffer[i];
|
|
}
|
|
} else {
|
|
fastCopy.fastCopy(indexBuffer.buffer, size.buffer);
|
|
}
|
|
this.indexBuffer = size;
|
|
}
|
|
packQuadIndex(indexBuffer, index, indicesOffset) {
|
|
indexBuffer[index] = indicesOffset + 0;
|
|
indexBuffer[index + 1] = indicesOffset + 1;
|
|
indexBuffer[index + 2] = indicesOffset + 2;
|
|
indexBuffer[index + 3] = indicesOffset + 0;
|
|
indexBuffer[index + 4] = indicesOffset + 2;
|
|
indexBuffer[index + 5] = indicesOffset + 3;
|
|
}
|
|
packIndex(element, indexBuffer, index, indicesOffset) {
|
|
const indices = element.indices, size = element.indexSize, indexOffset = element.indexOffset;
|
|
element = element.attributeOffset;
|
|
for (let i = 0; i < size; i++) {
|
|
indexBuffer[index++] = indicesOffset + indices[i + indexOffset] - element;
|
|
}
|
|
}
|
|
destroy(options = {}) {
|
|
if (null !== this.batches) {
|
|
for (let i = 0; i < this.batchIndex; i++) {
|
|
var batch = this.batches[i];
|
|
batch.elements = null;
|
|
batchPool[batchPoolIndex++] = batch;
|
|
}
|
|
this.batches = null;
|
|
this.geometry.destroy(!0);
|
|
this.geometry = null;
|
|
options.shader && (this.shader?.destroy(), this.shader = null);
|
|
for (options = 0; options < this._elements.length; options++) {
|
|
this._elements[options] && (this._elements[options]._batch = null);
|
|
}
|
|
this.indexBuffer = this._elements = null;
|
|
this.attributeBuffer.destroy();
|
|
this.attributeBuffer = null;
|
|
}
|
|
}
|
|
};
|
|
require = node_modules$pixi_DOT_js$lib$rendering$batcher$shared$Batcher$classdecl$var13;
|
|
require.defaultOptions = {maxTextures:null, attributesInitialSize:4, indicesInitialSize:6};
|
|
exports.Batch = Batch;
|
|
exports.Batcher = require;
|
|
};
|
|
|
|
//# sourceMappingURL=module$node_modules$pixi_DOT_js$lib$rendering$batcher$shared$Batcher.js.map
|