From 543debb56c1b2220acbde4f8ee025a6ce9dd3e64 Mon Sep 17 00:00:00 2001 From: Brian Zinn Date: Sun, 27 Aug 2023 08:27:12 -0700 Subject: [PATCH] fix: move SetStateAction lower and setting container Ref later. Attempt to resolve first scene render. #291 --- packages/react-babylonjs/src/Scene.tsx | 33 +++++++++++++------------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/packages/react-babylonjs/src/Scene.tsx b/packages/react-babylonjs/src/Scene.tsx index 7e707aac..cf212422 100644 --- a/packages/react-babylonjs/src/Scene.tsx +++ b/packages/react-babylonjs/src/Scene.tsx @@ -55,7 +55,7 @@ const updateScene = ( const Scene: React.FC = (props: SceneProps, context?: any) => { const { engine } = useContext(EngineCanvasContext) - const [propsHandler] = useState(new FiberScenePropsHandler()) + const [propsHandler] = useState(() => new FiberScenePropsHandler()) const [sceneReady, setSceneReady] = useState(false) const [scene, setScene] = useState>(null) @@ -69,14 +69,6 @@ const Scene: React.FC = (props: SceneProps, context?: any) => { useEffect( () => { const newScene = new BabylonScene(engine!, props.sceneOptions) - // const onReadyObservable: Nullable> = scene.onReadyObservable.add(onSceneReady); - const sceneIsReady = newScene.isReady() - if (sceneIsReady) { - // scene.onReadyObservable.remove(onReadyObservable); - setSceneReady(true) // this does not flow and cause a re-render - } else { - console.error('Scene is not ready. Report issue in react-babylonjs repo') - } // TODO: try to move the scene to parentComponent in updateContainer const container: Container = { @@ -95,11 +87,18 @@ const Scene: React.FC = (props: SceneProps, context?: any) => { updateScene(props, prevPropsRef, container.rootInstance, propsHandler) - containerRef.current = container - const reconciler = createReconciler({}) reconcilerRef.current = reconciler + // const onReadyObservable: Nullable> = scene.onReadyObservable.add(onSceneReady); + const sceneIsReady = newScene.isReady() + if (sceneIsReady) { + // scene.onReadyObservable.remove(onReadyObservable); + setSceneReady(true) + } else { + console.error('Scene is not ready. Report issue in react-babylonjs repo') + } + setScene(newScene) const pointerDownObservable: Nullable> = @@ -159,6 +158,7 @@ const Scene: React.FC = (props: SceneProps, context?: any) => { {props.children} ) + reconciler.render( sceneGraph, container, @@ -167,6 +167,7 @@ const Scene: React.FC = (props: SceneProps, context?: any) => { }, null ) + containerRef.current = container return () => { if (pointerDownObservable) { @@ -203,14 +204,14 @@ const Scene: React.FC = (props: SceneProps, context?: any) => { ] ) - // update babylon scene + // update babylon scene with props useEffect(() => { - // when the scene is set, so are containerRef and reconcilerRef - if (scene === null) { + const container = containerRef.current + if (scene === null || container === null) { return } - updateScene(props, prevPropsRef, containerRef.current!.rootInstance, propsHandler) + updateScene(props, prevPropsRef, container.rootInstance, propsHandler) const sceneGraph = ( = (props: SceneProps, context?: any) => { ) reconcilerRef.current!.render( sceneGraph, - containerRef.current!, + container, () => { /* ignored */ },