import { useEffect, useState } from 'react' import WebGPU from "three/examples/jsm/capabilities/WebGPU.js"; import './App.css' import { Demo } from './Demo'; import ThreeCanvas from './components/threeCanvas'; function App() { const [isDemoReady, setIsDemoReady] = useState(false); const [isDarkTheme, setIsDarkTheme] = useState(false); const [isGPUAvailable, setIsGPUAvailable] = useState(WebGPU.isAvailable()); useEffect(() => { document.body.classList.add('loading'); const interval = setInterval(() => { if (Demo.instance != null && Demo.firstRenderDone) { setIsDemoReady(true); clearInterval(interval); document.body.classList.remove('loading'); } }, 100); }, []); const toggleTheme = () => { setIsDarkTheme(prevTheme => !prevTheme); document.documentElement.setAttribute('data-theme', isDarkTheme ? 'light' : 'dark'); Demo.setTheme(isDarkTheme ? 'light' : 'dark'); }; return ( <>

BatchedMesh & Post Processing by Christophe Choffel

Article All demos GitHub
{isGPUAvailable &&
{!isDemoReady && <>

Please wait, loading & initializing ...

} {isDemoReady && <>

Controls :

  • Click/Touch and drag to rotate the camera
  • Scroll/Pinch to zoom in/out
  • Right click/Two fingers drag to pan
Switch to {!isDarkTheme ? 'dark mode' : 'light mode'}
}
} {!isGPUAvailable &&

WebGPU not available

WebGPU is not available on your device or browser. Please use a device or browser that supports WebGPU.

}
) } export default App