import { VisLevel } from "./index.js";
export class VisMain {
    _canvas;
    _context;
    _startTimestamp = 0;
    _active = true;
    _ready = false;
    _gap = 0;
    _wallPattern;
    _visLevel;
    _simMain;
    constructor(simMain, canvas) {
        this._simMain = simMain;
        this._canvas = canvas;
        this._context = this._canvas.getContext("2d");
        this._context.globalCompositeOperation = "source-over";
        this._wallPattern = this.createPattern(this._simMain.gdRoot.image("wall.png"), 48);
        this._visLevel = new VisLevel(this, this._simMain, this._simMain.gdRoot);
        const host = this;
        requestAnimationFrame(function step(timestamp) {
            host.step(timestamp);
        });
    }
    get simMain() {
        return this._simMain;
    }
    get visLevel() {
        return this._visLevel;
    }
    get canvas() {
        return this._canvas;
    }
    get context() {
        return this._context;
    }
    get wallPattern() {
        return this._wallPattern;
    }
    createPattern(image, size) {
        const tempCanvas = document.createElement("canvas");
        const tempContext = tempCanvas.getContext("2d");
        tempCanvas.width = size;
        tempCanvas.height = size;
        tempContext.drawImage(image, 0, 0, image.width, image.height, 0, 0, size, size);
        return this._context.createPattern(tempCanvas, 'repeat');
    }
    step(timestamp) {
        if (!this._active) {
            return;
        }
        const host = this;
        requestAnimationFrame((timestamp) => {
            host.step(timestamp);
        });
        if (!this._startTimestamp) {
            this._startTimestamp = timestamp;
        }
        const simLevel = this._simMain.currentLevel;
        let targetStep = (timestamp - this._startTimestamp) * this._simMain.gdRoot.simulation.stepsPerSecond / 1000 - this._gap;
        if (simLevel.paused) {
            this._gap += targetStep - simLevel.currentStep;
            targetStep = simLevel.currentStep;
        }
        this._simMain.executeUntilStep(targetStep);
        this._visLevel.updateEveryFrame(targetStep);
        this.onRender();
    }
    ;
    onResized() {
        const gameHost = document.getElementById("game-host");
        const width = gameHost.clientWidth;
        const height = gameHost.clientHeight;
        const ratio = window.devicePixelRatio;
        this._canvas.width = width * ratio;
        this._canvas.height = height * ratio;
        this._canvas.style.width = width + "px";
        this._canvas.style.height = height + "px";
        this._context.scale(ratio, ratio);
        this._visLevel.updateSize();
    }
    ;
    onRender() {
        this.clear();
        const ctx = this._context;
        ctx.font = "12px Tahoma";
        const simLevel = this._simMain.currentLevel;
        if (!!simLevel) {
            if (!this._ready) {
                this.onResized();
                this._ready = true;
            }
            this._visLevel.draw();
        }
    }
    ;
    clear() {
        this._context.clearRect(0, 0, this._canvas.width, this._canvas.height);
    }
    stop() {
        this._active = false;
    }
}
//# sourceMappingURL=VisMain.js.map