Vishalpainjane's picture
added files
8a01471
import { Suspense } from 'react';
import { Canvas } from '@react-three/fiber';
import { Stars, GizmoHelper, GizmoViewport } from '@react-three/drei';
import { LayerNodes } from './layers';
import { EdgeConnections } from './edges';
import { CameraControls, useKeyboardShortcuts } from './controls';
import { useVisualizerStore } from '@/core/store';
/**
* Loading fallback component
*/
function LoadingFallback() {
return (
<mesh>
<sphereGeometry args={[0.5, 32, 32]} />
<meshStandardMaterial color="#4fc3f7" wireframe />
</mesh>
);
}
/**
* Scene lighting setup
*/
function SceneLighting() {
const config = useVisualizerStore(state => state.config);
const isDark = config.theme !== 'light';
return (
<>
<ambientLight intensity={isDark ? 0.4 : 0.6} />
<directionalLight
position={[10, 20, 10]}
intensity={isDark ? 0.8 : 1}
castShadow
shadow-mapSize={[2048, 2048]}
/>
<directionalLight position={[-10, 10, -10]} intensity={0.3} />
<pointLight position={[0, 10, 0]} intensity={0.5} color="#4fc3f7" />
</>
);
}
/**
* Scene background
*/
function SceneBackground() {
const config = useVisualizerStore(state => state.config);
if (config.theme === 'light') {
return <color attach="background" args={['#f0f0f0']} />;
}
if (config.theme === 'blueprint') {
return (
<>
<color attach="background" args={['#0a1929']} />
<gridHelper args={[100, 100, '#1e3a5f', '#0d2137']} position={[0, -10, 0]} />
</>
);
}
// Dark theme (default)
return (
<>
<color attach="background" args={['#0f0f1a']} />
<Stars radius={100} depth={50} count={2000} factor={4} fade speed={0.5} />
</>
);
}
/**
* Keyboard shortcuts handler component
*/
function KeyboardHandler() {
useKeyboardShortcuts();
return null;
}
/**
* Grid and helper elements
*/
function SceneHelpers() {
const model = useVisualizerStore(state => state.model);
if (!model) return null;
return (
<>
<gridHelper
args={[50, 50, '#333', '#222']}
position={[0, -15, 0]}
rotation={[0, 0, 0]}
/>
<GizmoHelper alignment="bottom-left" margin={[80, 80]}>
<GizmoViewport axisColors={['#f44336', '#4caf50', '#2196f3']} labelColor="white" />
</GizmoHelper>
</>
);
}
/**
* Main 3D network scene
*/
function NetworkScene() {
return (
<>
<SceneLighting />
<SceneBackground />
<SceneHelpers />
<Suspense fallback={<LoadingFallback />}>
<EdgeConnections />
<LayerNodes />
</Suspense>
</>
);
}
/**
* Main 3D Canvas component
*/
export function Scene() {
return (
<Canvas
camera={{
position: [0, 5, 20],
fov: 60,
near: 0.1,
far: 1000,
}}
dpr={[1, 2]}
gl={{
antialias: true,
alpha: false,
powerPreference: 'high-performance',
}}
>
<CameraControls />
<KeyboardHandler />
<NetworkScene />
</Canvas>
);
}
export default Scene;