feat: more accurate models

This commit is contained in:
TrèsAbhi committed 2024-02-18 16:17:00 -06:00
1 parent bc85b354a0
commit 60a115b7d8
9 files changed
+39 -38

No files matched your search

+2 -2
View File
@@ -65,8 +65,8 @@
"react-spinners": "^0.13.8", "react-spinners": "^0.13.8",
"satori": "^0.10.8", "satori": "^0.10.8",
"sharp": "0.33.1", "sharp": "0.33.1",
"three": "0.159.0", "three": "^0.161.0",
"three-stdlib": "^2.29.1", "three-stdlib": "^2.29.4",
"vite-node": "^0.34.5", "vite-node": "^0.34.5",
"vitepress": "^1.0.0-rc.20", "vitepress": "^1.0.0-rc.20",
"vitepress-plugin-auto-sidebar": "^1.1.0", "vitepress-plugin-auto-sidebar": "^1.1.0",
+1 -1
View File
@@ -40,5 +40,5 @@ const methods = [
]; ];
for (const method of methods) { for (const method of methods) {
if (allTargets || targets?.includes(method.name)) method(production); if (allTargets || targets?.includes(method.name)) await method(production);
} }
+2 -2
View File
@@ -16,8 +16,8 @@ Buffer.prototype.toJSON = function () {
export async function extractArmor(data: string, fileName: string) { export async function extractArmor(data: string, fileName: string) {
const sc2Path = `${data}/3d/Tanks/CollisionMeshes/${fileName}.sc2.dvpl`; const sc2Path = `${data}/3d/Tanks/CollisionMeshes/${fileName}.sc2.dvpl`;
const scgPath = `${data}/3d/Tanks/CollisionMeshes/${fileName}.scg.dvpl`; const scgPath = `${data}/3d/Tanks/CollisionMeshes/${fileName}.scg.dvpl`;
const sc2 = new Sc2ReadStream(await readDVPLFile(sc2Path)).sc2(); const sc2 = new Sc2ReadStream((await readDVPLFile(sc2Path)).buffer).sc2();
const scg = new ScgReadStream(await readDVPLFile(scgPath)).scg(); const scg = new ScgReadStream((await readDVPLFile(scgPath)).buffer).scg();
const document = new Document(); const document = new Document();
const scene = document.createScene(); const scene = document.createScene();
const buffer = document.createBuffer(); const buffer = document.createBuffer();
+4 -4
View File
@@ -48,8 +48,8 @@ export async function extractModel(
) { ) {
const sc2Path = `${data}/3d/${path}.sc2.dvpl`; const sc2Path = `${data}/3d/${path}.sc2.dvpl`;
const scgPath = `${data}/3d/${path}.scg.dvpl`; const scgPath = `${data}/3d/${path}.scg.dvpl`;
const sc2 = new Sc2ReadStream(await readDVPLFile(sc2Path)).sc2(); const sc2 = new Sc2ReadStream((await readDVPLFile(sc2Path)).buffer).sc2();
const scg = new ScgReadStream(await readDVPLFile(scgPath)).scg(); const scg = new ScgReadStream((await readDVPLFile(scgPath)).buffer).scg();
const document = new Document(); const document = new Document();
const scene = document.createScene(); const scene = document.createScene();
const buffer = document.createBuffer(); const buffer = document.createBuffer();
@@ -58,7 +58,7 @@ export async function extractModel(
// create materials // create materials
await Promise.all( await Promise.all(
sc2['#dataNodes'].map(async (node) => { sc2['#dataNodes'].map(async (node) => {
const id = node['#id'].readBigUInt64LE(); const id = new DataView(node['#id']).getBigUint64(0, true);
if (node.parentMaterialKey !== undefined) { if (node.parentMaterialKey !== undefined) {
/** /**
@@ -140,7 +140,7 @@ export async function extractModel(
} }
} }
materials.set(node['#id'].readBigUInt64LE(), material); materials.set(new DataView(node['#id']).getBigUint64(0, true), material);
}), }),
); );
@@ -25,5 +25,3 @@ export interface EquipmentDefinitions {
export const equipmentDefinitions = fetchCdonLz4<EquipmentDefinitions>( export const equipmentDefinitions = fetchCdonLz4<EquipmentDefinitions>(
asset('definitions/equipment.cdon.lz4'), asset('definitions/equipment.cdon.lz4'),
); );
equipmentDefinitions.then(console.log);
+5 -5
View File
@@ -36,8 +36,8 @@ export async function readTexture(path: string, options?: ReadTextureOptions) {
const decompressedDvpl = await readDVPLFile(resolvedTexturePath); const decompressedDvpl = await readDVPLFile(resolvedTexturePath);
const raw = isDds const raw = isDds
? await new DdsReadStream(decompressedDvpl).dds() ? await new DdsReadStream(decompressedDvpl.buffer).dds()
: new PvrReadStream(decompressedDvpl).pvr(); : new PvrReadStream(decompressedDvpl.buffer).pvr();
const channels = 4 * raw.width * raw.height; const channels = 4 * raw.width * raw.height;
switch (options?.mutation) { switch (options?.mutation) {
@@ -81,11 +81,11 @@ export async function readTexture(path: string, options?: ReadTextureOptions) {
case TextureMutation.Miscellaneous: { case TextureMutation.Miscellaneous: {
for (let index = 0; index < channels; index += 4) { for (let index = 0; index < channels; index += 4) {
/** /**
* Green is ambient occlusion and alpha is emissive. But very few tanks * Alpha is ambient occlusion and green is emissive. But very few tanks
* use emissive so I am ignoring it for now. * use emissive so I am ignoring it for now.
*/ */
const occlusion = raw.data[index + 1]; // const emissive = raw.data[index + 1];
// const emissive = raw.data[index + 3]; const occlusion = raw.data[index + 3];
raw.data[index] = occlusion; raw.data[index] = occlusion;
raw.data[index + 1] = 0; raw.data[index + 1] = 0;
+10 -10
View File
@@ -9,7 +9,7 @@ export interface SC2 {
type DataNode = { type DataNode = {
'##name': 'NMaterial'; '##name': 'NMaterial';
'#id': Buffer; '#id': ArrayBuffer;
materialName: string; materialName: string;
parentMaterialKey?: bigint; parentMaterialKey?: bigint;
qualityGroup?: string; qualityGroup?: string;
@@ -46,15 +46,15 @@ interface Flags {
} }
interface Properties { interface Properties {
alphatestThreshold: Buffer; alphatestThreshold: ArrayBuffer;
attenuationBoxHalfSize: Buffer; attenuationBoxHalfSize: ArrayBuffer;
attenuationBoxSmoothness: Buffer; attenuationBoxSmoothness: ArrayBuffer;
baseColorFactor?: Buffer; baseColorFactor?: ArrayBuffer;
decalTileCoordScale?: Buffer; decalTileCoordScale?: ArrayBuffer;
inGlossiness: Buffer; inGlossiness: ArrayBuffer;
inSpecularity: Buffer; inSpecularity: ArrayBuffer;
metalFresnelReflectance: Buffer; metalFresnelReflectance: ArrayBuffer;
metallicRoughnessFactor?: Buffer; metallicRoughnessFactor?: ArrayBuffer;
} }
interface TextureSampleStates { interface TextureSampleStates {
+10 -7
View File
@@ -2,18 +2,18 @@ import { ScpgReadStream, VertexAttribute } from './scpg';
interface PolygonGroupRaw { interface PolygonGroupRaw {
'##name': 'PolygonGroup'; '##name': 'PolygonGroup';
'#id': Buffer; '#id': ArrayBuffer;
cubeTextureCoordCount: number; cubeTextureCoordCount: number;
indexCount: number; indexCount: number;
indexFormat: 0 | 1; indexFormat: 0 | 1;
indices: Buffer; indices: ArrayBuffer;
packing: 0 | 1; packing: 0 | 1;
primitiveCount: number; primitiveCount: number;
rhi_primitiveType: 1 | 2 | 10; rhi_primitiveType: 1 | 2 | 10;
textureCoordCount: number; textureCoordCount: number;
vertexCount: number; vertexCount: number;
vertexFormat: number; vertexFormat: number;
vertices: Buffer; vertices: ArrayBuffer;
} }
type BlitzkriegVertex = { attribute: VertexAttribute; value: number[] }[]; type BlitzkriegVertex = { attribute: VertexAttribute; value: number[] }[];
@@ -104,10 +104,13 @@ export class ScgReadStream extends ScpgReadStream {
})); }));
} }
polygonGroups.set(polygonGroupRaw['#id'].readBigUInt64LE(), { polygonGroups.set(
vertices, new DataView(polygonGroupRaw['#id']).getBigUint64(0, true),
indices, {
}); vertices,
indices,
},
);
}); });
return polygonGroups; return polygonGroups;
+5 -5
View File
@@ -5342,7 +5342,7 @@ three-mesh-bvh@^0.7.0:
resolved "https://registry.yarnpkg.com/three-mesh-bvh/-/three-mesh-bvh-0.7.1.tgz#c11461b73e71c143717f95e0a8e6c9721ad0de77" resolved "https://registry.yarnpkg.com/three-mesh-bvh/-/three-mesh-bvh-0.7.1.tgz#c11461b73e71c143717f95e0a8e6c9721ad0de77"
integrity sha512-63xvjnmK3FpA41klHfVvTMi2JRFdKeu3b4STBcLvGyDMYRpkBIyJ2d77CnNvKBZl9bed4sdEyrqE3AOsGorjUA== integrity sha512-63xvjnmK3FpA41klHfVvTMi2JRFdKeu3b4STBcLvGyDMYRpkBIyJ2d77CnNvKBZl9bed4sdEyrqE3AOsGorjUA==
three-stdlib@^2.29.1, three-stdlib@^2.29.4: three-stdlib@^2.29.4:
version "2.29.4" version "2.29.4"
resolved "https://registry.yarnpkg.com/three-stdlib/-/three-stdlib-2.29.4.tgz#6e8741f6a2d435d15ed73f3a14dd149660d4ce51" resolved "https://registry.yarnpkg.com/three-stdlib/-/three-stdlib-2.29.4.tgz#6e8741f6a2d435d15ed73f3a14dd149660d4ce51"
integrity sha512-XNzGCrz/uAk9XoLwd35eN7dQyI4ggXZTeqjcN034YdYBpBlNO9kmLHehl/0Nw9jCelblB7jla+unHAOIyLyV6Q== integrity sha512-XNzGCrz/uAk9XoLwd35eN7dQyI4ggXZTeqjcN034YdYBpBlNO9kmLHehl/0Nw9jCelblB7jla+unHAOIyLyV6Q==
@@ -5354,10 +5354,10 @@ three-stdlib@^2.29.1, three-stdlib@^2.29.4:
fflate "^0.6.9" fflate "^0.6.9"
potpack "^1.0.1" potpack "^1.0.1"
[email protected]59.0: three@^0.161.0:
version "0.159.0" version "0.161.0"
resolved "https://registry.yarnpkg.com/three/-/three-0.159.0.tgz#6576b1210805b14f0765bac41fd0e4ec18e43b2e" resolved "https://registry.yarnpkg.com/three/-/three-0.161.0.tgz#38aafaa82fe5467fde2e33933515d1b6beb17d91"
integrity sha512-eCmhlLGbBgucuo4VEA9IO3Qpc7dh8Bd4VKzr7WfW4+8hMcIfoAVi1ev0pJYN9PTTsCslbcKgBwr2wNZ1EvLInA== integrity sha512-LC28VFtjbOyEu5b93K0bNRLw1rQlMJ85lilKsYj6dgTu+7i17W+JCCEbvrpmNHF1F3NAUqDSWq50UD7w9H2xQw==
through2@^4.0.0: through2@^4.0.0:
version "4.0.2" version "4.0.2"