From 8f50d78ec797d616863325485ea68ea1d103c92e Mon Sep 17 00:00:00 2001 From: scawful Date: Wed, 30 Apr 2025 17:50:13 -0400 Subject: [PATCH] Refactor DungeonEditor to use arrays for rooms and entrances, improving memory management and performance. Remove unused variables and streamline drawing methods for better clarity. --- src/app/editor/dungeon/dungeon_editor.cc | 17 +++-------------- src/app/editor/dungeon/dungeon_editor.h | 10 ++++------ 2 files changed, 7 insertions(+), 20 deletions(-) diff --git a/src/app/editor/dungeon/dungeon_editor.cc b/src/app/editor/dungeon/dungeon_editor.cc index fd15eb31..aed5df7f 100644 --- a/src/app/editor/dungeon/dungeon_editor.cc +++ b/src/app/editor/dungeon/dungeon_editor.cc @@ -47,7 +47,6 @@ absl::Status DungeonEditor::Load() { auto dungeon_man_pal_group = rom()->palette_group().dungeon_main; for (int i = 0; i < 0x100 + 40; i++) { - rooms_.emplace_back(zelda3::Room(/*room_id=*/i)); rooms_[i] = zelda3::LoadRoomFromRom(rom(), i); auto room_size = zelda3::CalculateRoomSize(rom(), i); @@ -76,11 +75,11 @@ absl::Status DungeonEditor::Load() { LoadDungeonRoomSize(); // LoadRoomEntrances for (int i = 0; i < 0x07; ++i) { - entrances_.emplace_back(zelda3::RoomEntrance(*rom(), i, true)); + entrances_[i] = zelda3::RoomEntrance(*rom(), i, true); } for (int i = 0; i < 0x85; ++i) { - entrances_.emplace_back(zelda3::RoomEntrance(*rom(), i, false)); + entrances_[i + 0x07] = zelda3::RoomEntrance(*rom(), i, false); } // Load the palette group and palette for the dungeon @@ -89,10 +88,6 @@ absl::Status DungeonEditor::Load() { gfx::CreatePaletteGroupFromLargePalette(full_palette_)) graphics_bin_ = GraphicsSheetManager::GetInstance().gfx_sheets(); - // Create a vector of pointers to the current block bitmaps - for (int block : rooms_[current_room_id_].blocks()) { - room_gfx_sheets_.emplace_back(&graphics_bin_[block]); - } CalculateUsageStats(); is_loaded_ = true; return absl::OkStatus(); @@ -489,14 +484,10 @@ void DungeonEditor::DrawDungeonCanvas(int room_id) { canvas_.DrawBackground(); canvas_.DrawContextMenu(); if (is_loaded_) { - canvas_.DrawBitmap(gfx::Arena::Get().bg1_bitmap(), 0, 0); - canvas_.DrawBitmap(gfx::Arena::Get().bg2_bitmap(), 0, 0); - for (const auto &object : rooms_[room_id].tile_objects_) { canvas_.DrawOutline(object.x_, object.y_, object.width_ * 16, object.height_ * 16); } - canvas_.DrawBitmap(rooms_[room_id].layer1(), 0, 0); } canvas_.DrawGrid(); canvas_.DrawOverlay(); @@ -504,8 +495,7 @@ void DungeonEditor::DrawDungeonCanvas(int room_id) { void DungeonEditor::DrawRoomGraphics() { const auto height = 0x40; - const int num_sheets = 0x10; - room_gfx_canvas_.DrawBackground(ImVec2(0x100 + 1, num_sheets * height + 1)); + room_gfx_canvas_.DrawBackground(); room_gfx_canvas_.DrawContextMenu(); room_gfx_canvas_.DrawTileSelector(32); if (is_loaded_) { @@ -564,7 +554,6 @@ void DungeonEditor::DrawObjectRenderer() { for (const auto object_name : zelda3::Type1RoomObjectNames) { if (ImGui::Selectable(object_name.data(), selected_object == i)) { selected_object = i; - current_object_ = i; object_renderer_.LoadObject(i, rooms_[current_room_id_].mutable_blocks()); Renderer::GetInstance().RenderBitmap(object_renderer_.bitmap()); diff --git a/src/app/editor/dungeon/dungeon_editor.h b/src/app/editor/dungeon/dungeon_editor.h index 1dc49f5b..e3cf86f1 100644 --- a/src/app/editor/dungeon/dungeon_editor.h +++ b/src/app/editor/dungeon/dungeon_editor.h @@ -95,7 +95,6 @@ class DungeonEditor : public Editor { int background_type_ = kNoBackground; int placement_type_ = kNoType; - int current_object_ = 0; bool is_loaded_ = false; bool object_loaded_ = false; @@ -116,15 +115,14 @@ class DungeonEditor : public Editor { gfx::PaletteGroup current_palette_group_; gui::Canvas canvas_{"##DungeonCanvas", ImVec2(0x200, 0x200)}; - gui::Canvas room_gfx_canvas_; + gui::Canvas room_gfx_canvas_{"##RoomGfxCanvas", + ImVec2(0x100 + 1, 0x10 * 0x40 + 1)}; gui::Canvas object_canvas_; - gfx::Bitmap room_gfx_bmp_; std::array graphics_bin_; - std::vector room_gfx_sheets_; - std::vector rooms_; - std::vector entrances_; + std::array rooms_ = {}; + std::array entrances_ = {}; zelda3::DungeonObjectRenderer object_renderer_; absl::flat_hash_map spriteset_usage_;