146 lines
5.9 KiB
JavaScript
146 lines
5.9 KiB
JavaScript
|
|
"use strict";
|
||
|
|
var core = require("@pixi/core"), display = require("@pixi/display"), text = require("@pixi/text"), CountLimiter = require("./CountLimiter.js");
|
||
|
|
function findMultipleBaseTextures(item, queue) {
|
||
|
|
let result = !1;
|
||
|
|
if (item?._textures?.length) {
|
||
|
|
for (let i = 0; i < item._textures.length; i++)
|
||
|
|
if (item._textures[i] instanceof core.Texture) {
|
||
|
|
const baseTexture = item._textures[i].baseTexture;
|
||
|
|
queue.includes(baseTexture) || (queue.push(baseTexture), result = !0);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return result;
|
||
|
|
}
|
||
|
|
function findBaseTexture(item, queue) {
|
||
|
|
if (item.baseTexture instanceof core.BaseTexture) {
|
||
|
|
const texture = item.baseTexture;
|
||
|
|
return queue.includes(texture) || queue.push(texture), !0;
|
||
|
|
}
|
||
|
|
return !1;
|
||
|
|
}
|
||
|
|
function findTexture(item, queue) {
|
||
|
|
if (item._texture && item._texture instanceof core.Texture) {
|
||
|
|
const texture = item._texture.baseTexture;
|
||
|
|
return queue.includes(texture) || queue.push(texture), !0;
|
||
|
|
}
|
||
|
|
return !1;
|
||
|
|
}
|
||
|
|
function drawText(_helper, item) {
|
||
|
|
return item instanceof text.Text ? (item.updateText(!0), !0) : !1;
|
||
|
|
}
|
||
|
|
function calculateTextStyle(_helper, item) {
|
||
|
|
if (item instanceof text.TextStyle) {
|
||
|
|
const font = item.toFontString();
|
||
|
|
return text.TextMetrics.measureFont(font), !0;
|
||
|
|
}
|
||
|
|
return !1;
|
||
|
|
}
|
||
|
|
function findText(item, queue) {
|
||
|
|
if (item instanceof text.Text) {
|
||
|
|
queue.includes(item.style) || queue.push(item.style), queue.includes(item) || queue.push(item);
|
||
|
|
const texture = item._texture.baseTexture;
|
||
|
|
return queue.includes(texture) || queue.push(texture), !0;
|
||
|
|
}
|
||
|
|
return !1;
|
||
|
|
}
|
||
|
|
function findTextStyle(item, queue) {
|
||
|
|
return item instanceof text.TextStyle ? (queue.includes(item) || queue.push(item), !0) : !1;
|
||
|
|
}
|
||
|
|
const _BasePrepare = class _BasePrepare2 {
|
||
|
|
/**
|
||
|
|
* @param {PIXI.IRenderer} renderer - A reference to the current renderer
|
||
|
|
*/
|
||
|
|
constructor(renderer) {
|
||
|
|
this.limiter = new CountLimiter.CountLimiter(_BasePrepare2.uploadsPerFrame), this.renderer = renderer, this.uploadHookHelper = null, this.queue = [], this.addHooks = [], this.uploadHooks = [], this.completes = [], this.ticking = !1, this.delayedTick = () => {
|
||
|
|
this.queue && this.prepareItems();
|
||
|
|
}, this.registerFindHook(findText), this.registerFindHook(findTextStyle), this.registerFindHook(findMultipleBaseTextures), this.registerFindHook(findBaseTexture), this.registerFindHook(findTexture), this.registerUploadHook(drawText), this.registerUploadHook(calculateTextStyle);
|
||
|
|
}
|
||
|
|
/**
|
||
|
|
* Upload all the textures and graphics to the GPU.
|
||
|
|
* @method PIXI.BasePrepare#upload
|
||
|
|
* @param {PIXI.DisplayObject|PIXI.Container|PIXI.BaseTexture|PIXI.Texture|PIXI.Graphics|PIXI.Text} [item] -
|
||
|
|
* Container or display object to search for items to upload or the items to upload themselves,
|
||
|
|
* or optionally ommitted, if items have been added using {@link PIXI.BasePrepare#add `prepare.add`}.
|
||
|
|
*/
|
||
|
|
upload(item) {
|
||
|
|
return new Promise((resolve) => {
|
||
|
|
item && this.add(item), this.queue.length ? (this.completes.push(resolve), this.ticking || (this.ticking = !0, core.Ticker.system.addOnce(this.tick, this, core.UPDATE_PRIORITY.UTILITY))) : resolve();
|
||
|
|
});
|
||
|
|
}
|
||
|
|
/**
|
||
|
|
* Handle tick update
|
||
|
|
* @private
|
||
|
|
*/
|
||
|
|
tick() {
|
||
|
|
setTimeout(this.delayedTick, 0);
|
||
|
|
}
|
||
|
|
/**
|
||
|
|
* Actually prepare items. This is handled outside of the tick because it will take a while
|
||
|
|
* and we do NOT want to block the current animation frame from rendering.
|
||
|
|
* @private
|
||
|
|
*/
|
||
|
|
prepareItems() {
|
||
|
|
for (this.limiter.beginFrame(); this.queue.length && this.limiter.allowedToUpload(); ) {
|
||
|
|
const item = this.queue[0];
|
||
|
|
let uploaded = !1;
|
||
|
|
if (item && !item._destroyed) {
|
||
|
|
for (let i = 0, len = this.uploadHooks.length; i < len; i++)
|
||
|
|
if (this.uploadHooks[i](this.uploadHookHelper, item)) {
|
||
|
|
this.queue.shift(), uploaded = !0;
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
uploaded || this.queue.shift();
|
||
|
|
}
|
||
|
|
if (this.queue.length)
|
||
|
|
core.Ticker.system.addOnce(this.tick, this, core.UPDATE_PRIORITY.UTILITY);
|
||
|
|
else {
|
||
|
|
this.ticking = !1;
|
||
|
|
const completes = this.completes.slice(0);
|
||
|
|
this.completes.length = 0;
|
||
|
|
for (let i = 0, len = completes.length; i < len; i++)
|
||
|
|
completes[i]();
|
||
|
|
}
|
||
|
|
}
|
||
|
|
/**
|
||
|
|
* Adds hooks for finding items.
|
||
|
|
* @param {Function} addHook - Function call that takes two parameters: `item:*, queue:Array`
|
||
|
|
* function must return `true` if it was able to add item to the queue.
|
||
|
|
* @returns Instance of plugin for chaining.
|
||
|
|
*/
|
||
|
|
registerFindHook(addHook) {
|
||
|
|
return addHook && this.addHooks.push(addHook), this;
|
||
|
|
}
|
||
|
|
/**
|
||
|
|
* Adds hooks for uploading items.
|
||
|
|
* @param {Function} uploadHook - Function call that takes two parameters: `prepare:CanvasPrepare, item:*` and
|
||
|
|
* function must return `true` if it was able to handle upload of item.
|
||
|
|
* @returns Instance of plugin for chaining.
|
||
|
|
*/
|
||
|
|
registerUploadHook(uploadHook) {
|
||
|
|
return uploadHook && this.uploadHooks.push(uploadHook), this;
|
||
|
|
}
|
||
|
|
/**
|
||
|
|
* Manually add an item to the uploading queue.
|
||
|
|
* @param {PIXI.DisplayObject|PIXI.Container|PIXI.BaseTexture|PIXI.Texture|PIXI.Graphics|PIXI.Text|*} item - Object to
|
||
|
|
* add to the queue
|
||
|
|
* @returns Instance of plugin for chaining.
|
||
|
|
*/
|
||
|
|
add(item) {
|
||
|
|
for (let i = 0, len = this.addHooks.length; i < len && !this.addHooks[i](item, this.queue); i++)
|
||
|
|
;
|
||
|
|
if (item instanceof display.Container)
|
||
|
|
for (let i = item.children.length - 1; i >= 0; i--)
|
||
|
|
this.add(item.children[i]);
|
||
|
|
return this;
|
||
|
|
}
|
||
|
|
/** Destroys the plugin, don't use after this. */
|
||
|
|
destroy() {
|
||
|
|
this.ticking && core.Ticker.system.remove(this.tick, this), this.ticking = !1, this.addHooks = null, this.uploadHooks = null, this.renderer = null, this.completes = null, this.queue = null, this.limiter = null, this.uploadHookHelper = null;
|
||
|
|
}
|
||
|
|
};
|
||
|
|
_BasePrepare.uploadsPerFrame = 4;
|
||
|
|
let BasePrepare = _BasePrepare;
|
||
|
|
exports.BasePrepare = BasePrepare;
|
||
|
|
//# sourceMappingURL=BasePrepare.js.map
|