mirror of
https://github.com/blitzkit/blitzkit.git
synced 2026-10-23 19:49:50 +02:00
feat: load model button
This commit is contained in:
1 parent
6753d8a073
commit
51a59fe2d4
1 file changed
+53
-12
@@ -1,4 +1,5 @@
|
|||||||
import { Card, Flex, Tabs, Theme } from '@radix-ui/themes';
|
import { LightningBoltIcon } from '@radix-ui/react-icons';
|
||||||
|
import { Button, Card, Flex, Tabs, Theme } from '@radix-ui/themes';
|
||||||
import { PerspectiveCamera } from '@react-three/drei';
|
import { PerspectiveCamera } from '@react-three/drei';
|
||||||
import { Canvas } from '@react-three/fiber';
|
import { Canvas } from '@react-three/fiber';
|
||||||
import { Suspense, use, useEffect, useRef, useState } from 'react';
|
import { Suspense, use, useEffect, useRef, useState } from 'react';
|
||||||
@@ -6,6 +7,7 @@ import { applyPitchYawLimits } from '../../../../../../core/blitz/applyPitchYawL
|
|||||||
import { modelDefinitions } from '../../../../../../core/blitzkrieg/modelDefinitions';
|
import { modelDefinitions } from '../../../../../../core/blitzkrieg/modelDefinitions';
|
||||||
import { modelTransformEvent } from '../../../../../../core/blitzkrieg/modelTransform';
|
import { modelTransformEvent } from '../../../../../../core/blitzkrieg/modelTransform';
|
||||||
import { Pose, poseEvent } from '../../../../../../core/blitzkrieg/pose';
|
import { Pose, poseEvent } from '../../../../../../core/blitzkrieg/pose';
|
||||||
|
import { tankIcon } from '../../../../../../core/blitzkrieg/tankIcon';
|
||||||
import { useDuel } from '../../../../../../stores/duel';
|
import { useDuel } from '../../../../../../stores/duel';
|
||||||
import {
|
import {
|
||||||
TankopediaMode,
|
TankopediaMode,
|
||||||
@@ -32,6 +34,8 @@ export function TankSandbox() {
|
|||||||
const turretModelDefinition =
|
const turretModelDefinition =
|
||||||
tankModelDefinition.turrets[protagonist.turret.id];
|
tankModelDefinition.turrets[protagonist.turret.id];
|
||||||
const gunModelDefinition = turretModelDefinition.guns[protagonist.gun.id];
|
const gunModelDefinition = turretModelDefinition.guns[protagonist.gun.id];
|
||||||
|
const [loadModel, setLoadModel] = useState(false);
|
||||||
|
const duel = useDuel();
|
||||||
|
|
||||||
function handlePointerDown() {
|
function handlePointerDown() {
|
||||||
window.addEventListener('pointermove', handlePointerMove);
|
window.addEventListener('pointermove', handlePointerMove);
|
||||||
@@ -159,21 +163,58 @@ export function TankSandbox() {
|
|||||||
</Tabs.Root>
|
</Tabs.Root>
|
||||||
|
|
||||||
<div style={{ height: '100%' }}>
|
<div style={{ height: '100%' }}>
|
||||||
<Canvas shadows ref={canvas} onPointerDown={handlePointerDown}>
|
{loadModel ? (
|
||||||
<PerspectiveCamera makeDefault fov={25} far={32} />
|
<Canvas shadows ref={canvas} onPointerDown={handlePointerDown}>
|
||||||
<Controls />
|
<PerspectiveCamera makeDefault fov={25} far={32} />
|
||||||
<SceneProps />
|
<Controls />
|
||||||
|
<SceneProps />
|
||||||
|
|
||||||
<Suspense fallback={<ModelLoader />}>
|
<Suspense fallback={<ModelLoader />}>
|
||||||
<Lighting />
|
<Lighting />
|
||||||
<TankModel />
|
<TankModel />
|
||||||
<TankArmor />
|
<TankArmor />
|
||||||
</Suspense>
|
</Suspense>
|
||||||
</Canvas>
|
</Canvas>
|
||||||
|
) : (
|
||||||
|
<Flex
|
||||||
|
align="center"
|
||||||
|
justify="center"
|
||||||
|
style={{ height: '100%', position: 'relative' }}
|
||||||
|
>
|
||||||
|
<Button
|
||||||
|
variant="soft"
|
||||||
|
style={{
|
||||||
|
zIndex: 1,
|
||||||
|
}}
|
||||||
|
onClick={() => {
|
||||||
|
setLoadModel(true);
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<LightningBoltIcon /> Load model
|
||||||
|
</Button>
|
||||||
|
|
||||||
|
<div
|
||||||
|
style={{
|
||||||
|
filter: 'blur(16px)',
|
||||||
|
width: 256,
|
||||||
|
height: 128,
|
||||||
|
display: 'flex',
|
||||||
|
justifyContent: 'end',
|
||||||
|
position: 'absolute',
|
||||||
|
top: '50%',
|
||||||
|
left: '50%',
|
||||||
|
transform: 'translate(25%, -25%) scale(300%)',
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<img src={tankIcon(duel.antagonist!.tank.id, 'big')} />
|
||||||
|
</div>
|
||||||
|
</Flex>
|
||||||
|
)}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<Options canvas={canvasWrapper} isFullScreen={isFullScreen} />
|
<Options canvas={canvasWrapper} isFullScreen={isFullScreen} />
|
||||||
<RotationInputs />
|
|
||||||
|
{loadModel && <RotationInputs />}
|
||||||
</Flex>
|
</Flex>
|
||||||
</Theme>
|
</Theme>
|
||||||
</Card>
|
</Card>
|
||||||
|
|||||||
Reference in new issue
Block a user