mirror of
https://github.com/blitzkit/blitzkit.git
synced 2026-10-29 21:49:50 +01:00
Compare commits
4
Commits
6a06cb17a3
...
b6c4c4e852
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b6c4c4e852 | ||
|
|
8394f2ec1e | ||
|
|
f14e73d811 | ||
|
|
f193d5c503 |
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 './bufferToBigInt';
|
||||
export * from './dds';
|
||||
export * from './dids';
|
||||
export * from './pvr';
|
||||
@@ -7,3 +8,4 @@ export * from './sc2';
|
||||
export * from './scg';
|
||||
export * from './scpg';
|
||||
export * from './windows';
|
||||
|
||||
@@ -6,7 +6,6 @@
|
||||
<Nullable>enable</Nullable>
|
||||
<NodeApiAssemblyJSModuleType>esm</NodeApiAssemblyJSModuleType>
|
||||
<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
|
||||
<RuntimeIdentifier>win-x64</RuntimeIdentifier>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="../cue4parse/CUE4Parse/CUE4Parse.csproj" />
|
||||
@@ -14,4 +13,4 @@
|
||||
<PackageReference Include="Microsoft.JavaScript.NodeApi" Version="0.9.19" />
|
||||
<PackageReference Include="Microsoft.JavaScript.NodeApi.Generator" Version="0.9.19" />
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
</Project>
|
||||
@@ -1 +1 @@
|
||||
export * from "../bin/Debug/net9.0/win-x64/game";
|
||||
export * from "../bin/Debug/net9.0/game";
|
||||
@@ -12,12 +12,14 @@ export async function tankModels() {
|
||||
|
||||
using uploader = new AssetUploader("tank models");
|
||||
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) {
|
||||
const nation = nations[nationIndex];
|
||||
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);
|
||||
|
||||
@@ -26,11 +28,11 @@ export async function tankModels() {
|
||||
|
||||
const id = toUniqueId(nation, tank.id);
|
||||
const parameters = await vfs.yaml<TankParameters>(
|
||||
`Data/3d/Tanks/Parameters/${nation}/${tankKey}.yaml`
|
||||
`Data/3d/Tanks/Parameters/${nation}/${tankKey}.yaml`,
|
||||
);
|
||||
const model = await extractModel(
|
||||
vfs,
|
||||
parameters.resourcesPath.blitzModelPath.replace(/\.sc2$/, "")
|
||||
parameters.resourcesPath.blitzModelPath.replace(/\.sc2$/, ""),
|
||||
);
|
||||
const content = Buffer.from(await nodeIO.writeBinary(model));
|
||||
|
||||
@@ -39,4 +41,4 @@ export async function tankModels() {
|
||||
}
|
||||
|
||||
await uploader.flush();
|
||||
}
|
||||
}
|
||||
@@ -6,13 +6,13 @@ import {
|
||||
} from "@blitzkit/core";
|
||||
import { Accessor, Document, Node, Scene } from "@gltf-transform/core";
|
||||
import { times } from "lodash-es";
|
||||
import { SteamVFS } from "../vfs/steam";
|
||||
import { AbstractVFS } from "../vfs/abstract";
|
||||
import {
|
||||
vertexAttributeGLTFName,
|
||||
vertexAttributeGltfVectorSizes,
|
||||
} 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 scgPath = `Data/3d/Tanks/CollisionMeshes/${fileName}.scg`;
|
||||
const sc2 = new Sc2ReadStream(
|
||||
@@ -141,4 +141,4 @@ export async function extractArmor(vfs: SteamVFS, fileName: string) {
|
||||
parseHierarchies(sc2["#hierarchy"], scene);
|
||||
|
||||
return document;
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,5 @@
|
||||
import {
|
||||
bufferToBigInt,
|
||||
Hierarchy,
|
||||
Sc2ReadStream,
|
||||
ScgReadStream,
|
||||
@@ -9,7 +10,7 @@ import { Document, Material, Node, Scene } from "@gltf-transform/core";
|
||||
import { dedup, prune } from "@gltf-transform/functions";
|
||||
import { times } from "lodash-es";
|
||||
import { dirname } from "path";
|
||||
import { SteamVFS } from "../../vfs/steam";
|
||||
import { AbstractVFS } from "../../vfs/abstract";
|
||||
import { readBaseColor } from "../readBaseColor";
|
||||
import { readNormal } from "../readNormal";
|
||||
import { readRoughnessMetallic } from "../readRoughnessMetallic";
|
||||
@@ -25,7 +26,7 @@ const omitMeshNames = {
|
||||
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 scgPath = `Data/3d/${path}.scg`;
|
||||
const sc2 = new Sc2ReadStream(
|
||||
@@ -40,7 +41,7 @@ export async function extractModel(vfs: SteamVFS, path: string) {
|
||||
const materials = new Map<bigint, Material | bigint | undefined>();
|
||||
|
||||
for (const node of sc2["#dataNodes"]) {
|
||||
const id = new DataView(node["#id"]).getBigUint64(0, true);
|
||||
const id = bufferToBigInt(node["#id"]);
|
||||
|
||||
if (node.parentMaterialKey !== undefined) {
|
||||
/**
|
||||
@@ -80,8 +81,20 @@ export async function extractModel(vfs: SteamVFS, path: string) {
|
||||
configIndex < node.configCount;
|
||||
configIndex++
|
||||
) {
|
||||
if (!hasAlpha) continue;
|
||||
material.setAlphaMode("BLEND").setDoubleSided(true);
|
||||
const archive = node[`configArchive_${configIndex}`];
|
||||
|
||||
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());
|
||||
|
||||
return document;
|
||||
}
|
||||
}
|
||||
@@ -3,8 +3,6 @@ import { Text } from "../Text";
|
||||
import styles from "./index.module.css";
|
||||
|
||||
export function TankCard({ id }: PopularTank) {
|
||||
const tanks = useAwait(api.tanks, "tanks");
|
||||
|
||||
return (
|
||||
<div className={styles["tank-card"]}>
|
||||
<div className={styles["icon-wrapper"]}>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import { GameInterface } from "@blitzkit/game";
|
||||
|
||||
export const game = new GameInterface(
|
||||
"C:/Program Files (x86)/Steam/steamapps/common/World of Tanks Blitz Playtest",
|
||||
"/mnt/c/Program Files (x86)/Steam/steamapps/common/World of Tanks Blitz Playtest",
|
||||
);
|
||||
Reference in new issue
Block a user