renderer/shadows/ShadowMap.tstypescript
import type { DepthCamera } from "../../control/depthCamera/DepthCamera";
import type { ShadowManager } from "./ShadowManager";

export interface IShadowMapParams {
    enabled?: boolean;
    depthCamera: DepthCamera;
}

export class ShadowMap {
    protected static __staticCounter__ = 0;

    public readonly id: number;
    public depthCamera: DepthCamera;
    protected _enabled: boolean;

    public _slot: number = -1;
    public _manager: ShadowManager | null = null;

    constructor(params: IShadowMapParams) {
        this.id = ShadowMap.__staticCounter__++;
        this._enabled = params.enabled ?? true;
        this.depthCamera = params.depthCamera;
        this.depthCamera.shadowMap = this;
    }

    public get enabled(): boolean {
        return this._enabled;
    }

    public set enabled(enabled: boolean) {
        if (this._enabled === enabled) return;

        this._enabled = enabled;
        this._manager?.update(this);
    }

    public get slot(): number {
        return this._slot;
    }

    public get arrayTexture(): WebGLTexture | null {
        return this._manager ? this._manager.depthArrayTexture : null;
    }

    public get depthTexture(): WebGLTexture | null {
        return this.depthCamera.framebuffer.textures[0] || null;
    }

    public blur(): void {
        this._manager?.blurShadowMap(this);
    }
}