feat: all collisions

This commit is contained in:
tresabhi committed 2025-03-21 16:15:56 -05:00
1 parent ff0cac84e1
commit 62fb80dddc
2 files changed
+46 -33

No files matched your search

+37 -32
View File
@@ -36,6 +36,14 @@ namespace BlitzKit.CLI.Functions
{ $"{PenetrationGroupNameMapPrefix}::TANK_PART_GUN", "gun" }, { $"{PenetrationGroupNameMapPrefix}::TANK_PART_GUN", "gun" },
}; };
private static readonly List<string> CollisionDTs =
[
"DT_Chassis",
"DT_Hulls",
"DT_Turrets",
"DT_Guns",
];
[GeneratedRegex("[^a-z0-9]")] [GeneratedRegex("[^a-z0-9]")]
private static partial Regex NonAlphanumericRegex(); private static partial Regex NonAlphanumericRegex();
@@ -48,7 +56,7 @@ namespace BlitzKit.CLI.Functions
readonly BlitzProvider provider = new(args.Contains("--depot")); readonly BlitzProvider provider = new(args.Contains("--depot"));
Locales? locales; Locales? locales;
readonly Dictionary<string, Dictionary<string, string>> strings = []; readonly Dictionary<string, Dictionary<string, string>> strings = [];
readonly AssetUploader assetUploader = new("mangled ue assets"); readonly AssetUploader assetUploader = new("mangled ue assets") { disabled = false };
public async Task Mangle() public async Task Mangle()
{ {
@@ -123,6 +131,9 @@ namespace BlitzKit.CLI.Functions
// if (tankDir.Value.Name != "R90_IS_4") // if (tankDir.Value.Name != "R90_IS_4")
// continue; // continue;
// if (tankDir.Value.Name != "R81_IS_8")
// continue;
var tank = await MangleTank(tankDir.Value); var tank = await MangleTank(tankDir.Value);
tanksFull.Tanks.Add(tank); tanksFull.Tanks.Add(tank);
} }
@@ -223,7 +234,7 @@ namespace BlitzKit.CLI.Functions
slug = MultipleDashesRegex().Replace(slug, "-"); slug = MultipleDashesRegex().Replace(slug, "-");
slug = TrailingDashRegex().Replace(slug, ""); slug = TrailingDashRegex().Replace(slug, "");
await MangleHull(pda); await MangleCollision(id, pda);
// await MangleIcon(pda); // await MangleIcon(pda);
// await MangleArmor(pda); // await MangleArmor(pda);
@@ -309,40 +320,34 @@ namespace BlitzKit.CLI.Functions
} }
} }
async Task MangleHull(UObject pda) async Task MangleModuleCollision(string id, UDataTable dt)
{ {
var id = PropertyUtil.Get<FName>(pda, "TankId").Text; foreach (var row in dt.RowMap)
{
var moduleName = row.Key.Text;
var visualData = PropertyUtil.Get<UObject>(row.Value, "VisualData");
var meshSettings = PropertyUtil.Get<FStructFallback>(visualData, "MeshSettings");
var hullsDt = PropertyUtil.Get<UDataTable>(pda, "DT_Hulls"); if (PropertyUtil.TryGet<UStaticMesh>(meshSettings, "CollisionMesh", out var collision))
var chassisDt = PropertyUtil.Get<UDataTable>(pda, "DT_Chassis"); {
MonoGltf gltf = new(collision);
UDataTableUtility.TryGetDataTableRow(hullsDt, "hull", StringComparison.Ordinal, out var hull); await assetUploader.Add(new($"tanks/{id}/collision/{moduleName}.glb", gltf.Write()));
UDataTableUtility.TryGetDataTableRow( }
chassisDt, else
"chassis", {
StringComparison.Ordinal, PrettyLog.Warn($"No collision mesh found for {id} {moduleName}; skipping...");
out var chassis }
); ;
}
}
var hullVisualData = PropertyUtil.Get<UObject>(hull, "VisualData"); async Task MangleCollision(string id, UObject pda)
var chassisVisualData = PropertyUtil.Get<UObject>(chassis, "VisualData"); {
foreach (var name in CollisionDTs)
var hullMeshSettings = PropertyUtil.Get<FStructFallback>(hullVisualData, "MeshSettings"); {
var chassisMeshSettings = PropertyUtil.Get<FStructFallback>( await MangleModuleCollision(id, PropertyUtil.Get<UDataTable>(pda, name));
chassisVisualData, }
"MeshSettings"
);
var hullCollision = PropertyUtil.Get<UStaticMesh>(hullMeshSettings, "CollisionMesh");
var chassisCollision = PropertyUtil.Get<UStaticMesh>(chassisMeshSettings, "CollisionMesh");
MonoGltf hullCollisionGltf = new(hullCollision);
MonoGltf chassisCollisionGltf = new(chassisCollision);
await assetUploader.Add(new($"tanks/{id}/collision/hull.glb", hullCollisionGltf.Write()));
await assetUploader.Add(
new($"tanks/{id}/collision/chassis.glb", chassisCollisionGltf.Write())
);
} }
} }
} }
+9 -1
View File
@@ -10,6 +10,7 @@ namespace BlitzKit.CLI.Models
{ {
public class AssetUploader(string message) public class AssetUploader(string message)
{ {
public required bool disabled;
private static readonly int TIME_PER_BLOB = (int)Math.Pow(2, 4) * 10000; private static readonly int TIME_PER_BLOB = (int)Math.Pow(2, 4) * 10000;
private static readonly int TIME_BETWEEN_BLOBS = (int)(60 * 60 * 1000 / 5000 / 0.9); private static readonly int TIME_BETWEEN_BLOBS = (int)(60 * 60 * 1000 / 5000 / 0.9);
private static readonly int MAX_TREE_SIZE = 7_000_000; // 7MB private static readonly int MAX_TREE_SIZE = 7_000_000; // 7MB
@@ -30,6 +31,11 @@ namespace BlitzKit.CLI.Models
public async Task Add(FileChange change) public async Task Add(FileChange change)
{ {
if (disabled)
{
return;
}
var blobPath = $"{repo}/{branch}/{change.Path}"; var blobPath = $"{repo}/{branch}/{change.Path}";
HttpResponseMessage response = await httpClient.GetAsync( HttpResponseMessage response = await httpClient.GetAsync(
$"https://raw.githubusercontent.com/{blobPath}" $"https://raw.githubusercontent.com/{blobPath}"
@@ -103,8 +109,10 @@ namespace BlitzKit.CLI.Models
public async Task Flush() public async Task Flush()
{ {
if (changes.Count == 0) if (disabled || changes.Count == 0)
{
return; return;
}
var repoRawSplit = repo.Split('/'); var repoRawSplit = repo.Split('/');
var owner = repoRawSplit[0]; var owner = repoRawSplit[0];