feat: moved to blitzkrieg assets

This commit is contained in:
TrèsAbhi committed 2024-01-09 13:36:33 -06:00
1 parent f9ccb06d1f
commit 6aa4686c30
21 files changed
+55 -99

No files matched your search

BIN
View File
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+21 -8
View File
@@ -1,18 +1,18 @@
import { NodeIO } from '@gltf-transform/core'; 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 { extractArmor } from '../../src/core/blitz/extractArmor';
import { readXMLDVPL } from '../../src/core/blitz/readXMLDVPL'; import { readXMLDVPL } from '../../src/core/blitz/readXMLDVPL';
import { toUniqueId } from '../../src/core/blitz/toUniqueId'; import { toUniqueId } from '../../src/core/blitz/toUniqueId';
import commitMultipleFiles, {
FileChange,
} from '../../src/core/blitzkrieg/commitMultipleFiles';
import { DATA, DOI } from './constants'; import { DATA, DOI } from './constants';
import { VehicleDefinitionList } from './definitions'; import { VehicleDefinitionList } from './definitions';
BigInt.prototype.toJSON = function () {
return this.toString();
};
export async function buildTankArmors() { export async function buildTankArmors() {
console.log('Building tank armors...'); console.log('Building tank armors...');
const changes: FileChange[] = [];
const nodeIO = new NodeIO(); const nodeIO = new NodeIO();
const nations = await readdir(`${DATA}/${DOI.vehicleDefinitions}`).then( const nations = await readdir(`${DATA}/${DOI.vehicleDefinitions}`).then(
(nations) => nations.filter((nation) => nation !== 'common'), (nations) => nations.filter((nation) => nation !== 'common'),
@@ -36,10 +36,23 @@ export async function buildTankArmors() {
const model = await extractArmor(DATA, `${nation}-${tankKey}`); const model = await extractArmor(DATA, `${nation}-${tankKey}`);
writeFile(`temp/armor/${id}.glb`, await nodeIO.writeBinary(model)); changes.push({
path: `3d/tanks/armor/${id}.glb`,
// writeFile('test.sc2.json', JSON.stringify(sc2, null, 2)); encoding: 'base64',
content: Buffer.from(await nodeIO.writeBinary(model)).toString(
'base64',
),
});
} }
}), }),
); );
await commitMultipleFiles(
'tresabhi',
'blitzkrieg-assets',
'main',
'tank armor',
changes,
true,
);
} }
+23 -4
View File
@@ -1,10 +1,13 @@
import { NodeIO } from '@gltf-transform/core'; import { NodeIO } from '@gltf-transform/core';
import { readdir, writeFile } from 'fs/promises'; import { readdir } from 'fs/promises';
import { Vector3Tuple } from 'three'; import { Vector3Tuple } from 'three';
import { extractModel } from '../../src/core/blitz/extractModel'; import { extractModel } from '../../src/core/blitz/extractModel';
import { readXMLDVPL } from '../../src/core/blitz/readXMLDVPL'; import { readXMLDVPL } from '../../src/core/blitz/readXMLDVPL';
import { readYAMLDVPL } from '../../src/core/blitz/readYAMLDVPL'; import { readYAMLDVPL } from '../../src/core/blitz/readYAMLDVPL';
import { toUniqueId } from '../../src/core/blitz/toUniqueId'; import { toUniqueId } from '../../src/core/blitz/toUniqueId';
import commitMultipleFiles, {
FileChange,
} from '../../src/core/blitzkrieg/commitMultipleFiles';
import { DATA, DOI } from './constants'; import { DATA, DOI } from './constants';
import { VehicleDefinitionList } from './definitions'; import { VehicleDefinitionList } from './definitions';
import { TankParameters } from './tankIcons'; import { TankParameters } from './tankIcons';
@@ -16,6 +19,7 @@ interface VehicleCustomization {
export async function buildTankModels() { export async function buildTankModels() {
console.log('Building tank models...'); console.log('Building tank models...');
const changes: FileChange[] = [];
const nodeIO = new NodeIO(); const nodeIO = new NodeIO();
const nations = await readdir(`${DATA}/${DOI.vehicleDefinitions}`).then( const nations = await readdir(`${DATA}/${DOI.vehicleDefinitions}`).then(
(nations) => nations.filter((nation) => nation !== 'common'), (nations) => nations.filter((nation) => nation !== 'common'),
@@ -45,10 +49,10 @@ export async function buildTankModels() {
// if (id !== 7425) continue; // isu 152 // if (id !== 7425) continue; // isu 152
// if (id !== 10369) continue; // mino // if (id !== 10369) continue; // mino
// if (id !== 4417) continue; // amx m4 mle // 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 !== 1) continue; // t-34
// if (id !== 6753) continue; // type 71 // 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 !== 11633) continue; // forest witch
// if (id !== 6225) continue; // fv215b // if (id !== 6225) continue; // fv215b
// if (id !== 4481) continue; // kran // if (id !== 4481) continue; // kran
@@ -67,8 +71,23 @@ export async function buildTankModels() {
baseColor, 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,
);
} }
@@ -9,6 +9,7 @@ import {
import { Group, Vector3 } from 'three'; import { Group, Vector3 } from 'three';
import { GLTFLoader } from 'three-stdlib'; import { GLTFLoader } from 'three-stdlib';
import { X_AXIS } from '../../../../../../../constants/axis'; import { X_AXIS } from '../../../../../../../constants/axis';
import { asset } from '../../../../../../../core/blitzkrieg/asset';
import { import {
ModelDefinitions, ModelDefinitions,
modelDefinitions, modelDefinitions,
@@ -33,7 +34,10 @@ export const TankModel = forwardRef<Group>((_props, ref) => {
if (!protagonist) return null; 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 model = useTankopedia((state) => state.model);
const hullContainer = useRef<Group>(null); const hullContainer = useRef<Group>(null);
const turretContainer = useRef<Group>(null); const turretContainer = useRef<Group>(null);
+6 -34
View File
@@ -1,6 +1,5 @@
import { Accessor, Document, Node, Scene } from '@gltf-transform/core'; import { Accessor, Document, Node, Scene } from '@gltf-transform/core';
import { times } from 'lodash'; import { times } from 'lodash';
import { Matrix4, Quaternion, Vector3, Vector4Tuple } from 'three';
import { Hierarchy, Sc2Stream } from '../streams/sc2'; import { Hierarchy, Sc2Stream } from '../streams/sc2';
import { ScgStream } from '../streams/scg'; import { ScgStream } from '../streams/scg';
import { VertexAttribute } from '../streams/scpg'; import { VertexAttribute } from '../streams/scpg';
@@ -25,7 +24,6 @@ export async function extractArmor(data: string, fileName: string) {
function parseHierarchies(hierarchies: Hierarchy[], parent: Scene | Node) { function parseHierarchies(hierarchies: Hierarchy[], parent: Scene | Node) {
hierarchies.forEach((hierarchy) => { hierarchies.forEach((hierarchy) => {
const node = document.createNode(hierarchy.name);
const components = times( const components = times(
hierarchy.components.count, hierarchy.components.count,
(index) => hierarchy.components[index.toString().padStart(4, '0')], (index) => hierarchy.components[index.toString().padStart(4, '0')],
@@ -33,32 +31,8 @@ export async function extractArmor(data: string, fileName: string) {
components.forEach((component) => { components.forEach((component) => {
switch (component['comp.typename']) { switch (component['comp.typename']) {
case 'TransformComponent': { 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());
break; break;
}
case 'RenderComponent': { case 'RenderComponent': {
const batch = component['rc.renderObj']['ro.batches']['0000']; const batch = component['rc.renderObj']['ro.batches']['0000'];
@@ -116,8 +90,8 @@ export async function extractArmor(data: string, fileName: string) {
}); });
hardJointIndices.forEach((hardJointIndex) => { hardJointIndices.forEach((hardJointIndex) => {
const hardJointNode = document.createNode( const node = document.createNode(
`armor_${hardJointIndex}`, `${hierarchy.name}_armor_${hardJointIndex}`,
); );
const mesh = document.createMesh(batch['##name']); const mesh = document.createMesh(batch['##name']);
const indicesAccessor = document const indicesAccessor = document
@@ -148,8 +122,8 @@ export async function extractArmor(data: string, fileName: string) {
}); });
mesh.addPrimitive(primitive); mesh.addPrimitive(primitive);
hardJointNode.setMesh(mesh); node.setMesh(mesh);
node.addChild(hardJointNode); parent.addChild(node);
}); });
break; break;
@@ -163,10 +137,8 @@ export async function extractArmor(data: string, fileName: string) {
}); });
if (hierarchy['#hierarchy']) { if (hierarchy['#hierarchy']) {
parseHierarchies(hierarchy['#hierarchy'], node); parseHierarchies(hierarchy['#hierarchy'], parent);
} }
parent.addChild(node);
}); });
} }
-52
View File
@@ -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<ToJpgOptions>,
) {
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;
}