yaze 0.2.2
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
snes_palette.h
Go to the documentation of this file.
1#ifndef YAZE_APP_GFX_PALETTE_H
2#define YAZE_APP_GFX_PALETTE_H
3
4#include <cstdint>
5#include <cstdlib>
6#include <cstring>
7#include <iostream>
8#include <vector>
9
10#include "absl/status/status.h"
11#include "absl/status/statusor.h"
12#include "app/gfx/snes_color.h"
13#include "imgui/imgui.h"
14#include "snes_color.h"
15#include "util/macro.h"
16
17namespace yaze {
18namespace gfx {
19
20constexpr int kNumPalettes = 14;
21
38
39static constexpr absl::string_view kPaletteCategoryNames[] = {
40 "Sword", "Shield", "Clothes", "World Colors",
41 "Area Colors", "Global Sprites", "Sprites Aux1", "Sprites Aux2",
42 "Sprites Aux3", "Dungeons", "World Map", "Dungeon Map",
43 "Triforce", "Crystal"};
44
45static constexpr absl::string_view kPaletteGroupNames[] = {
46 "swords", "shields", "armors", "ow_main",
47 "ow_aux", "global_sprites", "sprites_aux1", "sprites_aux2",
48 "sprites_aux3", "dungeon_main", "ow_mini_map", "ow_mini_map",
49 "3d_object", "3d_object"};
50
51constexpr const char *kPaletteGroupAddressesKeys[] = {
52 "ow_main", "ow_aux", "ow_animated", "hud",
53 "global_sprites", "armors", "swords", "shields",
54 "sprites_aux1", "sprites_aux2", "sprites_aux3", "dungeon_main",
55 "grass", "3d_object", "ow_mini_map",
56};
57
58constexpr int kOverworldPaletteMain = 0xDE6C8;
59constexpr int kOverworldPaletteAux = 0xDE86C;
60constexpr int kOverworldPaletteAnimated = 0xDE604;
61constexpr int kGlobalSpritesLW = 0xDD218;
62constexpr int kGlobalSpritePalettesDW = 0xDD290;
63
65constexpr int kArmorPalettes = 0xDD308;
66constexpr int kSpritesPalettesAux1 = 0xDD39E; // 7 colors each
67constexpr int kSpritesPalettesAux2 = 0xDD446; // 7 colors each
68constexpr int kSpritesPalettesAux3 = 0xDD4E0; // 7 colors each
69constexpr int kSwordPalettes = 0xDD630; // 3 colors each - 4 entries
70constexpr int kShieldPalettes = 0xDD648; // 4 colors each - 3 entries
71constexpr int kHudPalettes = 0xDD660;
72constexpr int kDungeonMapPalettes = 0xDD70A; // 21 colors
73
74// (15*6) colors each - 20 entries
75constexpr int kDungeonMainPalettes = 0xDD734;
76constexpr int kDungeonMapBgPalettes = 0xDE544; // 16*6
77
78// Mirrored Value at 0x75645 : 0x75625
79constexpr int kHardcodedGrassLW = 0x5FEA9;
80constexpr int kHardcodedGrassDW = 0x05FEB3; // 0x7564F
81constexpr int kHardcodedGrassSpecial = 0x75640;
82constexpr int kOverworldMiniMapPalettes = 0x55B27;
83constexpr int kTriforcePalette = 0x64425;
84constexpr int kCrystalPalette = 0xF4CD3;
85
87constexpr int CustomAreaSpecificBGPalette = 0x140000;
88constexpr int CustomAreaSpecificBGASM = 0x140150;
89
90// 1 byte, not 0 if enabled
91constexpr int kCustomAreaSpecificBGEnabled = 0x140140;
92
93uint32_t GetPaletteAddress(const std::string &group_name, size_t palette_index,
94 size_t color_index);
95
109 public:
110 template <typename T>
111 explicit SnesPalette(const std::vector<T> &data) {
112 for (const auto &item : data) {
113 colors.emplace_back(SnesColor(item));
114 }
115 }
116
117 SnesPalette() = default;
118 explicit SnesPalette(char *snesPal);
119 explicit SnesPalette(const unsigned char *snes_pal);
120 explicit SnesPalette(const std::vector<ImVec4> &);
121 explicit SnesPalette(const std::vector<snes_color> &);
122 explicit SnesPalette(const std::vector<SnesColor> &);
123
124 void Create(const std::vector<SnesColor> &cols) {
125 for (const auto &each : cols) {
126 colors.emplace_back(each);
127 }
128 }
129
130 void Create(std::ranges::range auto &&cols) {
131 std::copy(cols.begin(), cols.end(), std::back_inserter(colors));
132 }
133
134 void AddColor(const SnesColor &color) { colors.emplace_back(color); }
135 void AddColor(const snes_color &color) { colors.emplace_back(color); }
136 void AddColor(uint16_t color) { colors.emplace_back(color); }
137
138 absl::StatusOr<SnesColor> GetColor(int i) const {
139 if (i > colors.size()) {
140 return absl::InvalidArgumentError("SnesPalette: Index out of bounds");
141 }
142 return colors[i];
143 }
144
145 auto mutable_color(int i) { return &colors[i]; }
146
147 void clear() { colors.clear(); }
148 auto size() const { return colors.size(); }
149 auto empty() const { return colors.empty(); }
150 auto begin() { return colors.begin(); }
151 auto end() { return colors.end(); }
152
154 if (i > colors.size()) {
155 std::cout << "SNESPalette: Index out of bounds" << std::endl;
156 return colors[0];
157 }
158 return colors[i];
159 }
160
161 void operator()(int i, const SnesColor &color) {
162 if (i >= colors.size()) {
163 std::cout << "SNESPalette: Index out of bounds" << std::endl;
164 }
165 colors[i] = color;
166 }
167
168 void operator()(int i, const ImVec4 &color) {
169 if (i >= colors.size()) {
170 std::cout << "SNESPalette: Index out of bounds" << std::endl;
171 return;
172 }
173 colors[i].set_rgb(color);
174 colors[i].set_modified(true);
175 }
176
177 SnesPalette sub_palette(int start, int end) const {
178 SnesPalette pal;
179 for (int i = start; i < end; i++) {
180 pal.AddColor(colors[i]);
181 }
182 return pal;
183 }
184
185 private:
186 std::vector<SnesColor> colors;
187};
188
189SnesPalette ReadPaletteFromRom(int offset, int num_colors, const uint8_t *rom);
190
191std::array<float, 4> ToFloatArray(const SnesColor &color);
192
200 PaletteGroup() = default;
201 PaletteGroup(const std::string &name) : name_(name) {}
202
203 void AddPalette(SnesPalette pal) { palettes.emplace_back(pal); }
204
205 void AddColor(SnesColor color) {
206 if (palettes.empty()) {
207 palettes.emplace_back();
208 }
209 palettes[0].AddColor(color);
210 }
211
212 void clear() { palettes.clear(); }
213 auto name() const { return name_; }
214 auto size() const { return palettes.size(); }
215 auto palette(int i) const { return palettes[i]; }
216 auto mutable_palette(int i) { return &palettes[i]; }
217
219 if (i > palettes.size()) {
220 std::cout << "PaletteGroup: Index out of bounds" << std::endl;
221 return palettes[0];
222 }
223 return palettes[i];
224 }
225
226 const SnesPalette &operator[](int i) const {
227 if (i > palettes.size()) {
228 std::cout << "PaletteGroup: Index out of bounds" << std::endl;
229 return palettes[0];
230 }
231 return palettes[i];
232 }
233
234 private:
235 std::string name_;
236 std::vector<SnesPalette> palettes;
237};
238
262
263 auto get_group(const std::string &group_name) {
264 if (group_name == "ow_main") {
265 return &overworld_main;
266 } else if (group_name == "ow_aux") {
267 return &overworld_aux;
268 } else if (group_name == "ow_animated") {
269 return &overworld_animated;
270 } else if (group_name == "hud") {
271 return &hud;
272 } else if (group_name == "global_sprites") {
273 return &global_sprites;
274 } else if (group_name == "armors") {
275 return &armors;
276 } else if (group_name == "swords") {
277 return &swords;
278 } else if (group_name == "shields") {
279 return &shields;
280 } else if (group_name == "sprites_aux1") {
281 return &sprites_aux1;
282 } else if (group_name == "sprites_aux2") {
283 return &sprites_aux2;
284 } else if (group_name == "sprites_aux3") {
285 return &sprites_aux3;
286 } else if (group_name == "dungeon_main") {
287 return &dungeon_main;
288 } else if (group_name == "grass") {
289 return &grass;
290 } else if (group_name == "3d_object") {
291 return &object_3d;
292 } else if (group_name == "ow_mini_map") {
293 return &overworld_mini_map;
294 } else {
295 throw std::out_of_range("PaletteGroupMap: Group not found");
296 }
297 }
298
299 template <typename Func>
300 absl::Status for_each(Func &&func) {
303 RETURN_IF_ERROR(func(hud));
305 RETURN_IF_ERROR(func(armors));
306 RETURN_IF_ERROR(func(swords));
312 RETURN_IF_ERROR(func(grass));
315 return absl::OkStatus();
316 }
317
318 void clear() {
319 overworld_main.clear();
320 overworld_aux.clear();
321 overworld_animated.clear();
322 hud.clear();
323 global_sprites.clear();
324 armors.clear();
325 swords.clear();
326 shields.clear();
327 sprites_aux1.clear();
328 sprites_aux2.clear();
329 sprites_aux3.clear();
330 dungeon_main.clear();
331 grass.clear();
332 object_3d.clear();
333 overworld_mini_map.clear();
334 }
335
336 bool empty() {
337 return overworld_main.size() == 0 && overworld_aux.size() == 0 &&
338 overworld_animated.size() == 0 && hud.size() == 0 &&
339 global_sprites.size() == 0 && armors.size() == 0 &&
340 swords.size() == 0 && shields.size() == 0 &&
341 sprites_aux1.size() == 0 && sprites_aux2.size() == 0 &&
342 sprites_aux3.size() == 0 && dungeon_main.size() == 0 &&
343 grass.size() == 0 && object_3d.size() == 0 &&
344 overworld_mini_map.size() == 0;
345 }
346};
347
348absl::StatusOr<PaletteGroup> CreatePaletteGroupFromColFile(
349 std::vector<SnesColor> &colors);
350
354absl::StatusOr<PaletteGroup> CreatePaletteGroupFromLargePalette(
355 SnesPalette &palette, int num_colors = 8);
356
366absl::Status LoadAllPalettes(const std::vector<uint8_t> &rom_data,
367 PaletteGroupMap &groups);
368
414
419 protected:
420 // Palettesets for the tile16 individual tiles
421 static std::unordered_map<uint8_t, gfx::Paletteset> palettesets_;
422};
423
424} // namespace gfx
425} // namespace yaze
426
427#endif // YAZE_APP_GFX_PALETTE_H
Shared graphical context across editors.
static std::unordered_map< uint8_t, gfx::Paletteset > palettesets_
SNES Color container.
Definition snes_color.h:38
Represents a palette of colors for the Super Nintendo Entertainment System (SNES).
std::vector< SnesColor > colors
void AddColor(uint16_t color)
void operator()(int i, const SnesColor &color)
void operator()(int i, const ImVec4 &color)
absl::StatusOr< SnesColor > GetColor(int i) const
SnesPalette(const std::vector< T > &data)
void Create(std::ranges::range auto &&cols)
void AddColor(const SnesColor &color)
SnesPalette sub_palette(int start, int end) const
void AddColor(const snes_color &color)
SnesColor & operator[](int i)
void Create(const std::vector< SnesColor > &cols)
int main(int argc, char **argv)
Definition emu.cc:20
#define RETURN_IF_ERROR(expression)
Definition macro.h:62
Contains classes for handling graphical data.
Definition bitmap.cc:16
constexpr int kHardcodedGrassSpecial
constexpr int kHudPalettes
constexpr int kOverworldPaletteAux
SnesPalette ReadPaletteFromRom(int offset, int num_colors, const uint8_t *rom)
constexpr int kHardcodedGrassLW
constexpr int kArmorPalettes
constexpr int kCrystalPalette
constexpr const char * kPaletteGroupAddressesKeys[]
constexpr int kShieldPalettes
constexpr int kSpritesPalettesAux2
constexpr int kOverworldPaletteAnimated
constexpr int CustomAreaSpecificBGPalette
constexpr int kOverworldMiniMapPalettes
constexpr int kOverworldPaletteMain
constexpr int kDungeonMapPalettes
constexpr int kSwordPalettes
constexpr int kHardcodedGrassDW
constexpr int kGlobalSpritesLW
constexpr int kSpritesPalettesAux1
std::array< float, 4 > ToFloatArray(const SnesColor &color)
constexpr int kNumPalettes
constexpr int kCustomAreaSpecificBGEnabled
constexpr int kGlobalSpritePalettesDW
constexpr int kSpritesPalettesAux3
constexpr int kDungeonMainPalettes
uint32_t GetPaletteAddress(const std::string &group_name, size_t palette_index, size_t color_index)
constexpr int kDungeonMapBgPalettes
constexpr int kTriforcePalette
absl::Status LoadAllPalettes(const std::vector< uint8_t > &rom_data, PaletteGroupMap &groups)
Loads all the palettes for the game.
constexpr int CustomAreaSpecificBGASM
absl::StatusOr< PaletteGroup > CreatePaletteGroupFromLargePalette(SnesPalette &palette, int num_colors)
Take a SNESPalette, divide it into palettes of 8 colors.
absl::StatusOr< PaletteGroup > CreatePaletteGroupFromColFile(std::vector< SnesColor > &palette_rows)
Main namespace for the application.
Definition controller.cc:18
Primitive of 16-bit RGB SNES color.
Definition snes.h:14
Represents a mapping of palette groups.
absl::Status for_each(Func &&func)
auto get_group(const std::string &group_name)
Represents a group of palettes.
std::vector< SnesPalette > palettes
auto palette(int i) const
void AddColor(SnesColor color)
const SnesPalette & operator[](int i) const
SnesPalette operator[](int i)
void AddPalette(SnesPalette pal)
PaletteGroup(const std::string &name)
gfx::SnesPalette spr
gfx::SnesPalette main_
gfx::SnesPalette animated
gfx::SnesPalette composite
gfx::SnesPalette hud
gfx::SnesPalette aux1
gfx::SnesPalette spr2
gfx::SnesColor background
Paletteset(gfx::SnesPalette main, gfx::SnesPalette animated, gfx::SnesPalette aux1, gfx::SnesPalette aux2, gfx::SnesColor background, gfx::SnesPalette hud, gfx::SnesPalette spr, gfx::SnesPalette spr2, gfx::SnesPalette comp)
Constructor for Paletteset.
gfx::SnesPalette aux2
Paletteset()=default
Default constructor for Paletteset.