diff --git a/.vscode/settings.json b/.vscode/settings.json index c5334eed5..a4a219ae9 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -9,6 +9,7 @@ "artefacts", "atgm", "AYUV", + "bbox", "bepaint", "BINORMAL", "Binormals", diff --git a/scripts/buildAssets/definitions.ts b/scripts/buildAssets/definitions.ts index 32b1fc7a7..3151c2b9b 100644 --- a/scripts/buildAssets/definitions.ts +++ b/scripts/buildAssets/definitions.ts @@ -29,6 +29,7 @@ import { Tier, } from '../../src/core/blitzkrieg/tankDefinitions'; import { DATA, POI } from './constants'; +import { TankParameters } from './tankIcons'; type BlitzTankType = 'AT-SPG' | 'lightTank' | 'mediumTank' | 'heavyTank'; interface Strings { @@ -119,6 +120,9 @@ interface VehicleDefinitions { yawLimits: string | string[]; gunPosition: string | string[]; models: { undamaged: string }; + hitTester: { + collisionModel: string; + }; guns: { [key: string]: { armor: VehicleDefinitionArmor & { @@ -338,6 +342,9 @@ export async function definitions(production: boolean) { const tankDefinition = await readXMLDVPL<{ root: VehicleDefinitions }>( `${DATA}/${POI.vehicleDefinitions}/${nation}/${tankKey}.xml.dvpl`, ); + const tankParameters = await readYAMLDVPL( + `${DATA}/${POI.tankParameters}/${nation}/${tankKey}.yaml.dvpl`, + ); const defaultChassis = Object.values(tankDefinition.root.chassis).at( -1, )!; @@ -426,6 +433,7 @@ export async function definitions(production: boolean) { roll: tankDefinition.root.hull.turretInitialRotation.roll, } : undefined, + boundingBox: tankParameters.collision.hull.bbox, turrets: {}, }; @@ -507,6 +515,10 @@ export async function definitions(production: boolean) { ? undefined : { min: turretYaw[0], max: turretYaw[1] }, guns: {}, + boundingBox: + tankParameters.collision[ + parsePath(turret.hitTester.collisionModel).name.toLowerCase() + ].bbox, }; Object.keys(turret.guns).forEach((gunKey, gunIndex) => { diff --git a/scripts/buildAssets/tankIcons.ts b/scripts/buildAssets/tankIcons.ts index fe28c27aa..109a6a268 100644 --- a/scripts/buildAssets/tankIcons.ts +++ b/scripts/buildAssets/tankIcons.ts @@ -1,4 +1,5 @@ import { readdir } from 'fs/promises'; +import { Vector3Tuple } from 'three'; import { NATION_IDS } from '../../src/constants/nations'; import { readBase64DVPL } from '../../src/core/blitz/readBase64DVPL'; import { readXMLDVPL } from '../../src/core/blitz/readXMLDVPL'; @@ -14,6 +15,16 @@ export interface TankParameters { bigIconPath: string; blitzModelPath: string; }; + collision: { + [key: string]: { + points: Vector3Tuple; + bbox: { + min: Vector3Tuple; + max: Vector3Tuple; + }; + averageThickness?: Record; + }; + }; } export async function buildTankIcons(production: boolean) { diff --git a/src/app/tools/tankopedia/[id]/components/Characteristics/index.tsx b/src/app/tools/tankopedia/[id]/components/Characteristics/index.tsx index 0cc7eaf4a..4c0111570 100644 --- a/src/app/tools/tankopedia/[id]/components/Characteristics/index.tsx +++ b/src/app/tools/tankopedia/[id]/components/Characteristics/index.tsx @@ -57,22 +57,22 @@ export function Characteristics() { {Math.round(engine.fire_chance * 100)} - TODO + {turret.view_range} - TODO + {(tank.camouflage.still * 100).toFixed(2)} - TODO + {(tank.camouflage.moving * 100).toFixed(2)} - TODO + {(tank.camouflage.still * gun.camouflageLoss * 100).toFixed(2)} - TODO + {(tank.camouflage.moving * gun.camouflageLoss * 100).toFixed(2)} - - TODO + + {(tank.camouflage.onFire * 100).toFixed(2)} TODO diff --git a/src/core/blitzkrieg/modelDefinitions.ts b/src/core/blitzkrieg/modelDefinitions.ts index 27c29c9e6..78be757bf 100644 --- a/src/core/blitzkrieg/modelDefinitions.ts +++ b/src/core/blitzkrieg/modelDefinitions.ts @@ -8,6 +8,10 @@ export interface ModelArmor { spaced?: number[]; } +interface BoundingBox { + min: Vector3Tuple; + max: Vector3Tuple; +} interface ModelDefinition { armor: ModelArmor; trackThickness: number; @@ -15,6 +19,7 @@ interface ModelDefinition { hullOrigin: Vector3Tuple; turretRotation?: InitialTurretRotation; turrets: Record; + boundingBox: BoundingBox; } export interface InitialTurretRotation { yaw: number; @@ -22,6 +27,7 @@ export interface InitialTurretRotation { roll: number; } interface TurretModelDefinition { + boundingBox: BoundingBox; armor: ModelArmor; model: number; gunOrigin: Vector3Tuple;