import {useEffect} from 'react'; import {useContext} from 'react'; import classNames from 'classnames'; import Preloader from '../components/Preloader'; import { useDispatchers, useHelpers, useLight, useObject3D, useOnDidMount, useOnSceneReady, useThreeEnvironment } from './hooks'; import ViewerContext from '../ViewerContext'; import './UniversalScene.scss'; import ErrorMessage from "../components/ErrorMessage"; import {fitObjectToCamera} from './utils'; const UniversalScene = () => { const { animationRunner, clientSize, dispatchers, object3D, onSceneReady, options, threeRoot, setIsLoading, } = useContext(ViewerContext); const {addDefaultHelpers} = options; const threeEnv = useThreeEnvironment(clientSize); useDispatchers({threeEnv, dispatchers}); useLight(threeEnv.scene, options); useHelpers(threeEnv.scene, addDefaultHelpers); const {isObjectAdded} = useObject3D(threeEnv.scene, object3D); useOnSceneReady(onSceneReady); useOnDidMount({threeEnv, threeRoot, animationRunner}); useEffect(function alignObjectInViewport() { object3D?.then(model => { fitObjectToCamera(model, threeEnv.camera, threeEnv.controls) }) }, [object3D, threeEnv.camera]) useEffect(function onObjectLoaded() { setIsLoading(!isObjectAdded); }, [isObjectAdded, setIsLoading]); const sceneClasses = classNames({ 'universal-scene': true, 'fog': isObjectAdded, }); if (!object3D) { return } return (
{!isObjectAdded && }
) }; export default UniversalScene;