Skip to content

Commit 6f54d83

Browse files
committed
add reading of r8g8b8 images from g1.dat
1 parent 6d58472 commit 6f54d83

File tree

4 files changed

+97
-47
lines changed

4 files changed

+97
-47
lines changed

OpenLocoTool/DataFiles/ImageIds.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,6 @@
33
public static class ImageIds
44
{
55
// todo: import list from ImageIds.h in openloco
6+
public const int DefaultPalette = 304;
67
}
78
}

OpenLocoToolGui/MainForm.cs

Lines changed: 67 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -347,7 +347,7 @@ private void setDataDirectoryToolStripMenuItem_Click(object sender, EventArgs e)
347347
{
348348
pgObject.SelectedObject = model.G1;
349349
var images = CreateImages(model.G1.G1Elements, model.Palette);
350-
CurrentUIImages = CreateImageControls(images).ToList();
350+
CurrentUIImages = CreateImageControls(images, model.G1.G1Elements).ToList();
351351
}
352352
}
353353
}
@@ -432,7 +432,7 @@ void LoadG1(string filename)
432432
{
433433
pgObject.SelectedObject = model.G1;
434434
var images = CreateImages(model.G1.G1Elements, model.Palette);
435-
CurrentUIImages = CreateImageControls(images).ToList();
435+
CurrentUIImages = CreateImageControls(images, model.G1.G1Elements).ToList();
436436
LoadDataDump(filename, true);
437437
}
438438

@@ -492,7 +492,7 @@ void CreateSounds(SoundObject soundObject)
492492
flpImageTable.ResumeLayout(true);
493493
}
494494

495-
IEnumerable<Control> CreateImageControls(IEnumerable<Bitmap> images)
495+
IEnumerable<Control> CreateImageControls(IEnumerable<Bitmap> images, List<G1Element32> g1Elements) // g1Elements is simply used for metadata at this stage
496496
{
497497
// on these controls we could add a right_click handler to replace image with user-created one
498498
var count = 0;
@@ -515,8 +515,9 @@ IEnumerable<Control> CreateImageControls(IEnumerable<Bitmap> images)
515515
};
516516

517517
var tb = new TextBox();
518-
tb.MinimumSize = new Size(32, 16);
519-
tb.Text = count++.ToString();
518+
tb.MinimumSize = new Size(96, 16);
519+
tb.Text = $"i={count} w={g1Elements[count].Width} h={g1Elements[count].Height}";
520+
count++;
520521
tb.Dock = DockStyle.Top;
521522

522523
panel.Controls.Add(tb);
@@ -537,43 +538,73 @@ IEnumerable<Bitmap> CreateImages(List<G1Element32> G1Elements, Color[] palette,
537538
for (var i = 0; i < G1Elements.Count; ++i)
538539
{
539540
var currElement = G1Elements[i];
540-
var imageData = currElement.ImageData;
541-
542-
if (currElement.ImageData.Length == 0 || currElement.Flags.HasFlag(G1ElementFlags.IsR8G8B8Palette))
541+
if (currElement.ImageData.Length == 0)
543542
{
544-
logger.Info($"skipped loading g1 element {i} with flags {currElement.Flags}");
543+
logger.Info($"skipped loading g1 element {i} with 0 length");
545544
continue;
546545
}
547546

548-
var dstImg = new Bitmap(currElement.Width, currElement.Height);
549-
var rect = new Rectangle(0, 0, currElement.Width, currElement.Height);
550-
var dstImgData = dstImg.LockBits(rect, ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb);
551-
for (var y = 0; y < currElement.Height; ++y)
547+
if (currElement.Flags.HasFlag(G1ElementFlags.IsR8G8B8Palette))
552548
{
553-
for (var x = 0; x < currElement.Width; ++x)
554-
{
555-
var paletteIndex = imageData[(y * currElement.Width) + x];
549+
var imageData = currElement.ImageData;
550+
var dstImg = new Bitmap(currElement.Width, currElement.Height);
551+
var rect = new Rectangle(0, 0, currElement.Width, currElement.Height);
552+
var dstImgData = dstImg.LockBits(rect, ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb);
556553

557-
// the issue with greyscale here is it isn't normalised so all heightmaps are really dark and hard to see
558-
//var colour = obj.Object is HillShapesObject
559-
// ? Color.FromArgb(paletteIndex, paletteIndex, paletteIndex) // for hillshapes, its just a heightmap so lets put it in greyscale
560-
// : palette[paletteIndex];
554+
var k = 0;
555+
for (var j = 0; j < currElement.Width; ++j) // += 4 for a 32-bit ptr++
556+
{
557+
var b = imageData[k++];
558+
var g = imageData[k++];
559+
var r = imageData[k++];
560+
ImageHelpers.SetPixel(dstImgData, j, 1, Color.FromArgb(r, g, b));
561+
}
561562

562-
if (paletteIndex == 0 && useTransparency)
563-
{
564-
//ImageHelpers.SetPixel(dstImgData, x, y, colour);
565-
}
566-
else
567-
{
568-
var colour = palette[paletteIndex];
569-
ImageHelpers.SetPixel(dstImgData, x, y, colour);
570-
}
563+
dstImg.UnlockBits(dstImgData);
564+
yield return dstImg;
565+
}
566+
else
567+
{
568+
var bmp = G1ElementToBitmap(currElement, palette, useTransparency);
569+
if (bmp != null)
570+
{
571+
yield return bmp;
571572
}
572573
}
574+
}
575+
}
573576

574-
dstImg.UnlockBits(dstImgData);
575-
yield return dstImg;
577+
Bitmap? G1ElementToBitmap(G1Element32 currElement, Color[] palette, bool useTransparency = false)
578+
{
579+
var imageData = currElement.ImageData;
580+
var dstImg = new Bitmap(currElement.Width, currElement.Height);
581+
var rect = new Rectangle(0, 0, currElement.Width, currElement.Height);
582+
var dstImgData = dstImg.LockBits(rect, ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb);
583+
for (var y = 0; y < currElement.Height; ++y)
584+
{
585+
for (var x = 0; x < currElement.Width; ++x)
586+
{
587+
var paletteIndex = imageData[(y * currElement.Width) + x];
588+
589+
// the issue with greyscale here is it isn't normalised so all heightmaps are really dark and hard to see
590+
//var colour = obj.Object is HillShapesObject
591+
// ? Color.FromArgb(paletteIndex, paletteIndex, paletteIndex) // for hillshapes, its just a heightmap so lets put it in greyscale
592+
// : palette[paletteIndex];
593+
594+
if (paletteIndex == 0 && useTransparency)
595+
{
596+
//ImageHelpers.SetPixel(dstImgData, x, y, colour);
597+
}
598+
else
599+
{
600+
var colour = palette[paletteIndex];
601+
ImageHelpers.SetPixel(dstImgData, x, y, colour);
602+
}
603+
}
576604
}
605+
606+
dstImg.UnlockBits(dstImgData);
607+
return dstImg;
577608
}
578609

579610
void SelectNewPalette()
@@ -613,7 +644,11 @@ private void RefreshObjectUI()
613644
}
614645

