diff --git a/packages/react-babylonjs/src/engine/Engine.tsx b/packages/react-babylonjs/src/engine/Engine.tsx index d81bf37b..0942d3bb 100644 --- a/packages/react-babylonjs/src/engine/Engine.tsx +++ b/packages/react-babylonjs/src/engine/Engine.tsx @@ -22,8 +22,8 @@ const ReactBabylonjsEngine: React.FC = (props: EngineProps, context const engine = useRef>(null) const [_, setEngineReady] = useState(false) - const onBeforeRenderLoopObservable = useRef>(new Observable()) - const onEndRenderLoopObservable = useRef>(new Observable()) + // const onBeforeRenderLoopObservable = useRef>(new Observable()) + // const onEndRenderLoopObservable = useRef>(new Observable()) const canvasRef = useRef>(null) const [canvasReady, setCanvasReady] = useState(false) @@ -75,9 +75,9 @@ const ReactBabylonjsEngine: React.FC = (props: EngineProps, context if (shouldRenderRef.current === false) { return } - if (onBeforeRenderLoopObservable.current.hasObservers()) { - onBeforeRenderLoopObservable.current.notifyObservers(engine.current!) - } + // if (onBeforeRenderLoopObservable.current.hasObservers()) { + // onBeforeRenderLoopObservable.current.notifyObservers(engine.current!) + // } // TODO: here is where you could access your own render method engine.current!.scenes.forEach((scene) => { @@ -87,9 +87,9 @@ const ReactBabylonjsEngine: React.FC = (props: EngineProps, context } }) - if (onEndRenderLoopObservable.current.hasObservers()) { - onEndRenderLoopObservable.current.notifyObservers(engine.current!) - } + // if (onEndRenderLoopObservable.current.hasObservers()) { + // onEndRenderLoopObservable.current.notifyObservers(engine.current!) + // } }) engine.current.onContextLostObservable.add((eventData: ThinEngine) => { diff --git a/packages/react-babylonjs/src/engine/FallbackEngine.tsx b/packages/react-babylonjs/src/engine/FallbackEngine.tsx index a9318106..7544ca37 100644 --- a/packages/react-babylonjs/src/engine/FallbackEngine.tsx +++ b/packages/react-babylonjs/src/engine/FallbackEngine.tsx @@ -9,8 +9,7 @@ import { SharedEngineProps } from './engineProps' export type FallbackEngineProps = { engineProps?: EngineOnlyProps webGPUEngineProps?: WebGPUEngineOnlyProps -} & EngineOnlyProps & - SharedEngineProps & { +} & SharedEngineProps & { children?: ReactNode | undefined } & React.CanvasHTMLAttributes diff --git a/packages/react-babylonjs/src/engine/WebGPUEngine.tsx b/packages/react-babylonjs/src/engine/WebGPUEngine.tsx index 405c37a9..072d43b5 100644 --- a/packages/react-babylonjs/src/engine/WebGPUEngine.tsx +++ b/packages/react-babylonjs/src/engine/WebGPUEngine.tsx @@ -37,11 +37,6 @@ const ReactBabylonjsWebGPUEngine: React.FC = ( const engine = useRef>(null) const [_, setEngineReady] = useState(false) - const onBeforeRenderLoopObservable = useRef>( - new Observable() - ) - const onEndRenderLoopObservable = useRef>(new Observable()) - const canvasRef = useRef>(null) const [canvasReady, setCanvasReady] = useState(false) const shouldRenderRef = useRef(true) @@ -51,6 +46,8 @@ const ReactBabylonjsWebGPUEngine: React.FC = ( touchActionNone, canvasId, webGPUEngineOptions, + twgslOptions, + glslangOptions, renderOptions, observeCanvasResize, children, @@ -75,38 +72,7 @@ const ReactBabylonjsWebGPUEngine: React.FC = ( return } - engine.current = new WebGPUEngine( - canvasRef.current, - webGPUEngineOptions ?? { - enableAllFeatures: true, - setMaximumLimits: true, - } - ) - - engine.current.runRenderLoop(() => { - if (shouldRenderRef.current === false) { - return - } - if (onBeforeRenderLoopObservable.current.hasObservers()) { - onBeforeRenderLoopObservable.current.notifyObservers(engine.current!) - } - - // TODO: here is where you could access your own render method - engine.current!.scenes.forEach((scene) => { - // TODO (fix properly): in React 18.2 (not 18.0 or 18.1 if the camera is in a subcomponent it will be added in a future render!) - if (scene.cameras?.length > 0) { - scene.render() - } - }) - - if (onEndRenderLoopObservable.current.hasObservers()) { - onEndRenderLoopObservable.current.notifyObservers(engine.current!) - } - }) - - engine.current.onContextLostObservable.add((eventData: ThinEngine) => { - console.warn('context loss observable from Engine: ', eventData) - }) + const webGPUEngine = (engine.current = new WebGPUEngine(canvasRef.current, webGPUEngineOptions)) const onResizeWindow = () => { if (engine.current) { @@ -114,15 +80,36 @@ const ReactBabylonjsWebGPUEngine: React.FC = ( } } - window.addEventListener('resize', onResizeWindow) // when initAsync completes - a re-render is triggers (to render scene) - engine.current.initAsync().then(() => setEngineReady(true)) + engine.current.initAsync(glslangOptions, twgslOptions).then(() => { + webGPUEngine.runRenderLoop(() => { + if (shouldRenderRef.current === false) { + return + } + + // TODO: here is where you could access your own render method + engine.current!.scenes.forEach((scene) => { + // TODO (fix properly): in React 18.2 (not 18.0 or 18.1 if the camera is in a subcomponent it will be added in a future render!) + if (scene.cameras?.length > 0) { + scene.render() + } + }) + }) + + webGPUEngine.onContextLostObservable.add((eventData: ThinEngine) => { + console.warn('context loss observable from Engine: ', eventData) + }) + + window.addEventListener('resize', onResizeWindow) + + setEngineReady(true) + }) return () => { window.removeEventListener('resize', onResizeWindow) if (engine.current !== null) { - engine.current!.dispose() + engine.current.dispose() engine.current = null } } diff --git a/packages/static/content/examples/basic/animations/BasicAnimations.tsx b/packages/static/content/examples/basic/animations/BasicAnimations.tsx index 3b19e73a..eeecf840 100644 --- a/packages/static/content/examples/basic/animations/BasicAnimations.tsx +++ b/packages/static/content/examples/basic/animations/BasicAnimations.tsx @@ -85,7 +85,7 @@ export const BasicAnimations: FC = () => (