Refactor DungeonEditor to use arrays for rooms and entrances, improving memory management and performance. Remove unused variables and streamline drawing methods for better clarity.

This commit is contained in:
scawful
2025-04-30 17:50:13 -04:00
parent e202d65780
commit 8f50d78ec7
2 changed files with 7 additions and 20 deletions

View File

@@ -47,7 +47,6 @@ absl::Status DungeonEditor::Load() {
auto dungeon_man_pal_group = rom()->palette_group().dungeon_main; auto dungeon_man_pal_group = rom()->palette_group().dungeon_main;
for (int i = 0; i < 0x100 + 40; i++) { for (int i = 0; i < 0x100 + 40; i++) {
rooms_.emplace_back(zelda3::Room(/*room_id=*/i));
rooms_[i] = zelda3::LoadRoomFromRom(rom(), i); rooms_[i] = zelda3::LoadRoomFromRom(rom(), i);
auto room_size = zelda3::CalculateRoomSize(rom(), i); auto room_size = zelda3::CalculateRoomSize(rom(), i);
@@ -76,11 +75,11 @@ absl::Status DungeonEditor::Load() {
LoadDungeonRoomSize(); LoadDungeonRoomSize();
// LoadRoomEntrances // LoadRoomEntrances
for (int i = 0; i < 0x07; ++i) { 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) { 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 // Load the palette group and palette for the dungeon
@@ -89,10 +88,6 @@ absl::Status DungeonEditor::Load() {
gfx::CreatePaletteGroupFromLargePalette(full_palette_)) gfx::CreatePaletteGroupFromLargePalette(full_palette_))
graphics_bin_ = GraphicsSheetManager::GetInstance().gfx_sheets(); 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(); CalculateUsageStats();
is_loaded_ = true; is_loaded_ = true;
return absl::OkStatus(); return absl::OkStatus();
@@ -489,14 +484,10 @@ void DungeonEditor::DrawDungeonCanvas(int room_id) {
canvas_.DrawBackground(); canvas_.DrawBackground();
canvas_.DrawContextMenu(); canvas_.DrawContextMenu();
if (is_loaded_) { 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_) { for (const auto &object : rooms_[room_id].tile_objects_) {
canvas_.DrawOutline(object.x_, object.y_, object.width_ * 16, canvas_.DrawOutline(object.x_, object.y_, object.width_ * 16,
object.height_ * 16); object.height_ * 16);
} }
canvas_.DrawBitmap(rooms_[room_id].layer1(), 0, 0);
} }
canvas_.DrawGrid(); canvas_.DrawGrid();
canvas_.DrawOverlay(); canvas_.DrawOverlay();
@@ -504,8 +495,7 @@ void DungeonEditor::DrawDungeonCanvas(int room_id) {
void DungeonEditor::DrawRoomGraphics() { void DungeonEditor::DrawRoomGraphics() {
const auto height = 0x40; const auto height = 0x40;
const int num_sheets = 0x10; room_gfx_canvas_.DrawBackground();
room_gfx_canvas_.DrawBackground(ImVec2(0x100 + 1, num_sheets * height + 1));
room_gfx_canvas_.DrawContextMenu(); room_gfx_canvas_.DrawContextMenu();
room_gfx_canvas_.DrawTileSelector(32); room_gfx_canvas_.DrawTileSelector(32);
if (is_loaded_) { if (is_loaded_) {
@@ -564,7 +554,6 @@ void DungeonEditor::DrawObjectRenderer() {
for (const auto object_name : zelda3::Type1RoomObjectNames) { for (const auto object_name : zelda3::Type1RoomObjectNames) {
if (ImGui::Selectable(object_name.data(), selected_object == i)) { if (ImGui::Selectable(object_name.data(), selected_object == i)) {
selected_object = i; selected_object = i;
current_object_ = i;
object_renderer_.LoadObject(i, object_renderer_.LoadObject(i,
rooms_[current_room_id_].mutable_blocks()); rooms_[current_room_id_].mutable_blocks());
Renderer::GetInstance().RenderBitmap(object_renderer_.bitmap()); Renderer::GetInstance().RenderBitmap(object_renderer_.bitmap());

View File

@@ -95,7 +95,6 @@ class DungeonEditor : public Editor {
int background_type_ = kNoBackground; int background_type_ = kNoBackground;
int placement_type_ = kNoType; int placement_type_ = kNoType;
int current_object_ = 0;
bool is_loaded_ = false; bool is_loaded_ = false;
bool object_loaded_ = false; bool object_loaded_ = false;
@@ -116,15 +115,14 @@ class DungeonEditor : public Editor {
gfx::PaletteGroup current_palette_group_; gfx::PaletteGroup current_palette_group_;
gui::Canvas canvas_{"##DungeonCanvas", ImVec2(0x200, 0x200)}; 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_; gui::Canvas object_canvas_;
gfx::Bitmap room_gfx_bmp_;
std::array<gfx::Bitmap, kNumGfxSheets> graphics_bin_; std::array<gfx::Bitmap, kNumGfxSheets> graphics_bin_;
std::vector<gfx::Bitmap*> room_gfx_sheets_; std::array<zelda3::Room, 0x128> rooms_ = {};
std::vector<zelda3::Room> rooms_; std::array<zelda3::RoomEntrance, 0x8C> entrances_ = {};
std::vector<zelda3::RoomEntrance> entrances_;
zelda3::DungeonObjectRenderer object_renderer_; zelda3::DungeonObjectRenderer object_renderer_;
absl::flat_hash_map<uint16_t, int> spriteset_usage_; absl::flat_hash_map<uint16_t, int> spriteset_usage_;