From 058233933223d7ed465a7f0dd4d5243750c60c66 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Fri, 12 Jan 2024 20:20:51 -0600 Subject: [PATCH] fix: negative hard joint handling... correctly this time --- .../components/Model/components/TankArmor.tsx | 35 +++++++++++-------- src/core/blitz/extractArmor.ts | 5 +-- src/core/blitzkrieg/nameToArmorId.ts | 2 +- src/core/blitzkrieg/resolveThickness.ts | 8 +++++ 4 files changed, 30 insertions(+), 20 deletions(-) create mode 100644 src/core/blitzkrieg/resolveThickness.ts diff --git a/src/app/tools/tankopedia/[id]/components/Model/components/TankArmor.tsx b/src/app/tools/tankopedia/[id]/components/Model/components/TankArmor.tsx index 57f8ad2b7..ea5f20773 100644 --- a/src/app/tools/tankopedia/[id]/components/Model/components/TankArmor.tsx +++ b/src/app/tools/tankopedia/[id]/components/Model/components/TankArmor.tsx @@ -14,6 +14,7 @@ import { modelDefinitions, } from '../../../../../../../core/blitzkrieg/modelDefinitions'; import { nameToArmorId } from '../../../../../../../core/blitzkrieg/nameToArmorId'; +import { resolveArmor } from '../../../../../../../core/blitzkrieg/resolveThickness'; import { useTankopedia } from '../../../../../../../stores/tankopedia'; import { Lighting } from '../../Lighting'; @@ -109,15 +110,17 @@ export function TankArmor({ ...props }: TankArmorProps) { > {armorNodes.map((node) => { const isHull = node.name.startsWith('hull_'); - const armorId = nameToArmorId(node.name); const isVisible = isHull; - const thickness = tankModelDefinition.armor.thickness[armorId]; - const isSpaced = tankModelDefinition.armor.spaced?.includes(armorId); + const armorId = nameToArmorId(node.name); + const { spaced, thickness } = resolveArmor( + tankModelDefinition.armor, + armorId, + ); if ( !isVisible || thickness === undefined || - (isSpaced && !showSpacedArmor) + (spaced && !showSpacedArmor) ) return null; @@ -128,7 +131,7 @@ export function TankArmor({ ...props }: TankArmorProps) { caliber={antagonist.shell.caliber} canSplash={splashCapable} isExplosive={explosiveCapable} - isSpaced={isSpaced ?? false} + isSpaced={spaced ?? false} normalization={normalization} penetration={penetration} thickness={thickness} @@ -172,14 +175,15 @@ export function TankArmor({ ...props }: TankArmorProps) { ); const isVisible = isCurrentTurret; const armorId = nameToArmorId(node.name); - const thickness = turretModelDefinition.armor.thickness[armorId]; - const isSpaced = - turretModelDefinition.armor.spaced?.includes(armorId); + const { spaced, thickness } = resolveArmor( + turretModelDefinition.armor, + armorId, + ); if ( !isVisible || thickness === undefined || - (isSpaced && !showSpacedArmor) + (spaced && !showSpacedArmor) ) return null; @@ -191,7 +195,7 @@ export function TankArmor({ ...props }: TankArmorProps) { caliber={antagonist.shell.caliber} canSplash={splashCapable} isExplosive={explosiveCapable} - isSpaced={isSpaced ?? false} + isSpaced={spaced ?? false} normalization={normalization} penetration={penetration} thickness={thickness} @@ -216,14 +220,15 @@ export function TankArmor({ ...props }: TankArmorProps) { ); const isVisible = isCurrentGun; const armorId = nameToArmorId(node.name); - const thickness = gunModelDefinition.armor.thickness[armorId]; - const isSpaced = - gunModelDefinition.armor.spaced?.includes(armorId); + const { spaced, thickness } = resolveArmor( + gunModelDefinition.armor, + armorId, + ); if ( !isVisible || thickness === undefined || - (isSpaced && !showSpacedArmor) + (spaced && !showSpacedArmor) ) return null; @@ -235,7 +240,7 @@ export function TankArmor({ ...props }: TankArmorProps) { caliber={antagonist.shell.caliber} canSplash={splashCapable} isExplosive={explosiveCapable} - isSpaced={isSpaced ?? false} + isSpaced={spaced ?? false} normalization={normalization} penetration={penetration} thickness={thickness} diff --git a/src/core/blitz/extractArmor.ts b/src/core/blitz/extractArmor.ts index 5bca676be..2e1d7a659 100644 --- a/src/core/blitz/extractArmor.ts +++ b/src/core/blitz/extractArmor.ts @@ -58,10 +58,7 @@ export async function extractArmor(data: string, fileName: string) { attributes.get(attribute)!.push(value); - if ( - attribute === VertexAttribute.HARD_JOINTINDEX && - value[0] !== -1 - ) { + if (attribute === VertexAttribute.HARD_JOINTINDEX) { hardJointIndices.add(value[0]); vertexHardJointIndices.set(index, value[0]); } diff --git a/src/core/blitzkrieg/nameToArmorId.ts b/src/core/blitzkrieg/nameToArmorId.ts index 903f1543b..6ebb6bb15 100644 --- a/src/core/blitzkrieg/nameToArmorId.ts +++ b/src/core/blitzkrieg/nameToArmorId.ts @@ -1,5 +1,5 @@ export function nameToArmorId(name: string) { - const match = name.match(/.+_armor_(\d+)/); + const match = name.match(/.+_armor_(-?\d+)/); const group1 = match![1]; return parseInt(group1); diff --git a/src/core/blitzkrieg/resolveThickness.ts b/src/core/blitzkrieg/resolveThickness.ts new file mode 100644 index 000000000..a4727c1e1 --- /dev/null +++ b/src/core/blitzkrieg/resolveThickness.ts @@ -0,0 +1,8 @@ +import { ModelArmor } from './modelDefinitions'; + +export function resolveArmor(armor: ModelArmor, index: number) { + const spaced = armor.spaced?.includes(index) ?? false; + const thickness = index === -1 ? 0 : armor.thickness[index] ?? 0; + + return { spaced, thickness }; +}