import * as THREE from 'three';
import * as React from 'react';
import { TinyEmitter } from 'tiny-emitter';
import { ReactThreeFiber } from './three-types';
import { RectReadOnly } from 'react-use-measure';
export declare type Camera = THREE.OrthographicCamera | THREE.PerspectiveCamera;
export declare function isOrthographicCamera(def: THREE.Camera): def is THREE.OrthographicCamera;
export interface Intersection extends THREE.Intersection {
    eventObject: THREE.Object3D;
}
declare type ThreeEvent<T> = T & Intersection & {
    intersections: Intersection[];
    stopped: boolean;
    unprojectedPoint: THREE.Vector3;
    ray: THREE.Ray;
    camera: THREE.Camera;
    stopPropagation: () => void;
    sourceEvent: T;
    delta: number;
};
export declare type PointerEvent = ThreeEvent<React.PointerEvent>;
export declare type MouseEvent = ThreeEvent<React.MouseEvent>;
export declare type WheelEvent = ThreeEvent<React.WheelEvent>;
declare type DomEvent = PointerEvent | MouseEvent | WheelEvent;
export declare type RenderCallback = (state: CanvasContext, delta: number) => void;
export declare type SharedCanvasContext = {
    gl: THREE.WebGLRenderer;
    aspect: number;
    subscribe: (callback: React.MutableRefObject<RenderCallback>, priority?: number) => () => void;
    setDefaultCamera: (camera: Camera) => void;
    invalidate: () => void;
    intersect: (event?: DomEvent) => void;
    camera: Camera;
    raycaster: THREE.Raycaster;
    mouse: THREE.Vector2;
    clock: THREE.Clock;
    scene: THREE.Scene;
    size: RectReadOnly;
    viewport: {
        width: number;
        height: number;
        factor: number;
    };
    events: DomEventHandlers;
};
export declare type Subscription = {
    ref: React.MutableRefObject<RenderCallback>;
    priority: number;
};
export declare type CanvasContext = SharedCanvasContext & {
    captured: Intersection[] | undefined;
    noEvents: boolean;
    ready: boolean;
    active: boolean;
    manual: number;
    sRGB: boolean;
    colorManagement: boolean;
    vr: boolean;
    concurrent: boolean;
    invalidateFrameloop: boolean;
    frames: number;
    subscribers: Subscription[];
    initialClick: [number, number];
    initialHits: THREE.Object3D[];
    pointer: TinyEmitter;
};
export declare type FilterFunction = (items: THREE.Intersection[], state: SharedCanvasContext) => THREE.Intersection[];
export declare type ResizeOptions = {
    debounce?: number | {
        scroll: number;
        resize: number;
    };
    scroll?: boolean;
};
export interface CanvasProps {
    children: React.ReactNode;
    vr?: boolean;
    gl2?: boolean;
    concurrent?: boolean;
    shadowMap?: boolean | Partial<THREE.WebGLShadowMap>;
    sRGB?: boolean;
    colorManagement?: boolean;
    orthographic?: boolean;
    resize?: ResizeOptions;
    invalidateFrameloop?: boolean;
    updateDefaultCamera?: boolean;
    noEvents?: boolean;
    gl?: Partial<THREE.WebGLRendererParameters>;
    camera?: Partial<ReactThreeFiber.Object3DNode<THREE.Camera, typeof THREE.Camera> & ReactThreeFiber.Object3DNode<THREE.PerspectiveCamera, typeof THREE.PerspectiveCamera> & ReactThreeFiber.Object3DNode<THREE.OrthographicCamera, typeof THREE.OrthographicCamera>>;
    raycaster?: Partial<THREE.Raycaster> & {
        filter?: FilterFunction;
    };
    pixelRatio?: number;
    onCreated?: (props: CanvasContext) => Promise<any> | void;
    onPointerMissed?: () => void;
}
export interface UseCanvasProps extends CanvasProps {
    gl: THREE.WebGLRenderer;
    size: RectReadOnly;
}
export declare type DomEventHandlers = {
    onClick(e: any): void;
    onContextMenu(e: any): void;
    onDoubleClick(e: any): void;
    onWheel(e: any): void;
    onPointerDown(e: any): void;
    onPointerUp(e: any): void;
    onPointerLeave(e: any): void;
    onPointerMove(e: any): void;
    onGotPointerCaptureLegacy(e: any): void;
    onLostPointerCapture(e: any): void;
};
export declare const stateContext: React.Context<SharedCanvasContext>;
export declare const useCanvas: (props: UseCanvasProps) => DomEventHandlers;
export {};
