mirror of
https://github.com/blitzkit/blitzkit.git
synced 2026-10-23 19:49:50 +02:00
Merge branch 'main' into ue
This commit is contained in:
commit
b6c4c4e852
6 files changed
+40
-15
No files matched your search
@@ -0,0 +1,5 @@
|
|||||||
|
# BlitzKit 1.29.15
|
||||||
|
|
||||||
|
## Fixes
|
||||||
|
|
||||||
|
- Tanks now use alpha clipping to render translucency, fixing a lot of "ghostly" looking tanks
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
export function bufferToBigInt(buffer: ArrayBuffer) {
|
||||||
|
return new DataView(buffer).getBigUint64(0, true);
|
||||||
|
}
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
export * from './buffer';
|
export * from './buffer';
|
||||||
|
export * from './bufferToBigInt';
|
||||||
export * from './dds';
|
export * from './dds';
|
||||||
export * from './dids';
|
export * from './dids';
|
||||||
export * from './pvr';
|
export * from './pvr';
|
||||||
@@ -7,3 +8,4 @@ export * from './sc2';
|
|||||||
export * from './scg';
|
export * from './scg';
|
||||||
export * from './scpg';
|
export * from './scpg';
|
||||||
export * from './windows';
|
export * from './windows';
|
||||||
|
|
||||||
@@ -12,12 +12,14 @@ export async function tankModels() {
|
|||||||
|
|
||||||
using uploader = new AssetUploader("tank models");
|
using uploader = new AssetUploader("tank models");
|
||||||
const nodeIO = new NodeIO().registerExtensions(ALL_EXTENSIONS);
|
const nodeIO = new NodeIO().registerExtensions(ALL_EXTENSIONS);
|
||||||
const nations = vfs.dir(`Data/XML/item_defs/vehicles`).filter((nation) => nation !== "common")
|
const nations = vfs
|
||||||
|
.dir(`Data/XML/item_defs/vehicles`)
|
||||||
|
.filter((nation) => nation !== "common");
|
||||||
|
|
||||||
for (const nationIndex in nations) {
|
for (const nationIndex in nations) {
|
||||||
const nation = nations[nationIndex];
|
const nation = nations[nationIndex];
|
||||||
const tanks = await vfs.xml<{ root: VehicleDefinitionList }>(
|
const tanks = await vfs.xml<{ root: VehicleDefinitionList }>(
|
||||||
`Data/XML/item_defs/vehicles/${nation}/list.xml`
|
`Data/XML/item_defs/vehicles/${nation}/list.xml`,
|
||||||
);
|
);
|
||||||
const entries = Object.entries(tanks.root);
|
const entries = Object.entries(tanks.root);
|
||||||
|
|
||||||
@@ -26,11 +28,11 @@ export async function tankModels() {
|
|||||||
|
|
||||||
const id = toUniqueId(nation, tank.id);
|
const id = toUniqueId(nation, tank.id);
|
||||||
const parameters = await vfs.yaml<TankParameters>(
|
const parameters = await vfs.yaml<TankParameters>(
|
||||||
`Data/3d/Tanks/Parameters/${nation}/${tankKey}.yaml`
|
`Data/3d/Tanks/Parameters/${nation}/${tankKey}.yaml`,
|
||||||
);
|
);
|
||||||
const model = await extractModel(
|
const model = await extractModel(
|
||||||
vfs,
|
vfs,
|
||||||
parameters.resourcesPath.blitzModelPath.replace(/\.sc2$/, "")
|
parameters.resourcesPath.blitzModelPath.replace(/\.sc2$/, ""),
|
||||||
);
|
);
|
||||||
const content = Buffer.from(await nodeIO.writeBinary(model));
|
const content = Buffer.from(await nodeIO.writeBinary(model));
|
||||||
|
|
||||||
@@ -39,4 +41,4 @@ export async function tankModels() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
await uploader.flush();
|
await uploader.flush();
|
||||||
}
|
}
|
||||||
@@ -6,13 +6,13 @@ import {
|
|||||||
} from "@blitzkit/core";
|
} from "@blitzkit/core";
|
||||||
import { Accessor, Document, Node, Scene } from "@gltf-transform/core";
|
import { Accessor, Document, Node, Scene } from "@gltf-transform/core";
|
||||||
import { times } from "lodash-es";
|
import { times } from "lodash-es";
|
||||||
import { SteamVFS } from "../vfs/steam";
|
import { AbstractVFS } from "../vfs/abstract";
|
||||||
import {
|
import {
|
||||||
vertexAttributeGLTFName,
|
vertexAttributeGLTFName,
|
||||||
vertexAttributeGltfVectorSizes,
|
vertexAttributeGltfVectorSizes,
|
||||||
} from "./extractModel/constants";
|
} from "./extractModel/constants";
|
||||||
|
|
||||||
export async function extractArmor(vfs: SteamVFS, fileName: string) {
|
export async function extractArmor(vfs: AbstractVFS, fileName: string) {
|
||||||
const sc2Path = `Data/3d/Tanks/CollisionMeshes/${fileName}.sc2`;
|
const sc2Path = `Data/3d/Tanks/CollisionMeshes/${fileName}.sc2`;
|
||||||
const scgPath = `Data/3d/Tanks/CollisionMeshes/${fileName}.scg`;
|
const scgPath = `Data/3d/Tanks/CollisionMeshes/${fileName}.scg`;
|
||||||
const sc2 = new Sc2ReadStream(
|
const sc2 = new Sc2ReadStream(
|
||||||
@@ -141,4 +141,4 @@ export async function extractArmor(vfs: SteamVFS, fileName: string) {
|
|||||||
parseHierarchies(sc2["#hierarchy"], scene);
|
parseHierarchies(sc2["#hierarchy"], scene);
|
||||||
|
|
||||||
return document;
|
return document;
|
||||||
}
|
}
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
import {
|
import {
|
||||||
|
bufferToBigInt,
|
||||||
Hierarchy,
|
Hierarchy,
|
||||||
Sc2ReadStream,
|
Sc2ReadStream,
|
||||||
ScgReadStream,
|
ScgReadStream,
|
||||||
@@ -9,7 +10,7 @@ import { Document, Material, Node, Scene } from "@gltf-transform/core";
|
|||||||
import { dedup, prune } from "@gltf-transform/functions";
|
import { dedup, prune } from "@gltf-transform/functions";
|
||||||
import { times } from "lodash-es";
|
import { times } from "lodash-es";
|
||||||
import { dirname } from "path";
|
import { dirname } from "path";
|
||||||
import { SteamVFS } from "../../vfs/steam";
|
import { AbstractVFS } from "../../vfs/abstract";
|
||||||
import { readBaseColor } from "../readBaseColor";
|
import { readBaseColor } from "../readBaseColor";
|
||||||
import { readNormal } from "../readNormal";
|
import { readNormal } from "../readNormal";
|
||||||
import { readRoughnessMetallic } from "../readRoughnessMetallic";
|
import { readRoughnessMetallic } from "../readRoughnessMetallic";
|
||||||
@@ -25,7 +26,7 @@ const omitMeshNames = {
|
|||||||
end: ["_POINT"],
|
end: ["_POINT"],
|
||||||
};
|
};
|
||||||
|
|
||||||
export async function extractModel(vfs: SteamVFS, path: string) {
|
export async function extractModel(vfs: AbstractVFS, path: string) {
|
||||||
const sc2Path = `Data/3d/${path}.sc2`;
|
const sc2Path = `Data/3d/${path}.sc2`;
|
||||||
const scgPath = `Data/3d/${path}.scg`;
|
const scgPath = `Data/3d/${path}.scg`;
|
||||||
const sc2 = new Sc2ReadStream(
|
const sc2 = new Sc2ReadStream(
|
||||||
@@ -40,7 +41,7 @@ export async function extractModel(vfs: SteamVFS, path: string) {
|
|||||||
const materials = new Map<bigint, Material | bigint | undefined>();
|
const materials = new Map<bigint, Material | bigint | undefined>();
|
||||||
|
|
||||||
for (const node of sc2["#dataNodes"]) {
|
for (const node of sc2["#dataNodes"]) {
|
||||||
const id = new DataView(node["#id"]).getBigUint64(0, true);
|
const id = bufferToBigInt(node["#id"]);
|
||||||
|
|
||||||
if (node.parentMaterialKey !== undefined) {
|
if (node.parentMaterialKey !== undefined) {
|
||||||
/**
|
/**
|
||||||
@@ -80,8 +81,20 @@ export async function extractModel(vfs: SteamVFS, path: string) {
|
|||||||
configIndex < node.configCount;
|
configIndex < node.configCount;
|
||||||
configIndex++
|
configIndex++
|
||||||
) {
|
) {
|
||||||
if (!hasAlpha) continue;
|
const archive = node[`configArchive_${configIndex}`];
|
||||||
material.setAlphaMode("BLEND").setDoubleSided(true);
|
|
||||||
|
if (
|
||||||
|
archive.configName !== "Default" ||
|
||||||
|
!archive.enabledPresets?.AlphaTest
|
||||||
|
) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
const view = new DataView(archive.properties.alphatestThreshold);
|
||||||
|
const _ = view.getUint8(0); // only god knows what these flags are
|
||||||
|
const alphaCutoff = view.getFloat32(1, true);
|
||||||
|
|
||||||
|
material.setAlphaMode("MASK").setAlphaCutoff(alphaCutoff);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -116,7 +129,7 @@ export async function extractModel(vfs: SteamVFS, path: string) {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
materials.set(new DataView(node["#id"]).getBigUint64(0, true), material);
|
materials.set(id, material);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -266,4 +279,4 @@ export async function extractModel(vfs: SteamVFS, path: string) {
|
|||||||
await document.transform(prune({ keepAttributes: true }), dedup());
|
await document.transform(prune({ keepAttributes: true }), dedup());
|
||||||
|
|
||||||
return document;
|
return document;
|
||||||
}
|
}
|
||||||
Reference in new issue
Block a user