diff --git a/src/app/tools/tankopedia/[id]/components/Control.tsx b/src/app/tools/tankopedia/[id]/components/Control.tsx
index 30e687573..22dc7afbe 100644
--- a/src/app/tools/tankopedia/[id]/components/Control.tsx
+++ b/src/app/tools/tankopedia/[id]/components/Control.tsx
@@ -14,5 +14,7 @@ export function Controls() {
orbitControls.current?.target.set(0, 1.5, 0);
}, []);
- return ;
+ return (
+
+ );
}
diff --git a/src/app/tools/tankopedia/[id]/components/Model/TankDisplay.tsx b/src/app/tools/tankopedia/[id]/components/Model/TankDisplay.tsx
new file mode 100644
index 000000000..5d0e18171
--- /dev/null
+++ b/src/app/tools/tankopedia/[id]/components/Model/TankDisplay.tsx
@@ -0,0 +1,168 @@
+import {
+ EnterFullScreenIcon,
+ ExitFullScreenIcon,
+ FrameIcon,
+} from '@radix-ui/react-icons';
+import { Button, Card, Flex, Tabs, Theme } from '@radix-ui/themes';
+import { Html } from '@react-three/drei';
+import { Canvas } from '@react-three/fiber';
+import { Suspense, useEffect, useRef, useState } from 'react';
+import { Group } from 'three';
+import { theme } from '../../../../../../stitches.config';
+import mutateTankopedia, {
+ TankopediaMode,
+ useTankopedia,
+} from '../../../../../../stores/tankopedia';
+import { Loader } from '../../../../components/Loader';
+import { Controls } from '../Control';
+import { RotationInputs } from '../RotationInputs';
+import { SceneProps } from '../SceneProps';
+import { TankModel } from './components/TankModel';
+
+interface TankDisplayProps {
+ tankId: number;
+ turretId: number;
+ gunId: number;
+}
+
+export function TankDisplay({ tankId, turretId, gunId }: TankDisplayProps) {
+ const canvas = useRef(null);
+ const canvasWrapper = useRef(null);
+ const [isFullScreen, setIsFullScreen] = useState(false);
+ const mode = useTankopedia((state) => state.mode);
+ const hullContainer = useRef(null);
+ const showGrid = useTankopedia((state) => state.model.showGrid);
+
+ function handlePointerDown() {
+ window.addEventListener('pointermove', handlePointerMove);
+ window.addEventListener('pointerup', handlePointerUp);
+ }
+ function handlePointerMove(event: PointerEvent) {
+ event.preventDefault();
+ }
+ function handlePointerUp(event: PointerEvent) {
+ event.preventDefault();
+
+ window.removeEventListener('pointermove', handlePointerMove);
+ window.removeEventListener('pointerup', handlePointerUp);
+ }
+
+ useEffect(() => {
+ function handleFullScreenChange() {
+ setIsFullScreen(document.fullscreenElement !== null);
+ }
+
+ document.addEventListener('fullscreenchange', handleFullScreenChange);
+
+ return () => {
+ document.removeEventListener('fullscreenchange', handleFullScreenChange);
+ };
+ });
+
+ return (
+
+
+
+
+ {
+ mutateTankopedia((draft) => {
+ draft.mode = mode as TankopediaMode;
+ });
+ }}
+ >
+
+ Model
+ Armor
+
+
+
+
+