three-render-objects
Version:
Easy way to render ThreeJS objects with built-in interaction defaults
98 lines (84 loc) • 4.5 kB
TypeScript
import { WebGLRendererParameters, Renderer, Object3D, Light, WebGLRenderer, Scene, Camera, Intersection } from 'three';
import { TrackballControls } from 'three/examples/jsm/controls/TrackballControls.js';
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js';
import { FlyControls } from 'three/examples/jsm/controls/FlyControls.js';
import { EffectComposer } from 'three/examples/jsm/postprocessing/EffectComposer.js';
import { ReactHTMLElement } from 'react';
interface ConfigOptions {
controlType?: 'trackball' | 'orbit' | 'fly';
useWebGPU?: boolean;
rendererConfig?: WebGLRendererParameters;
extraRenderers?: Renderer[];
waitForLoadComplete?: boolean;
}
type Accessor<In, Out> = Out | string | ((obj: In) => Out);
type Obj3DAccessor<T> = Accessor<Object3D, T>;
type Coords = { x: number; y: number; z: number; };
type Obj3DCompFn = (a: Object3D, b: Object3D) => number;
declare class ThreeRenderObjectsGeneric<ChainableInstance> {
constructor(element: HTMLElement, configOptions?: ConfigOptions);
resetProps(): ChainableInstance;
// Data input
objects(): Object3D[];
objects(objs: Object3D[]): ChainableInstance;
lights(): Light[];
lights(lights: Light[]): ChainableInstance;
// Container layout
width(): number;
width(width: number): ChainableInstance;
height(): number;
height(height: number): ChainableInstance;
viewOffset(): [number, number];
viewOffset(offset: [number, number]): ChainableInstance;
skyRadius(): number;
skyRadius(glUnits: number): ChainableInstance;
backgroundColor(): string;
backgroundColor(color: string): ChainableInstance;
backgroundImageUrl(): string | null;
backgroundImageUrl(url: string | null): ChainableInstance;
onBackgroundImageLoaded(callback: () => void): ChainableInstance;
showNavInfo(): boolean;
showNavInfo(enabled: boolean): ChainableInstance;
// Render control
tick(): ChainableInstance;
cameraPosition(): Coords;
cameraPosition(position: Partial<Coords>, lookAt?: Coords, transitionMs?: number): ChainableInstance;
zoomToFit(durationMs?: number, padding?: number, objFilter?: (obj: Object3D) => boolean): ChainableInstance;
fitToBbox(bbox: { x: [number, number], y: [number, number], z: [number, number] }, durationMs?: number, padding?: number): ChainableInstance;
postProcessingComposer(): EffectComposer;
renderer(): WebGLRenderer;
scene(): Scene;
camera(): Camera;
controls(): TrackballControls | OrbitControls | FlyControls;
// Interaction
onClick(callback: (obj: object | null, event: MouseEvent, intersection: Intersection) => void): ChainableInstance;
onRightClick(callback: (obj: object | null, event: MouseEvent, intersection: Intersection) => void): ChainableInstance;
onHover(callback: (obj: object | null, previousObj: object | null, intersection: Intersection | null) => void): ChainableInstance;
hoverOrderComparator(): Obj3DCompFn;
hoverOrderComparator(compFn: Obj3DCompFn): ChainableInstance;
hoverFilter(): (obj: Object3D) => boolean;
hoverFilter(filterFn: (obj: Object3D) => boolean): ChainableInstance;
lineHoverPrecision(): number;
lineHoverPrecision(precision: number): ChainableInstance;
pointsHoverPrecision(): number;
pointsHoverPrecision(precision: number): ChainableInstance;
tooltipContent(): Obj3DAccessor<string | HTMLElement | ReactHTMLElement<HTMLElement> | boolean>;
tooltipContent(contentAccessor: Obj3DAccessor<string | HTMLElement | ReactHTMLElement<HTMLElement> | boolean>): ChainableInstance;
pointerRaycasterThrottleMs(): number;
pointerRaycasterThrottleMs(ms: number): ChainableInstance;
enablePointerInteraction(): boolean;
enablePointerInteraction(enable: boolean): ChainableInstance;
hoverDuringDrag(): boolean;
hoverDuringDrag(enabled: boolean): ChainableInstance;
clickAfterDrag(): boolean;
clickAfterDrag(enabled: boolean): ChainableInstance;
getPointerPos(): { x: number, y: number };
// Utility
getBbox(objFilter?: (obj: Object3D) => boolean): { x: [number, number], y: [number, number], z: [number, number] };
getScreenCoords(x: number, y: number, z: number): { x: number, y: number; };
getSceneCoords(x: number, y: number, distance: number): { x: number, y: number, z: number };
intersectingObjects(x: number, y: number): Intersection[];
}
declare class ThreeRenderObjects extends ThreeRenderObjectsGeneric<ThreeRenderObjects> {}
export { ThreeRenderObjectsGeneric, ThreeRenderObjects as default };
export type { ConfigOptions };