Proliferate use of SharedROM

This commit is contained in:
scawful
2023-08-18 17:19:42 -04:00
parent 905db2d57b
commit 5cc680762e
16 changed files with 99 additions and 79 deletions

View File

@@ -1,6 +1,13 @@
#include "dungeon_editor.h"
#include <imgui/imgui.h>
#include "app/core/common.h"
#include "app/gui/canvas.h"
#include "app/gui/icons.h"
#include "app/rom.h"
#include "app/zelda3/dungeon/room_names.h"
#include "zelda3/dungeon/room.h"
namespace yaze {
namespace app {
@@ -10,13 +17,27 @@ void DungeonEditor::Update() {
DrawToolset();
ImGui::Separator();
if (ImGui::BeginTable("#DungeonEditTable", 2, toolset_table_flags_,
if (ImGui::BeginTable("#DungeonEditTable", 3, toolset_table_flags_,
ImVec2(0, 0))) {
ImGui::TableSetupColumn("Room Selector");
ImGui::TableSetupColumn("Canvas", ImGuiTableColumnFlags_WidthStretch,
ImGui::GetContentRegionAvail().x);
ImGui::TableSetupColumn("Object Selector");
ImGui::TableHeadersRow();
ImGui::TableNextRow();
ImGui::TableNextColumn();
if (rom()->isLoaded()) {
if (ImGuiID child_id = ImGui::GetID((void *)(intptr_t)9);
ImGui::BeginChild(child_id, ImGui::GetContentRegionAvail(), true,
ImGuiWindowFlags_AlwaysVerticalScrollbar)) {
for (const auto each_room_name : zelda3::dungeon::kRoomNames) {
ImGui::Button(each_room_name.data());
}
}
ImGui::EndChild();
}
ImGui::TableNextColumn();
DrawDungeonCanvas();
ImGui::TableNextColumn();

View File

@@ -6,12 +6,13 @@
#include "app/core/common.h"
#include "app/gui/canvas.h"
#include "app/gui/icons.h"
#include "rom.h"
#include "app/rom.h"
#include "zelda3/dungeon/room.h"
namespace yaze {
namespace app {
namespace editor {
class DungeonEditor : public SharedROM {
public:
void Update();
@@ -31,8 +32,11 @@ class DungeonEditor : public SharedROM {
gui::Canvas canvas_;
gui::Canvas room_gfx_canvas_;
ImGuiTableFlags toolset_table_flags_ = ImGuiTableFlags_SizingFixedFit;
ImGuiTableFlags toolset_table_flags_ = ImGuiTableFlags_SizingFixedFit |
ImGuiTableFlags_Reorderable |
ImGuiTableFlags_Resizable;
};
} // namespace editor
} // namespace app
} // namespace yaze

View File

@@ -60,7 +60,7 @@ absl::Status GraphicsEditor::Update() {
for (int i = 0; i < graphics_bin_.size(); i++) {
graphics_bin_[i].ApplyPalette(
col_file_palette_group_[current_palette_index_]);
rom_.UpdateBitmap(&graphics_bin_[i]);
rom()->UpdateBitmap(&graphics_bin_[i]);
}
refresh_graphics_ = false;
}
@@ -130,7 +130,7 @@ absl::Status GraphicsEditor::DrawCgxImport() {
cgx_bitmap_.Create(0x80, 0x200, 8, decoded_cgx_);
if (col_file_) {
cgx_bitmap_.ApplyPalette(decoded_col_);
rom_.RenderBitmap(&cgx_bitmap_);
rom()->RenderBitmap(&cgx_bitmap_);
}
});
@@ -140,16 +140,17 @@ absl::Status GraphicsEditor::DrawCgxImport() {
absl::Status GraphicsEditor::DrawScrImport() {
ImGui::InputText("##ScrFile", scr_file_name_, sizeof(scr_file_name_));
core::FileDialogPipeline("ImportScrKey", ".SCR,.scr\0", "Open SCR", [this]() {
strncpy(scr_file_path_,
ImGuiFileDialog::Instance()->GetFilePathName().c_str(),
sizeof(scr_file_path_));
strncpy(scr_file_name_,
ImGuiFileDialog::Instance()->GetCurrentFileName().c_str(),
sizeof(scr_file_name_));
is_open_ = true;
scr_loaded_ = true;
});
core::FileDialogPipeline(
"ImportScrKey", ".SCR,.scr,.BAK\0", "Open SCR", [this]() {
strncpy(scr_file_path_,
ImGuiFileDialog::Instance()->GetFilePathName().c_str(),
sizeof(scr_file_path_));
strncpy(scr_file_name_,
ImGuiFileDialog::Instance()->GetCurrentFileName().c_str(),
sizeof(scr_file_name_));
is_open_ = true;
scr_loaded_ = true;
});
ImGui::InputInt("SCR Mod", &scr_mod_value_);
@@ -163,7 +164,7 @@ absl::Status GraphicsEditor::DrawScrImport() {
scr_bitmap_.Create(0x100, 0x100, 8, decoded_scr_data_);
if (scr_loaded_) {
scr_bitmap_.ApplyPalette(decoded_col_);
rom_.RenderBitmap(&scr_bitmap_);
rom()->RenderBitmap(&scr_bitmap_);
}
});
@@ -201,7 +202,7 @@ absl::Status GraphicsEditor::DrawPaletteControls() {
core::ButtonPipe("Copy COL Path",
[this]() { ImGui::SetClipboardText(col_file_path_); });
if (rom_.isLoaded()) {
if (rom()->isLoaded()) {
gui::TextWithSeparators("ROM Palette");
gui::InputHex("Palette Index", &current_palette_index_);
ImGui::Combo("Palette", &current_palette_, kPaletteGroupAddressesKeys,
@@ -311,8 +312,8 @@ absl::Status GraphicsEditor::DecompressImportData(int size) {
bitmap_.Create(core::kTilesheetWidth, 0x2000, core::kTilesheetDepth,
converted_sheet.data(), size);
if (rom_.isLoaded()) {
auto palette_group = rom_.GetPaletteGroup("ow_main");
if (rom()->isLoaded()) {
auto palette_group = rom()->GetPaletteGroup("ow_main");
palette_ = palette_group[current_palette_];
if (col_file_) {
bitmap_.ApplyPalette(col_file_palette_);
@@ -321,7 +322,7 @@ absl::Status GraphicsEditor::DecompressImportData(int size) {
}
}
rom_.RenderBitmap(&bitmap_);
rom()->RenderBitmap(&bitmap_);
gfx_loaded_ = true;
return absl::OkStatus();
@@ -345,12 +346,12 @@ absl::Status GraphicsEditor::DecompressSuperDonkey() {
} else {
// ROM palette
auto palette_group =
rom_.GetPaletteGroup(kPaletteGroupAddressesKeys[current_palette_]);
rom()->GetPaletteGroup(kPaletteGroupAddressesKeys[current_palette_]);
palette_ = palette_group[current_palette_index_];
graphics_bin_[i].ApplyPalette(palette_);
}
rom_.RenderBitmap(&graphics_bin_[i]);
rom()->RenderBitmap(&graphics_bin_[i]);
i++;
}
@@ -370,12 +371,12 @@ absl::Status GraphicsEditor::DecompressSuperDonkey() {
} else {
// ROM palette
auto palette_group =
rom_.GetPaletteGroup(kPaletteGroupAddressesKeys[current_palette_]);
rom()->GetPaletteGroup(kPaletteGroupAddressesKeys[current_palette_]);
palette_ = palette_group[current_palette_index_];
graphics_bin_[i].ApplyPalette(palette_);
}
rom_.RenderBitmap(&graphics_bin_[i]);
rom()->RenderBitmap(&graphics_bin_[i]);
i++;
}
super_donkey_ = true;

View File

@@ -59,10 +59,9 @@ constexpr ImGuiTableFlags kGfxEditFlags = ImGuiTableFlags_Reorderable |
ImGuiTableFlags_Resizable |
ImGuiTableFlags_SizingStretchSame;
class GraphicsEditor {
class GraphicsEditor : public SharedROM {
public:
absl::Status Update();
void SetupROM(ROM& rom) { rom_ = rom; }
private:
absl::Status DrawToolset();
@@ -113,7 +112,6 @@ class GraphicsEditor {
char scr_file_path_[256] = "";
char scr_file_name_[256] = "";
ROM rom_;
ROM temp_rom_;
Bytes import_data_;
Bytes graphics_buffer_;

View File

@@ -59,12 +59,7 @@ bool BeginCentered(const char *name) {
void MasterEditor::SetupScreen(std::shared_ptr<SDL_Renderer> renderer) {
sdl_renderer_ = renderer;
rom_.SetupRenderer(renderer);
overworld_editor_.SetupROM(rom_);
graphics_editor_.SetupROM(rom_);
screen_editor_.SetupROM(rom_);
palette_editor_.SetupROM(rom_);
music_editor_.SetupROM(rom_);
rom()->SetupRenderer(renderer);
}
void MasterEditor::UpdateScreen() {
@@ -94,7 +89,7 @@ void MasterEditor::DrawFileDialog() {
[&]() {
std::string filePathName =
ImGuiFileDialog::Instance()->GetFilePathName();
status_ = rom_.LoadFromFile(filePathName);
status_ = rom()->LoadFromFile(filePathName);
});
}
@@ -141,8 +136,8 @@ void MasterEditor::DrawInfoPopup() {
if (rom_info_) ImGui::OpenPopup("ROM Information");
if (ImGui::BeginPopupModal("ROM Information", nullptr,
ImGuiWindowFlags_AlwaysAutoResize)) {
ImGui::Text("Title: %s", rom_.title());
ImGui::Text("ROM Size: %ld", rom_.size());
ImGui::Text("Title: %s", rom()->title());
ImGui::Text("ROM Size: %ld", rom()->size());
if (ImGui::Button("Close", gui::kDefaultModalSize)) {
rom_info_ = false;
@@ -170,7 +165,7 @@ void MasterEditor::DrawFileMenu() {
".sfc,.smc", ".");
}
MENU_ITEM2("Save", "Ctrl+S") { status_ = rom_.SaveToFile(backup_rom_); }
MENU_ITEM2("Save", "Ctrl+S") { status_ = rom()->SaveToFile(backup_rom_); }
MENU_ITEM("Save As..") { save_as_menu = true; }
ImGui::Separator();
@@ -187,7 +182,7 @@ void MasterEditor::DrawFileMenu() {
ImGui::Begin("Save As..", nullptr, ImGuiWindowFlags_AlwaysAutoResize);
ImGui::InputText("Filename", &save_as_filename);
if (ImGui::Button("Save", gui::kDefaultModalSize)) {
status_ = rom_.SaveToFile(backup_rom_, save_as_filename);
status_ = rom()->SaveToFile(backup_rom_, save_as_filename);
}
if (ImGui::Button("Cancel", gui::kDefaultModalSize)) {
save_as_menu = false;
@@ -227,7 +222,7 @@ void MasterEditor::DrawViewMenu() {
if (show_memory_editor) {
static MemoryEditor mem_edit;
mem_edit.DrawWindow("Memory Editor", (void *)&rom_, rom_.size());
mem_edit.DrawWindow("Memory Editor", (void *)&(*rom()), rom()->size());
}
if (show_imgui_demo) {

View File

@@ -29,7 +29,7 @@ namespace yaze {
namespace app {
namespace editor {
class MasterEditor {
class MasterEditor : public SharedROM {
public:
void SetupScreen(std::shared_ptr<SDL_Renderer> renderer);
void UpdateScreen();
@@ -72,7 +72,6 @@ class MasterEditor {
PaletteEditor palette_editor_;
ScreenEditor screen_editor_;
SpriteEditor sprite_editor_;
ROM rom_;
};
} // namespace editor

View File

@@ -274,7 +274,7 @@ void MusicEditor::DrawToolset() {
BUTTON_COLUMN(ICON_MD_FAST_FORWARD)
BUTTON_COLUMN(ICON_MD_VOLUME_UP)
if (ImGui::Button(ICON_MD_ACCESS_TIME)) {
music_tracker_.LoadSongs(rom_);
music_tracker_.LoadSongs(*rom());
}
ImGui::TableNextColumn();
ImGui::SliderInt("Volume", &current_volume, 0, 100);

View File

@@ -54,10 +54,9 @@ static const char* kGameSongs[] = {"Title",
static constexpr absl::string_view kSongNotes[] = {
"C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B", "C",
"C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B", "C"};
class MusicEditor {
class MusicEditor : public SharedROM {
public:
void Update();
void SetupROM(ROM& rom) { rom_ = rom; }
private:
void DrawChannels();
@@ -67,7 +66,6 @@ class MusicEditor {
void DrawToolset();
zelda3::Tracker music_tracker_;
ROM rom_;
// Mix_Music* current_song_ = NULL;

View File

@@ -27,7 +27,7 @@ namespace editor {
absl::Status OverworldEditor::Update() {
// Initialize overworld graphics, maps, and palettes
if (rom_.isLoaded() && !all_gfx_loaded_) {
if (rom()->isLoaded() && !all_gfx_loaded_) {
RETURN_IF_ERROR(LoadGraphics())
all_gfx_loaded_ = true;
}
@@ -289,21 +289,21 @@ void OverworldEditor::DrawTileSelector() {
absl::Status OverworldEditor::LoadGraphics() {
// Load all of the graphics data from the game.
PRINT_IF_ERROR(rom_.LoadAllGraphicsData())
graphics_bin_ = rom_.GetGraphicsBin();
PRINT_IF_ERROR(rom()->LoadAllGraphicsData())
graphics_bin_ = rom()->GetGraphicsBin();
// Load the Link to the Past overworld.
RETURN_IF_ERROR(overworld_.Load(rom_))
RETURN_IF_ERROR(overworld_.Load(*rom()))
palette_ = overworld_.AreaPalette();
// Create the area graphics image
core::BuildAndRenderBitmapPipeline(0x80, 0x200, 0x40,
overworld_.AreaGraphics(), rom_,
overworld_.AreaGraphics(), *rom(),
current_gfx_bmp_, palette_);
// Create the tile16 blockset image
core::BuildAndRenderBitmapPipeline(0x80, 0x2000, 0x80,
overworld_.Tile16Blockset(), rom_,
overworld_.Tile16Blockset(), *rom(),
tile16_blockset_bmp_, palette_);
map_blockset_loaded_ = true;
@@ -333,7 +333,7 @@ absl::Status OverworldEditor::LoadGraphics() {
for (int id = 0; id < 4096; id++) {
tile16_individual_.emplace_back();
core::BuildAndRenderBitmapPipeline(0x10, 0x10, 0x80,
tile16_individual_data_[id], rom_,
tile16_individual_data_[id], *rom(),
tile16_individual_[id], palette_);
}
@@ -342,7 +342,7 @@ absl::Status OverworldEditor::LoadGraphics() {
overworld_.SetCurrentMap(i);
auto palette = overworld_.AreaPalette();
core::BuildAndRenderBitmapPipeline(0x200, 0x200, 0x200,
overworld_.BitmapData(), rom_,
overworld_.BitmapData(), *rom(),
maps_bmp_[i], palette);
}
@@ -359,7 +359,7 @@ absl::Status OverworldEditor::LoadSpriteGraphics() {
auto spr_gfx = sprite.PreviewGraphics();
sprite_previews_[sprite.id()].Create(width, height, depth, spr_gfx);
sprite_previews_[sprite.id()].ApplyPalette(palette_);
rom_.RenderBitmap(&(sprite_previews_[sprite.id()]));
rom()->RenderBitmap(&(sprite_previews_[sprite.id()]));
}
return absl::OkStatus();
}

View File

@@ -63,11 +63,6 @@ class OverworldEditor : public Editor, public SharedROM {
absl::Status Copy() { return absl::UnimplementedError("Copy"); }
absl::Status Paste() { return absl::UnimplementedError("Paste"); }
void SetupROM(ROM &rom) {
rom_ = rom;
shared_rom_ = std::make_shared<ROM>(rom_);
}
private:
absl::Status DrawToolset();
void DrawOverworldMapSettings();
@@ -105,7 +100,6 @@ class OverworldEditor : public Editor, public SharedROM {
std::vector<Bytes> tile16_individual_data_;
std::vector<gfx::Bitmap> tile16_individual_;
ROM rom_;
PaletteEditor palette_editor_;
zelda3::Overworld overworld_;

View File

@@ -44,8 +44,8 @@ absl::Status PaletteEditor::Update() {
}
absl::Status PaletteEditor::DrawPaletteGroup(int i) {
auto size = rom_.GetPaletteGroup(kPaletteGroupNames[i].data()).size();
auto palettes = rom_.GetPaletteGroup(kPaletteGroupNames[i].data());
auto size = rom()->GetPaletteGroup(kPaletteGroupNames[i].data()).size();
auto palettes = rom()->GetPaletteGroup(kPaletteGroupNames[i].data());
for (int j = 0; j < size; j++) {
ImGui::Text("%d", j);
@@ -73,8 +73,8 @@ absl::Status PaletteEditor::DrawPaletteGroup(int i) {
if (ImGui::ColorEdit4(
"Edit Color", col.data(),
ImGuiColorEditFlags_NoInputs | ImGuiColorEditFlags_NoAlpha)) {
RETURN_IF_ERROR(rom_.UpdatePaletteColor(kPaletteGroupNames[i].data(),
j, n, palette[n]))
RETURN_IF_ERROR(rom()->UpdatePaletteColor(
kPaletteGroupNames[i].data(), j, n, palette[n]))
}
if (ImGui::Button("Copy as..", ImVec2(-1, 0))) ImGui::OpenPopup("Copy");
if (ImGui::BeginPopup("Copy")) {

View File

@@ -5,9 +5,10 @@
#include "absl/status/status.h"
#include "app/gfx/snes_palette.h"
#include "app/rom.h"
#include "app/gui/canvas.h"
#include "app/gui/icons.h"
#include "app/rom.h"
namespace yaze {
namespace app {
@@ -25,22 +26,18 @@ static constexpr absl::string_view kPaletteGroupNames[] = {
"ow_aux", "global_sprites", "dungeon_main", "ow_mini_map",
"ow_mini_map", "3d_object", "3d_object"};
class PaletteEditor {
class PaletteEditor : public SharedROM {
public:
absl::Status Update();
void DisplayPalette(gfx::SNESPalette& palette, bool loaded);
void DrawPortablePalette(gfx::SNESPalette& palette);
auto SetupROM(ROM& rom) { rom_ = rom; }
private:
absl::Status DrawPaletteGroup(int i);
ImVec4 saved_palette_[256] = {};
ImVec4 current_color_;
ROM rom_;
ImGuiColorEditFlags palette_button_flags =
ImGuiColorEditFlags_NoAlpha | ImGuiColorEditFlags_NoTooltip;

View File

@@ -63,7 +63,7 @@ void ScreenEditor::DrawInventoryMenuEditor() {
TAB_ITEM("Inventory Menu")
static bool create = false;
if (!create && rom_.isLoaded()) {
if (!create && rom()->isLoaded()) {
inventory_.Create();
palette_ = inventory_.Palette();
create = true;

View File

@@ -21,13 +21,9 @@ namespace editor {
using MosaicArray = std::array<int, core::kNumOverworldMaps>;
class ScreenEditor {
class ScreenEditor : public SharedROM {
public:
ScreenEditor();
void SetupROM(ROM &rom) {
rom_ = rom;
inventory_.SetupROM(rom_);
}
void Update();
private:
@@ -44,7 +40,6 @@ class ScreenEditor {
char mosaic_tiles_[core::kNumOverworldMaps];
ROM rom_;
Bytes all_gfx_;
zelda3::Inventory inventory_;
gfx::SNESPalette palette_;