import { BaseTexture } from '@pixi/core'; import { Graphics } from '@pixi/graphics'; import BasePrepare from './BasePrepare'; /** * The prepare manager provides functionality to upload content to the GPU. * * An instance of this class is automatically created by default, and can be found at `renderer.plugins.prepare` * * @class * @extends PIXI.prepare.BasePrepare * @memberof PIXI.prepare */ export default class Prepare extends BasePrepare { /** * @param {PIXI.Renderer} renderer - A reference to the current renderer */ constructor(renderer) { super(renderer); this.uploadHookHelper = this.renderer; // Add textures and graphics to upload this.registerFindHook(findGraphics); this.registerUploadHook(uploadBaseTextures); this.registerUploadHook(uploadGraphics); } } /** * Built-in hook to upload PIXI.Texture objects to the GPU. * * @private * @param {PIXI.Renderer} renderer - instance of the webgl renderer * @param {PIXI.DisplayObject} item - Item to check * @return {boolean} If item was uploaded. */ function uploadBaseTextures(renderer, item) { if (item instanceof BaseTexture) { // if the texture already has a GL texture, then the texture has been prepared or rendered // before now. If the texture changed, then the changer should be calling texture.update() which // reuploads the texture without need for preparing it again if (!item._glTextures[renderer.CONTEXT_UID]) { renderer.texture.updateTexture(item); } return true; } return false; } /** * Built-in hook to upload PIXI.Graphics to the GPU. * * @private * @param {PIXI.Renderer} renderer - instance of the webgl renderer * @param {PIXI.DisplayObject} item - Item to check * @return {boolean} If item was uploaded. */ function uploadGraphics(renderer, item) { if (item instanceof Graphics) { // if the item is not dirty and already has webgl data, then it got prepared or rendered // before now and we shouldn't waste time updating it again if (item.dirty || item.clearDirty || !item._webGL[renderer.plugins.graphics.CONTEXT_UID]) { renderer.plugins.graphics.updateGraphics(item); } return true; } return false; } /** * Built-in hook to find graphics. * * @private * @param {PIXI.DisplayObject} item - Display object to check * @param {Array<*>} queue - Collection of items to upload * @return {boolean} if a PIXI.Graphics object was found. */ function findGraphics(item, queue) { if (item instanceof Graphics) { queue.push(item); return true; } return false; }