diff --git a/src/app/tools/tankopedia/[id]/components/Characteristics/index.tsx b/src/app/tools/tankopedia/[id]/components/Characteristics/index.tsx index 027e4af90..b67b819cd 100644 --- a/src/app/tools/tankopedia/[id]/components/Characteristics/index.tsx +++ b/src/app/tools/tankopedia/[id]/components/Characteristics/index.tsx @@ -28,6 +28,7 @@ import { } from '../../../../../../core/blitzkit/tankDefinitions/constants'; import { useAdExempt } from '../../../../../../hooks/useAdExempt'; import { useEquipment } from '../../../../../../hooks/useEquipment'; +import { useTankModelDefinition } from '../../../../../../hooks/useTankModelDefinition'; import * as Duel from '../../../../../../stores/duel'; import * as TankopediaEphemeral from '../../../../../../stores/tankopediaEphemeral'; import { Info } from './components/Info'; @@ -37,7 +38,6 @@ export function Characteristics() { const mutateDuel = Duel.useMutation(); const exempt = useAdExempt(); const awaitedEquipmentDefinitions = use(equipmentDefinitions); - const awaitedModelDefinitions = use(modelDefinitions); const awaitedProvisionDefinitions = use(provisionDefinitions); const crewSkills = TankopediaEphemeral.use((state) => state.skills); const penetrationDistanceInput = useRef(null); @@ -68,7 +68,8 @@ export function Characteristics() { const stockTrack = tank.tracks[0]; const stockTurret = tank.turrets[0]; const stockGun = stockTurret.guns[0]; - const tankModelDefinition = awaitedModelDefinitions[tank.id]; + const awaitedModelDefinitions = use(modelDefinitions); + const tankModelDefinition = useTankModelDefinition(); const turretModelDefinition = tankModelDefinition.turrets[turret.id]; const gunModelDefinition = turretModelDefinition.guns[gun.id]; const stats = tankCharacteristics( @@ -94,8 +95,8 @@ export function Characteristics() { applySpallLiner: false, }, { + tankModelDefinition, equipmentDefinitions: awaitedEquipmentDefinitions, - modelDefinitions: awaitedModelDefinitions, provisionDefinitions: awaitedProvisionDefinitions, }, ); diff --git a/src/app/tools/tankopedia/[id]/components/Model/TankSandbox.tsx b/src/app/tools/tankopedia/[id]/components/Model/TankSandbox.tsx index dd66c984f..d90808e24 100644 --- a/src/app/tools/tankopedia/[id]/components/Model/TankSandbox.tsx +++ b/src/app/tools/tankopedia/[id]/components/Model/TankSandbox.tsx @@ -1,16 +1,15 @@ import { Canvas } from '@react-three/fiber'; -import { Suspense, use, useEffect, useRef } from 'react'; +import { Suspense, useEffect, useRef } from 'react'; import { Armor } from '../../../../../../components/Armor'; import { ArmorPlateDisplay } from '../../../../../../components/Armor/components/ArmorPlateDisplay'; import { ShotDisplay } from '../../../../../../components/Armor/components/ShotDisplay'; import { StaticArmor } from '../../../../../../components/StaticArmor'; import { ThicknessRange } from '../../../../../../components/StaticArmor/components/StaticArmorScene'; import { applyPitchYawLimits } from '../../../../../../core/blitz/applyPitchYawLimits'; -import { modelDefinitions } from '../../../../../../core/blitzkit/modelDefinitions'; import { modelTransformEvent } from '../../../../../../core/blitzkit/modelTransform'; import { Pose, poseEvent } from '../../../../../../core/blitzkit/pose'; -import { tankDefinitions } from '../../../../../../core/blitzkit/tankDefinitions'; import { useEquipment } from '../../../../../../hooks/useEquipment'; +import { useTankModelDefinition } from '../../../../../../hooks/useTankModelDefinition'; import * as Duel from '../../../../../../stores/duel'; import * as TankopediaEphemeral from '../../../../../../stores/tankopediaEphemeral'; import * as TankopediaPersistent from '../../../../../../stores/tankopediaPersistent'; @@ -29,11 +28,9 @@ export function TankSandbox({ thicknessRange }: TankSandboxProps) { const mutateTankopediaEphemeral = TankopediaEphemeral.useMutation(); const canvas = useRef(null); const hasImprovedVerticalStabilizer = useEquipment(122); - const awaitedModelDefinitions = use(modelDefinitions); - const awaitedTankDefinitions = use(tankDefinitions); const protagonist = Duel.use((state) => state.protagonist); const mutateDuel = Duel.useMutation(); - const tankModelDefinition = awaitedModelDefinitions[protagonist.tank.id]; + const tankModelDefinition = useTankModelDefinition(); const turretModelDefinition = tankModelDefinition.turrets[protagonist.turret.id]; const gunModelDefinition = turretModelDefinition.guns[protagonist.gun.id]; diff --git a/src/app/tools/tankopedia/[id]/components/Model/components/TankModel.tsx b/src/app/tools/tankopedia/[id]/components/Model/components/TankModel.tsx index 6d6585572..5d8337d0b 100644 --- a/src/app/tools/tankopedia/[id]/components/Model/components/TankModel.tsx +++ b/src/app/tools/tankopedia/[id]/components/Model/components/TankModel.tsx @@ -5,11 +5,10 @@ import { ModelTankWrapper } from '../../../../../../../components/Armor/componen import { applyPitchYawLimits } from '../../../../../../../core/blitz/applyPitchYawLimits'; import { hasEquipment } from '../../../../../../../core/blitzkit/hasEquipment'; import { jsxTree } from '../../../../../../../core/blitzkit/jsxTree'; -import { modelDefinitions } from '../../../../../../../core/blitzkit/modelDefinitions'; import { modelTransformEvent } from '../../../../../../../core/blitzkit/modelTransform'; import { normalizeAngleRad } from '../../../../../../../core/math/normalizeAngleRad'; -import { useAwait } from '../../../../../../../hooks/useAwait'; import { useModel } from '../../../../../../../hooks/useModel'; +import { useTankModelDefinition } from '../../../../../../../hooks/useTankModelDefinition'; import { useTankTransform } from '../../../../../../../hooks/useTankTransform'; import * as Duel from '../../../../../../../stores/duel'; import * as TankopediaEphemeral from '../../../../../../../stores/tankopediaEphemeral'; @@ -19,7 +18,6 @@ import { TankopediaDisplay } from '../../../../../../../stores/tankopediaPersist export const TankModel = memo(() => { const mutateDuel = Duel.useMutation(); const duelStore = Duel.useStore(); - const awaitedModelDefinitions = useAwait(modelDefinitions); const protagonist = Duel.use((draft) => draft.protagonist); const tankopediaPersistentStore = TankopediaPersistent.useStore(); const canvas = useThree((state) => state.gl.domElement); @@ -27,18 +25,15 @@ export const TankModel = memo(() => { const turretContainer = useRef(null); const gunContainer = useRef(null); const mutateTankopediaTemporary = TankopediaEphemeral.useMutation(); - - useTankTransform(protagonist, turretContainer, gunContainer); - - if (!awaitedModelDefinitions) return; - - const tankModelDefinition = awaitedModelDefinitions[protagonist.tank.id]; + const tankModelDefinition = useTankModelDefinition(); const turretModelDefinition = tankModelDefinition.turrets[protagonist.turret.id]; const gunModelDefinition = turretModelDefinition.guns[protagonist.gun.id]; const { gltf } = useModel(protagonist.tank.id); const nodes = Object.values(gltf.nodes); + useTankTransform(protagonist, turretContainer, gunContainer); + return ( {nodes.map((node) => { diff --git a/src/app/tools/tankopedia/[id]/components/QuickInputs/index.tsx b/src/app/tools/tankopedia/[id]/components/QuickInputs/index.tsx index 4ee0350e9..36d7304c1 100644 --- a/src/app/tools/tankopedia/[id]/components/QuickInputs/index.tsx +++ b/src/app/tools/tankopedia/[id]/components/QuickInputs/index.tsx @@ -1,24 +1,23 @@ import { HeightIcon, WidthIcon } from '@radix-ui/react-icons'; import { Flex, TextField } from '@radix-ui/themes'; -import { use, useEffect, useRef } from 'react'; +import { useEffect, useRef } from 'react'; import { degToRad, radToDeg } from 'three/src/math/MathUtils'; import { applyPitchYawLimits } from '../../../../../../core/blitz/applyPitchYawLimits'; -import { modelDefinitions } from '../../../../../../core/blitzkit/modelDefinitions'; import { modelTransformEvent, ModelTransformEventData, } from '../../../../../../core/blitzkit/modelTransform'; import { useEquipment } from '../../../../../../hooks/useEquipment'; +import { useTankModelDefinition } from '../../../../../../hooks/useTankModelDefinition'; import * as Duel from '../../../../../../stores/duel'; import * as styles from './index.css'; export function QuickInputs() { const mutateDuel = Duel.useMutation(); const protagonist = Duel.use((state) => state.protagonist); - const awaitedModelDefinitions = use(modelDefinitions); const yawInput = useRef(null); const pitchInput = useRef(null); - const tankModelDefinition = awaitedModelDefinitions[protagonist.tank.id]; + const tankModelDefinition = useTankModelDefinition(); const turretModelDefinition = tankModelDefinition.turrets[protagonist.turret.id]; const gunModelDefinition = turretModelDefinition.guns[protagonist.gun.id]; diff --git a/src/app/tools/tankopedia/[id]/layout.tsx b/src/app/tools/tankopedia/[id]/layout.tsx index 37c57ae08..43e426434 100644 --- a/src/app/tools/tankopedia/[id]/layout.tsx +++ b/src/app/tools/tankopedia/[id]/layout.tsx @@ -1,4 +1,5 @@ import { ReactNode } from 'react'; +import { modelDefinitions } from '../../../../core/blitzkit/modelDefinitions'; import { provisionDefinitions } from '../../../../core/blitzkit/provisionDefinitions'; import { tankDefinitions } from '../../../../core/blitzkit/tankDefinitions'; import { TIER_ROMAN_NUMERALS } from '../../../../core/blitzkit/tankDefinitions/constants'; @@ -17,6 +18,8 @@ export default async function Layout({ }) { const id = Number(params.id); const awaitedTankDefinitions = await tankDefinitions; + const awaitedModelDefinitions = await modelDefinitions; + const tankModelDefinition = awaitedModelDefinitions[id]; const awaitedProvisionDefinitions = await provisionDefinitions; const tank = awaitedTankDefinitions[id]; const title = `${tank.name} - Tier ${TIER_ROMAN_NUMERALS[tank.tier]} ${ @@ -25,7 +28,7 @@ export default async function Layout({ const description = `Statistics, armor, and equipment for ${tank.name}`; return ( - + - + {!exempt && } diff --git a/src/components/Armor/components/ArmorPlateDisplay.tsx b/src/components/Armor/components/ArmorPlateDisplay.tsx index c52987cf2..6917ae284 100644 --- a/src/components/Armor/components/ArmorPlateDisplay.tsx +++ b/src/components/Armor/components/ArmorPlateDisplay.tsx @@ -1,7 +1,11 @@ -import { Card, Code, Flex, Text } from '@radix-ui/themes'; +import { Card, Code, Flex, Text, TextField } from '@radix-ui/themes'; import { Html } from '@react-three/drei'; +import { useEffect, useRef } from 'react'; import { radToDeg } from 'three/src/math/MathUtils'; +import { ModelArmor } from '../../../core/blitzkit/modelDefinitions'; +import { resolveArmorIndex } from '../../../core/blitzkit/resolveArmorIndex'; import * as App from '../../../stores/app'; +import * as Duel from '../../../stores/duel'; import * as TankopediaEphemeral from '../../../stores/tankopediaEphemeral'; import { layerTypeNames } from './ShotDisplayCard'; import { ArmorType } from './SpacedArmorScene'; @@ -10,7 +14,14 @@ export function ArmorPlateDisplay() { const highlightArmor = TankopediaEphemeral.use( (state) => state.highlightArmor, ); + const mutateTankopediaEphemeral = TankopediaEphemeral.useMutation(); const developerMode = App.use((state) => state.developerMode); + const devThicknessInput = useRef(null); + const duelStore = Duel.useStore(); + + useEffect(() => { + devThicknessInput.current?.focus(); + }); if (highlightArmor === undefined) return null; @@ -42,9 +53,60 @@ export function ArmorPlateDisplay() { )} {developerMode && ( - - DEV: {highlightArmor.name} - + <> + + DEV: {highlightArmor.name} + + { + if (event.key === 'Enter') { + devThicknessInput.current?.blur(); + mutateTankopediaEphemeral((draft) => { + draft.highlightArmor = undefined; + const { protagonist } = duelStore.getState(); + let armor: ModelArmor; + + if (highlightArmor.name.startsWith('hull_')) { + armor = draft.model.armor; + } else if (highlightArmor.name.startsWith('turret_')) { + armor = + draft.model.turrets[protagonist.turret.id].armor; + } else if (highlightArmor.name.startsWith('gun_')) { + armor = + draft.model.turrets[protagonist.turret.id].guns[ + protagonist.gun.id + ].armor; + } else return; + + const index = resolveArmorIndex(highlightArmor.name); + + if (index === undefined) return; + + const input = event.currentTarget.valueAsNumber; + + if (!isNaN(input)) { + armor.thickness[index] = input; + } + }); + } else if (event.key === 'Escape') { + devThicknessInput.current?.blur(); + mutateTankopediaEphemeral((draft) => { + draft.highlightArmor = undefined; + }); + } + }} + key={highlightArmor.name} + defaultValue={highlightArmor.thickness.toFixed(0)} + mt="1" + autoFocus + ref={devThicknessInput} + size="1" + > + mm + + )} diff --git a/src/components/Armor/components/PrimaryArmorScene.tsx b/src/components/Armor/components/PrimaryArmorScene.tsx index 32c301359..d8c2492d3 100644 --- a/src/components/Armor/components/PrimaryArmorScene.tsx +++ b/src/components/Armor/components/PrimaryArmorScene.tsx @@ -4,7 +4,7 @@ import { correctZYTuple } from '../../../core/blitz/correctZYTuple'; import { nameToArmorId } from '../../../core/blitzkit/nameToArmorId'; import { resolveArmor } from '../../../core/blitzkit/resolveThickness'; import { useArmor } from '../../../hooks/useArmor'; -import { useModelDefinitions } from '../../../hooks/useModelDefinitions'; +import { useTankModelDefinition } from '../../../hooks/useTankModelDefinition'; import { useTankTransform } from '../../../hooks/useTankTransform'; import * as Duel from '../../../stores/duel'; import * as TankopediaPersistent from '../../../stores/tankopediaPersistent'; @@ -13,7 +13,6 @@ import { PrimaryArmorSceneComponent } from './PrimaryArmorSceneComponent'; export const PrimaryArmorScene = memo(() => { const wrapper = useRef(null); - const modelDefinitions = useModelDefinitions(); const turretContainer = useRef(null); const gunContainer = useRef(null); const protagonist = Duel.use((draft) => draft.protagonist); @@ -23,7 +22,7 @@ export const PrimaryArmorScene = memo(() => { const gun = Duel.use((state) => state.protagonist.gun); const armorGltf = useArmor(tank.id); const armorNodes = Object.values(armorGltf.nodes); - const tankModelDefinition = modelDefinitions[tank.id]; + const tankModelDefinition = useTankModelDefinition(); const trackModelDefinition = tankModelDefinition.tracks[track.id]; const turretModelDefinition = tankModelDefinition.turrets[turret.id]; const gunModelDefinition = turretModelDefinition.guns[gun.id]; @@ -32,6 +31,12 @@ export const PrimaryArmorScene = memo(() => { const gunOrigin = correctZYTuple(turretModelDefinition.gunOrigin); const tankopediaPersistentStore = TankopediaPersistent.useStore(); + console.log( + tankModelDefinition.armor, + turretModelDefinition.armor, + gunModelDefinition.armor, + ); + useTankTransform(protagonist, turretContainer, gunContainer); return ( diff --git a/src/components/Armor/components/SpacedArmorScene.tsx b/src/components/Armor/components/SpacedArmorScene.tsx index 68baf3cf9..3720c48b2 100644 --- a/src/components/Armor/components/SpacedArmorScene.tsx +++ b/src/components/Armor/components/SpacedArmorScene.tsx @@ -5,7 +5,7 @@ import { nameToArmorId } from '../../../core/blitzkit/nameToArmorId'; import { resolveArmor } from '../../../core/blitzkit/resolveThickness'; import { useArmor } from '../../../hooks/useArmor'; import { useModel } from '../../../hooks/useModel'; -import { useModelDefinitions } from '../../../hooks/useModelDefinitions'; +import { useTankModelDefinition } from '../../../hooks/useTankModelDefinition'; import { useTankTransform } from '../../../hooks/useTankTransform'; import * as Duel from '../../../stores/duel'; import { ModelTankWrapper } from './ModelTankWrapper'; @@ -23,7 +23,6 @@ interface SpacedArmorSceneProps { export const SpacedArmorScene = memo(({ scene }) => { const wrapper = useRef(null); - const modelDefinitions = useModelDefinitions(); const turretContainer = useRef(null); const gunContainer = useRef(null); const protagonist = Duel.use((draft) => draft.protagonist); @@ -35,7 +34,7 @@ export const SpacedArmorScene = memo(({ scene }) => { const { gltf: modelGltf } = useModel(tank.id); const armorNodes = Object.values(armorGltf.nodes); const modelNodes = Object.values(modelGltf.nodes); - const tankModelDefinition = modelDefinitions[tank.id]; + const tankModelDefinition = useTankModelDefinition(); const trackModelDefinition = tankModelDefinition.tracks[track.id]; const turretModelDefinition = tankModelDefinition.turrets[turret.id]; const gunModelDefinition = turretModelDefinition.guns[gun.id]; diff --git a/src/components/Armor/components/SpacedArmorSceneComponent/index.tsx b/src/components/Armor/components/SpacedArmorSceneComponent/index.tsx index ca0a372e7..365bbae75 100644 --- a/src/components/Armor/components/SpacedArmorSceneComponent/index.tsx +++ b/src/components/Armor/components/SpacedArmorSceneComponent/index.tsx @@ -92,9 +92,9 @@ export function SpacedArmorSceneComponent({ ...props }: SpacedArmorSceneComponentProps) { const tankopediaEphemeralStore = TankopediaEphemeral.useStore(); + const duelStore = Duel.useStore(); const mutateTankopediaEphemeralStore = TankopediaEphemeral.useMutation(); const camera = useThree((state) => state.camera); - const duelStore = Duel.useStore(); if (props.static) { const x = clamp(thickness / props.thicknessRange.quartile, 0, 1); @@ -134,7 +134,7 @@ export function SpacedArmorSceneComponent({ depthWrite, ...(clip ? { clippingPlanes: [clip] } : {}), }), - [], + [thickness], ); /** @@ -182,7 +182,7 @@ export function SpacedArmorSceneComponent({ ); return unsubscribe; - }, []); + }, [thickness]); return jsxTree(node, { material, diff --git a/src/components/StaticArmor/components/StaticArmorScene.tsx b/src/components/StaticArmor/components/StaticArmorScene.tsx index be8ca9a0e..7db494f5a 100644 --- a/src/components/StaticArmor/components/StaticArmorScene.tsx +++ b/src/components/StaticArmor/components/StaticArmorScene.tsx @@ -5,7 +5,7 @@ import { nameToArmorId } from '../../../core/blitzkit/nameToArmorId'; import { resolveArmor } from '../../../core/blitzkit/resolveThickness'; import { useArmor } from '../../../hooks/useArmor'; import { useModel } from '../../../hooks/useModel'; -import { useModelDefinitions } from '../../../hooks/useModelDefinitions'; +import { useTankModelDefinition } from '../../../hooks/useTankModelDefinition'; import { useTankTransform } from '../../../hooks/useTankTransform'; import * as Duel from '../../../stores/duel'; import * as TankopediaPersistent from '../../../stores/tankopediaPersistent'; @@ -25,7 +25,6 @@ export interface ThicknessRange { export const StaticArmorScene = memo( ({ thicknessRange }) => { const wrapper = useRef(null); - const awaitedTankModelDefinitions = useModelDefinitions(); const turretContainer = useRef(null); const gunContainer = useRef(null); const protagonist = Duel.use((draft) => draft.protagonist); @@ -37,7 +36,7 @@ export const StaticArmorScene = memo( const { gltf: modelGltf } = useModel(tank.id); const armorNodes = Object.values(armorGltf.nodes); const modelNodes = Object.values(modelGltf.nodes); - const tankModelDefinition = awaitedTankModelDefinitions[tank.id]; + const tankModelDefinition = useTankModelDefinition(); const trackModelDefinition = tankModelDefinition.tracks[track.id]; const turretModelDefinition = tankModelDefinition.turrets[turret.id]; const gunModelDefinition = turretModelDefinition.guns[gun.id]; @@ -58,6 +57,8 @@ export const StaticArmorScene = memo( (state) => state.model.visual.showExternalModules, ); + console.log('yeah'); + useTankTransform(protagonist, turretContainer, gunContainer); return ( diff --git a/src/core/blitzkit/modelDefinitions.ts b/src/core/blitzkit/modelDefinitions.ts index 58f5b5dfe..201b525bc 100644 --- a/src/core/blitzkit/modelDefinitions.ts +++ b/src/core/blitzkit/modelDefinitions.ts @@ -13,7 +13,7 @@ export interface BoundingBox { min: Vector3Tuple; max: Vector3Tuple; } -interface ModelDefinition { +export interface ModelDefinition { armor: ModelArmor; turretOrigin: Vector3Tuple; turretRotation?: InitialTurretRotation; diff --git a/src/core/blitzkit/resolveArmorIndex.ts b/src/core/blitzkit/resolveArmorIndex.ts new file mode 100644 index 000000000..816d15fe5 --- /dev/null +++ b/src/core/blitzkit/resolveArmorIndex.ts @@ -0,0 +1,6 @@ +const pattern = /\d+$/; + +export function resolveArmorIndex(name: string) { + const match = name.match(pattern)?.[0]; + return match ? parseInt(match) : undefined; +} diff --git a/src/core/blitzkit/tankCharacteristics.ts b/src/core/blitzkit/tankCharacteristics.ts index 5b1802bb3..1eb36f5b4 100644 --- a/src/core/blitzkit/tankCharacteristics.ts +++ b/src/core/blitzkit/tankCharacteristics.ts @@ -5,7 +5,7 @@ import { resolvePenetrationCoefficient } from '../blitz/resolvePenetrationCoeffi import { coefficient } from './coefficient'; import { degressiveStat } from './degressiveStat'; import { EquipmentDefinitions } from './equipmentDefinitions'; -import { ModelDefinitions } from './modelDefinitions'; +import { ModelDefinition, ModelDefinitions } from './modelDefinitions'; import { normalizeBoundingBox } from './normalizeBoundingBox'; import { progressiveStat } from './progressiveStat'; import { ProvisionDefinitions } from './provisionDefinitions'; @@ -66,17 +66,16 @@ export function tankCharacteristics( applySpallLiner: boolean; }, { - modelDefinitions, + tankModelDefinition, equipmentDefinitions, provisionDefinitions, }: { - modelDefinitions: ModelDefinitions; + tankModelDefinition: ModelDefinition; equipmentDefinitions: EquipmentDefinitions; provisionDefinitions: ProvisionDefinitions; }, ) { - const presetRows = equipmentDefinitions.presets[tank.equipment]; - const tankModelDefinition = modelDefinitions[tank.id]; + const presetRows = equipmentDefinitions.presets[tank.equipment]; const turretModelDefinition = tankModelDefinition.turrets[turret.id]; const gunModelDefinition = turretModelDefinition.guns[gun.id]; diff --git a/src/hooks/useModelDefinitions.ts b/src/hooks/useModelDefinitions.ts deleted file mode 100644 index dec51b8b0..000000000 --- a/src/hooks/useModelDefinitions.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { modelDefinitions } from '../core/blitzkit/modelDefinitions'; -import { useAwait } from './useAwait'; - -export function useModelDefinitions() { - return useAwait(modelDefinitions); -} diff --git a/src/hooks/useTankModelDefinition.ts b/src/hooks/useTankModelDefinition.ts new file mode 100644 index 000000000..0da6613b7 --- /dev/null +++ b/src/hooks/useTankModelDefinition.ts @@ -0,0 +1,7 @@ +'use client'; + +import * as TankopediaEphemeral from '../stores/tankopediaEphemeral'; + +export function useTankModelDefinition() { + return TankopediaEphemeral.use((state) => state.model); +} diff --git a/src/hooks/useTankTransform.ts b/src/hooks/useTankTransform.ts index fe905ba61..9f2c49d8d 100644 --- a/src/hooks/useTankTransform.ts +++ b/src/hooks/useTankTransform.ts @@ -3,23 +3,21 @@ import { Euler, Group, Vector3 } from 'three'; import { degToRad } from 'three/src/math/MathUtils'; import { I_HAT, J_HAT, K_HAT } from '../constants/axis'; import { correctZYTuple } from '../core/blitz/correctZYTuple'; -import { modelDefinitions } from '../core/blitzkit/modelDefinitions'; import { ModelTransformEventData, modelTransformEvent, } from '../core/blitzkit/modelTransform'; import { DuelMember } from '../stores/duel'; -import { useAwait } from './useAwait'; +import { useTankModelDefinition } from './useTankModelDefinition'; export function useTankTransform( member: DuelMember, turretContainer: RefObject, gunContainer: RefObject, ) { - const awaitedModelDefinitions = useAwait(modelDefinitions); + const tankModelDefinition = useTankModelDefinition(); useEffect(() => { - const tankModelDefinition = awaitedModelDefinitions[member.tank.id]; const trackModelDefinition = tankModelDefinition.tracks[member.track.id]; const turretModelDefinition = tankModelDefinition.turrets[member.turret.id]; diff --git a/src/stores/tankopediaEphemeral.ts b/src/stores/tankopediaEphemeral.ts index 563eedc53..a80f6c443 100644 --- a/src/stores/tankopediaEphemeral.ts +++ b/src/stores/tankopediaEphemeral.ts @@ -5,12 +5,14 @@ import { create } from 'zustand'; import { subscribeWithSelector } from 'zustand/middleware'; import { ArmorType } from '../components/Armor/components/SpacedArmorScene'; import { ExternalModuleVariant } from '../components/Armor/components/SpacedArmorSceneComponent'; +import { ModelDefinition } from '../core/blitzkit/modelDefinitions'; import { createNextSafeStore } from '../core/zustand/createNextSafeStore'; interface TankopediaEphemeral { shot?: Shot; skills: Record; controlsEnabled: boolean; + model: ModelDefinition; highlightArmor?: { name: string; point: Vector3; @@ -86,10 +88,11 @@ export type ArmorPiercingLayer = }; export const { Provider, use, useMutation, useStore } = createNextSafeStore( - () => + (model: ModelDefinition) => create()( subscribeWithSelector(() => ({ skills: {}, + model, controlsEnabled: true, })), ),