Welcome to mirror list, hosted at ThFree Co, Russian Federation.

NesTiler.git/NesTiler.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexey 'Cluster' Avdyukhin <cluster@cluster.wtf>2023-09-19 19:34:05 +0300
committerAlexey 'Cluster' Avdyukhin <cluster@cluster.wtf>2023-09-19 19:34:05 +0300
commitda52163c42c66d815904b52341b8f4f6c99d0dfc (patch)
tree8caba4e7f3680f0b10153bba411b235bfc00956b
parent82c03241895d74593ddf7631b016ef76071952e8 (diff)
"--no-group-tiles" option.
-rw-r--r--NesTiler/CmdArgs.cs13
-rw-r--r--NesTiler/Config.cs23
-rw-r--r--NesTiler/Program.cs42
3 files changed, 55 insertions, 23 deletions
diff --git a/NesTiler/CmdArgs.cs b/NesTiler/CmdArgs.cs
index 7e337c3..e010a5d 100644
--- a/NesTiler/CmdArgs.cs
+++ b/NesTiler/CmdArgs.cs
@@ -19,6 +19,7 @@
new ArgPatternOffset(),
new ArgAttributeTableYOffset(),
new ArgSharePatternTable(),
+ new ArgDoNotGroupTiles(),
new ArgLossy(),
new ArgOutPreview(),
new ArgOutPalette(),
@@ -131,6 +132,17 @@
public string Long { get; } = L;
}
+ class ArgDoNotGroupTiles : IArg
+ {
+ public const string S = "r";
+ public const string L = "no-group-tiles";
+ public string? Params { get; } = null;
+ public string Description { get; } = $"do not group similar tiles in pattern table";
+ public bool HasIndex { get; } = true;
+ public string Short { get; } = S;
+ public string Long { get; } = L;
+ }
+
class ArgLossy : IArg
{
public const string S = "l";
@@ -240,4 +252,5 @@
public string Short { get; } = S;
public string Long { get; } = L;
}
+
}
diff --git a/NesTiler/Config.cs b/NesTiler/Config.cs
index c4c8225..83b9602 100644
--- a/NesTiler/Config.cs
+++ b/NesTiler/Config.cs
@@ -21,7 +21,7 @@ namespace com.clusterrr.Famicom.NesTiler
}
public string ColorsFile { get; private set; }
- public Dictionary<int, string> ImageFiles { get; private set; } = new Dictionary<int, string>();
+ public Dictionary<int, string> ImageFiles { get; private set; } = new();
public SKColor? BgColor { get; private set; } = null;
public bool[] PaletteEnabled { get; private set; } = new bool[4] { true, true, true, true };
public Palette?[] FixedPalettes { get; private set; } = new Palette?[4] { null, null, null, null };
@@ -31,18 +31,19 @@ namespace com.clusterrr.Famicom.NesTiler
public int TilePalWidth { get; private set; } = 16;
public int TilePalHeight { get; private set; } = 16;
public bool SharePatternTable { get; private set; } = false;
+ public HashSet<int> DoNotGroupTiles { get; private set; } = new();
public int LossyLevel { get; private set; } = 2;
public int PatternTableStartOffsetShared { get; private set; } = 0;
- public Dictionary<int, int> PatternTableStartOffsets { get; private set; } = new Dictionary<int, int>();
- public Dictionary<int, int> PattributeTableYOffsets { get; private set; } = new Dictionary<int, int>();
+ public Dictionary<int, int> PatternTableStartOffsets { get; private set; } = new();
+ public Dictionary<int, int> AttributeTableYOffsets { get; private set; } = new();
public bool Quiet { get; private set; } = false;
// Filenames
- public Dictionary<int, string> OutPreview { get; private set; } = new Dictionary<int, string>();
- public Dictionary<int, string> OutPalette { get; private set; } = new Dictionary<int, string>();
- public Dictionary<int, string> OutPatternTable { get; private set; } = new Dictionary<int, string>();
- public Dictionary<int, string> OutNameTable { get; private set; } = new Dictionary<int, string>();
- public Dictionary<int, string> OutAttributeTable { get; private set; } = new Dictionary<int, string>();
+ public Dictionary<int, string> OutPreview { get; private set; } = new();
+ public Dictionary<int, string> OutPalette { get; private set; } = new();
+ public Dictionary<int, string> OutPatternTable { get; private set; } = new();
+ public Dictionary<int, string> OutNameTable { get; private set; } = new();
+ public Dictionary<int, string> OutAttributeTable { get; private set; } = new();
public string? OutPatternTableShared { get; private set; } = null;
public string? OutTilesCsv { get; private set; } = null;
public string? OutPalettesCsv { get; private set; } = null;
@@ -190,13 +191,17 @@ namespace com.clusterrr.Famicom.NesTiler
throw new ArgumentException($"Value ({valueInt}) must be divisible by 8.", param);
if (valueInt < 0 || valueInt >= 256)
throw new ArgumentException($"Value ({valueInt}) must be between 0 and 255.", param);
- config.PattributeTableYOffsets[indexNum] = valueInt;
+ config.AttributeTableYOffsets[indexNum] = valueInt;
i++;
break;
case ArgSharePatternTable.S:
case ArgSharePatternTable.L:
config.SharePatternTable = true;
break;
+ case ArgDoNotGroupTiles.S:
+ case ArgDoNotGroupTiles.L:
+ config.DoNotGroupTiles.Add(indexNum);
+ break;
case ArgLossy.S:
case ArgLossy.L:
if (!int.TryParse(value, out valueInt))
diff --git a/NesTiler/Program.cs b/NesTiler/Program.cs
index 8954f2d..f2421e1 100644
--- a/NesTiler/Program.cs
+++ b/NesTiler/Program.cs
@@ -85,6 +85,7 @@ namespace com.clusterrr.Famicom.NesTiler
var images = new Dictionary<int, FastBitmap>();
var paletteIndexes = new Dictionary<int, byte[,]>();
var patternTables = new Dictionary<int, Dictionary<Tile, int>>();
+ var patternTablesReversed = new Dictionary<int, Dictionary<int, Tile>>();
var nameTables = new Dictionary<int, List<int>>();
int tileID = 0;
@@ -180,7 +181,7 @@ namespace com.clusterrr.Famicom.NesTiler
(calculatedPalettes, lossyInfo) = CalculatePalettes(images,
c.PaletteEnabled,
c.FixedPalettes,
- c.PattributeTableYOffsets,
+ c.AttributeTableYOffsets,
c.TilePalWidth,
c.TilePalHeight,
c.BgColor.Value);
@@ -232,7 +233,7 @@ namespace com.clusterrr.Famicom.NesTiler
calcResults[candidates[i]] = CalculatePalettes(images,
c.PaletteEnabled,
c.FixedPalettes,
- c.PattributeTableYOffsets,
+ c.AttributeTableYOffsets,
c.TilePalWidth,
c.TilePalHeight,
candidates[i]);
@@ -322,7 +323,7 @@ namespace com.clusterrr.Famicom.NesTiler
{
Trace.WriteLine($"Mapping palettes for image #{imageNum}...");
var image = images[imageNum];
- c.PattributeTableYOffsets.TryGetValue(imageNum, out int attributeTableOffset);
+ c.AttributeTableYOffsets.TryGetValue(imageNum, out int attributeTableOffset);
paletteIndexes[imageNum] = new byte[image.Width / c.TilePalWidth, (int)Math.Ceiling((image.Height + attributeTableOffset) / (float)c.TilePalHeight)];
// For each tile/sprite
for (int tilePalY = 0; tilePalY < (int)Math.Ceiling((image.Height + attributeTableOffset) / (float)c.TilePalHeight); tilePalY++)
@@ -387,7 +388,7 @@ namespace com.clusterrr.Famicom.NesTiler
throw new InvalidOperationException("Attribute table generation available for backgrounds mode only.");
Trace.WriteLine($"Creating attribute table for image #{imageNum}...");
var image = images[imageNum];
- c.PattributeTableYOffsets.TryGetValue(imageNum, out int attributeTableOffset);
+ c.AttributeTableYOffsets.TryGetValue(imageNum, out int attributeTableOffset);
var attributeTableRaw = new List<byte>();
int width = paletteIndexes[imageNum].GetLength(0);
int height = paletteIndexes[imageNum].GetLength(1);
@@ -435,11 +436,14 @@ namespace com.clusterrr.Famicom.NesTiler
{
Trace.WriteLine($"Creating pattern table for image #{imageNum}...");
var image = images[imageNum];
- c.PattributeTableYOffsets.TryGetValue(imageNum, out int attributeTableOffset);
- if (!patternTables.ContainsKey(!c.SharePatternTable ? imageNum : 0)) patternTables[!c.SharePatternTable ? imageNum : 0] = new Dictionary<Tile, int>();
+ c.AttributeTableYOffsets.TryGetValue(imageNum, out int attributeTableOffset);
+ if (!patternTables.ContainsKey(!c.SharePatternTable ? imageNum : 0)) patternTables[!c.SharePatternTable ? imageNum : 0] = new();
var patternTable = patternTables[!c.SharePatternTable ? imageNum : 0];
+ if (!patternTablesReversed.ContainsKey(!c.SharePatternTable ? imageNum : 0)) patternTablesReversed[!c.SharePatternTable ? imageNum : 0] = new();
+ var patternTableReversed = patternTablesReversed[!c.SharePatternTable ? imageNum : 0];
if (!nameTables.ContainsKey(imageNum)) nameTables[imageNum] = new List<int>();
var nameTable = nameTables[imageNum];
+ var noGroup = !c.SharePatternTable ? c.DoNotGroupTiles.Contains(imageNum) : c.DoNotGroupTiles.Any();
if (!c.SharePatternTable)
{
if (!c.PatternTableStartOffsets.ContainsKey(imageNum))
@@ -474,7 +478,15 @@ namespace com.clusterrr.Famicom.NesTiler
}
var tile = new Tile(tileData, c.TileHeight);
int currentTileID;
- if (patternTable.TryGetValue(tile, out int id))
+
+ if (noGroup)
+ {
+ patternTableReversed[tileID] = tile;
+ if (c.Mode == Config.TilesMode.Backgrounds) nameTable.Add(tileID);
+ currentTileID = tileID;
+ tileID++;
+ }
+ else if (patternTable.TryGetValue(tile, out int id))
{
if (c.Mode == Config.TilesMode.Backgrounds) nameTable.Add(id);
currentTileID = id;
@@ -486,15 +498,14 @@ namespace com.clusterrr.Famicom.NesTiler
currentTileID = tileID;
tileID++;
}
- currentTileID = ((currentTileID & 0x7F) << 1) | ((currentTileID & 0x80) >> 7);
-
+ // TODO: fix it
+ //if (c.Mode == Config.TilesMode.Sprites8x16)
+ currentTileID = ((currentTileID & 0x7F) << 1) | ((currentTileID & 0x80) >> 7);
// Write CSV if required
outTilesCsvLines?.Add($"{imageNum},{c.ImageFiles[imageNum]},{tileY},{tileX},{tileX * c.TileWidth},{tileY * c.TileHeight},{c.TileWidth},{c.TileHeight},{currentTileID},{paletteID}");
}
}
- if (c.SharePatternTable && tileID > c.PatternTableStartOffsetShared)
- Trace.WriteLine($"#{imageNum} tiles range: {c.PatternTableStartOffsetShared}-{tileID - 1}");
- else if (tileID > c.PatternTableStartOffsets[imageNum])
+ if (tileID > c.PatternTableStartOffsets[imageNum])
Trace.WriteLine($"#{imageNum} tiles range: {c.PatternTableStartOffsets[imageNum]}-{tileID - 1}");
else
Trace.WriteLine($"Pattern table is empty.");
@@ -503,7 +514,8 @@ namespace com.clusterrr.Famicom.NesTiler
// Save pattern table to file
if (c.OutPatternTable.ContainsKey(imageNum) && !c.SharePatternTable)
{
- var patternTableReversed = patternTable.ToDictionary(kv => kv.Value, kv => kv.Key);
+ if (!noGroup)
+ patternTableReversed = patternTable.ToDictionary(kv => kv.Value, kv => kv.Key);
var patternTableRaw = new List<byte>();
for (int t = c.PatternTableStartOffsets[imageNum]; t < tileID; t++)
{
@@ -527,7 +539,9 @@ namespace com.clusterrr.Famicom.NesTiler
// Save shared pattern table to file
if (c.SharePatternTable && c.OutPatternTableShared != null)
{
- var patternTableReversed = patternTables[0].ToDictionary(kv => kv.Value, kv => kv.Key);
+ var patternTableReversed = !c.DoNotGroupTiles.Any()
+ ? patternTables[0].ToDictionary(kv => kv.Value, kv => kv.Key)
+ : patternTablesReversed[0];
var patternTableRaw = new List<byte>();
for (int t = c.PatternTableStartOffsetShared; t < tileID; t++)
{