UNPKG

react-native-filament

Version:

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

114 lines (108 loc) 5.3 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.FilamentScene = FilamentScene; var _react = _interopRequireWildcard(require("react")); var _FilamentProxy = require("../native/FilamentProxy"); var _useEngine = require("../hooks/useEngine"); var _useDisposableResource = require("../hooks/useDisposableResource"); var _reactNativeWorkletsCore = require("react-native-worklets-core"); var _Configurator = require("./Configurator"); var _useFilamentContext = require("../hooks/useFilamentContext"); var _RenderCallbackContext = require("./RenderCallbackContext"); var _jsxRuntime = require("react/jsx-runtime"); function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); } /** * The `<FilamentScene>` holds contextual values for a Filament rendering scene. * * You need to wrap your rendering scene (= a component that uses `<FilamentView>`, hooks or * other Filament components) with a `<FilamentScene>`. * * @note Make sure to wrap your scene in a parent component, otherwise the React context cannot be inferred. * @example * ```tsx * function Scene() { * // in here you can use Filament's hooks and components * return ( * <FilamentView style={styles.container}> * <DefaultLight /> * <Model source={{ uri: modelPath }} /> * </FilamentView> * ) * } * * export function RocketModel() { * // in here you only need to wrap the child-component with <FilamentScene> * return ( * <FilamentScene> * <Scene /> * </FilamentScene> * ) * } * ``` */ function FilamentScene({ children, fallback, config, backend, frameRateOptions, ...viewProps }) { // First create the engine, which we need to create (almost) all other filament APIs const engine = (0, _useEngine.useEngine)({ config, backend, context: _FilamentProxy.FilamentWorkletContext }); // Create all Filament APIs using the engine const transformManager = (0, _useDisposableResource.useDisposableResource)(() => Promise.resolve(engine?.createTransformManager()), [engine]); const renderableManager = (0, _useDisposableResource.useDisposableResource)(() => Promise.resolve(engine?.createRenderableManager()), [engine]); const scene = (0, _useDisposableResource.useDisposableResource)(() => Promise.resolve(engine?.getScene()), [engine]); const lightManager = (0, _useDisposableResource.useDisposableResource)(() => Promise.resolve(engine?.createLightManager()), [engine]); const view = (0, _useDisposableResource.useDisposableResource)(() => Promise.resolve(engine?.getView()), [engine]); const camera = (0, _useDisposableResource.useDisposableResource)(() => Promise.resolve(engine?.getCamera()), [engine]); const renderer = (0, _useDisposableResource.useDisposableResource)(() => Promise.resolve(engine?.createRenderer()), [engine]); const nameComponentManager = (0, _useDisposableResource.useDisposableResource)(() => Promise.resolve(engine?.createNameComponentManager()), [engine]); // Create a choreographer for this context tree const choreographer = (0, _useDisposableResource.useDisposableResource)((0, _reactNativeWorkletsCore.useWorklet)(_FilamentProxy.FilamentWorkletContext, () => { 'worklet'; return _FilamentProxy.FilamentProxy.createChoreographer(); })); // Construct the context object value: const value = (0, _react.useMemo)(() => { if (transformManager == null || renderableManager == null || scene == null || lightManager == null || view == null || camera == null || renderer == null || nameComponentManager == null || choreographer == null || engine == null) { return undefined; } return { engine, transformManager, renderableManager, scene, lightManager, view, camera, renderer, nameComponentManager, workletContext: _FilamentProxy.FilamentWorkletContext, choreographer: choreographer }; }, [engine, transformManager, renderableManager, scene, lightManager, view, camera, renderer, nameComponentManager, choreographer]); const rendererProps = (0, _react.useMemo)(() => ({ frameRateOptions }), [frameRateOptions]); // If the APIs aren't ready yet render the fallback component (or nothing) if (value == null) return fallback ?? null; return /*#__PURE__*/(0, _jsxRuntime.jsx)(_useFilamentContext.FilamentContext.Provider, { value: value, children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Configurator.Configurator, { rendererProps: rendererProps, viewProps: viewProps, children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_RenderCallbackContext.RenderCallbackContext.RenderContextProvider, { children: children }) }) }); } //# sourceMappingURL=FilamentScene.js.map