{"version":3,"sources":["src/index.ts","src/EquirectangularTilesAdapter.ts","../shared/Queue.ts","../shared/tiles-utils.ts","src/utils.ts"],"sourcesContent":["export { EquirectangularTilesAdapter } from './EquirectangularTilesAdapter';\nexport * from './model';\n","import type { AdapterConstructor, PanoData, PanoramaPosition, Position, TextureData, Viewer } from '@photo-sphere-viewer/core';\nimport { AbstractAdapter, CONSTANTS, EquirectangularAdapter, events, utils } from '@photo-sphere-viewer/core';\nimport { BufferAttribute, Group, Mesh, MeshBasicMaterial, SphereGeometry, Texture, Vector3 } from 'three';\nimport { Queue, Task } from '../../shared/Queue';\nimport { buildDebugTexture, buildErrorMaterial, createWireFrame } from '../../shared/tiles-utils';\nimport {\n    EquirectangularMultiTilesPanorama,\n    EquirectangularTilesAdapterConfig,\n    EquirectangularTilesPanoData,\n    EquirectangularTilesPanorama,\n} from './model';\nimport { EquirectangularTileConfig, checkPanoramaConfig, getCacheKey, getTileConfig, getTileConfigByIndex } from './utils';\n\n/* the faces of the top and bottom rows are made of a single triangle (3 vertices)\n * all other faces are made of two triangles (6 vertices)\n * below is the indexing of each face vertices\n *\n * first row faces:\n *     ⋀\n *    /0\\\n *   /   \\\n *  /     \\\n * /1     2\\\n * ¯¯¯¯¯¯¯¯¯\n *\n * other rows faces:\n * _________\n * |\\1    0|\n * |3\\     |\n * |  \\    |\n * |   \\   |\n * |    \\  |\n * |     \\2|\n * |4    5\\|\n * ¯¯¯¯¯¯¯¯¯\n *\n * last row faces:\n * _________\n * \\1     0/\n *  \\     /\n *   \\   /\n *    \\2/\n *     ⋁\n */\n\ntype EquirectangularMesh = Mesh<SphereGeometry, MeshBasicMaterial>;\ntype EquirectangularTilesMesh = Mesh<SphereGeometry, MeshBasicMaterial[]>;\ntype EquirectangularTilesTextureData = TextureData<\n    Texture,\n    EquirectangularTilesPanorama | EquirectangularMultiTilesPanorama,\n    EquirectangularTilesPanoData\n>;\ntype EquirectangularTile = {\n    row: number;\n    col: number;\n    angle: number;\n    config: EquirectangularTileConfig;\n    url: string;\n};\n\nconst NB_VERTICES_BY_FACE = 6;\nconst NB_VERTICES_BY_SMALL_FACE = 3;\n\nconst ATTR_UV = 'uv';\nconst ATTR_POSITION = 'position';\n\nconst ERROR_LEVEL = -1;\n\nfunction tileId(tile: EquirectangularTile): string {\n    return `${tile.col}x${tile.row}/${tile.config.level}`;\n}\n\nfunction meshes(group: Group) {\n    return group.children as [EquirectangularMesh, EquirectangularTilesMesh];\n}\n\nconst getConfig = utils.getConfigParser<EquirectangularTilesAdapterConfig>({\n    resolution: 64,\n    showErrorTile: true,\n    baseBlur: true,\n    antialias: true,\n    debug: false,\n    useXmpData: false,\n});\n\nconst vertexPosition = new Vector3();\n\n/**\n * Adapter for tiled panoramas\n */\nexport class EquirectangularTilesAdapter extends AbstractAdapter<\n    EquirectangularTilesPanorama | EquirectangularMultiTilesPanorama,\n    EquirectangularTilesPanoData,\n    Texture,\n    Group\n> {\n    static override readonly id = 'equirectangular-tiles';\n    static override readonly VERSION = PKG_VERSION;\n    static override readonly supportsDownload = false;\n\n    // @internal\n    public readonly SPHERE_SEGMENTS: number;\n    // @internal\n    public readonly SPHERE_HORIZONTAL_SEGMENTS: number;\n    private readonly NB_VERTICES: number;\n    private readonly NB_GROUPS: number;\n\n    private readonly config: EquirectangularTilesAdapterConfig;\n\n    private readonly state = {\n        tileConfig: null as EquirectangularTileConfig,\n        tiles: {} as Record<string, boolean>,\n        faces: {} as Record<number, number>,\n        geom: null as SphereGeometry,\n        materials: [] as MeshBasicMaterial[],\n        errorMaterial: null as MeshBasicMaterial,\n        inTransition: false,\n    };\n\n    // @internal\n    public adapter: EquirectangularAdapter;\n    private readonly queue = new Queue();\n\n    static withConfig(config: EquirectangularTilesAdapterConfig): [AdapterConstructor, any] {\n        return [EquirectangularTilesAdapter, config];\n    }\n\n    constructor(viewer: Viewer, config: EquirectangularTilesAdapterConfig) {\n        super(viewer);\n\n        this.config = getConfig(config);\n\n        this.adapter = new EquirectangularAdapter(this.viewer, {\n            resolution: this.config.resolution,\n            blur: this.config.baseBlur,\n        });\n\n        this.SPHERE_SEGMENTS = this.config.resolution;\n        this.SPHERE_HORIZONTAL_SEGMENTS = this.SPHERE_SEGMENTS / 2;\n        this.NB_VERTICES\n            = 2 * this.SPHERE_SEGMENTS * NB_VERTICES_BY_SMALL_FACE\n                + (this.SPHERE_HORIZONTAL_SEGMENTS - 2) * this.SPHERE_SEGMENTS * NB_VERTICES_BY_FACE;\n        this.NB_GROUPS = this.SPHERE_SEGMENTS * this.SPHERE_HORIZONTAL_SEGMENTS;\n\n        if (this.viewer.config.requestHeaders) {\n            utils.logWarn(\n                'EquirectangularTilesAdapter fallbacks to file loader because \"requestHeaders\" where provided. '\n                + 'Consider removing \"requestHeaders\" if you experience performances issues.',\n            );\n        }\n    }\n\n    override init() {\n        super.init();\n\n        this.viewer.addEventListener(events.TransitionDoneEvent.type, this);\n        this.viewer.addEventListener(events.PositionUpdatedEvent.type, this);\n        this.viewer.addEventListener(events.ZoomUpdatedEvent.type, this);\n    }\n\n    override destroy() {\n        this.viewer.removeEventListener(events.TransitionDoneEvent.type, this);\n        this.viewer.removeEventListener(events.PositionUpdatedEvent.type, this);\n        this.viewer.removeEventListener(events.ZoomUpdatedEvent.type, this);\n\n        this.__cleanup();\n\n        this.state.errorMaterial?.map?.dispose();\n        this.state.errorMaterial?.dispose();\n        this.adapter.destroy();\n\n        delete this.adapter;\n        delete this.state.geom;\n        delete this.state.errorMaterial;\n\n        super.destroy();\n    }\n\n    /**\n     * @internal\n     */\n    handleEvent(e: Event) {\n        switch (e.type) {\n            case events.PositionUpdatedEvent.type:\n            case events.ZoomUpdatedEvent.type:\n                this.__refresh();\n                break;\n\n            case events.TransitionDoneEvent.type:\n                this.state.inTransition = false;\n                if ((e as events.TransitionDoneEvent).completed) {\n                    this.__switchMesh(this.viewer.renderer.mesh as Group);\n                }\n                break;\n        }\n    }\n\n    override supportsTransition(panorama: EquirectangularTilesPanorama | EquirectangularMultiTilesPanorama) {\n        return !!panorama.baseUrl;\n    }\n\n    override supportsPreload(panorama: EquirectangularTilesPanorama | EquirectangularMultiTilesPanorama) {\n        return !!panorama.baseUrl;\n    }\n\n    override textureCoordsToSphericalCoords(point: PanoramaPosition, data: EquirectangularTilesPanoData): Position {\n        return this.adapter.textureCoordsToSphericalCoords(point, data);\n    }\n\n    override sphericalCoordsToTextureCoords(position: Position, data: EquirectangularTilesPanoData): PanoramaPosition {\n        return this.adapter.sphericalCoordsToTextureCoords(position, data);\n    }\n\n    override async loadTexture(\n        panorama: EquirectangularTilesPanorama | EquirectangularMultiTilesPanorama,\n        loader = true,\n    ): Promise<EquirectangularTilesTextureData> {\n        checkPanoramaConfig(panorama, this);\n\n        const firstTile = getTileConfig(panorama, 0, 0, null, this);\n        const panoData: PanoData = {\n            isEquirectangular: true,\n            fullWidth: firstTile.width,\n            fullHeight: firstTile.width / 2,\n            croppedWidth: firstTile.width,\n            croppedHeight: firstTile.width / 2,\n            croppedX: 0,\n            croppedY: 0,\n            poseHeading: 0,\n            posePitch: 0,\n            poseRoll: 0,\n        };\n\n        if (panorama.baseUrl) {\n            const textureData = await this.adapter.loadTexture(panorama.baseUrl, loader, panorama.basePanoData, true);\n\n            return {\n                panorama,\n                panoData: {\n                    ...panoData,\n                    baseData: textureData.panoData,\n                },\n                cacheKey: textureData.cacheKey,\n                texture: textureData.texture,\n            };\n        } else {\n            return {\n                panorama,\n                panoData: {\n                    ...panoData,\n                    baseData: null,\n                },\n                cacheKey: getCacheKey(panorama, firstTile),\n                texture: null,\n            };\n        }\n    }\n\n    createMesh(panoData: EquirectangularTilesPanoData): Group {\n        // mesh for the base panorama\n        const baseMesh = this.adapter.createMesh(panoData.baseData ?? panoData);\n\n        // mesh for the tiles\n        const geometry = new SphereGeometry(\n            CONSTANTS.SPHERE_RADIUS,\n            this.SPHERE_SEGMENTS,\n            this.SPHERE_HORIZONTAL_SEGMENTS,\n            -Math.PI / 2,\n        )\n            .scale(-1, 1, 1)\n            .toNonIndexed() as SphereGeometry;\n\n        geometry.clearGroups();\n        let i = 0;\n        let k = 0;\n        // first row\n        for (; i < this.SPHERE_SEGMENTS * NB_VERTICES_BY_SMALL_FACE; i += NB_VERTICES_BY_SMALL_FACE) {\n            geometry.addGroup(i, NB_VERTICES_BY_SMALL_FACE, k++);\n        }\n        // second to before last rows\n        for (; i < this.NB_VERTICES - this.SPHERE_SEGMENTS * NB_VERTICES_BY_SMALL_FACE; i += NB_VERTICES_BY_FACE) {\n            geometry.addGroup(i, NB_VERTICES_BY_FACE, k++);\n        }\n        // last row\n        for (; i < this.NB_VERTICES; i += NB_VERTICES_BY_SMALL_FACE) {\n            geometry.addGroup(i, NB_VERTICES_BY_SMALL_FACE, k++);\n        }\n\n        const materials: MeshBasicMaterial[] = [];\n        const material = new MeshBasicMaterial({\n            opacity: 0,\n            transparent: true,\n            depthTest: false,\n            depthWrite: false,\n        });\n        for (let g = 0; g < this.NB_GROUPS; g++) {\n            materials.push(material);\n        }\n\n        const tilesMesh = new Mesh(geometry, materials);\n        tilesMesh.renderOrder = 1;\n\n        const group = new Group();\n        group.add(baseMesh);\n        group.add(tilesMesh);\n        return group;\n    }\n\n    /**\n     * Applies the base texture and starts the loading of tiles\n     */\n    setTexture(group: Group, textureData: EquirectangularTilesTextureData, transition: boolean) {\n        const [baseMesh] = meshes(group);\n\n        if (textureData.texture) {\n            this.adapter.setTexture(baseMesh, {\n                panorama: textureData.panorama.baseUrl,\n                texture: textureData.texture,\n                panoData: textureData.panoData.baseData,\n            });\n        } else {\n            baseMesh.visible = false;\n        }\n\n        if (transition) {\n            this.state.inTransition = true;\n        } else {\n            this.__switchMesh(group);\n        }\n    }\n\n    setTextureOpacity(group: Group, opacity: number) {\n        const [baseMesh] = meshes(group);\n        this.adapter.setTextureOpacity(baseMesh, opacity);\n    }\n\n    disposeTexture({ texture }: EquirectangularTilesTextureData) {\n        texture?.dispose();\n    }\n\n    disposeMesh(group: Group) {\n        const [baseMesh, tilesMesh] = meshes(group);\n\n        baseMesh.geometry.dispose();\n        baseMesh.material.dispose();\n\n        tilesMesh.geometry.dispose();\n        tilesMesh.material.forEach((m) => {\n            m.map?.dispose();\n            m.dispose();\n        });\n    }\n\n    /**\n     * Compute visible tiles and load them\n     */\n    private __refresh() {\n        if (!this.state.geom || this.state.inTransition) {\n            return;\n        }\n\n        const panorama = this.viewer.config.panorama as EquirectangularTilesPanorama | EquirectangularMultiTilesPanorama;\n        const tileConfig = getTileConfig(panorama, this.viewer.state.hFov, this.viewer.state.vFov, this.viewer.state.size, this);\n\n        const verticesPosition = this.state.geom.getAttribute(ATTR_POSITION) as BufferAttribute;\n        const tilesToLoad: Record<string, EquirectangularTile> = {};\n\n        for (let i = 0; i < this.NB_VERTICES; i += 1) {\n            vertexPosition.fromBufferAttribute(verticesPosition, i);\n            vertexPosition.applyEuler(this.viewer.renderer.sphereCorrection);\n\n            if (this.viewer.renderer.isObjectVisible(vertexPosition)) {\n                // compute position of the segment (3 or 6 vertices)\n                let segmentIndex;\n                if (i < this.SPHERE_SEGMENTS * NB_VERTICES_BY_SMALL_FACE) {\n                    // first row\n                    segmentIndex = Math.floor(i / 3);\n                } else if (i < this.NB_VERTICES - this.SPHERE_SEGMENTS * NB_VERTICES_BY_SMALL_FACE) {\n                    // second to before last rows\n                    segmentIndex = Math.floor((i / 3 - this.SPHERE_SEGMENTS) / 2) + this.SPHERE_SEGMENTS;\n                } else {\n                    // last row\n                    segmentIndex\n                        = Math.floor((i - this.NB_VERTICES - this.SPHERE_SEGMENTS * NB_VERTICES_BY_SMALL_FACE) / 3)\n                            + this.SPHERE_HORIZONTAL_SEGMENTS * (this.SPHERE_SEGMENTS - 1);\n                }\n                const segmentRow = Math.floor(segmentIndex / this.SPHERE_SEGMENTS);\n                const segmentCol = segmentIndex - segmentRow * this.SPHERE_SEGMENTS;\n\n                let config = tileConfig;\n                while (config) {\n                    // compute the position of the tile\n                    const row = Math.floor(segmentRow / config.facesByRow);\n                    const col = Math.floor(segmentCol / config.facesByCol);\n                    let angle = vertexPosition.angleTo(this.viewer.state.direction);\n                    if (row === 0 || row === config.rows - 1) {\n                        angle *= 2; // lower priority to top and bottom tiles\n                    }\n\n                    const tile: EquirectangularTile = {\n                        row,\n                        col,\n                        angle,\n                        config,\n                        url: null,\n                    };\n                    const id = tileId(tile);\n\n                    if (tilesToLoad[id]) {\n                        tilesToLoad[id].angle = Math.min(tilesToLoad[id].angle, angle);\n                        break;\n                    } else {\n                        tile.url = panorama.tileUrl(col, row, config.level);\n\n                        if (tile.url) {\n                            tilesToLoad[id] = tile;\n                            break;\n                        } else {\n                            // if no url is returned, try a lower tile level\n                            config = getTileConfigByIndex(panorama, config.level - 1, this);\n                        }\n                    }\n                }\n            }\n        }\n\n        this.state.tileConfig = tileConfig;\n        this.__loadTiles(Object.values(tilesToLoad));\n    }\n\n    /**\n     * Loads tiles and change existing tiles priority\n     */\n    private __loadTiles(tiles: EquirectangularTile[]) {\n        this.queue.disableAllTasks();\n\n        tiles.forEach((tile) => {\n            const id = tileId(tile);\n\n            if (this.state.tiles[id]) {\n                this.queue.setPriority(id, tile.angle);\n            } else {\n                this.state.tiles[id] = true;\n                this.queue.enqueue(new Task(id, tile.angle, task => this.__loadTile(tile, task)));\n            }\n        });\n\n        this.queue.start();\n    }\n\n    /**\n     * Loads and draw a tile\n     */\n    private __loadTile(tile: EquirectangularTile, task: Task): Promise<any> {\n        return this.viewer.textureLoader\n            .loadImage(tile.url, null, this.viewer.state.textureData.cacheKey)\n            .then((image: HTMLImageElement) => {\n                if (!task.isCancelled()) {\n                    if (this.config.debug) {\n                        image = buildDebugTexture(image, tile.config.level, tileId(tile)) as any;\n                    }\n\n                    const mipmaps = this.config.antialias && tile.config.level > 0;\n                    const material = new MeshBasicMaterial({ map: utils.createTexture(image, mipmaps) });\n                    this.__swapMaterial(tile, material, false);\n                    this.viewer.needsUpdate();\n                }\n            })\n            .catch((err) => {\n                if (!utils.isAbortError(err) && !task.isCancelled() && this.config.showErrorTile) {\n                    if (!this.state.errorMaterial) {\n                        this.state.errorMaterial = buildErrorMaterial();\n                    }\n                    this.__swapMaterial(tile, this.state.errorMaterial, true);\n                    this.viewer.needsUpdate();\n                }\n            });\n    }\n\n    /**\n     * Applies a new texture to the faces\n     */\n    private __swapMaterial(tile: EquirectangularTile, material: MeshBasicMaterial, isError: boolean) {\n        const uvs = this.state.geom.getAttribute(ATTR_UV) as BufferAttribute;\n\n        for (let c = 0; c < tile.config.facesByCol; c++) {\n            for (let r = 0; r < tile.config.facesByRow; r++) {\n                // position of the face\n                const faceCol = tile.col * tile.config.facesByCol + c;\n                const faceRow = tile.row * tile.config.facesByRow + r;\n                const isFirstRow = faceRow === 0;\n                const isLastRow = faceRow === (this.SPHERE_HORIZONTAL_SEGMENTS - 1);\n\n                // first vertex for this face (3 or 6 vertices in total)\n                let firstVertex: number;\n                if (isFirstRow) {\n                    firstVertex = faceCol * NB_VERTICES_BY_SMALL_FACE;\n                } else if (isLastRow) {\n                    firstVertex\n                        = this.NB_VERTICES\n                            - this.SPHERE_SEGMENTS * NB_VERTICES_BY_SMALL_FACE\n                            + faceCol * NB_VERTICES_BY_SMALL_FACE;\n                } else {\n                    firstVertex\n                        = this.SPHERE_SEGMENTS * NB_VERTICES_BY_SMALL_FACE\n                            + (faceRow - 1) * this.SPHERE_SEGMENTS * NB_VERTICES_BY_FACE\n                            + faceCol * NB_VERTICES_BY_FACE;\n                }\n\n                // in case of error, skip the face if already showing valid data\n                if (isError && this.state.faces[firstVertex] > ERROR_LEVEL) {\n                    continue;\n                }\n                // skip this face if its already showing an higher resolution\n                if (this.state.faces[firstVertex] > tile.config.level) {\n                    continue;\n                }\n                this.state.faces[firstVertex] = isError ? ERROR_LEVEL : tile.config.level;\n\n                // swap material\n                const matIndex = this.state.geom.groups.find(g => g.start === firstVertex).materialIndex;\n                this.state.materials[matIndex] = material;\n\n                // define new uvs\n                const top = 1 - r / tile.config.facesByRow;\n                const bottom = 1 - (r + 1) / tile.config.facesByRow;\n                const left = c / tile.config.facesByCol;\n                const right = (c + 1) / tile.config.facesByCol;\n\n                if (isFirstRow) {\n                    uvs.setXY(firstVertex, (left + right) / 2, top);\n                    uvs.setXY(firstVertex + 1, left, bottom);\n                    uvs.setXY(firstVertex + 2, right, bottom);\n                } else if (isLastRow) {\n                    uvs.setXY(firstVertex, right, top);\n                    uvs.setXY(firstVertex + 1, left, top);\n                    uvs.setXY(firstVertex + 2, (left + right) / 2, bottom);\n                } else {\n                    uvs.setXY(firstVertex, right, top);\n                    uvs.setXY(firstVertex + 1, left, top);\n                    uvs.setXY(firstVertex + 2, right, bottom);\n                    uvs.setXY(firstVertex + 3, left, top);\n                    uvs.setXY(firstVertex + 4, left, bottom);\n                    uvs.setXY(firstVertex + 5, right, bottom);\n                }\n            }\n        }\n\n        uvs.needsUpdate = true;\n    }\n\n    private __switchMesh(group: Group) {\n        const [, tilesMesh] = meshes(group);\n\n        this.__cleanup();\n\n        this.state.materials = tilesMesh.material;\n        this.state.geom = tilesMesh.geometry;\n\n        if (this.config.debug) {\n            const wireframe = createWireFrame(this.state.geom);\n            this.viewer.renderer.addObject(wireframe);\n            this.viewer.renderer.setSphereCorrection(this.viewer.config.sphereCorrection, wireframe);\n        }\n\n        setTimeout(() => this.__refresh());\n    }\n\n    /**\n     * Clears loading queue, dispose all materials\n     */\n    private __cleanup() {\n        this.queue.clear();\n        this.state.tiles = {};\n        this.state.faces = {};\n        this.state.materials = [];\n        this.state.inTransition = false;\n    }\n}\n","/**\n * @internal\n */\nconst enum Status {\n    DISABLED,\n    PENDING,\n    RUNNING,\n    CANCELLED,\n    DONE,\n    ERROR,\n}\n\n/**\n * @internal\n */\nexport class Task {\n    status: Status = Status.PENDING;\n\n    constructor(\n        public readonly id: string,\n        public priority: number,\n        private readonly fn: (task: Task) => Promise<any>,\n    ) {}\n\n    start() {\n        this.status = Status.RUNNING;\n        return this.fn(this).then(\n            () => {\n                this.status = Status.DONE;\n            },\n            () => {\n                this.status = Status.ERROR;\n            },\n        );\n    }\n\n    cancel() {\n        this.status = Status.CANCELLED;\n    }\n\n    isCancelled() {\n        return this.status === Status.CANCELLED;\n    }\n}\n\n/**\n * @internal\n */\nexport class Queue {\n    private runningTasks: Record<string, boolean> = {};\n    private tasks: Record<string, Task> = {};\n\n    constructor(private readonly concurency = 8) {}\n\n    enqueue(task: Task) {\n        this.tasks[task.id] = task;\n    }\n\n    clear() {\n        Object.values(this.tasks).forEach(task => task.cancel());\n        this.tasks = {};\n        this.runningTasks = {};\n    }\n\n    setPriority(taskId: string, priority: number) {\n        const task = this.tasks[taskId];\n        if (task) {\n            task.priority = priority;\n            if (task.status === Status.DISABLED) {\n                task.status = Status.PENDING;\n            }\n        }\n    }\n\n    disableAllTasks() {\n        Object.values(this.tasks).forEach((task) => {\n            task.status = Status.DISABLED;\n        });\n    }\n\n    start() {\n        if (Object.keys(this.runningTasks).length >= this.concurency) {\n            return;\n        }\n\n        const nextTask = Object.values(this.tasks)\n            .filter(task => task.status === Status.PENDING)\n            .sort((a, b) => b.priority - a.priority)\n            .pop();\n\n        if (nextTask) {\n            this.runningTasks[nextTask.id] = true;\n\n            nextTask.start().then(() => {\n                if (!nextTask.isCancelled()) {\n                    delete this.tasks[nextTask.id];\n                    delete this.runningTasks[nextTask.id];\n                    this.start();\n                }\n            });\n\n            this.start(); // start tasks until max concurrency is reached\n        }\n    }\n}\n","import { utils } from '@photo-sphere-viewer/core';\nimport { BufferGeometry, LineSegments, Material, MeshBasicMaterial, Object3D, WireframeGeometry } from 'three';\n\n/**\n * Generates an material for errored tiles\n * @internal\n */\nexport function buildErrorMaterial(): MeshBasicMaterial {\n    const canvas = new OffscreenCanvas(512, 512);\n\n    const ctx = canvas.getContext('2d');\n\n    ctx.fillStyle = '#333';\n    ctx.fillRect(0, 0, canvas.width, canvas.height);\n    ctx.font = `${canvas.width / 5}px serif`;\n    ctx.fillStyle = '#a22';\n    ctx.textAlign = 'center';\n    ctx.textBaseline = 'middle';\n    ctx.fillText('⚠', canvas.width / 2, canvas.height / 2);\n\n    return new MeshBasicMaterial({ map: utils.createTexture(canvas) });\n}\n\n/**\n * Creates a wireframe geometry, for debug\n * @internal\n */\nexport function createWireFrame(geometry: BufferGeometry): Object3D {\n    const wireframe = new WireframeGeometry(geometry);\n    const line = new LineSegments<WireframeGeometry, Material>(wireframe);\n    line.material.depthTest = false;\n    line.material.depthWrite = false;\n    line.material.opacity = 0.25;\n    line.material.transparent = true;\n    return line;\n}\n\nconst DEBUG_COLORS = ['dodgerblue', 'limegreen', 'indianred'];\n\n/**\n * Applies a color filter to an tile image and shows the id of the tile\n * @internal\n */\nexport function buildDebugTexture(image: HTMLImageElement, level: number, id: string): HTMLCanvasElement {\n    const canvas = document.createElement('canvas');\n    canvas.width = image.width;\n    canvas.height = image.height;\n    const ctx = canvas.getContext('2d');\n\n    ctx.fillStyle = DEBUG_COLORS[level % DEBUG_COLORS.length];\n    ctx.fillRect(0, 0, canvas.width, canvas.height);\n\n    ctx.globalCompositeOperation = 'multiply';\n    ctx.drawImage(image, 0, 0);\n\n    const fontSize = image.width / 7;\n    ctx.globalCompositeOperation = 'source-over';\n    ctx.fillStyle = 'white';\n    ctx.font = `${fontSize}px monospace`;\n    ctx.textAlign = 'center';\n    id.split('\\n').forEach((id2, i) => {\n        ctx.fillText(id2, image.width / 2, image.height / 2 + fontSize * (0.3 + i));\n    });\n\n    return canvas;\n}\n","import { PSVError, Size, utils } from '@photo-sphere-viewer/core';\nimport { MathUtils } from 'three';\nimport { EquirectangularMultiTilesPanorama, EquirectangularTileLevel, EquirectangularTilesPanorama } from './model';\n\nexport type EquirectangularTileConfig = EquirectangularTileLevel & {\n    level: number;\n    colSize: number;\n    rowSize: number;\n    facesByCol: number;\n    facesByRow: number;\n};\n\nfunction isMultiTiles(\n    panorama: EquirectangularTilesPanorama | EquirectangularMultiTilesPanorama,\n): panorama is EquirectangularMultiTilesPanorama {\n    return !!(panorama as EquirectangularMultiTilesPanorama).levels;\n}\n\nfunction computeTileConfig(\n    tile: EquirectangularTileLevel,\n    level: number,\n    data: { SPHERE_SEGMENTS: number; SPHERE_HORIZONTAL_SEGMENTS: number },\n): EquirectangularTileConfig {\n    return {\n        ...tile,\n        level,\n        colSize: tile.width / tile.cols,\n        rowSize: tile.width / 2 / tile.rows,\n        facesByCol: data.SPHERE_SEGMENTS / tile.cols,\n        facesByRow: data.SPHERE_HORIZONTAL_SEGMENTS / tile.rows,\n    };\n}\n\nexport function getTileConfig(\n    panorama: EquirectangularTilesPanorama | EquirectangularMultiTilesPanorama,\n    hFov: number, vFov: number,\n    viewerSize: Size,\n    data: { SPHERE_SEGMENTS: number; SPHERE_HORIZONTAL_SEGMENTS: number },\n): EquirectangularTileConfig {\n    let tile: EquirectangularTileLevel;\n    let level: number;\n    if (!isMultiTiles(panorama)) {\n        level = 0;\n        tile = { ...panorama };\n    } else {\n        if (viewerSize) {\n            level = panorama.levels.findIndex((pLevel) => {\n                const hResolution = pLevel.width / 360 * hFov;\n                const vResolution = pLevel.width / 2 / 180 * vFov;\n                return hResolution >= viewerSize.width && vResolution >= viewerSize.height;\n            });\n            if (level === -1) {\n                level = panorama.levels.length - 1;\n            }\n        } else {\n            level = 0;\n        }\n        tile = panorama.levels[level];\n    }\n    return computeTileConfig(tile, level, data);\n}\n\nexport function getTileConfigByIndex(\n    panorama: EquirectangularTilesPanorama | EquirectangularMultiTilesPanorama,\n    level: number,\n    data: { SPHERE_SEGMENTS: number; SPHERE_HORIZONTAL_SEGMENTS: number },\n): EquirectangularTileConfig {\n    if (!isMultiTiles(panorama) || !panorama.levels[level]) {\n        return null;\n    } else {\n        return computeTileConfig(panorama.levels[level], level, data);\n    }\n}\n\nexport function checkPanoramaConfig(\n    panorama: EquirectangularTilesPanorama | EquirectangularMultiTilesPanorama,\n    data: { SPHERE_SEGMENTS: number; SPHERE_HORIZONTAL_SEGMENTS: number },\n) {\n    if (typeof panorama !== 'object' || !panorama.tileUrl) {\n        throw new PSVError('Invalid panorama configuration, are you using the right adapter?');\n    }\n    if (isMultiTiles(panorama)) {\n        panorama.levels.forEach((level) => {\n            checkTile(level, data);\n            if ('zoomRange' in level) {\n                utils.logWarn('EquirectangularTilesAdapter: \"zoomRange\" property is deprecated and must be removed');\n            }\n        });\n        panorama.levels.sort((a, b) => a.width - b.width);\n    } else {\n        checkTile(panorama, data);\n    }\n}\n\nfunction checkTile(\n    tile: EquirectangularTilesPanorama | EquirectangularTileLevel,\n    data: { SPHERE_SEGMENTS: number; SPHERE_HORIZONTAL_SEGMENTS: number },\n) {\n    if (!tile.width || !tile.cols || !tile.rows) {\n        throw new PSVError('Invalid panorama configuration, are you using the right adapter?');\n    }\n    if (tile.cols > data.SPHERE_SEGMENTS) {\n        throw new PSVError(`Panorama cols must not be greater than ${data.SPHERE_SEGMENTS}.`);\n    }\n    if (tile.rows > data.SPHERE_HORIZONTAL_SEGMENTS) {\n        throw new PSVError(`Panorama rows must not be greater than ${data.SPHERE_HORIZONTAL_SEGMENTS}.`);\n    }\n    if (!MathUtils.isPowerOfTwo(tile.cols) || !MathUtils.isPowerOfTwo(tile.rows)) {\n        throw new PSVError('Panorama cols and rows must be powers of 2.');\n    }\n}\n\n/**\n * Returns a path used for cache key\n */\nexport function getCacheKey(\n    panorama: EquirectangularTilesPanorama | EquirectangularMultiTilesPanorama,\n    firstTile: EquirectangularTileConfig,\n): string {\n    // some tiles might be \"null\"\n    for (let i = 0; i < firstTile.cols; i++) {\n        const url = panorama.tileUrl(i, firstTile.rows / 2, firstTile.level);\n        if (url) {\n            return url;\n        }\n    }\n\n    return panorama.tileUrl.toString();\n}\n"],"mappings":"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","names":["import_core","import_three","import_core","import_three"]}