import { Canvas, useFrame, useThree } from "@react-three/fiber"; import { Grid, OrbitControls, Text } from "@react-three/drei"; import { MathUtils, Vector3 } from "three"; import React, { useMemo, useRef, useState } from "react"; import { motion } from "framer-motion"; import { useNavigate } from "react-router-dom"; type Gateway = { label: string; color: string; route: string; angle: number; // radians }; const gateways: Gateway[] = [ { label: "NEXUS", color: "#a855f7", route: "/dashboard/nexus", angle: MathUtils.degToRad(-50), }, { label: "GAMEFORGE", color: "#22c55e", route: "/gameforge", angle: MathUtils.degToRad(-20), }, { label: "FOUNDATION", color: "#ef4444", route: "/foundation", angle: MathUtils.degToRad(0), }, { label: "LABS", color: "#eab308", route: "/dashboard/labs", angle: MathUtils.degToRad(20), }, { label: "CORP", color: "#3b82f6", route: "/corp", angle: MathUtils.degToRad(50), }, ]; function CoreCube() { const ref = useRef(null); useFrame((_, delta) => { if (!ref.current) return; ref.current.rotation.x += delta * 0.45; ref.current.rotation.y += delta * 0.65; }); return ( ); } function GatewayMesh({ gateway, onHover, onClick, isActive, }: { gateway: Gateway; onHover: (label: string | null) => void; onClick: (gw: Gateway) => void; isActive: boolean; }) { const ref = useRef(null); const glow = useRef(null); const position = useMemo(() => { const radius = 6; return new Vector3( Math.cos(gateway.angle) * radius, 1.5, Math.sin(gateway.angle) * radius, ); }, [gateway.angle]); useFrame((_, delta) => { if (ref.current) { const targetScale = isActive ? 1.22 : 1; ref.current.scale.lerp( new Vector3(targetScale, targetScale, targetScale), 6 * delta, ); } if (glow.current) { glow.current.rotation.y += delta * 0.8; } }); return ( onHover(gateway.label)} onPointerOut={() => onHover(null)} onClick={() => onClick(gateway)} > {gateway.label} ); } function CameraRig({ target }: { target: Gateway | null }) { const { camera } = useThree(); const desired = useRef(new Vector3(0, 3, 12)); useFrame((_, delta) => { if (target) { const radius = 3.2; desired.current.set( Math.cos(target.angle) * radius, 2.5, Math.sin(target.angle) * radius, ); camera.lookAt( Math.cos(target.angle) * 6, 1.5, Math.sin(target.angle) * 6, ); } else { desired.current.set(0, 3, 12); camera.lookAt(0, 0, 0); } camera.position.lerp(desired.current, 3 * delta); }); return null; } function SceneContent() { const [hovered, setHovered] = useState(null); const [selected, setSelected] = useState(null); const navigate = useNavigate(); const handleClick = (gw: Gateway) => { setSelected(gw); setTimeout(() => navigate(gw.route), 550); }; return ( <> {gateways.map((gw) => ( ))} ); } export default function Scene() { return (
{/* HUD Overlay */} AeThex OS v5.0 alert("Connect Passport")} > Connect Passport
); }