Skip to content

Commit

Permalink
Godot verison add colour palette switcher
Browse files Browse the repository at this point in the history
  • Loading branch information
qkmaxware committed Jan 20, 2024
1 parent cb954c2 commit 687108a
Show file tree
Hide file tree
Showing 9 changed files with 607 additions and 65 deletions.
1 change: 1 addition & 0 deletions Gameboy.Player.Godot/.gitignore
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
# Godot 4+ specific ignores
.godot/
[bB]in/
6 changes: 6 additions & 0 deletions Gameboy.Player.Godot/Debuggers/Map Debugger.tscn
Original file line number Diff line number Diff line change
Expand Up @@ -37,4 +37,10 @@ text = "Reload"
icon = ExtResource("3_fd1ro")
expand_icon = true

[node name="Label" type="Label" parent="."]
layout_mode = 0
offset_right = 40.0
offset_bottom = 23.0
text = "Addressing Mode: Method8000"

[connection signal="pressed" from="Reload" to="." method="Refresh"]
8 changes: 6 additions & 2 deletions Gameboy.Player.Godot/Debuggers/MapDebugger.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,21 +14,25 @@ public partial class MapDebugger : Control {
[Export] public MapType Map;

private BitmapTextureRect rect;
private Label label;

// Called when the node enters the scene tree for the first time.
public override void _Ready() {
this.rect = GetNode<BitmapTextureRect>("Rect");
this.label = GetNode<Label>("Label");
}

public void Refresh() {
var ppu = Player?.Console?.GPU;
if (ppu is IDebuggablePpu debug) {
var mode = debug.TileSelectionMode;
label.Text = "Addressing Mode: " + mode;
switch (Map) {
case MapType.Background:
rect?.Redraw(debug.BackgroundMap.ToBitmap());
rect?.Redraw(debug.BackgroundMap.ToBitmap(mode));
break;
case MapType.Window:
rect?.Redraw(debug.WindowMap.ToBitmap());
rect?.Redraw(debug.WindowMap.ToBitmap(mode));
break;
}
}
Expand Down
242 changes: 213 additions & 29 deletions Gameboy.Player.Godot/Debuggers/PaletteDebugger.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,57 +6,193 @@

namespace Qkmaxware.Emulators.Gameboy.Player;

public class Theme {
public string Name;
public Color BgWhite = new Color(1, 1, 1);
public Color BgLightGrey = new Color(0.6f, 0.6f, 0.6f);
public Color BgDarkGrey = new Color(0.3f, 0.3f, 0.3f);
public Color BgBlack = new Color(0, 0, 0);

public Color Obj0White = new Color(1, 1, 1);
public Color Obj0LightGrey = new Color(0.6f, 0.6f, 0.6f);
public Color Obj0DarkGrey = new Color(0.3f, 0.3f, 0.3f);
public Color Obj0Black = new Color(0, 0, 0);

public Color Obj1White = new Color(1, 1, 1);
public Color Obj1LightGrey = new Color(0.6f, 0.6f, 0.6f);
public Color Obj1DarkGrey = new Color(0.3f, 0.3f, 0.3f);
public Color Obj1Black = new Color(0, 0, 0);
}

public partial class PaletteDebugger : Control {

[Export] public TextureRenderer Player;

private ColorPickerButton bg0Black;
private ColorPickerButton bg0DarkGrey;
private ColorPickerButton bg0LightGrey;
private ColorPickerButton bg0White;
private ColorPickerButton obj0Black;
private ColorPickerButton obj0DarkGrey;
private ColorPickerButton obj0LightGrey;
private ColorPickerButton obj0White;
private ColorPickerButton obj1Black;
private ColorPickerButton obj1DarkGrey;
private ColorPickerButton obj1LightGrey;
private ColorPickerButton obj1White;

private ColorRect[][] bg;
private ColorRect[][] obj;

private static List<Theme> themes = new List<Theme> {
// Good theme list https://tcrf.net/Notes:Game_Boy_Color_Bootstrap_ROM
new Theme { Name = "Greyscale" },
new Theme {
Name = "Classic Green",
BgWhite = new Color("e0f8cf"),
BgLightGrey = new Color("86c06c"),
BgDarkGrey = new Color("306850"),
BgBlack = new Color("071821"),
Obj0White = new Color("e0f8cf"),
Obj0LightGrey = new Color("86c06c"),
Obj0DarkGrey = new Color("306850"),
Obj0Black = new Color("071821"),
Obj1White = new Color("e0f8cf"),
Obj1LightGrey = new Color("86c06c"),
Obj1DarkGrey = new Color("306850"),
Obj1Black = new Color("071821"),
},
new Theme {
Name = "PkMn Blue",
BgWhite = new Color("FFFFFF"),
Obj0White = new Color("FFFFFF"),
Obj1White = new Color("FFFFFF"),

BgLightGrey = new Color("63A5FF"),
Obj0LightGrey = new Color("FF8484"),
Obj1LightGrey = new Color("63A5FF"),

BgDarkGrey = new Color("0000FF"),
Obj0DarkGrey = new Color("943A3A"),
Obj1DarkGrey = new Color("0000FF"),

BgBlack = new Color("000000"),
Obj0Black = new Color("000000"),
Obj1Black = new Color("000000"),
},
new Theme {
Name = "PkMn Red",
BgWhite = new Color("FFFFFF"),
Obj0White = new Color("FFFFFF"),
Obj1White = new Color("FFFFFF"),

BgLightGrey = new Color("FF8484"),
Obj0LightGrey = new Color("7BFF31"),
Obj1LightGrey = new Color("FF8484"),

BgDarkGrey = new Color("943A3A"),
Obj0DarkGrey = new Color("008400"),
Obj1DarkGrey = new Color("943A3A"),

BgBlack = new Color("000000"),
Obj0Black = new Color("000000"),
Obj1Black = new Color("000000"),
},
};

// Called when the node enters the scene tree for the first time.
public override void _Ready() {
// Colours
bg0Black = GetNode<ColorPickerButton>("ScrollContainer/VSplitContainer/Colours/VBoxContainer/HBoxContainer/Bg/HBoxContainer/BgBlack");
bg0Black.Color = Player?.BgBlack ?? new Color(0,0,0,1);
bg0DarkGrey = GetNode<ColorPickerButton>("ScrollContainer/VSplitContainer/Colours/VBoxContainer/HBoxContainer/Bg/HBoxContainer/BgDarkGrey");
bg0DarkGrey.Color = Player?.BgDarkGrey ?? new Color(0.3f,0.3f,0.3f,1);
bg0LightGrey = GetNode<ColorPickerButton>("ScrollContainer/VSplitContainer/Colours/VBoxContainer/HBoxContainer/Bg/HBoxContainer/BgLightGrey");
bg0LightGrey.Color = Player?.BgLightGrey ?? new Color(0.6f,0.6f,0.6f,1);
bg0White = GetNode<ColorPickerButton>("ScrollContainer/VSplitContainer/Colours/VBoxContainer/HBoxContainer/Bg/HBoxContainer/BgWhite");
bg0White.Color = Player?.BgWhite ?? new Color(1,1,1,1);

obj0Black = GetNode<ColorPickerButton>("ScrollContainer/VSplitContainer/Colours/VBoxContainer/HBoxContainer/Objects/HBoxContainer/Obj0Black");
obj0Black.Color = Player?.Obj0Black ?? new Color(0,0,0,1);
obj0DarkGrey = GetNode<ColorPickerButton>("ScrollContainer/VSplitContainer/Colours/VBoxContainer/HBoxContainer/Objects/HBoxContainer/Obj0DarkGrey");
obj0DarkGrey.Color = Player?.Obj0DarkGrey ?? new Color(0.3f,0.3f,0.3f,1);
obj0LightGrey = GetNode<ColorPickerButton>("ScrollContainer/VSplitContainer/Colours/VBoxContainer/HBoxContainer/Objects/HBoxContainer/Obj0LightGrey");
obj0LightGrey.Color = Player?.Obj0LightGrey ?? new Color(0.6f,0.6f,0.6f,1);
obj0White = GetNode<ColorPickerButton>("ScrollContainer/VSplitContainer/Colours/VBoxContainer/HBoxContainer/Objects/HBoxContainer/Obj0White");
obj0White.Color = Player?.Obj0White ?? new Color(1,1,1,1);

obj1Black = GetNode<ColorPickerButton>("ScrollContainer/VSplitContainer/Colours/VBoxContainer/HBoxContainer/Objects/HBoxContainer2/Obj1Black");
obj1Black.Color = Player?.Obj1Black ?? new Color(0,0,0,1);
obj1DarkGrey = GetNode<ColorPickerButton>("ScrollContainer/VSplitContainer/Colours/VBoxContainer/HBoxContainer/Objects/HBoxContainer2/Obj1DarkGrey");
obj1DarkGrey.Color = Player?.Obj1DarkGrey ?? new Color(0.3f,0.3f,0.3f,1);
obj1LightGrey = GetNode<ColorPickerButton>("ScrollContainer/VSplitContainer/Colours/VBoxContainer/HBoxContainer/Objects/HBoxContainer2/Obj1LightGrey");
obj1LightGrey.Color = Player?.Obj1LightGrey ?? new Color(0.6f,0.6f,0.6f,1);
obj1White = GetNode<ColorPickerButton>("ScrollContainer/VSplitContainer/Colours/VBoxContainer/HBoxContainer/Objects/HBoxContainer2/Obj1White");
obj1White.Color = Player?.Obj1White ?? new Color(1,1,1,1);

var themePicker = GetNode<OptionButton>("ScrollContainer/VSplitContainer/Colours/VBoxContainer/HBoxContainer/Themes/OptionButton");
foreach (var theme in themes) {
themePicker.AddItem(theme.Name);
}

// Palettes
bg = new ColorRect[1][];
bg[0] = new ColorRect[4];
for (var i = 0; i < 4; i++) {
var b00 = Convert.ToString(i, 2).PadLeft(2, '0');
bg[0][i] = this.GetNode<ColorRect>("ScrollContainer/HSplitContainer/Background/VBoxContainer/HBoxContainer/"+b00);
bg[0][i] = this.GetNode<ColorRect>("ScrollContainer/VSplitContainer/Palettes/VBoxContainer/HBoxContainer/Background/HBoxContainer/"+b00);
}

obj = new ColorRect[2][];
obj[0] = new ColorRect[4];
obj[1] = new ColorRect[4];
for (var i = 0; i < 4; i++) {
var b00 = Convert.ToString(i, 2).PadLeft(2, '0');
obj[0][i] = this.GetNode<ColorRect>("ScrollContainer/HSplitContainer/Objects/VBoxContainer/HBoxContainer1/"+b00);
obj[1][i] = this.GetNode<ColorRect>("ScrollContainer/HSplitContainer/Objects/VBoxContainer/HBoxContainer2/"+b00);
obj[0][i] = this.GetNode<ColorRect>("ScrollContainer/VSplitContainer/Palettes/VBoxContainer/HBoxContainer/Objects/HBoxContainer1/"+b00);
obj[1][i] = this.GetNode<ColorRect>("ScrollContainer/VSplitContainer/Palettes/VBoxContainer/HBoxContainer/Objects/HBoxContainer2/"+b00);
}
}

public void Refresh() {
bg0Black.Color = Player?.BgBlack ?? new Color(0,0,0,1);
bg0DarkGrey.Color = Player?.BgDarkGrey ?? new Color(0.3f,0.3f,0.3f,1);
bg0LightGrey.Color = Player?.BgLightGrey ?? new Color(0.6f,0.6f,0.6f,1);
bg0White.Color = Player?.BgWhite ?? new Color(1,1,1,1);

obj0Black.Color = Player?.Obj0Black ?? new Color(0,0,0,1);
obj0DarkGrey.Color = Player?.Obj0DarkGrey ?? new Color(0.3f,0.3f,0.3f,1);
obj0LightGrey.Color = Player?.Obj0LightGrey ?? new Color(0.6f,0.6f,0.6f,1);
obj0White.Color = Player?.Obj0White ?? new Color(1,1,1,1);

obj1Black.Color = Player?.Obj1Black ?? new Color(0,0,0,1);
obj1DarkGrey.Color = Player?.Obj1DarkGrey ?? new Color(0.3f,0.3f,0.3f,1);
obj1LightGrey.Color = Player?.Obj1LightGrey ?? new Color(0.6f,0.6f,0.6f,1);
obj1White.Color = Player?.Obj1White ?? new Color(1,1,1,1);

var ppu = Player?.Console?.GPU;
if (ppu is IDebuggablePpu debug) {
HashSet<ColourPallet> bgcolours = new HashSet<ColourPallet>();
foreach (var palette in debug.BackgroundPalettes.Zip(bg)) {
foreach (var pair in palette.First.Zip(palette.Second)) {
var palettedColour = pair.First;
var rgb = palettedColour switch {
ColourPallet.BackgroundDark => new Color(0,0,0,1),
ColourPallet.Object0Dark => new Color(0,0,0,1),
ColourPallet.Object1Dark => new Color(0,0,0,1),
ColourPallet.BackgroundDark => Player.BgBlack,
ColourPallet.Object0Dark => Player.BgBlack,
ColourPallet.Object1Dark => Player.BgBlack,

ColourPallet.BackgroundMedium => new Color(0.3f,0.3f,0.3f,1),
ColourPallet.Object0Medium => new Color(0.3f,0.3f,0.3f,1),
ColourPallet.Object1Medium => new Color(0.3f,0.3f,0.3f,1),
ColourPallet.BackgroundMedium => Player.BgDarkGrey,
ColourPallet.Object0Medium => Player.BgDarkGrey,
ColourPallet.Object1Medium => Player.BgDarkGrey,

ColourPallet.BackgroundLight => new Color(0.6f,0.6f,0.6f,1),
ColourPallet.Object0Light => new Color(0.6f,0.6f,0.6f,1),
ColourPallet.Object1Light => new Color(0.6f,0.6f,0.6f,1),
ColourPallet.BackgroundLight => Player.BgLightGrey,
ColourPallet.Object0Light => Player.BgLightGrey,
ColourPallet.Object1Light => Player.BgLightGrey,

ColourPallet.BackgroundWhite => new Color(1f,1f,1f,1),
ColourPallet.Object0White => new Color(1f,1f,1f,1),
ColourPallet.Object1White => new Color(1f,1f,1f,1),
ColourPallet.BackgroundWhite => Player.BgWhite,
ColourPallet.Object0White => Player.BgWhite,
ColourPallet.Object1White => Player.BgWhite,

_ => new Color(0,0,0,1),
_ => Player.BgBlack,
};
bgcolours.Add(palettedColour);
pair.Second.Color = rgb;
Expand All @@ -67,35 +203,83 @@ public void Refresh() {
}

HashSet<ColourPallet> objcolours = new HashSet<ColourPallet>();
var colourSetIndex = 0;
foreach (var palette in debug.ObjectPalettes.Zip(obj)) {
var black = colourSetIndex == 0 ? Player.Obj0Black : Player.Obj1Black;
var dg = colourSetIndex == 0 ? Player.Obj0DarkGrey : Player.Obj1DarkGrey;
var lg = colourSetIndex == 0 ? Player.Obj0LightGrey : Player.Obj1LightGrey;
var white = colourSetIndex == 0 ? Player.Obj0White : Player.Obj1White;

foreach (var pair in palette.First.Zip(palette.Second)) {
var palettedColour = pair.First;
var rgb = palettedColour switch {
ColourPallet.BackgroundDark => new Color(0,0,0,1),
ColourPallet.Object0Dark => new Color(0,0,0,1),
ColourPallet.Object1Dark => new Color(0,0,0,1),
ColourPallet.BackgroundDark => black,
ColourPallet.Object0Dark => black,
ColourPallet.Object1Dark => black,

ColourPallet.BackgroundMedium => new Color(0.3f,0.3f,0.3f,1),
ColourPallet.Object0Medium => new Color(0.3f,0.3f,0.3f,1),
ColourPallet.Object1Medium => new Color(0.3f,0.3f,0.3f,1),
ColourPallet.BackgroundMedium => dg,
ColourPallet.Object0Medium => dg,
ColourPallet.Object1Medium => dg,

ColourPallet.BackgroundLight => new Color(0.6f,0.6f,0.6f,1),
ColourPallet.Object0Light => new Color(0.6f,0.6f,0.6f,1),
ColourPallet.Object1Light => new Color(0.6f,0.6f,0.6f,1),
ColourPallet.BackgroundLight => lg,
ColourPallet.Object0Light => lg,
ColourPallet.Object1Light => lg,

ColourPallet.BackgroundWhite => new Color(1f,1f,1f,1),
ColourPallet.Object0White => new Color(1f,1f,1f,1),
ColourPallet.Object1White => new Color(1f,1f,1f,1),
ColourPallet.BackgroundWhite => white,
ColourPallet.Object0White => white,
ColourPallet.Object1White => white,

_ => new Color(0,0,0,1),
_ => black,
};
objcolours.Add(palettedColour);
pair.Second.Color = rgb;
}

colourSetIndex = (colourSetIndex + 1) % 2;
}
if (objcolours.Count < 1) {
GD.PushError("Object palette is mono-colour.");
}
}
}


public void SelectTheme(int index) {
if (index >= 0 && index < themes.Count) {
var theme = themes[index];
bg0Black.Color = theme.BgBlack;
bg0DarkGrey.Color = theme.BgDarkGrey;
bg0LightGrey.Color = theme.BgLightGrey;
bg0White.Color = theme.BgWhite;

obj0Black.Color = theme.Obj0Black;
obj0DarkGrey.Color = theme.Obj0DarkGrey;
obj0LightGrey.Color = theme.Obj0LightGrey;
obj0White.Color = theme.Obj0White;

obj1Black.Color = theme.Obj1Black;
obj1DarkGrey.Color = theme.Obj1DarkGrey;
obj1LightGrey.Color = theme.Obj1LightGrey;
obj1White.Color = theme.Obj1White;
}
}

public void UpdatePlayerColours() {
if (Player is not null) {
Player.BgBlack = bg0Black.Color;
Player.BgDarkGrey = bg0DarkGrey.Color;
Player.BgLightGrey = bg0LightGrey.Color;
Player.BgWhite = bg0White.Color;

Player.Obj0Black = obj0Black.Color;
Player.Obj0DarkGrey = obj0DarkGrey.Color;
Player.Obj0LightGrey = obj0LightGrey.Color;
Player.Obj0White = obj0White.Color;

Player.Obj1Black = obj1Black.Color;
Player.Obj1DarkGrey = obj1DarkGrey.Color;
Player.Obj1LightGrey = obj1LightGrey.Color;
Player.Obj1White = obj1White.Color;
}
}
}
Loading

0 comments on commit 687108a

Please sign in to comment.