import { Camera, Object3D } from 'three';
import { Vec2, Vec3 } from '../../sdk';
export type KeysPressed = {
    altKey: boolean;
    ctrlKey: boolean;
    shiftKey: boolean;
};
export type EventEmitterCallbackEvent = {
    target: Object3D;
    source: Object3D;
    instanceIndex?: number;
    position?: Vec3;
    pointer: Vec2;
    camera: Camera;
    domElement: HTMLElement;
    keys: KeysPressed;
    ref: any;
};
export type EventEmitterCallback = (event: EventEmitterCallbackEvent) => void;
export type Listener = {
    object: Object3D;
    ref?: any;
    threshold?: number;
    handlers: Record<string, EventEmitterCallback>;
};
export type Emitter = {
    source: Object3D;
    depth: number;
    listener: number;
    instanced: boolean;
    instanceCount: number;
    threshold: number;
};
export type ObjectMapEntry = {
    emitter: number;
    index: number;
};
export type EventEmitterContextProps = {
    register: (listener: Listener) => () => void;
    update: () => void;
};
/**
 * Context for registering event handlers to the `EventEmitter`
 *
 * @see {@link EventEmitter}
 *
 * @group Contexts
 */
export declare const EventEmitterContext: import('react').Context<EventEmitterContextProps>;
/**
 * Used to register event handlers for renderable components.
 *
 * @example
 * const eventHandler = useEventEmitter()
 *
 * @remarks
 * The generator is an async function that process and returns data required
 * by your components, such as geometry for a mesh.
 *
 * An optional threshold value may be provided in the register method. This is used
 * to weight the distance when performing GPU picking, making objects with a
 * higher threshold more likely to be hit. This is usually used for thin/small objects,
 * which may otherwise be hard to hit.
 * @example
 *
 * useEffect(() => {
 *   let unregister: (() => void) | null = null
 *   if (eventHandler && ref.current) {
 *     const handlers: Record<string, EventEmitterCallback> = {}
 *
 *     if (onPointerClick) handlers.click = onPointerClick
 *     if (onPointerEnter) handlers.enter = onPointerEnter
 *     if (onPointerLeave) handlers.leave = onPointerLeave
 *     if (onPointerMove) handlers.move = onPointerMove
 *
 *     if (Object.keys(handlers).length) {
 *       unregister = eventHandler.register(ref.current, handlers, id)
 *     }
 *   }
 *
 *   return () => {
 *     if (unregister) unregister()
 *   }
 * }, [eventHandler, onPointerClick, onPointerEnter, onPointerLeave, onPointerMove])
 *
 * @see {@link EventEmitter}
 *
 * @group Hooks
 */
export declare const useEventEmitter: () => EventEmitterContextProps;
