import type { ObservableEvents } from 'modern-idoc';
import type { GlRenderer } from '../GlRenderer';
import type { GlRenderingContext } from '../types';
import { Observable } from 'modern-idoc';
export interface GlSystemEvents extends ObservableEvents {
    updateContext: [gl: GlRenderingContext];
    setup: [];
}
export interface GlSystem {
    on: <K extends keyof GlSystemEvents & string>(event: K, listener: (...args: GlSystemEvents[K]) => void) => this;
    once: <K extends keyof GlSystemEvents & string>(event: K, listener: (...args: GlSystemEvents[K]) => void) => this;
    off: <K extends keyof GlSystemEvents & string>(event: K, listener: (...args: GlSystemEvents[K]) => void) => this;
    emit: <K extends keyof GlSystemEvents & string>(event: K, ...args: GlSystemEvents[K]) => this;
}
export declare abstract class GlSystem extends Observable {
    protected _renderer: GlRenderer;
    protected get _gl(): GlRenderingContext;
    constructor();
    install(renderer: GlRenderer): void;
    protected _updateContext(gl: GlRenderingContext): void;
    protected _setup(): void;
    flush(): void;
    reset(): void;
}
