diff --git a/public/test/1.glb b/public/test/1.glb deleted file mode 100644 index 90ce7b846..000000000 Binary files a/public/test/1.glb and /dev/null differ diff --git a/public/test/10369.glb b/public/test/10369.glb deleted file mode 100644 index ac398e97f..000000000 Binary files a/public/test/10369.glb and /dev/null differ diff --git a/public/test/11633.glb b/public/test/11633.glb deleted file mode 100644 index b408aa2ae..000000000 Binary files a/public/test/11633.glb and /dev/null differ diff --git a/public/test/12049.glb b/public/test/12049.glb deleted file mode 100644 index 83160af2e..000000000 Binary files a/public/test/12049.glb and /dev/null differ diff --git a/public/test/13569.glb b/public/test/13569.glb deleted file mode 100644 index 493f092f3..000000000 Binary files a/public/test/13569.glb and /dev/null differ diff --git a/public/test/15697.glb b/public/test/15697.glb deleted file mode 100644 index 741c751e3..000000000 Binary files a/public/test/15697.glb and /dev/null differ diff --git a/public/test/16401.glb b/public/test/16401.glb deleted file mode 100644 index f6aacaf5a..000000000 Binary files a/public/test/16401.glb and /dev/null differ diff --git a/public/test/24609.glb b/public/test/24609.glb deleted file mode 100644 index 636a3b032..000000000 Binary files a/public/test/24609.glb and /dev/null differ diff --git a/public/test/4417.glb b/public/test/4417.glb deleted file mode 100644 index cae09b64d..000000000 Binary files a/public/test/4417.glb and /dev/null differ diff --git a/public/test/4481.glb b/public/test/4481.glb deleted file mode 100644 index 7dd1fb630..000000000 Binary files a/public/test/4481.glb and /dev/null differ diff --git a/public/test/5137.glb b/public/test/5137.glb deleted file mode 100644 index f2622dfed..000000000 Binary files a/public/test/5137.glb and /dev/null differ diff --git a/public/test/6225.glb b/public/test/6225.glb deleted file mode 100644 index 30e23e545..000000000 Binary files a/public/test/6225.glb and /dev/null differ diff --git a/public/test/6753.glb b/public/test/6753.glb deleted file mode 100644 index f2d2dc378..000000000 Binary files a/public/test/6753.glb and /dev/null differ diff --git a/public/test/7297.glb b/public/test/7297.glb deleted file mode 100644 index 900677128..000000000 Binary files a/public/test/7297.glb and /dev/null differ diff --git a/public/test/7425.glb b/public/test/7425.glb deleted file mode 100644 index d8ec346fb..000000000 Binary files a/public/test/7425.glb and /dev/null differ diff --git a/public/test/9489.glb b/public/test/9489.glb deleted file mode 100644 index 73a521181..000000000 Binary files a/public/test/9489.glb and /dev/null differ diff --git a/scripts/buildAssets/tankArmors.ts b/scripts/buildAssets/tankArmors.ts index fc36bc487..ba4b33cf9 100644 --- a/scripts/buildAssets/tankArmors.ts +++ b/scripts/buildAssets/tankArmors.ts @@ -1,18 +1,18 @@ import { NodeIO } from '@gltf-transform/core'; -import { readdir, writeFile } from 'fs/promises'; +import { readdir } from 'fs/promises'; import { extractArmor } from '../../src/core/blitz/extractArmor'; import { readXMLDVPL } from '../../src/core/blitz/readXMLDVPL'; import { toUniqueId } from '../../src/core/blitz/toUniqueId'; +import commitMultipleFiles, { + FileChange, +} from '../../src/core/blitzkrieg/commitMultipleFiles'; import { DATA, DOI } from './constants'; import { VehicleDefinitionList } from './definitions'; -BigInt.prototype.toJSON = function () { - return this.toString(); -}; - export async function buildTankArmors() { console.log('Building tank armors...'); + const changes: FileChange[] = []; const nodeIO = new NodeIO(); const nations = await readdir(`${DATA}/${DOI.vehicleDefinitions}`).then( (nations) => nations.filter((nation) => nation !== 'common'), @@ -36,10 +36,23 @@ export async function buildTankArmors() { const model = await extractArmor(DATA, `${nation}-${tankKey}`); - writeFile(`temp/armor/${id}.glb`, await nodeIO.writeBinary(model)); - - // writeFile('test.sc2.json', JSON.stringify(sc2, null, 2)); + changes.push({ + path: `3d/tanks/armor/${id}.glb`, + encoding: 'base64', + content: Buffer.from(await nodeIO.writeBinary(model)).toString( + 'base64', + ), + }); } }), ); + + await commitMultipleFiles( + 'tresabhi', + 'blitzkrieg-assets', + 'main', + 'tank armor', + changes, + true, + ); } diff --git a/scripts/buildAssets/tankModels.ts b/scripts/buildAssets/tankModels.ts index 3a3a0a6f2..56ce0faec 100644 --- a/scripts/buildAssets/tankModels.ts +++ b/scripts/buildAssets/tankModels.ts @@ -1,10 +1,13 @@ import { NodeIO } from '@gltf-transform/core'; -import { readdir, writeFile } from 'fs/promises'; +import { readdir } from 'fs/promises'; import { Vector3Tuple } from 'three'; import { extractModel } from '../../src/core/blitz/extractModel'; import { readXMLDVPL } from '../../src/core/blitz/readXMLDVPL'; import { readYAMLDVPL } from '../../src/core/blitz/readYAMLDVPL'; import { toUniqueId } from '../../src/core/blitz/toUniqueId'; +import commitMultipleFiles, { + FileChange, +} from '../../src/core/blitzkrieg/commitMultipleFiles'; import { DATA, DOI } from './constants'; import { VehicleDefinitionList } from './definitions'; import { TankParameters } from './tankIcons'; @@ -16,6 +19,7 @@ interface VehicleCustomization { export async function buildTankModels() { console.log('Building tank models...'); + const changes: FileChange[] = []; const nodeIO = new NodeIO(); const nations = await readdir(`${DATA}/${DOI.vehicleDefinitions}`).then( (nations) => nations.filter((nation) => nation !== 'common'), @@ -45,10 +49,10 @@ export async function buildTankModels() { // if (id !== 7425) continue; // isu 152 // if (id !== 10369) continue; // mino // if (id !== 4417) continue; // amx m4 mle - // if (id !== 7297) continue; // 60tp + if (id !== 7297) continue; // 60tp // if (id !== 1) continue; // t-34 // if (id !== 6753) continue; // type 71 - if (id !== 5137) continue; // tiger ii + // if (id !== 5137) continue; // tiger ii // if (id !== 11633) continue; // forest witch // if (id !== 6225) continue; // fv215b // if (id !== 4481) continue; // kran @@ -67,8 +71,23 @@ export async function buildTankModels() { baseColor, ); - writeFile(`public/test/${id}.glb`, await nodeIO.writeBinary(model)); + changes.push({ + path: `3d/tanks/models/${id}.glb`, + encoding: 'base64', + content: Buffer.from(await nodeIO.writeBinary(model)).toString( + 'base64', + ), + }); } }), ); + + await commitMultipleFiles( + 'tresabhi', + 'blitzkrieg-assets', + 'main', + 'tank models', + changes, + true, + ); } 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 b3290c1fa..e315dd18f 100644 --- a/src/app/tools/tankopedia/[id]/components/Model/components/TankModel.tsx +++ b/src/app/tools/tankopedia/[id]/components/Model/components/TankModel.tsx @@ -9,6 +9,7 @@ import { import { Group, Vector3 } from 'three'; import { GLTFLoader } from 'three-stdlib'; import { X_AXIS } from '../../../../../../../constants/axis'; +import { asset } from '../../../../../../../core/blitzkrieg/asset'; import { ModelDefinitions, modelDefinitions, @@ -33,7 +34,10 @@ export const TankModel = forwardRef((_props, ref) => { if (!protagonist) return null; - const gltf = useLoader(GLTFLoader, `/test/${protagonist.tank.id}.glb`); + const gltf = useLoader( + GLTFLoader, + asset(`3d/tanks/models/${protagonist.tank.id}.glb`), + ); const model = useTankopedia((state) => state.model); const hullContainer = useRef(null); const turretContainer = useRef(null); diff --git a/src/core/blitz/extractArmor.ts b/src/core/blitz/extractArmor.ts index 5f33da5a4..5cd4f5fc2 100644 --- a/src/core/blitz/extractArmor.ts +++ b/src/core/blitz/extractArmor.ts @@ -1,6 +1,5 @@ import { Accessor, Document, Node, Scene } from '@gltf-transform/core'; import { times } from 'lodash'; -import { Matrix4, Quaternion, Vector3, Vector4Tuple } from 'three'; import { Hierarchy, Sc2Stream } from '../streams/sc2'; import { ScgStream } from '../streams/scg'; import { VertexAttribute } from '../streams/scpg'; @@ -25,7 +24,6 @@ export async function extractArmor(data: string, fileName: string) { function parseHierarchies(hierarchies: Hierarchy[], parent: Scene | Node) { hierarchies.forEach((hierarchy) => { - const node = document.createNode(hierarchy.name); const components = times( hierarchy.components.count, (index) => hierarchy.components[index.toString().padStart(4, '0')], @@ -33,32 +31,8 @@ export async function extractArmor(data: string, fileName: string) { components.forEach((component) => { switch (component['comp.typename']) { - case 'TransformComponent': { - const translation = new Vector3(); - const rotation = new Quaternion(); - const scale = new Vector3(); - - new Matrix4() - .multiplyMatrices( - new Matrix4().compose( - new Vector3().fromArray(component['tc.worldTranslation']), - new Quaternion().fromArray(component['tc.worldRotation']), - new Vector3().fromArray(component['tc.worldScale']), - ), - new Matrix4().compose( - new Vector3().fromArray(component['tc.localTranslation']), - new Quaternion().fromArray(component['tc.localRotation']), - new Vector3().fromArray(component['tc.localScale']), - ), - ) - .decompose(translation, rotation, scale); - - node.setTranslation(translation.toArray()); - node.setRotation(rotation.toArray() as Vector4Tuple); - node.setScale(scale.toArray()); - + case 'TransformComponent': break; - } case 'RenderComponent': { const batch = component['rc.renderObj']['ro.batches']['0000']; @@ -116,8 +90,8 @@ export async function extractArmor(data: string, fileName: string) { }); hardJointIndices.forEach((hardJointIndex) => { - const hardJointNode = document.createNode( - `armor_${hardJointIndex}`, + const node = document.createNode( + `${hierarchy.name}_armor_${hardJointIndex}`, ); const mesh = document.createMesh(batch['##name']); const indicesAccessor = document @@ -148,8 +122,8 @@ export async function extractArmor(data: string, fileName: string) { }); mesh.addPrimitive(primitive); - hardJointNode.setMesh(mesh); - node.addChild(hardJointNode); + node.setMesh(mesh); + parent.addChild(node); }); break; @@ -163,10 +137,8 @@ export async function extractArmor(data: string, fileName: string) { }); if (hierarchy['#hierarchy']) { - parseHierarchies(hierarchy['#hierarchy'], node); + parseHierarchies(hierarchy['#hierarchy'], parent); } - - parent.addChild(node); }); } diff --git a/src/core/blitzkrieg/toJpg.ts b/src/core/blitzkrieg/toJpg.ts deleted file mode 100644 index 696b6bdf7..000000000 --- a/src/core/blitzkrieg/toJpg.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { exec } from 'child_process'; -import { mkdir, readFile, rm, writeFile } from 'fs/promises'; -import { generateUUID } from 'three/src/math/MathUtils'; -import { promisify } from 'util'; - -const execPromise = promisify(exec); - -type Channel = 'red' | 'green' | 'blue' | 'alpha'; - -export interface ToJpgOptions { - format: string; - swap: [Channel, Channel][]; - invert: boolean; -} - -const toJpgDefaultOptions: ToJpgOptions = { - format: 'dds', - swap: [], - invert: false, -}; - -export async function toJpg( - inputBuffer: Buffer, - options?: Partial, -) { - const mergedOptions = { ...toJpgDefaultOptions, ...options }; - const id = generateUUID(); - const input = `temp/toJpg/${id}.${mergedOptions.format}`; - const output = `temp/toJpg/${id}.jpg`; - const command = `PVRTexToolCLI -noout -i ${input} ${ - mergedOptions.swap.length === 0 - ? '' - : mergedOptions.swap - .map( - (swapChannels) => `-${swapChannels[1]} ${input},${swapChannels[0]}`, - ) - .join(' ') - } ${ - mergedOptions.invert ? `-diff ${input},DIFFINVERT,255` : '' - } -d ${output}`; - - await mkdir('temp/toJpg', { recursive: true }); - await writeFile(`temp/toJpg/${id}.${mergedOptions.format}`, inputBuffer); - await execPromise(command); - - const jpgBuffer = await readFile(`temp/toJpg/${id}.jpg`); - - rm(`temp/toJpg/${id}.${mergedOptions.format}`); - rm(`temp/toJpg/${id}.jpg`); - - return jpgBuffer; -}