UNPKG

react-native-filament

Version:

A real-time physically based 3D rendering engine for React Native

129 lines (111 loc) 4.47 kB
import { FilamentBuffer } from './FilamentBuffer' import type { Engine } from '../types/Engine' import { FilamentView } from './FilamentViewTypes' import type { BulletAPI } from '../bullet/types/api' import type { IWorkletContext } from 'react-native-worklets-core' import { EngineBackend, EngineConfig } from '../types' import { TFilamentRecorder } from '../types/FilamentRecorder' import { Choreographer } from '../types/Choreographer' import { Dispatcher } from './Dispatcher' import { FilamentModule } from './FilamentModule' import { Worklets } from 'react-native-worklets-core' interface TestHybridObject { int: number string: string nullableString: string | undefined multipleArguments(first: number, second: boolean, third: string): Record<string, number> getIntGetter(): () => number sayHelloCallback(callback: () => string): void createNewHybridObject: () => TestHybridObject calculateFibonacciAsync: (count: number) => Promise<BigInt> calculateFibonacci: (count: number) => number enum: 'first' | 'second' | 'third' } export interface TFilamentProxy { /** * Asynchronously loads the the given asset into a ByteBuffer. * @param path A web URL (http:// or https://), local file (file://) or resource ID. (Only resource ID supported for now) */ loadAsset(path: string): Promise<FilamentBuffer> /** * @private */ createTestObject(): TestHybridObject /** * @private */ findFilamentView(viewTag: number): Promise<FilamentView> /** * Creates a new engine. You should only call this once. */ createEngine(backend: EngineBackend | undefined, config: EngineConfig | undefined): Engine /** * Creates the bullet API wrapper. * @private */ createBullet(): BulletAPI /** * Creates a Dispatcher interface that can dispatch to the current JS Runtime. * * @throws If the current JS Runtime does not have a Dispatcher. * This may happen if a JS Runtime was not created by Filament */ getCurrentDispatcher(): Dispatcher /** * Creates a Filament Recorder instance that can be used to render offscreen and * record to a video file. * @param width The width of the target video and the target scene. * @param height The height of the target video and the target scene. * @param fps The FPS of the rendered video. Offscreen rendering does not happen at the same * FPS rate as set here, but the resulting video will be displayed at this rate. * @param bitRate The target bit-rate of the video, in bits per second. For example, 2_000_000 is 2 Mbps. */ createRecorder(width: number, height: number, fps: number, bitRate: number): TFilamentRecorder /** * Whether Worklets are installed, or not. */ readonly hasWorklets: boolean /** * Create a Worklet context used for Rendering to Filament. * * This should only be called once, and the returned value should be kept strong. * * @example * ```ts * // 1. Get Render-Thread Worklet Context * const context = FilamentProxy.createWorkletContext() * * // 2. From now on, perform all Filament calls and operations in `context` * context.runAsync(() => { * const engine = FilamentProxy.createEngine() * // render... * }) * ``` */ createWorkletContext: () => IWorkletContext createChoreographer(): Choreographer } const successful = FilamentModule.install() if (!successful) { throw new Error( 'Failed to initialize react-native-filament! The install() method returned false - check the native logs (adb logcat or Xcode logs) for more information.' ) } // @ts-expect-error global is untyped, it's a C++ host-object const proxy = global.FilamentProxy as TFilamentProxy if (proxy == null) { throw new Error( 'Failed to initialize react-native-filament. The global proxy instance (global.FilamentProxy) is null. Check the native logs (adb logcat or Xcode logs) for more information.' ) } if (!proxy.hasWorklets) { throw new Error( 'Failed to initialize react-native-filament - Worklets are not available (HAS_WORKLETS=false), did you install react-native-worklets-core?' ) } export const FilamentProxy = proxy // We must make sure that the Worklets API (module) is initialized (as its possible a lazy-loaded CxxTurboModule), // to initialize we must only call any property of the module: Worklets.defaultContext // Create our custom RNF worklet context: export const FilamentWorkletContext = proxy.createWorkletContext()