segment/SegmentLonLatEqui.tstypescript
import { Extent } from "../Extent";
import { Node } from "../quadTree/Node";
import { SegmentLonLat } from "./SegmentLonLat";
import { getTileCellIndex, TILEGROUP_COMMON } from "./Segment";
import { equi } from "../proj/equi";
import type { WebGLTextureExt } from "../webgl/Handler";
import { QuadTreeStrategy } from "../quadTree";

const MAX_POLE_ZOOM = 5;
export const POLE_PIECE_SIZE = 5 / Math.pow(2, MAX_POLE_ZOOM);

export class SegmentLonLatEqui extends SegmentLonLat {
    constructor(node: Node, quadTreeStrategy: QuadTreeStrategy, tileZoom: number, extent: Extent) {
        super(node, quadTreeStrategy, tileZoom, extent);
        this._projection = equi;
        this.isPole = false;
        this._tileGroup = TILEGROUP_COMMON;
    }

    protected override _getMaxZoom(): number {
        let maxPoleZoom: number;
        if (this._extent.northEast.lat > 85) {
            //north pole limits
            let Yz = Math.floor((90.0 - this._extent.northEast.lat) / POLE_PIECE_SIZE);
            maxPoleZoom = Math.floor(Yz / 16) + MAX_POLE_ZOOM;
        } else if (this._extent.southWest.lat < -85) {
            //south pole limits
            let Yz = Math.floor((90 + this._extent.southWest.lat) / POLE_PIECE_SIZE);
            maxPoleZoom = Math.floor(Yz / 16) + MAX_POLE_ZOOM;
        } else {
            maxPoleZoom = 50;
        }
        return maxPoleZoom;
    }

    protected override _assignTileYIndexes(extent: Extent) {
        const lat = extent.getCenter().lat;
        this.tileY = getTileCellIndex(lat, extent.getHeight(), 90.0);
        this.tileYN = this.tileY - 1;
        this.tileYS = this.tileY + 1;
    }

    protected override _assignTileXIndexes(extent: Extent) {
        let lon = extent.getCenter().lon;
        this.tileX = getTileCellIndex(lon, extent.getWidth(), -180);
        let p2 = (1 << this.tileZoom) * 2;
        this.tileXE = (this.tileX + 1) % p2;
        this.tileXW = (p2 + this.tileX - 1) % p2;
    }

    public override getDefaultTexture(): WebGLTextureExt | null {
        return this.planet.solidTextureOne;
    }
}