import { Cell } from '../../reactive';
import { Camera, Scene, WebGLRenderer, Object3D, Raycaster, Vector2 } from 'three';

export declare const TRES_CONTEXT: unique symbol;
export interface TresContextState {
    scene: Scene;
    camera: Cell<Camera | null>;
    cameras: Cell<Camera[]>;
    renderer: Cell<WebGLRenderer | null>;
    raycaster: Raycaster | null;
    pointer: Vector2 | null;
    onBeforeRender: Set<(state: TresContextState, delta: number) => void>;
    onAfterRender: Set<(state: TresContextState, delta: number) => void>;
    interactiveObjects: Set<Object3D>;
    isRunning: Cell<boolean>;
}
export interface TresContext {
    /** The Three.js scene */
    scene: Scene;
    /** Get the active camera */
    getCamera(): Camera | null;
    /** Get all registered cameras */
    getCameras(): Camera[];
    /** Get the WebGL renderer */
    getRenderer(): WebGLRenderer | null;
    /** Register a callback to run before each render */
    onBeforeRender(callback: (state: TresContextState, delta: number) => void): () => void;
    /** Register a callback to run after each render */
    onAfterRender(callback: (state: TresContextState, delta: number) => void): () => void;
    /** Register an object for pointer events */
    registerInteractiveObject(object: Object3D): void;
    /** Unregister an object from pointer events */
    unregisterInteractiveObject(object: Object3D): void;
    /** Pause the render loop */
    pause(): void;
    /** Resume the render loop */
    resume(): void;
    /** Check if the render loop is running */
    isRunning(): boolean;
    /** Internal state (for advanced use) */
    state: TresContextState;
}
/**
 * Create a new Tres context state
 */
export declare function createTresContextState(scene: Scene): TresContextState;
/**
 * Create a Tres context from state
 */
export declare function createTresContext(state: TresContextState): TresContext;
