Cleanup DungeonEditor

This commit is contained in:
scawful
2024-02-02 23:59:12 -05:00
parent 626d38ec0d
commit 326d1dbba4
2 changed files with 80 additions and 68 deletions

View File

@@ -44,78 +44,45 @@ absl::Status DungeonEditor::Update() {
}
auto dungeon_palette_ptr = rom()->paletteset_ids[rooms_[i].palette][0];
ASSIGN_OR_RETURN(auto paletteid,
ASSIGN_OR_RETURN(auto palette_id,
rom()->ReadWord(0xDEC4B + dungeon_palette_ptr));
int pId = paletteid / 180;
auto color = rom()->palette_group("dungeon_main")[pId][3];
int p_id = palette_id / 180;
auto color = rom()->palette_group("dungeon_main")[p_id][3];
room_palette_[rooms_[i].palette] = color.rgb();
}
std::map<int, std::vector<int>> roomsByBank;
for (const auto& room : room_size_addresses_) {
int bank = room.second >> 16;
roomsByBank[bank].push_back(room.second);
}
LoadDungeonRoomSize();
// Process and calculate room sizes within each bank
for (auto& bankRooms : roomsByBank) {
// Sort the rooms within this bank
std::sort(bankRooms.second.begin(), bankRooms.second.end());
for (size_t i = 0; i < bankRooms.second.size(); ++i) {
int roomPtr = bankRooms.second[i];
// Identify the room ID for the current room pointer
int roomId = std::find_if(room_size_addresses_.begin(),
room_size_addresses_.end(),
[roomPtr](const auto& entry) {
return entry.second == roomPtr;
})
->first;
if (roomPtr != 0x0A8000) {
if (i < bankRooms.second.size() - 1) {
// Calculate size as difference between current room and next room
// in the same bank
rooms_[roomId].set_room_size(bankRooms.second[i + 1] - roomPtr);
} else {
// Calculate size for the last room in this bank
int bankEndAddress = (bankRooms.first << 16) | 0xFFFF;
rooms_[roomId].set_room_size(bankEndAddress - roomPtr + 1);
}
total_room_size_ += rooms_[roomId].room_size();
} else {
// Room with address 0x0A8000
rooms_[roomId].set_room_size(0x00);
}
}
}
graphics_bin_ = rom()->graphics_bin();
// Load the palette group and palette for the dungeon
full_palette_ =
rom()->palette_group("dungeon_main")[current_palette_group_id_];
auto current_palette_group_status =
gfx::CreatePaletteGroupFromLargePalette(full_palette_);
if (current_palette_group_status.ok()) {
current_palette_group_ = current_palette_group_status.value();
}
ASSIGN_OR_RETURN(current_palette_group_,
gfx::CreatePaletteGroupFromLargePalette(full_palette_));
graphics_bin_ = *rom()->mutable_bitmap_manager();
// 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]);
room_gfx_sheets_.emplace_back(graphics_bin_[block].get());
}
is_loaded_ = true;
}
if (refresh_graphics_) {
for (int block : rooms_[current_room_id_].blocks()) {
graphics_bin_[block].ApplyPalette(
current_palette_group_[current_palette_id_]);
rom()->UpdateBitmap(&graphics_bin_[block]);
for (int i = 0; i < 8; i++) {
int block = rooms_[current_room_id_].blocks()[i];
graphics_bin_[block].get()->ApplyPaletteWithTransparent(
current_palette_group_[current_palette_id_], 0);
rom()->UpdateBitmap(graphics_bin_[block].get(), true);
}
for (int i = 9; i < 16; i++) {
int block = rooms_[current_room_id_].blocks()[i];
graphics_bin_[block].get()->ApplyPaletteWithTransparent(
rom()->palette_group("sprites_aux1")[current_palette_id_], 0);
rom()->UpdateBitmap(graphics_bin_[block].get(), true);
}
refresh_graphics_ = false;
}
@@ -138,6 +105,48 @@ absl::Status DungeonEditor::Update() {
return absl::OkStatus();
}
void DungeonEditor::LoadDungeonRoomSize() {
std::map<int, std::vector<int>> rooms_by_bank;
for (const auto& room : room_size_addresses_) {
int bank = room.second >> 16;
rooms_by_bank[bank].push_back(room.second);
}
// Process and calculate room sizes within each bank
for (auto& bank_rooms : rooms_by_bank) {
// Sort the rooms within this bank
std::sort(bank_rooms.second.begin(), bank_rooms.second.end());
for (size_t i = 0; i < bank_rooms.second.size(); ++i) {
int room_ptr = bank_rooms.second[i];
// Identify the room ID for the current room pointer
int room_id =
std::find_if(room_size_addresses_.begin(), room_size_addresses_.end(),
[room_ptr](const auto& entry) {
return entry.second == room_ptr;
})
->first;
if (room_ptr != 0x0A8000) {
if (i < bank_rooms.second.size() - 1) {
// Calculate size as difference between current room and next room
// in the same bank
rooms_[room_id].set_room_size(bank_rooms.second[i + 1] - room_ptr);
} else {
// Calculate size for the last room in this bank
int bank_end_address = (bank_rooms.first << 16) | 0xFFFF;
rooms_[room_id].set_room_size(bank_end_address - room_ptr + 1);
}
total_room_size_ += rooms_[room_id].room_size();
} else {
// Room with address 0x0A8000
rooms_[room_id].set_room_size(0x00);
}
}
}
}
void DungeonEditor::UpdateDungeonRoomView() {
DrawToolset();
@@ -279,13 +288,16 @@ void DungeonEditor::DrawRoomSelector() {
ImGuiWindowFlags_AlwaysVerticalScrollbar)) {
int i = 0;
for (const auto each_room_name : zelda3::dungeon::kRoomNames) {
// ImGui::Selectable(each_room_name.data(), current_room_id_ == i,
// ImGuiSelectableFlags_AllowDoubleClick);
rom()->resource_label()->SelectableLabelWithNameEdit(
current_room_id_ == i, "Dungeon Room Names", each_room_name.data(),
zelda3::dungeon::kRoomNames[i].data());
if (ImGui::IsItemClicked()) {
active_rooms_.push_back(i);
if (active_rooms_.contains(i)) {
current_room_id_ = i;
} else {
active_rooms_.push_back(i);
current_room_id_ = i;
}
}
i += 1;
}
@@ -298,7 +310,6 @@ void DungeonEditor::DrawDungeonTabView() {
static int next_tab_id = 0;
if (ImGui::BeginTabBar("MyTabBar", kDungeonTabBarFlags)) {
// TODO: Manage the room that is being added to the tab bar.
if (ImGui::TabItemButton("+", kDungeonTabFlags)) {
if (std::find(active_rooms_.begin(), active_rooms_.end(),
current_room_id_) != active_rooms_.end()) {
@@ -384,7 +395,7 @@ void DungeonEditor::DrawRoomGraphics() {
top_left_y = room_gfx_canvas_.zero_point().y + height * current_block;
}
room_gfx_canvas_.draw_list()->AddImage(
(void*)graphics_bin_[block].texture(),
(void*)graphics_bin_[block].get()->texture(),
ImVec2(room_gfx_canvas_.zero_point().x + 2, top_left_y),
ImVec2(room_gfx_canvas_.zero_point().x + 0x100,
room_gfx_canvas_.zero_point().y + offset));
@@ -459,14 +470,13 @@ void DungeonEditor::DrawObjectRenderer() {
ImGui::EndTable();
}
// if (object_loaded_) {
// ImGui::Begin("Memory Viewer", &object_loaded_, 0);
// auto memory = object_renderer_.memory();
// static MemoryEditor mem_edit;
// mem_edit.DrawContents((void*)object_renderer_.memory_ptr(),
// memory.size());
// ImGui::End();
// }
if (object_loaded_) {
ImGui::Begin("Memory Viewer", &object_loaded_, 0);
static MemoryEditor mem_edit;
mem_edit.DrawContents((void*)object_renderer_.mutable_memory(),
object_renderer_.mutable_memory()->size());
ImGui::End();
}
}
void DungeonEditor::CalculateUsageStats() {