@vladkrutenyuk/three-kvy-core
Version:
Everything you need to create any-complexity 3D apps with Three.js. Empower Three.js with a modular, lifecycle-managed context that seamlessly propagates through objects via reusable features providing structured logic.
135 lines (133 loc) • 5.34 kB
TypeScript
import { EventEmitter } from "eventemitter3";
import type * as THREE from "three";
export type ThreeContextParams = {
renderer?: THREE.WebGLRendererParameters;
};
/**
* A utility for initializing core [Three.js](https://threejs.org) entities, managing their setup, and handling rendering.
* @see {@link https://three-kvy-core.vladkrutenyuk.ru/docs/api/three-context | Official Documentation}
* @see {@link https://github.com/vladkrutenyuk/three-kvy-core/blob/main/src/core/ThreeContext.ts | Source}
*/
export declare class ThreeContext extends EventEmitter<ThreeContextEventMap, ThreeContext> {
/**
* Shortcut to create an instance of ThreeContext.
* @param {typeof import("three")} Three - Three.js `THREE` imported module, object containing class constructors `WebGLRenderer`, `PerspectiveCamera`, `Scene`, `Clock`, `Raycaster`.
* @param {{renderer: THREE.WebGLRendererParameters}} params - (optional) Object parameters
* @returns {ThreeContext} An instance of ThreeContext
* @example
* ```js
import * as THREE from "three";
import * as KVY from "@vladkrutenyuk/three-kvy-core";
const three = new KVY.ThreeContext.create(THREE, { renderer: { antialias: true } });
```
*/
static create(Three: {
WebGLRenderer: typeof THREE.WebGLRenderer;
PerspectiveCamera: typeof THREE.PerspectiveCamera;
Scene: typeof THREE.Scene;
Clock: typeof THREE.Clock;
Raycaster: typeof THREE.Raycaster;
}, params?: ThreeContextParams): ThreeContext;
/**
* (readonly) flag to mark that it is an instance of ThreeContext.
* @type {true}
*/
readonly isThreeContext: true;
/**
* (readonly) instance of Three.js `WebGLRenderer` used for rendering your awesome scene.
* @type {THREE.WebGLRenderer}
*/
readonly renderer: THREE.WebGLRenderer;
/**
* An instance of Three.js `PerspectiveCamera` camera which is used in rendering. Fires event `camerachanged` on set.
*/
get camera(): THREE.PerspectiveCamera;
set camera(value: THREE.PerspectiveCamera);
/** (readonly) instance of Three.js `Scene` that contains all objects to be rendered. */
readonly scene: THREE.Scene;
/** (readonly) instance of Three.js `Clock` */
readonly clock: THREE.Clock;
/** (readonly) instance of Three.js `Raycaster`. */
readonly raycaster: THREE.Raycaster;
/** (readonly) HTML element where the renderer canvas is appended on mount. */
get container(): HTMLDivElement | null;
/**
* (readonly) flag to check if the renderer canvas is currently mounted.
* @type {boolean}
*/
get isMounted(): boolean;
/**
* (readonly) flag to check whether this instance has been destroyed.
*/
get isDestroyed(): boolean;
private _camera;
private _container;
private _resizeObserver;
private _isMounted;
private _isDestroyed;
private _srcRenderFn;
private _renderFn;
/**
* This creates a new {@link ThreeContext} instance.
* @param {THREE.WebGLRenderer} renderer - An instance of Three.js `WebGLRenderer`
* @param {THREE.PerspectiveCamera} camera - An instance of Three.js `PerspectiveCamera`
* @param {THREE.Scene} scene - An instance of Three.js `Scene`
* @param {THREE.Clock} clock - An instance of Three.js `Clock`
* @param {THREE.Raycaster} raycaster - An instance of Three.js `Raycaster`
*/
constructor(renderer: THREE.WebGLRenderer, camera: THREE.PerspectiveCamera, scene: THREE.Scene, clock: THREE.Clock, raycaster: THREE.Raycaster);
/**
* Renders the scene using the current render function. Fires `renderbefore` and `renderafter` events.
*/
render(): void;
/**
* Overrides the render function with a custom implementation.
* @param {Function} fn
* @returns
*/
overrideRender(fn: () => void): this;
/**
* Resets the render function to its default implementation.
*/
resetRender(): this;
/**
* Append the renderer canvas to the given HTML container, initializes event listeners and resize observer.
* Fires `mount` event.
* @param {HTMLDivElement} container - The HTML container element where to mount (append) renderer canvas.
*/
mount(container: HTMLDivElement): this | undefined;
/**
* Remove the renderer canvas from DOM it was mounted, removes event listeners, disconnect resize observer.
* Fires `"unmount"` event.
*/
unmount(): this | undefined;
/**
* Destroys this instance, releasing resources and preventing further rendering.
* Fires `"destroy"` event.
*/
destroy(): void;
private resizeHandler;
private cameraChanged;
}
declare const ev: Readonly<{
RenderBefore: "renderbefore";
RenderAfter: "renderafter";
Mount: "mount";
Unmount: "unmount";
Destroy: "destroy";
CameraChanged: "camerachanged";
Resize: "resize";
}>;
export type ThreeContextEventMap = {
[ev.RenderBefore]: [];
[ev.RenderAfter]: [];
[ev.Mount]: [root: HTMLDivElement];
[ev.Unmount]: [];
[ev.Destroy]: [];
[ev.Resize]: [width: number, height: number];
[ev.CameraChanged]: [
newCamera: THREE.PerspectiveCamera,
prevCamera: THREE.PerspectiveCamera
];
};
export {};