import Texture, { TextureUnit } from "./texture";
/**
 * Handles loading and unloading of textures on the GPU as needed.
 */
export default abstract class TextureLoader {
    private static ready;
    private static gl;
    private static loaded;
    private static textureUnits;
    /**
     * Sets up the texture loader for use, should only be called once.
     *
     * @param gl The WebGL context to use for texture loading
     */
    static init(gl: WebGL2RenderingContext): void;
    /**
     * Checks if the loader is ready to be used for texture loading/unloading.
     *
     * @throws When TextureLoader.init has not yet been called
     */
    private static checkReady;
    /**
     * Loads a texture into any available texture unit on the GPU, if no unit is available then the unit with the longest time since it was last used is overwritten.
     *
     * @param texture The texture to load
     * @returns Wether or not the texture was loaded
     */
    static loadTexture(texture: Texture): boolean;
    /**
     * Unloads the texture from the GPU.
     *
     * @param texture The texture to unload
     * @param unit The texture unit the `texture` belongs to, improves performance as the unit does not need to be searched for.
     * @returns Wether or not the texture was unloaded
     */
    static unloadTexture(texture: Texture, unit?: TextureUnit): boolean;
    /**
     * Unloads and then reloads the provided texture.
     *
     * @param texture The texture to reload
     * @returns Wether or not the texture was reloaded
     */
    static reloadTexture(texture: Texture): boolean;
    /**
     * Checks if a texture is loaded, ie the texture's image is loaded in a texture unit on the GPU.
     *
     * @param texture The texture to check
     * @returns Wether or not the texture is loaded
     */
    static isLoaded(texture: Texture): boolean;
    /**
     * Finds the texture unit the given texture is loaded in.
     *
     * @param texture The texture to find
     * @returns The unit the texture is loaded in or undefined
     */
    static getUnitOfTexture(texture: Texture): TextureUnit | undefined;
    /**
     * Finds a free texture unit.
     *
     * @returns A free texture unit or undefined when no units are free
     */
    static getFreeTextureUnit(): TextureUnit | undefined;
    /**
     * Finds the best texture unit to replace.
     *
     * First looks for free texture units and if none are available then it will return the texture unit with the oldest last used time.
     *
     * Texture units that have a {@link TextureAtlas} in them will be ignored.
     *
     * @returns The most replaceable texture unit
     */
    static findReplaceableTextureUnit(): TextureUnit;
    /**
     * Finds a {@link TextureUnit} by its WebGL texture unit number and updates its lastUsed time to the current time from `performance.now()`
     *
     * @param unit The WebGL texture unit number
     * @returns Wether or not the TextureUnit was updated
     */
    static updateLastUsed(unit: number): boolean;
}
