diff --git a/demos/flow-shield/public/droideka-5mb.glb b/demos/flow-shield/public/droideka-5mb.glb new file mode 100644 index 00000000..d50f0d6e Binary files /dev/null and b/demos/flow-shield/public/droideka-5mb.glb differ diff --git a/demos/flow-shield/public/droideka.glb b/demos/flow-shield/public/droideka.glb deleted file mode 100644 index f26e7bae..00000000 Binary files a/demos/flow-shield/public/droideka.glb and /dev/null differ diff --git a/demos/flow-shield/src/App.jsx b/demos/flow-shield/src/App.jsx index 69a9c66a..cb288ec6 100644 --- a/demos/flow-shield/src/App.jsx +++ b/demos/flow-shield/src/App.jsx @@ -1,5 +1,77 @@ -import PlaygroundCanvas from './components/playground/PlaygroundCanvas' +import { useCallback, useRef, useState } from 'react' +import { Canvas } from '@react-three/fiber' +import { Leva, useControls } from 'leva' +import SceneContent from './components/playground/SceneContent' +import UIOverlay from './components/overlay/UIOverlay' +import OverlayButtons from './components/overlay/OverlayButtons' +import LoadingOverlay from './components/overlay/LoadingOverlay' +import { LEVA_THEME } from './components/theme/theme' export default function App() { - return + const [showGrid, setShowGrid] = useState(true) + const [hideLeva, setHideLeva] = useState(false) + const [glbUrl, setGlbUrl] = useState(null) + const [preset, setPreset] = useState('default') + const [isLoadingModel, setIsLoadingModel] = useState(false) + const glbUrlRef = useRef(null) + + const handleLoadGlb = useCallback((file) => { + if (glbUrlRef.current) URL.revokeObjectURL(glbUrlRef.current) + const url = URL.createObjectURL(file) + glbUrlRef.current = url + setIsLoadingModel(true) + setGlbUrl(url) + }, []) + + const handleModelLoaded = useCallback(() => { + setIsLoadingModel(false) + }, []) + + const handleClearGlb = useCallback(() => { + if (glbUrlRef.current) URL.revokeObjectURL(glbUrlRef.current) + glbUrlRef.current = null + setGlbUrl(null) + }, []) + + const { mode } = useControls( + 'Scene', + { + mode: { + value: 'Background', + options: ['Background', 'Frame'], + label: 'Mode' + } + }, + { collapsed: true } + ) + + return ( + <> +