615646
var images = CreateImages(CurrentUIObject.G1Elements, model.Palette);
616-
CurrentUIImages = CreateImageControls(images).ToArray();
647+
CurrentUIImages = CreateImageControls(images, model.G1.G1Elements).ToArray();
648+
}
649+
else
650+
{
651+
CurrentUIImages = new List<Control>();
617652
}
618653

619654
if (CurrentUIObject?.Object is SoundObject soundObject)

OpenLocoToolGui/MainFormModel.cs

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
using OpenLocoTool.Objects;
99
using OpenLocoToolCommon;
1010
using OpenLocoTool.Headers;
11+
using OpenLocoTool.DataFiles;
1112

1213
namespace OpenLocoToolGui
1314
{
@@ -29,23 +30,35 @@ public string PaletteFile
2930
set
3031
{
3132
Settings.PaletteFile = value;
32-
LoadPaletteFile();
33+
LoadPalette();
3334
}
3435
}
3536

36-
private void LoadPaletteFile()
37+
private void LoadPalette()
3738
{
38-
try
39+
//if (G1 == null)
3940
{
40-
var paletteBitmap = new Bitmap(Settings.PaletteFile);
41-
Palette = PaletteHelpers.PaletteFromBitmap(paletteBitmap);
42-
SaveSettings();
43-
logger.Debug($"Successfully loaded palette file {Settings.PaletteFile}");
44-
}
45-
catch (ArgumentException ex)
46-
{
47-
logger.Error(ex);
41+
try
42+
{
43+
var paletteBitmap = new Bitmap(Settings.PaletteFile);
44+
Palette = PaletteHelpers.PaletteFromBitmap(paletteBitmap);
45+
SaveSettings();
46+
logger.Debug($"Successfully loaded palette file {Settings.PaletteFile}");
47+
}
48+
catch (ArgumentException ex)
49+
{
50+
logger.Error(ex);
51+
}
4852
}
53+
//else
54+
//{
55+
// var g1PaletteElement = G1.G1Elements[ImageIds.MainPalette];
56+
// Palette = g1PaletteElement.ImageData
57+
// .Take(256 * 3)
58+
// .Chunk(3)
59+
// .Select(x => Color.FromArgb(x[2], x[1], x[0]))
60+
// .ToArray();
61+
//}
4962
}
5063

5164
public Color[] Palette { get; private set; }
@@ -104,7 +117,7 @@ public void LoadSettings(string settingsFile)
104117
LoadObjDirectory(Settings.ObjDataDirectory, new Progress<float>(), true);
105118
}
106119

107-
LoadPaletteFile();
120+
LoadPalette();
108121
}
109122

110123
static bool ValidateSettings(GuiSettings settings, ILogger logger)
@@ -195,6 +208,7 @@ public bool LoadDataDirectory(string directory)
195208

196209
// load G1 only for now
197210
G1 = reader.LoadG1(Settings.G1Path);
211+
LoadPalette(); // update palette from g1
198212

199213
SaveSettings();
200214

OpenLocoToolGui/PaletteHelpers.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,11 @@ public static Color[] PaletteFromBitmap(Bitmap img)
99
var palette = new Color[256];
1010
var rect = new Rectangle(0, 0, img.Width, img.Height);
1111
var imgData = img.LockBits(rect, ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);
12-
for (var y = 0; y < 16; ++y)
12+
for (var y = 0; y < img.Width; ++y)
1313
{
14-
for (var x = 0; x < 16; ++x)
14+
for (var x = 0; x < img.Height; ++x)
1515
{
16-
palette[(y * 16) + x] = ImageHelpers.GetPixel(imgData, x, y);
16+
palette[(y * img.Height) + x] = ImageHelpers.GetPixel(imgData, x, y);
1717
}
1818
}
1919

0 commit comments

Comments
 (0)