videx-3d
Version:
React 3D component library designed for sub surface visualizations in the browser
91 lines (90 loc) • 2.61 kB
TypeScript
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;