mirror of
https://github.com/blitzkit/blitzkit.git
synced 2026-10-21 10:47:04 +02:00
feat: watermark 2
This commit is contained in:
1 parent
818d13fade
commit
797f5a90d2
2 files changed
+109
-100
No files matched your search
@@ -1,5 +1,5 @@
|
|||||||
import { LightningBoltIcon } from '@radix-ui/react-icons';
|
import { LightningBoltIcon } from '@radix-ui/react-icons';
|
||||||
import { Button, Card, Flex, Tabs, Theme } from '@radix-ui/themes';
|
import { Button, Card, Flex, Tabs, Text, 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';
|
||||||
@@ -14,6 +14,7 @@ import { tankIcon } from '../../../../../../core/blitzkrieg/tankIcon';
|
|||||||
import { useEquipment } from '../../../../../../hooks/useEquipment';
|
import { useEquipment } from '../../../../../../hooks/useEquipment';
|
||||||
import { useFullScreen } from '../../../../../../hooks/useFullScreen';
|
import { useFullScreen } from '../../../../../../hooks/useFullScreen';
|
||||||
import { useWideFormat } from '../../../../../../hooks/useWideFormat';
|
import { useWideFormat } from '../../../../../../hooks/useWideFormat';
|
||||||
|
import { BlitzkriegWormWide } from '../../../../../../icons/BlitzkriegWormWide';
|
||||||
import { mutateDuel, useDuel } from '../../../../../../stores/duel';
|
import { mutateDuel, useDuel } from '../../../../../../stores/duel';
|
||||||
import mutateTankopediaPersistent, {
|
import mutateTankopediaPersistent, {
|
||||||
TankopediaMode,
|
TankopediaMode,
|
||||||
@@ -150,111 +151,117 @@ export function TankSandbox() {
|
|||||||
}}
|
}}
|
||||||
ref={canvasWrapper}
|
ref={canvasWrapper}
|
||||||
>
|
>
|
||||||
<Theme radius="full" style={{ height: '100%' }}>
|
<Flex
|
||||||
<Flex
|
style={{
|
||||||
style={{
|
height: isFullScreen ? '100%' : '75vh',
|
||||||
height: isFullScreen ? '100%' : '75vh',
|
maxHeight: isFullScreen ? 'unset' : 576,
|
||||||
maxHeight: isFullScreen ? 'unset' : 576,
|
}}
|
||||||
|
direction="column"
|
||||||
|
gap="2"
|
||||||
|
>
|
||||||
|
<Tabs.Root
|
||||||
|
value={mode}
|
||||||
|
onValueChange={(mode) => {
|
||||||
|
mutateTankopediaPersistent((draft) => {
|
||||||
|
draft.mode = mode as TankopediaMode;
|
||||||
|
});
|
||||||
}}
|
}}
|
||||||
direction="column"
|
|
||||||
gap="2"
|
|
||||||
>
|
>
|
||||||
<Tabs.Root
|
<Tabs.List>
|
||||||
value={mode}
|
<Tabs.Trigger value="model">
|
||||||
onValueChange={(mode) => {
|
<Flex gap="2" align="center">
|
||||||
mutateTankopediaPersistent((draft) => {
|
Model
|
||||||
draft.mode = mode as TankopediaMode;
|
|
||||||
});
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<Tabs.List>
|
|
||||||
<Tabs.Trigger value="model">
|
|
||||||
<Flex gap="2" align="center">
|
|
||||||
Model
|
|
||||||
</Flex>
|
|
||||||
</Tabs.Trigger>
|
|
||||||
<Tabs.Trigger value="armor">Armor</Tabs.Trigger>
|
|
||||||
</Tabs.List>
|
|
||||||
</Tabs.Root>
|
|
||||||
|
|
||||||
<div
|
|
||||||
style={{
|
|
||||||
height: 'calc(100% - 64px)',
|
|
||||||
position: 'absolute',
|
|
||||||
width: '100%',
|
|
||||||
bottom: 0,
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
{loadModel ? (
|
|
||||||
<div style={{ width: '100%', height: '100%' }}>
|
|
||||||
<Canvas
|
|
||||||
shadows
|
|
||||||
ref={canvas}
|
|
||||||
onPointerDown={handlePointerDown}
|
|
||||||
onPointerMissed={() => {
|
|
||||||
mutateTankopediaTemporary((draft) => {
|
|
||||||
draft.shot = undefined;
|
|
||||||
});
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<PerspectiveCamera makeDefault fov={25} far={32} />
|
|
||||||
<Controls />
|
|
||||||
<SceneProps />
|
|
||||||
|
|
||||||
<Suspense fallback={<ModelLoader />}>
|
|
||||||
<Lighting />
|
|
||||||
<TankModel />
|
|
||||||
<Armor />
|
|
||||||
<ShotDisplay />
|
|
||||||
</Suspense>
|
|
||||||
</Canvas>
|
|
||||||
</div>
|
|
||||||
) : (
|
|
||||||
<Flex
|
|
||||||
align="center"
|
|
||||||
justify="center"
|
|
||||||
style={{ height: '100%', position: 'relative' }}
|
|
||||||
>
|
|
||||||
<Button
|
|
||||||
style={{
|
|
||||||
zIndex: 1,
|
|
||||||
}}
|
|
||||||
onClick={() => {
|
|
||||||
setLoadModel(true);
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<LightningBoltIcon /> Load model
|
|
||||||
</Button>
|
|
||||||
|
|
||||||
<Flex
|
|
||||||
style={{
|
|
||||||
filter: 'blur(16px)',
|
|
||||||
width: 256,
|
|
||||||
height: 128,
|
|
||||||
display: 'flex',
|
|
||||||
position: 'absolute',
|
|
||||||
top: '50%',
|
|
||||||
left: '50%',
|
|
||||||
transformOrigin: 'center center',
|
|
||||||
transform: 'translate(25%, -25%) scale(300%)',
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<img src={tankIcon(duel.antagonist!.tank.id, 'big')} />
|
|
||||||
</Flex>
|
|
||||||
</Flex>
|
</Flex>
|
||||||
)}
|
</Tabs.Trigger>
|
||||||
</div>
|
<Tabs.Trigger value="armor">Armor</Tabs.Trigger>
|
||||||
|
</Tabs.List>
|
||||||
|
</Tabs.Root>
|
||||||
|
|
||||||
<Options
|
<Text
|
||||||
canvasWrapper={canvasWrapper}
|
color="gray"
|
||||||
isFullScreen={isFullScreen}
|
style={{
|
||||||
/>
|
position: 'absolute',
|
||||||
|
left: '50%',
|
||||||
|
top: 11,
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<BlitzkriegWormWide height={32} />
|
||||||
|
</Text>
|
||||||
|
|
||||||
{isFullScreen && <AntagonistBar floating />}
|
<div
|
||||||
|
style={{
|
||||||
|
height: 'calc(100% - 64px)',
|
||||||
|
position: 'absolute',
|
||||||
|
width: '100%',
|
||||||
|
bottom: 0,
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{loadModel ? (
|
||||||
|
<div style={{ width: '100%', height: '100%' }}>
|
||||||
|
<Canvas
|
||||||
|
shadows
|
||||||
|
ref={canvas}
|
||||||
|
onPointerDown={handlePointerDown}
|
||||||
|
onPointerMissed={() => {
|
||||||
|
mutateTankopediaTemporary((draft) => {
|
||||||
|
draft.shot = undefined;
|
||||||
|
});
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<PerspectiveCamera makeDefault fov={25} far={32} />
|
||||||
|
<Controls />
|
||||||
|
<SceneProps />
|
||||||
|
|
||||||
{loadModel && <RotationInputs isFullScreen={isFullScreen} />}
|
<Suspense fallback={<ModelLoader />}>
|
||||||
</Flex>
|
<Lighting />
|
||||||
</Theme>
|
<TankModel />
|
||||||
|
<Armor />
|
||||||
|
<ShotDisplay />
|
||||||
|
</Suspense>
|
||||||
|
</Canvas>
|
||||||
|
</div>
|
||||||
|
) : (
|
||||||
|
<Flex
|
||||||
|
align="center"
|
||||||
|
justify="center"
|
||||||
|
style={{ height: '100%', position: 'relative' }}
|
||||||
|
>
|
||||||
|
<Button
|
||||||
|
style={{
|
||||||
|
zIndex: 1,
|
||||||
|
}}
|
||||||
|
onClick={() => {
|
||||||
|
setLoadModel(true);
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<LightningBoltIcon /> Load model
|
||||||
|
</Button>
|
||||||
|
|
||||||
|
<Flex
|
||||||
|
style={{
|
||||||
|
filter: 'blur(16px)',
|
||||||
|
width: 256,
|
||||||
|
height: 128,
|
||||||
|
display: 'flex',
|
||||||
|
position: 'absolute',
|
||||||
|
top: '50%',
|
||||||
|
left: '50%',
|
||||||
|
transformOrigin: 'center center',
|
||||||
|
transform: 'translate(25%, -25%) scale(300%)',
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<img src={tankIcon(duel.antagonist!.tank.id, 'big')} />
|
||||||
|
</Flex>
|
||||||
|
</Flex>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<Options canvasWrapper={canvasWrapper} isFullScreen={isFullScreen} />
|
||||||
|
|
||||||
|
{isFullScreen && <AntagonistBar floating />}
|
||||||
|
|
||||||
|
{loadModel && <RotationInputs isFullScreen={isFullScreen} />}
|
||||||
|
</Flex>
|
||||||
</Card>
|
</Card>
|
||||||
</Theme>
|
</Theme>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -52,6 +52,7 @@ export function RotationInputs({ isFullScreen }: RotationInputsProps) {
|
|||||||
>
|
>
|
||||||
<Flex gap="2" style={{ width: 256, pointerEvents: 'auto' }}>
|
<Flex gap="2" style={{ width: 256, pointerEvents: 'auto' }}>
|
||||||
<TextField.Root
|
<TextField.Root
|
||||||
|
radius="full"
|
||||||
style={{
|
style={{
|
||||||
flex: 1,
|
flex: 1,
|
||||||
textAlign: 'right',
|
textAlign: 'right',
|
||||||
@@ -99,6 +100,7 @@ export function RotationInputs({ isFullScreen }: RotationInputsProps) {
|
|||||||
</TextField.Root>
|
</TextField.Root>
|
||||||
|
|
||||||
<TextField.Root
|
<TextField.Root
|
||||||
|
radius="full"
|
||||||
style={{
|
style={{
|
||||||
flex: 1,
|
flex: 1,
|
||||||
textAlign: 'right',
|
textAlign: 'right',
|
||||||
|
|||||||
Reference in new issue
Block a user