diff --git a/src/app/core/controller.cc b/src/app/core/controller.cc index 54e2cdbb..2be9872b 100644 --- a/src/app/core/controller.cc +++ b/src/app/core/controller.cc @@ -303,7 +303,7 @@ absl::Status Controller::OnEntry(std::string filename) { master_editor_.emulator().set_audio_device_id(audio_device_); } InitializeKeymap(); - master_editor_.SetupScreen(renderer_, filename); + master_editor_.SetupScreen(filename); active_ = true; return absl::OkStatus(); } @@ -367,9 +367,10 @@ absl::Status Controller::OnLoad() { void Controller::DoRender() const { ImGui::Render(); - SDL_RenderClear(renderer_.get()); - ImGui_ImplSDLRenderer2_RenderDrawData(ImGui::GetDrawData(), renderer_.get()); - SDL_RenderPresent(renderer_.get()); + SDL_RenderClear(Renderer::GetInstance().renderer()); + ImGui_ImplSDLRenderer2_RenderDrawData(ImGui::GetDrawData(), + Renderer::GetInstance().renderer()); + SDL_RenderPresent(Renderer::GetInstance().renderer()); } void Controller::OnExit() { @@ -420,18 +421,7 @@ absl::Status Controller::CreateSDL_Window() { } absl::Status Controller::CreateRenderer() { - renderer_ = std::unique_ptr( - SDL_CreateRenderer(window_.get(), -1, - SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC), - sdl_deleter()); - if (renderer_ == nullptr) { - return absl::InternalError( - absl::StrFormat("SDL_CreateRenderer: %s\n", SDL_GetError())); - } else { - SDL_SetRenderDrawBlendMode(renderer_.get(), SDL_BLENDMODE_BLEND); - SDL_SetRenderDrawColor(renderer_.get(), 0x00, 0x00, 0x00, 0x00); - } - return absl::OkStatus(); + return Renderer::GetInstance().CreateRenderer(window_.get()); } absl::Status Controller::CreateGuiContext() { @@ -446,8 +436,9 @@ absl::Status Controller::CreateGuiContext() { } // Initialize ImGui for SDL - ImGui_ImplSDL2_InitForSDLRenderer(window_.get(), renderer_.get()); - ImGui_ImplSDLRenderer2_Init(renderer_.get()); + ImGui_ImplSDL2_InitForSDLRenderer(window_.get(), + Renderer::GetInstance().renderer()); + ImGui_ImplSDLRenderer2_Init(Renderer::GetInstance().renderer()); if (flags()->kLoadSystemFonts) { LoadSystemFonts(); diff --git a/src/app/core/controller.h b/src/app/core/controller.h index e4f63df6..3ddf3848 100644 --- a/src/app/core/controller.h +++ b/src/app/core/controller.h @@ -2,6 +2,7 @@ #define YAZE_APP_CORE_CONTROLLER_H #include + #include "imgui/backends/imgui_impl_sdl2.h" #include "imgui/backends/imgui_impl_sdlrenderer2.h" #include "imgui/imconfig.h" @@ -12,6 +13,7 @@ #include "absl/status/status.h" #include "app/core/common.h" +#include "app/core/platform/renderer.h" #include "app/editor/master_editor.h" #include "app/editor/utils/editor.h" #include "app/gui/icons.h" @@ -45,13 +47,12 @@ class Controller : public ExperimentFlags { absl::Status CreateGuiContext(); absl::Status LoadFontFamilies() const; absl::Status LoadAudioDevice(); - - void SetupScreen() { - master_editor_.SetupScreen(renderer_); - } + void SetupScreen() { master_editor_.SetupScreen(); } auto master_editor() -> editor::MasterEditor & { return master_editor_; } - auto renderer() -> SDL_Renderer * { return renderer_.get(); } + auto renderer() -> SDL_Renderer * { + return Renderer::GetInstance().renderer(); + } auto window() -> SDL_Window * { return window_.get(); } private: @@ -81,7 +82,6 @@ class Controller : public ExperimentFlags { int16_t *audio_buffer_; SDL_AudioDeviceID audio_device_; std::shared_ptr window_; - std::shared_ptr renderer_; }; } // namespace core diff --git a/src/app/editor/dungeon/dungeon_editor.cc b/src/app/editor/dungeon/dungeon_editor.cc index c23e5d47..9b0e9caa 100644 --- a/src/app/editor/dungeon/dungeon_editor.cc +++ b/src/app/editor/dungeon/dungeon_editor.cc @@ -1,9 +1,8 @@ #include "dungeon_editor.h" -#include "imgui/imgui.h" - #include "app/core/common.h" #include "app/core/labeling.h" +#include "app/core/platform/renderer.h" #include "app/gfx/snes_palette.h" #include "app/gui/canvas.h" #include "app/gui/color.h" @@ -12,12 +11,15 @@ #include "app/rom.h" #include "app/zelda3/dungeon/object_names.h" #include "app/zelda3/dungeon/room_names.h" +#include "imgui/imgui.h" #include "zelda3/dungeon/room.h" namespace yaze { namespace app { namespace editor { +using core::Renderer; + using ImGui::BeginChild; using ImGui::BeginTabBar; using ImGui::BeginTabItem; @@ -120,14 +122,14 @@ absl::Status DungeonEditor::RefreshGraphics() { int block = rooms_[current_room_id_].blocks()[i]; RETURN_IF_ERROR(graphics_bin_[block].ApplyPaletteWithTransparent( current_palette_group_[current_palette_id_], 0)); - rom()->UpdateBitmap(&graphics_bin_[block], true); + Renderer::GetInstance().UpdateBitmap(&graphics_bin_[block], true); } auto sprites_aux1_pal_group = rom()->palette_group().sprites_aux1; for (int i = 9; i < 16; i++) { int block = rooms_[current_room_id_].blocks()[i]; RETURN_IF_ERROR(graphics_bin_[block].ApplyPaletteWithTransparent( sprites_aux1_pal_group[current_palette_id_], 0)); - rom()->UpdateBitmap(&graphics_bin_[block], true); + Renderer::GetInstance().UpdateBitmap(&graphics_bin_[block], true); } return absl::OkStatus(); } @@ -547,7 +549,7 @@ void DungeonEditor::DrawObjectRenderer() { current_object_ = i; object_renderer_.LoadObject(i, rooms_[current_room_id_].mutable_blocks()); - rom()->RenderBitmap(object_renderer_.bitmap()); + Renderer::GetInstance().RenderBitmap(object_renderer_.bitmap()); object_loaded_ = true; } i += 1; diff --git a/src/app/editor/graphics/graphics_editor.cc b/src/app/editor/graphics/graphics_editor.cc index fe238599..86608faa 100644 --- a/src/app/editor/graphics/graphics_editor.cc +++ b/src/app/editor/graphics/graphics_editor.cc @@ -13,6 +13,8 @@ #include "app/gfx/compression.h" #include "app/gfx/scad_format.h" #include "app/gfx/snes_palette.h" +#include "app/core/platform/renderer.h" + #include "app/gfx/snes_tile.h" #include "app/gui/asset_browser.h" #include "app/gui/canvas.h" @@ -25,6 +27,8 @@ namespace yaze { namespace app { namespace editor { +using core::Renderer; + using gfx::kPaletteGroupAddressesKeys; using ImGui::Button; using ImGui::InputInt; @@ -142,7 +146,7 @@ void GraphicsEditor::DrawGfxEditToolset() { ->mutable_bitmap_manager() ->mutable_bitmap(current_sheet_) ->Create(width, height, 8, png_data); - rom()->UpdateBitmap( + Renderer::GetInstance().UpdateBitmap( rom()->mutable_bitmap_manager()->mutable_bitmap(current_sheet_)); } } @@ -291,7 +295,7 @@ absl::Status GraphicsEditor::UpdateGfxTabView() { auto draw_tile_event = [&]() { current_sheet_canvas_.DrawTileOnBitmap(tile_size_, ¤t_bitmap, current_color_); - rom()->UpdateBitmap(¤t_bitmap, true); + Renderer::GetInstance().UpdateBitmap(¤t_bitmap, true); }; current_sheet_canvas_.UpdateColorPainter( @@ -367,7 +371,7 @@ absl::Status GraphicsEditor::UpdatePaletteColumn() { RETURN_IF_ERROR( rom()->bitmap_manager()[current_sheet_].ApplyPaletteWithTransparent( palette, edit_palette_sub_index_)); - rom()->UpdateBitmap( + Renderer::GetInstance().UpdateBitmap( rom()->mutable_bitmap_manager()->mutable_bitmap(current_sheet_), true); refresh_graphics_ = false; @@ -462,7 +466,7 @@ absl::Status GraphicsEditor::UpdateScadView() { for (int i = 0; i < graphics_bin_.size(); i++) { status_ = graphics_bin_[i].ApplyPalette( col_file_palette_group_[current_palette_index_]); - rom()->UpdateBitmap(&graphics_bin_[i]); + Renderer::GetInstance().UpdateBitmap(&graphics_bin_[i]); } refresh_graphics_ = false; } @@ -535,7 +539,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_); + Renderer::GetInstance().RenderBitmap(&cgx_bitmap_); } } @@ -570,7 +574,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_); + Renderer::GetInstance().RenderBitmap(&scr_bitmap_); } } @@ -775,7 +779,7 @@ absl::Status GraphicsEditor::DecompressImportData(int size) { } } - rom()->RenderBitmap(&bin_bitmap_); + Renderer::GetInstance().RenderBitmap(&bin_bitmap_); gfx_loaded_ = true; return absl::OkStatus(); @@ -805,7 +809,7 @@ absl::Status GraphicsEditor::DecompressSuperDonkey() { status_ = graphics_bin_[i].ApplyPalette(z3_rom_palette_); } - rom()->RenderBitmap(&graphics_bin_[i]); + Renderer::GetInstance().RenderBitmap(&graphics_bin_[i]); i++; } @@ -830,7 +834,7 @@ absl::Status GraphicsEditor::DecompressSuperDonkey() { status_ = graphics_bin_[i].ApplyPalette(z3_rom_palette_); } - rom()->RenderBitmap(&graphics_bin_[i]); + Renderer::GetInstance().RenderBitmap(&graphics_bin_[i]); i++; } super_donkey_ = true; diff --git a/src/app/editor/graphics/screen_editor.cc b/src/app/editor/graphics/screen_editor.cc index 9680d968..09595df2 100644 --- a/src/app/editor/graphics/screen_editor.cc +++ b/src/app/editor/graphics/screen_editor.cc @@ -17,6 +17,7 @@ #include "app/gfx/snes_tile.h" #include "app/gfx/tilesheet.h" #include "app/gui/canvas.h" +#include "app/core/platform/renderer.h" #include "app/gui/icons.h" #include "app/gui/input.h" #include "app/zelda3/dungeon/room.h" @@ -25,6 +26,8 @@ namespace yaze { namespace app { namespace editor { +using core::Renderer; + absl::Status ScreenEditor::Update() { TAB_BAR("##TabBar") TAB_ITEM("Dungeon Maps") @@ -235,13 +238,13 @@ absl::Status ScreenEditor::LoadDungeonMapTile16() { RETURN_IF_ERROR(tile16_sheet_.mutable_bitmap()->ApplyPalette( *rom()->mutable_dungeon_palette(3))); - rom()->RenderBitmap(&*tile16_sheet_.mutable_bitmap().get()); + Renderer::GetInstance().RenderBitmap(&*tile16_sheet_.mutable_bitmap().get()); for (int i = 0; i < tile16_sheet_.num_tiles(); ++i) { if (tile16_individual_.count(i) == 0) { auto tile = tile16_sheet_.GetTile16(i); tile16_individual_[i] = tile; - rom()->RenderBitmap(&tile16_individual_[i]); + Renderer::GetInstance().RenderBitmap(&tile16_individual_[i]); } } @@ -279,7 +282,7 @@ void ScreenEditor::DrawDungeonMapsTabs() { if (tile16_individual_.count(tile16_id) == 0) { auto tile = tile16_sheet_.GetTile16(tile16_id); std::cout << "Tile16: " << tile16_id << std::endl; - rom()->RenderBitmap(&tile); + Renderer::GetInstance().RenderBitmap(&tile); tile16_individual_[tile16_id] = tile; } screen_canvas_.DrawBitmap(tile16_individual_[tile16_id], (posX * 2), diff --git a/src/app/editor/graphics/tile16_editor.cc b/src/app/editor/graphics/tile16_editor.cc index dc52f8ac..8a15dace 100644 --- a/src/app/editor/graphics/tile16_editor.cc +++ b/src/app/editor/graphics/tile16_editor.cc @@ -1,12 +1,11 @@ #include "tile16_editor.h" -#include "ImGuiFileDialog/ImGuiFileDialog.h" -#include "imgui/imgui.h" - #include +#include "ImGuiFileDialog/ImGuiFileDialog.h" #include "absl/status/status.h" #include "absl/status/statusor.h" +#include "app/core/platform/renderer.h" #include "app/editor/graphics/palette_editor.h" #include "app/editor/utils/editor.h" #include "app/gfx/bitmap.h" @@ -19,11 +18,14 @@ #include "app/gui/style.h" #include "app/rom.h" #include "app/zelda3/overworld/overworld.h" +#include "imgui/imgui.h" namespace yaze { namespace app { namespace editor { +using core::Renderer; + using ImGui::BeginChild; using ImGui::BeginMenu; using ImGui::BeginMenuBar; @@ -146,7 +148,7 @@ absl::Status Tile16Editor::UpdateBlockset() { auto ow_main_pal_group = rom()->palette_group().overworld_main; RETURN_IF_ERROR(current_tile16_bmp_->ApplyPalette( ow_main_pal_group[current_palette_])); - rom()->RenderBitmap(current_tile16_bmp_); + Renderer::GetInstance().RenderBitmap(current_tile16_bmp_); } } @@ -197,7 +199,8 @@ absl::Status Tile16Editor::UpdateTile16Edit() { RETURN_IF_ERROR( current_gfx_individual_[current_tile8_].ApplyPaletteWithTransparent( ow_main_pal_group[0], current_palette_)); - rom()->UpdateBitmap(¤t_gfx_individual_[current_tile8_]); + Renderer::GetInstance().UpdateBitmap( + ¤t_gfx_individual_[current_tile8_]); } tile8_source_canvas_.DrawBitmap(current_gfx_bmp_, 0, 0, 4.0f); tile8_source_canvas_.DrawGrid(); @@ -214,7 +217,8 @@ absl::Status Tile16Editor::UpdateTile16Edit() { RETURN_IF_ERROR( current_gfx_individual_[current_tile8_].ApplyPaletteWithTransparent( ow_main_pal_group[0], current_palette_)); - rom()->UpdateBitmap(¤t_gfx_individual_[current_tile8_]); + Renderer::GetInstance().UpdateBitmap( + ¤t_gfx_individual_[current_tile8_]); } if (BeginChild("Tile16 Editor Options", @@ -227,7 +231,7 @@ absl::Status Tile16Editor::UpdateTile16Edit() { current_gfx_individual_[current_tile8_], 16, 2.0f)) { RETURN_IF_ERROR( DrawToCurrentTile16(tile16_edit_canvas_.drawn_tile_position())); - rom()->UpdateBitmap(current_tile16_bmp_); + Renderer::GetInstance().UpdateBitmap(current_tile16_bmp_); } } tile16_edit_canvas_.DrawGrid(); @@ -260,8 +264,8 @@ absl::Status Tile16Editor::DrawTileEditControls() { current_gfx_bmp_.ApplyPaletteWithTransparent(palette, value)); RETURN_IF_ERROR( current_tile16_bmp_->ApplyPaletteWithTransparent(palette, value)); - rom()->UpdateBitmap(¤t_gfx_bmp_); - rom()->UpdateBitmap(current_tile16_bmp_); + Renderer::GetInstance().UpdateBitmap(¤t_gfx_bmp_); + Renderer::GetInstance().UpdateBitmap(current_tile16_bmp_); } } @@ -310,7 +314,7 @@ absl::Status Tile16Editor::LoadTile8() { current_gfx_individual_[index].Create(0x08, 0x08, 0x08, tile_data); RETURN_IF_ERROR(current_gfx_individual_[index].ApplyPaletteWithTransparent( ow_main_pal_group[0], current_palette_)); - rom()->RenderBitmap(¤t_gfx_individual_[index]); + Renderer::GetInstance().RenderBitmap(¤t_gfx_individual_[index]); } map_blockset_loaded_ = true; @@ -371,7 +375,7 @@ absl::Status Tile16Editor::UpdateTransferTileCanvas() { palette_ = transfer_overworld_.AreaPalette(); // Create the tile16 blockset image - RETURN_IF_ERROR(rom()->CreateAndRenderBitmap( + RETURN_IF_ERROR(Renderer::GetInstance().CreateAndRenderBitmap( 0x80, 0x2000, 0x80, transfer_overworld_.Tile16Blockset(), transfer_blockset_bmp_, palette_)); transfer_blockset_loaded_ = true; @@ -391,7 +395,7 @@ absl::Status Tile16Editor::SetCurrentTile(int id) { auto ow_main_pal_group = rom()->palette_group().overworld_main; RETURN_IF_ERROR( current_tile16_bmp_->ApplyPalette(ow_main_pal_group[current_palette_])); - rom()->RenderBitmap(current_tile16_bmp_); + Renderer::GetInstance().RenderBitmap(current_tile16_bmp_); return absl::OkStatus(); } diff --git a/src/app/editor/master_editor.cc b/src/app/editor/master_editor.cc index 94bce89d..95319776 100644 --- a/src/app/editor/master_editor.cc +++ b/src/app/editor/master_editor.cc @@ -3,17 +3,11 @@ #include "ImGuiColorTextEdit/TextEditor.h" #include "ImGuiFileDialog/ImGuiFileDialog.h" #include "abseil-cpp/absl/strings/match.h" -#include "imgui/backends/imgui_impl_sdl2.h" -#include "imgui/backends/imgui_impl_sdlrenderer2.h" -#include "imgui/imgui.h" -#include "imgui/misc/cpp/imgui_stdlib.h" -#include "imgui_internal.h" -#include "imgui_memory_editor.h" - #include "absl/status/status.h" #include "app/core/common.h" #include "app/core/constants.h" #include "app/core/platform/file_dialog.h" +#include "app/core/platform/renderer.h" #include "app/editor/code/assembly_editor.h" #include "app/editor/dungeon/dungeon_editor.h" #include "app/editor/graphics/graphics_editor.h" @@ -32,6 +26,12 @@ #include "app/gui/input.h" #include "app/gui/style.h" #include "app/rom.h" +#include "imgui/backends/imgui_impl_sdl2.h" +#include "imgui/backends/imgui_impl_sdlrenderer2.h" +#include "imgui/imgui.h" +#include "imgui/misc/cpp/imgui_stdlib.h" +#include "imgui_internal.h" +#include "imgui_memory_editor.h" namespace yaze { namespace app { @@ -40,9 +40,9 @@ namespace editor { using namespace ImGui; namespace { - -bool BeginCentered(const char *name) { - ImGuiIO const &io = GetIO(); + +bool BeginCentered(const char* name) { + ImGuiIO const& io = GetIO(); ImVec2 pos(io.DisplaySize.x * 0.5f, io.DisplaySize.y * 0.5f); SetNextWindowPos(pos, ImGuiCond_Always, ImVec2(0.5f, 0.5f)); ImGuiWindowFlags flags = @@ -58,10 +58,7 @@ bool IsEditorActive(Editor* editor, std::vector& active_editors) { } // namespace -void MasterEditor::SetupScreen(std::shared_ptr renderer, - std::string filename) { - sdl_renderer_ = renderer; - rom()->SetupRenderer(renderer); +void MasterEditor::SetupScreen(std::string filename) { if (!filename.empty()) { PRINT_IF_ERROR(rom()->LoadFromFile(filename)); } @@ -656,7 +653,6 @@ void MasterEditor::DrawTestMenu() { MenuItem("Run Tests", nullptr, &show_tests_); EndMenu(); } - } void MasterEditor::DrawProjectMenu() { diff --git a/src/app/editor/master_editor.h b/src/app/editor/master_editor.h index cc5e495f..55bcac7f 100644 --- a/src/app/editor/master_editor.h +++ b/src/app/editor/master_editor.h @@ -5,10 +5,6 @@ #include "ImGuiColorTextEdit/TextEditor.h" #include "ImGuiFileDialog/ImGuiFileDialog.h" -#include "imgui/imgui.h" -#include "imgui/misc/cpp/imgui_stdlib.h" -#include "imgui_memory_editor.h" - #include "absl/status/status.h" #include "app/core/common.h" #include "app/core/constants.h" @@ -32,6 +28,9 @@ #include "app/gui/icons.h" #include "app/gui/input.h" #include "app/rom.h" +#include "imgui/imgui.h" +#include "imgui/misc/cpp/imgui_stdlib.h" +#include "imgui_memory_editor.h" namespace yaze { namespace app { @@ -69,8 +68,7 @@ class MasterEditor : public SharedRom, active_editors_.push_back(&message_editor_); } - void SetupScreen(std::shared_ptr renderer, - std::string filename = ""); + void SetupScreen(std::string filename = ""); absl::Status Update(); auto emulator() -> emu::Emulator& { return emulator_; } @@ -111,8 +109,6 @@ class MasterEditor : public SharedRom, absl::Status status_; absl::Status prev_status_; - std::shared_ptr sdl_renderer_; - emu::Emulator emulator_; Project current_project_; diff --git a/src/app/editor/message/message_editor.cc b/src/app/editor/message/message_editor.cc index a39f8f96..a7bf8058 100644 --- a/src/app/editor/message/message_editor.cc +++ b/src/app/editor/message/message_editor.cc @@ -11,6 +11,7 @@ #include "absl/strings/str_replace.h" #include "absl/strings/str_split.h" #include "app/core/common.h" +#include "app/core/platform/renderer.h" #include "app/editor/utils/editor.h" #include "app/gfx/bitmap.h" #include "app/gfx/snes_palette.h" @@ -24,6 +25,8 @@ namespace yaze { namespace app { namespace editor { +using core::Renderer; + using ImGui::Begin; using ImGui::BeginChild; using ImGui::BeginTable; @@ -212,7 +215,7 @@ void MessageEditor::DrawCurrentMessage() { Text("Message Preview"); if (Button("Refresh Bitmap")) { - rom()->UpdateBitmap(¤t_font_gfx16_bitmap_); + Renderer::GetInstance().UpdateBitmap(¤t_font_gfx16_bitmap_); } gui::BeginPadding(1); BeginChild("CurrentGfxFont", ImVec2(0, 0), true, @@ -260,7 +263,7 @@ absl::Status MessageEditor::Initialize() { font_gfx16_data = gfx::SnesTo8bppSheet(data, /*bpp=*/2); // 4bpp - RETURN_IF_ERROR(rom()->CreateAndRenderBitmap( + RETURN_IF_ERROR(Renderer::GetInstance().CreateAndRenderBitmap( 128, 128, 8, font_gfx16_data, font_gfx_bitmap_, font_preview_colors_)) current_font_gfx16_data_.reserve(172 * 4096); @@ -269,7 +272,7 @@ absl::Status MessageEditor::Initialize() { } // 8bpp - RETURN_IF_ERROR(rom()->CreateAndRenderBitmap( + RETURN_IF_ERROR(Renderer::GetInstance().CreateAndRenderBitmap( 172, 4096, 64, current_font_gfx16_data_, current_font_gfx16_bitmap_, font_preview_colors_)) diff --git a/src/app/editor/overworld/refresh.cc b/src/app/editor/overworld/refresh.cc index bdfaa566..13f29f70 100644 --- a/src/app/editor/overworld/refresh.cc +++ b/src/app/editor/overworld/refresh.cc @@ -1,9 +1,12 @@ +#include "app/core/platform/renderer.h" #include "app/editor/overworld_editor.h" namespace yaze { namespace app { namespace editor { +using core::Renderer; + void OverworldEditor::RefreshChildMap(int map_index) { overworld_.mutable_overworld_map(map_index)->LoadAreaGraphics(); status_ = overworld_.mutable_overworld_map(map_index)->BuildTileset(); @@ -50,7 +53,7 @@ void OverworldEditor::RefreshOverworldMap() { int n = is_large ? 4 : 1; // We do texture updating on the main thread for (int i = 0; i < n; ++i) { - rom()->UpdateBitmap(&maps_bmp_[indices[i]]); + Renderer::GetInstance().UpdateBitmap(&maps_bmp_[indices[i]]); } } @@ -106,7 +109,7 @@ absl::Status OverworldEditor::RefreshTile16Blockset() { overworld_.set_current_map(current_map_); palette_ = overworld_.AreaPalette(); // Create the tile16 blockset image - rom()->UpdateBitmap(&tile16_blockset_bmp_); + Renderer::GetInstance().UpdateBitmap(&tile16_blockset_bmp_); RETURN_IF_ERROR(tile16_blockset_bmp_.ApplyPalette(palette_)); // Copy the tile16 data into individual tiles. @@ -146,7 +149,7 @@ absl::Status OverworldEditor::RefreshTile16Blockset() { // Render the bitmaps of each tile. for (int id = 0; id < 4096; id++) { RETURN_IF_ERROR(tile16_individual_[id].ApplyPalette(palette_)); - rom()->UpdateBitmap(&tile16_individual_[id]); + Renderer::GetInstance().UpdateBitmap(&tile16_individual_[id]); } return absl::OkStatus(); diff --git a/src/app/editor/overworld_editor.cc b/src/app/editor/overworld_editor.cc index 62f0f92b..4fa170ab 100644 --- a/src/app/editor/overworld_editor.cc +++ b/src/app/editor/overworld_editor.cc @@ -11,6 +11,7 @@ #include "app/core/common.h" #include "app/core/constants.h" #include "app/core/platform/clipboard.h" +#include "app/core/platform/renderer.h" #include "app/editor/graphics/palette_editor.h" #include "app/editor/overworld/entity.h" #include "app/gfx/bitmap.h" @@ -29,6 +30,8 @@ namespace yaze { namespace app { namespace editor { +using core::Renderer; + using ImGui::BeginChild; using ImGui::BeginTabBar; using ImGui::BeginTabItem; @@ -589,7 +592,7 @@ absl::Status OverworldEditor::CheckForCurrentMap() { ImGui::IsMouseClicked(ImGuiMouseButton_Right)) { RefreshOverworldMap(); RETURN_IF_ERROR(RefreshTile16Blockset()); - rom()->UpdateBitmap(&maps_bmp_[current_map_]); + Renderer::GetInstance().UpdateBitmap(&maps_bmp_[current_map_]); maps_bmp_[current_map_].set_modified(false); } @@ -709,7 +712,7 @@ absl::Status OverworldEditor::DrawAreaGraphics() { overworld_.set_current_map(current_map_); palette_ = overworld_.AreaPalette(); gfx::Bitmap bmp; - RETURN_IF_ERROR(rom()->CreateAndRenderBitmap( + RETURN_IF_ERROR(Renderer::GetInstance().CreateAndRenderBitmap( 0x80, kOverworldMapSize, 0x08, overworld_.current_graphics(), bmp, palette_)); current_graphics_set_[current_map_] = bmp; @@ -981,14 +984,14 @@ absl::Status OverworldEditor::LoadGraphics() { palette_ = overworld_.AreaPalette(); // Create the area graphics image - RETURN_IF_ERROR(rom()->CreateAndRenderBitmap(0x80, kOverworldMapSize, 0x40, - overworld_.current_graphics(), - current_gfx_bmp_, palette_)); + RETURN_IF_ERROR(Renderer::GetInstance().CreateAndRenderBitmap( + 0x80, kOverworldMapSize, 0x40, overworld_.current_graphics(), + current_gfx_bmp_, palette_)); // Create the tile16 blockset image - RETURN_IF_ERROR(rom()->CreateAndRenderBitmap(0x80, 0x2000, 0x08, - overworld_.Tile16Blockset(), - tile16_blockset_bmp_, palette_)); + RETURN_IF_ERROR(Renderer::GetInstance().CreateAndRenderBitmap( + 0x80, 0x2000, 0x08, overworld_.Tile16Blockset(), tile16_blockset_bmp_, + palette_)); map_blockset_loaded_ = true; // Copy the tile16 data into individual tiles. @@ -1016,7 +1019,7 @@ absl::Status OverworldEditor::LoadGraphics() { // Render the bitmaps of each tile. for (int id = 0; id < 4096; id++) { tile16_individual_.emplace_back(); - RETURN_IF_ERROR(rom()->CreateAndRenderBitmap( + RETURN_IF_ERROR(Renderer::GetInstance().CreateAndRenderBitmap( 0x10, 0x10, 0x80, tile16_individual_data_[id], tile16_individual_[id], palette_)); } @@ -1025,7 +1028,7 @@ absl::Status OverworldEditor::LoadGraphics() { for (int i = 0; i < zelda3::overworld::kNumOverworldMaps; ++i) { overworld_.set_current_map(i); auto palette = overworld_.AreaPalette(); - RETURN_IF_ERROR(rom()->CreateAndRenderBitmap( + RETURN_IF_ERROR(Renderer::GetInstance().CreateAndRenderBitmap( kOverworldMapSize, kOverworldMapSize, 0x200, overworld_.BitmapData(), maps_bmp_[i], palette)); } @@ -1047,7 +1050,7 @@ absl::Status OverworldEditor::LoadSpriteGraphics() { auto spr_gfx = sprite.PreviewGraphics(); sprite_previews_[sprite.id()].Create(width, height, depth, spr_gfx); RETURN_IF_ERROR(sprite_previews_[sprite.id()].ApplyPalette(palette_)); - rom()->RenderBitmap(&(sprite_previews_[sprite.id()])); + Renderer::GetInstance().RenderBitmap(&(sprite_previews_[sprite.id()])); } return absl::OkStatus(); } @@ -1321,7 +1324,7 @@ absl::Status OverworldEditor::LoadAnimatedMaps() { } RETURN_IF_ERROR(map.BuildBitmap(blockset)); - RETURN_IF_ERROR(rom()->CreateAndRenderBitmap( + RETURN_IF_ERROR(Renderer::GetInstance().CreateAndRenderBitmap( kOverworldMapSize, kOverworldMapSize, 0x200, map.bitmap_data(), animated_maps_[world_index], *map.mutable_current_palette())); diff --git a/src/app/emu/emulator.cc b/src/app/emu/emulator.cc index 4373642b..8f9807cf 100644 --- a/src/app/emu/emulator.cc +++ b/src/app/emu/emulator.cc @@ -1,18 +1,18 @@ #include "app/emu/emulator.h" -#include "imgui/imgui.h" -#include "imgui_memory_editor.h" - #include #include #include "app/core/constants.h" #include "app/core/platform/file_dialog.h" +#include "app/core/platform/renderer.h" #include "app/emu/snes.h" #include "app/gui/icons.h" #include "app/gui/input.h" #include "app/gui/zeml.h" #include "app/rom.h" +#include "imgui/imgui.h" +#include "imgui_memory_editor.h" namespace yaze { namespace app { @@ -52,9 +52,9 @@ using ImGui::Text; void Emulator::Run() { static bool loaded = false; if (!snes_.running() && rom()->is_loaded()) { - ppu_texture_ = - SDL_CreateTexture(rom()->renderer().get(), SDL_PIXELFORMAT_ARGB8888, - SDL_TEXTUREACCESS_STREAMING, 512, 480); + ppu_texture_ = SDL_CreateTexture(core::Renderer::GetInstance().renderer(), + SDL_PIXELFORMAT_ARGB8888, + SDL_TEXTUREACCESS_STREAMING, 512, 480); if (ppu_texture_ == NULL) { printf("Failed to create texture: %s\n", SDL_GetError()); return; diff --git a/src/app/gui/canvas.cc b/src/app/gui/canvas.cc index 6b92c01e..57073562 100644 --- a/src/app/gui/canvas.cc +++ b/src/app/gui/canvas.cc @@ -3,6 +3,7 @@ #include #include +#include "app/core/platform/renderer.h" #include "app/editor/graphics/graphics_editor.h" #include "app/gfx/bitmap.h" #include "app/gui/color.h" @@ -15,6 +16,8 @@ namespace yaze { namespace app { namespace gui { +using core::Renderer; + using ImGui::BeginMenu; using ImGui::BeginPopup; using ImGui::EndMenu; @@ -133,19 +136,19 @@ void Canvas::DrawContextMenu(gfx::Bitmap *bitmap) { if (BeginMenu("Bitmap Format")) { if (MenuItem("Indexed")) { bitmap->Reformat(gfx::BitmapFormat::kIndexed); - rom()->UpdateBitmap(bitmap); + Renderer::GetInstance().UpdateBitmap(bitmap); } if (MenuItem("2BPP")) { bitmap->Reformat(gfx::BitmapFormat::k2bpp); - rom()->UpdateBitmap(bitmap); + Renderer::GetInstance().UpdateBitmap(bitmap); } if (MenuItem("4BPP")) { bitmap->Reformat(gfx::BitmapFormat::k4bpp); - rom()->UpdateBitmap(bitmap); + Renderer::GetInstance().UpdateBitmap(bitmap); } if (MenuItem("8BPP")) { bitmap->Reformat(gfx::BitmapFormat::k8bpp); - rom()->UpdateBitmap(bitmap); + Renderer::GetInstance().UpdateBitmap(bitmap); } EndMenu(); } @@ -170,7 +173,7 @@ void Canvas::DrawContextMenu(gfx::Bitmap *bitmap) { if (refresh_graphics_) { auto status = bitmap->ApplyPaletteWithTransparent( *palette, edit_palette_sub_index_); - rom()->UpdateBitmap(bitmap); + Renderer::GetInstance().UpdateBitmap(bitmap); refresh_graphics_ = false; } ImGui::EndChild(); diff --git a/src/app/rom.cc b/src/app/rom.cc index 151f582a..b70c8156 100644 --- a/src/app/rom.cc +++ b/src/app/rom.cc @@ -20,15 +20,17 @@ #include "absl/strings/str_cat.h" // for StrCat #include "absl/strings/string_view.h" // for string_view, operator== #include "app/core/constants.h" // for Bytes, ASSIGN_OR_RETURN -#include "app/gfx/bitmap.h" // for Bitmap, BitmapTable -#include "app/gfx/compression.h" // for DecompressV2 -#include "app/gfx/snes_color.h" // for SNESColor -#include "app/gfx/snes_palette.h" // for PaletteGroup -#include "app/gfx/snes_tile.h" // for SnesTo8bppSheet +#include "app/core/platform/renderer.h" +#include "app/gfx/bitmap.h" // for Bitmap, BitmapTable +#include "app/gfx/compression.h" // for DecompressV2 +#include "app/gfx/snes_color.h" // for SNESColor +#include "app/gfx/snes_palette.h" // for PaletteGroup +#include "app/gfx/snes_tile.h" // for SnesTo8bppSheet namespace yaze { namespace app { +using core::Renderer; constexpr int Uncompressed3BPPSize = 0x0600; constexpr int kEntranceGfxGroup = 0x5D97; @@ -74,7 +76,7 @@ absl::Status Rom::LoadLinkGraphics() { core::kTilesheetDepth, link_sheet_8bpp); RETURN_IF_ERROR( link_graphics_[i].ApplyPaletteWithTransparent(link_palette_, 0)); - RenderBitmap(&link_graphics_[i]); + Renderer::GetInstance().RenderBitmap(&link_graphics_[i]); } return absl::OkStatus(); @@ -104,7 +106,7 @@ absl::Status Rom::LoadAllGraphicsData() { auto converted_sheet = gfx::SnesTo8bppSheet(sheet, 3); graphics_sheets_[i].Create(core::kTilesheetWidth, core::kTilesheetHeight, core::kTilesheetDepth, converted_sheet); - graphics_sheets_[i].CreateTexture(renderer_); + graphics_sheets_[i].CreateTexture(Renderer::GetInstance().renderer()); if (flags()->kUseBitmapManager) { graphics_manager_.LoadBitmap(i, converted_sheet, core::kTilesheetWidth, @@ -118,12 +120,12 @@ absl::Status Rom::LoadAllGraphicsData() { RETURN_IF_ERROR(graphics_manager_[i].ApplyPaletteWithTransparent( palette_groups_.dungeon_main[0], 0)); } - graphics_manager_[i].CreateTexture(renderer_); + graphics_manager_[i].CreateTexture(Renderer::GetInstance().renderer()); } graphics_bin_[i] = gfx::Bitmap(core::kTilesheetWidth, core::kTilesheetHeight, core::kTilesheetDepth, converted_sheet); - graphics_bin_.at(i).CreateTexture(renderer_); + graphics_bin_.at(i).CreateTexture(Renderer::GetInstance().renderer()); if (flags()->kUseBitmapManager) { for (int j = 0; j < graphics_manager_[i].size(); ++j) { diff --git a/src/app/rom.h b/src/app/rom.h index 699af27e..ec7c59e3 100644 --- a/src/app/rom.h +++ b/src/app/rom.h @@ -445,7 +445,6 @@ class Rom : public core::ExperimentFlags { auto filename() const { return filename_; } auto is_loaded() const { return is_loaded_; } auto version() const { return version_; } - auto renderer() const { return renderer_; } uint8_t& operator[](int i) { if (i > size_) { @@ -465,41 +464,6 @@ class Rom : public core::ExperimentFlags { } const uint8_t* operator&() { return rom_data_.data(); } - void SetupRenderer(std::shared_ptr renderer) { - renderer_ = renderer; - } - - absl::Status CreateAndRenderBitmap(int width, int height, int depth, - const Bytes& data, gfx::Bitmap& bitmap, - gfx::SnesPalette& palette) { - bitmap.Create(width, height, depth, data); - RETURN_IF_ERROR(bitmap.ApplyPalette(palette)); - RenderBitmap(&bitmap); - return absl::OkStatus(); - } - - /** - * @brief Used to render a bitmap to the screen. - */ - void RenderBitmap(gfx::Bitmap* bitmap) { - if (flags()->kLoadTexturesAsStreaming) { - bitmap->CreateTexture(renderer_.get()); - } else { - bitmap->CreateTexture(renderer_); - } - } - - /** - * @brief Used to update a bitmap on the screen. - */ - void UpdateBitmap(gfx::Bitmap* bitmap, bool use_sdl_update = false) { - if (flags()->kLoadTexturesAsStreaming) { - bitmap->UpdateTexture(renderer_.get(), use_sdl_update); - } else { - bitmap->UpdateTexture(renderer_); - } - } - std::vector> main_blockset_ids; std::vector> room_blockset_ids; std::vector> spriteset_ids; @@ -579,8 +543,6 @@ class Rom : public core::ExperimentFlags { gfx::SnesPalette link_palette_; gfx::PaletteGroupMap palette_groups_; core::ResourceLabelManager resource_label_manager_; - - std::shared_ptr renderer_; }; /** diff --git a/src/app/zelda3/screen/inventory.cc b/src/app/zelda3/screen/inventory.cc index b33d4c77..54bb291e 100644 --- a/src/app/zelda3/screen/inventory.cc +++ b/src/app/zelda3/screen/inventory.cc @@ -1,5 +1,6 @@ #include "inventory.h" +#include "app/core/platform/renderer.h" #include "app/gfx/bitmap.h" #include "app/gfx/snes_tile.h" #include "app/gui/canvas.h" @@ -10,6 +11,8 @@ namespace app { namespace zelda3 { namespace screen { +using core::Renderer; + absl::Status Inventory::Create() { data_.reserve(256 * 256); for (int i = 0; i < 256 * 256; i++) { @@ -65,7 +68,7 @@ absl::Status Inventory::Create() { bitmap_.Create(256, 256, 8, data_); RETURN_IF_ERROR(bitmap_.ApplyPalette(palette_)); - rom()->RenderBitmap(&bitmap_); + Renderer::GetInstance().RenderBitmap(&bitmap_); return absl::OkStatus(); } @@ -84,7 +87,7 @@ absl::Status Inventory::BuildTileset() { auto hud_pal_group = rom()->palette_group().hud; palette_ = hud_pal_group[0]; RETURN_IF_ERROR(tilesheets_bmp_.ApplyPalette(palette_)) - rom()->RenderBitmap(&tilesheets_bmp_); + Renderer::GetInstance().RenderBitmap(&tilesheets_bmp_); return absl::OkStatus(); }