Files
mrgameeng/tools/MrGameEng.AtlasTool/Program.cs
T
Leonid Pershin fd6343bd09
CI / build-test (push) Failing after 1m8s
@
Add MrGameEng.AI utility-AI module; format codebase with CSharpier

New MrGameEng.AI module (ResponseCurve, Consideration, UtilityAction,
UtilityAi selector, Blackboard) plus CSharpier formatting applied across
the whole engine. Documents the CSharpier convention in CLAUDE.md.
@
2026-06-12 07:19:10 +03:00

77 lines
2.3 KiB
C#

using System.Diagnostics;
using MrGameEng.Atlases;
if (args.Length < 2 || args.Contains("--help") || args.Contains("-h"))
{
Console.WriteLine(
"""
MrGameEng.AtlasTool packs a directory tree of images into texture atlases.
Usage: MrGameEng.AtlasTool <source-dir> <output-dir> [options]
Options:
--group-depth <n> directories forming one atlas (0 = single atlas; default 1)
--page-size <n> maximum page size in pixels (default 2048)
--padding <n> gap between images in pixels (default 2)
--root-name <name> atlas name for files above group depth (default "Atlas")
--force rebuild even when sources are unchanged
"""
);
return args.Length < 2 && !args.Contains("--help") && !args.Contains("-h") ? 1 : 0;
}
int Option(string name, int fallback)
{
var index = Array.IndexOf(args, name);
if (index < 0)
{
return fallback;
}
if (index + 1 < args.Length && int.TryParse(args[index + 1], out var value) && value >= 0)
{
return value;
}
Console.Error.WriteLine($"Option {name} requires a non-negative integer value.");
Environment.Exit(1);
return fallback; // недостижимо
}
var rootNameIndex = Array.IndexOf(args, "--root-name");
var options = new AtlasBuildOptions
{
SourceDirectory = args[0],
OutputDirectory = args[1],
GroupDepth = Option("--group-depth", 1),
MaxPageSize = Option("--page-size", 2048),
Padding = Option("--padding", 2),
RootAtlasName =
rootNameIndex >= 0 && rootNameIndex + 1 < args.Length ? args[rootNameIndex + 1] : "Atlas",
Force = args.Contains("--force"),
};
var stopwatch = Stopwatch.StartNew();
var result = AtlasBuilder.Build(options);
stopwatch.Stop();
foreach (var group in result.Groups)
{
Console.WriteLine(
group.Skipped
? $" {group.Name}: up to date ({group.RegionCount} regions, {group.PageCount} pages)"
: $" {group.Name}: {group.RegionCount} regions -> {group.PageCount} pages"
);
}
foreach (var orphan in result.DeletedOrphans)
{
Console.WriteLine($" deleted orphan {orphan}");
}
var built = result.Groups.Count(g => !g.Skipped);
Console.WriteLine(
$"Done: {built} atlases built, {result.Groups.Count - built} up to date, {stopwatch.Elapsed.TotalSeconds:F1}s."
);
return 0;