From d9fcbd028bd0033b7758df057a3a83ac92f74cde Mon Sep 17 00:00:00 2001 From: tresabhi <43380238+tresabhi@users.noreply.github.com> Date: Mon, 16 Dec 2024 22:42:27 -0600 Subject: [PATCH] fix: re add blitzkit tank icons --- .../src/buildAssets/blitzkitTankIcons.ts | 44 +++++++ .../scripts/src/buildAssets/definitions.ts | 2 +- packages/scripts/src/buildAssets/index.ts | 4 +- packages/scripts/src/buildAssets/tankIcons.ts | 117 +++++++++++++----- .../scripts/src/buildAssets/tankModels.ts | 2 +- 5 files changed, 135 insertions(+), 34 deletions(-) create mode 100644 packages/scripts/src/buildAssets/blitzkitTankIcons.ts diff --git a/packages/scripts/src/buildAssets/blitzkitTankIcons.ts b/packages/scripts/src/buildAssets/blitzkitTankIcons.ts new file mode 100644 index 000000000..47c6fd854 --- /dev/null +++ b/packages/scripts/src/buildAssets/blitzkitTankIcons.ts @@ -0,0 +1,44 @@ +import { BLITZKIT_TANK_ICON_SIZE, fetchTankDefinitions } from '@blitzkit/core'; +import { exec } from 'child_process'; +import { launch } from 'puppeteer'; +import sharp from 'sharp'; +import { commitAssets } from '../core/github/commitAssets'; +import { FileChange } from '../core/github/commitMultipleFiles'; + +export async function blitzkitTankIcons() { + console.log('Building tank icons...'); + + const child = exec('cd ../.. && bun dev:website'); + const browser = await launch(); + const page = await browser.newPage(); + const tanks = Object.values(await fetchTankDefinitions()); + const files: FileChange[] = []; + + let index = 0; + for (const { id, name } of tanks) { + await page.setViewport({ + width: BLITZKIT_TANK_ICON_SIZE.width - 1, + height: BLITZKIT_TANK_ICON_SIZE.height, + }); + await page.goto(`http://localhost:4321/api/tankopedia/tank-icon/${id}/`, { + waitUntil: 'networkidle0', + }); + const screenshot = await page.screenshot({ + type: 'webp', + omitBackground: true, + }); + const content = await sharp(screenshot).trim({ threshold: 100 }).toBuffer(); + + index++; + console.log( + `Rendered ${id} (${name}) ${((index / tanks.length) * 100).toFixed(2)}%`, + ); + + files.push({ path: `icons/tanks/blitzkit/${id}.webp`, content }); + } + + child.kill('SIGHUP'); + await browser.close(); + + await commitAssets('tank icons', files); +} diff --git a/packages/scripts/src/buildAssets/definitions.ts b/packages/scripts/src/buildAssets/definitions.ts index d356268bf..5e0255cee 100644 --- a/packages/scripts/src/buildAssets/definitions.ts +++ b/packages/scripts/src/buildAssets/definitions.ts @@ -39,9 +39,9 @@ import { readStringDVPL } from '../core/blitz/readStringDVPL'; import { readXMLDVPL } from '../core/blitz/readXMLDVPL'; import { readYAMLDVPL } from '../core/blitz/readYAMLDVPL'; import { commitAssets } from '../core/github/commitAssets'; +import { TankParameters } from './blitzkitTankIcons'; import { DATA } from './constants'; import { Avatar } from './skillIcons'; -import { TankParameters } from './tankIcons'; function parseResearchCost(raw: number | string) { if (typeof raw === 'number') { diff --git a/packages/scripts/src/buildAssets/index.ts b/packages/scripts/src/buildAssets/index.ts index dede2e154..127afae18 100644 --- a/packages/scripts/src/buildAssets/index.ts +++ b/packages/scripts/src/buildAssets/index.ts @@ -9,6 +9,7 @@ const targets = argv ?.split('=')[1] .split(','); +import { blitzkitTankIcons } from './blitzkitTankIcons'; import { boosterIcons } from './boosterIcons'; import { camouflageIcons } from './camouflageIcons'; import { consumableProvisionIcons } from './consumableProvisionIcons'; @@ -28,7 +29,6 @@ if (!targets && !allTargets) throw new Error('No target(s) specified'); const methods = [ definitions, - tankIcons, tankModels, tankArmors, gameModeBanners, @@ -41,6 +41,8 @@ const methods = [ consumableProvisionIcons, camouflageIcons, boosterIcons, + tankIcons, + blitzkitTankIcons, ]; for (const method of methods) { diff --git a/packages/scripts/src/buildAssets/tankIcons.ts b/packages/scripts/src/buildAssets/tankIcons.ts index 627ed15d0..d3421c42d 100644 --- a/packages/scripts/src/buildAssets/tankIcons.ts +++ b/packages/scripts/src/buildAssets/tankIcons.ts @@ -1,44 +1,99 @@ -import { BLITZKIT_TANK_ICON_SIZE, fetchTankDefinitions } from '@blitzkit/core'; -import { exec } from 'child_process'; -import { launch } from 'puppeteer'; +import { NATION_IDS } from '@blitzkit/core'; +import { readdir } from 'fs/promises'; import sharp from 'sharp'; +import { Vector3Tuple } from 'three'; +import { readDVPLFile } from '../core/blitz/readDVPLFile'; +import { readXMLDVPL } from '../core/blitz/readXMLDVPL'; +import { readYAMLDVPL } from '../core/blitz/readYAMLDVPL'; import { commitAssets } from '../core/github/commitAssets'; import { FileChange } from '../core/github/commitMultipleFiles'; +import { DATA } from './constants'; +import { VehicleDefinitionList } from './definitions'; + +export interface TankParameters { + resourcesPath: { + smallIconPath: string; + bigIconPath: string; + blitzModelPath: string; + }; + collision: { + [key: string]: { + points: Vector3Tuple; + bbox: { + min: Vector3Tuple; + max: Vector3Tuple; + }; + averageThickness?: Record; + }; + }; + maskSlice?: { + [key: string]: + | { + enabled: boolean; + planePosition: Vector3Tuple; + planeNormal: Vector3Tuple; + planeAxis: Vector3Tuple; + frustumConeBaseRadius: number; + frustumConeAngleDegrees: number; + planeSliceMode: number; + frustumConeSliceMode: number; + } + | undefined; + }; +} export async function tankIcons() { console.log('Building tank icons...'); - const child = exec('cd ../.. && bun dev:website'); - const browser = await launch(); - const page = await browser.newPage(); - const tanks = Object.values(await fetchTankDefinitions()); - const files: FileChange[] = []; + const changes: FileChange[] = []; + const nations = await readdir(`${DATA}/XML/item_defs/vehicles`).then( + (nations) => nations.filter((nation) => nation !== 'common'), + ); - let index = 0; - for (const { id, name } of tanks) { - await page.setViewport({ - width: BLITZKIT_TANK_ICON_SIZE.width - 1, - height: BLITZKIT_TANK_ICON_SIZE.height, - }); - await page.goto(`http://localhost:4321/api/tankopedia/tank-icon/${id}/`, { - waitUntil: 'networkidle0', - }); - const screenshot = await page.screenshot({ - type: 'webp', - omitBackground: true, - }); - const content = await sharp(screenshot).trim({ threshold: 100 }).toBuffer(); + await Promise.all( + nations.map(async (nation) => { + const tanks = await readXMLDVPL<{ root: VehicleDefinitionList }>( + `${DATA}/XML/item_defs/vehicles/${nation}/list.xml.dvpl`, + ); - index++; - console.log( - `Rendered ${id} (${name}) ${((index / tanks.length) * 100).toFixed(2)}%`, - ); + await Promise.all( + Object.entries(tanks.root).map(async ([tankKey, tank]) => { + if (tankKey.includes('tutorial_bot')) return; - files.push({ path: `icons/tanks/blitzkit/${id}.webp`, content }); - } + const nationVehicleId = tank.id; + const id = (nationVehicleId << 8) + (NATION_IDS[nation] << 4) + 1; + const parameters = await readYAMLDVPL( + `${DATA}/3d/Tanks/Parameters/${nation}/${tankKey}.yaml.dvpl`, + ); + const smallPath = `${DATA}/${parameters.resourcesPath.smallIconPath + .replace(/~res:\//, '') + .replace(/\..+/, '')}.packed.webp.dvpl`; + const bigPath = `${DATA}/${parameters.resourcesPath.bigIconPath + .replace(/~res:\//, '') + .replace(/\..+/, '')}.packed.webp.dvpl`; + const big = await sharp(await readDVPLFile(bigPath)) + .trim() + .toBuffer(); + const small = await sharp(await readDVPLFile(smallPath)) + .trim() + .toBuffer(); - child.kill('SIGHUP'); - await browser.close(); + if (big) { + changes.push({ + content: big, + path: `icons/tanks/big/${id}.webp`, + }); + } + if (small) { + changes.push({ + content: small, + path: `icons/tanks/small/${id}.webp`, + }); + } + }), + ); + }), + ); - await commitAssets('tank icons', files); + await commitAssets('tank icons', changes); } diff --git a/packages/scripts/src/buildAssets/tankModels.ts b/packages/scripts/src/buildAssets/tankModels.ts index 9a2a759ad..0add1d2e5 100644 --- a/packages/scripts/src/buildAssets/tankModels.ts +++ b/packages/scripts/src/buildAssets/tankModels.ts @@ -7,9 +7,9 @@ import { readXMLDVPL } from '../core/blitz/readXMLDVPL'; import { readYAMLDVPL } from '../core/blitz/readYAMLDVPL'; import { commitAssets } from '../core/github/commitAssets'; import { FileChange } from '../core/github/commitMultipleFiles'; +import { TankParameters } from './blitzkitTankIcons'; import { DATA } from './constants'; import { VehicleDefinitionList } from './definitions'; -import { TankParameters } from './tankIcons'; export async function tankModels() { console.log('Building tank models...');