Cleanup DungeonEditor Update routine
This commit is contained in:
@@ -30,6 +30,35 @@ using ImGui::TableSetupColumn;
|
|||||||
|
|
||||||
absl::Status DungeonEditor::Update() {
|
absl::Status DungeonEditor::Update() {
|
||||||
if (!is_loaded_ && rom()->is_loaded()) {
|
if (!is_loaded_ && rom()->is_loaded()) {
|
||||||
|
RETURN_IF_ERROR(Initialize());
|
||||||
|
is_loaded_ = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (refresh_graphics_) {
|
||||||
|
RETURN_IF_ERROR(RefreshGraphics());
|
||||||
|
refresh_graphics_ = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
TAB_BAR("##DungeonEditorTabBar")
|
||||||
|
TAB_ITEM("Room Editor")
|
||||||
|
UpdateDungeonRoomView();
|
||||||
|
END_TAB_ITEM()
|
||||||
|
TAB_ITEM("Usage Statistics")
|
||||||
|
if (is_loaded_) {
|
||||||
|
static bool calc_stats = false;
|
||||||
|
if (!calc_stats) {
|
||||||
|
CalculateUsageStats();
|
||||||
|
calc_stats = true;
|
||||||
|
}
|
||||||
|
DrawUsageStats();
|
||||||
|
}
|
||||||
|
END_TAB_ITEM()
|
||||||
|
END_TAB_BAR()
|
||||||
|
|
||||||
|
return absl::OkStatus();
|
||||||
|
}
|
||||||
|
|
||||||
|
absl::Status DungeonEditor::Initialize() {
|
||||||
for (int i = 0; i < 0x100 + 40; i++) {
|
for (int i = 0; i < 0x100 + 40; i++) {
|
||||||
rooms_.emplace_back(zelda3::dungeon::Room(i));
|
rooms_.emplace_back(zelda3::dungeon::Room(i));
|
||||||
rooms_[i].LoadHeader();
|
rooms_[i].LoadHeader();
|
||||||
@@ -66,11 +95,9 @@ absl::Status DungeonEditor::Update() {
|
|||||||
for (int block : rooms_[current_room_id_].blocks()) {
|
for (int block : rooms_[current_room_id_].blocks()) {
|
||||||
room_gfx_sheets_.emplace_back(graphics_bin_[block].get());
|
room_gfx_sheets_.emplace_back(graphics_bin_[block].get());
|
||||||
}
|
}
|
||||||
|
|
||||||
is_loaded_ = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (refresh_graphics_) {
|
absl::Status DungeonEditor::RefreshGraphics() {
|
||||||
for (int i = 0; i < 8; i++) {
|
for (int i = 0; i < 8; i++) {
|
||||||
int block = rooms_[current_room_id_].blocks()[i];
|
int block = rooms_[current_room_id_].blocks()[i];
|
||||||
graphics_bin_[block].get()->ApplyPaletteWithTransparent(
|
graphics_bin_[block].get()->ApplyPaletteWithTransparent(
|
||||||
@@ -83,26 +110,6 @@ absl::Status DungeonEditor::Update() {
|
|||||||
rom()->palette_group("sprites_aux1")[current_palette_id_], 0);
|
rom()->palette_group("sprites_aux1")[current_palette_id_], 0);
|
||||||
rom()->UpdateBitmap(graphics_bin_[block].get(), true);
|
rom()->UpdateBitmap(graphics_bin_[block].get(), true);
|
||||||
}
|
}
|
||||||
|
|
||||||
refresh_graphics_ = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
TAB_BAR("##DungeonEditorTabBar")
|
|
||||||
TAB_ITEM("Room Editor")
|
|
||||||
UpdateDungeonRoomView();
|
|
||||||
END_TAB_ITEM()
|
|
||||||
TAB_ITEM("Usage Statistics")
|
|
||||||
if (is_loaded_) {
|
|
||||||
static bool calc_stats = false;
|
|
||||||
if (!calc_stats) {
|
|
||||||
CalculateUsageStats();
|
|
||||||
calc_stats = true;
|
|
||||||
}
|
|
||||||
DrawUsageStats();
|
|
||||||
}
|
|
||||||
END_TAB_ITEM()
|
|
||||||
END_TAB_BAR()
|
|
||||||
|
|
||||||
return absl::OkStatus();
|
return absl::OkStatus();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -483,7 +490,7 @@ void DungeonEditor::DrawDungeonCanvas(int room_id) {
|
|||||||
|
|
||||||
void DungeonEditor::DrawRoomGraphics() {
|
void DungeonEditor::DrawRoomGraphics() {
|
||||||
const auto height = 0x40;
|
const auto height = 0x40;
|
||||||
room_gfx_canvas_.DrawBackground(ImVec2(256 + 1, 0x10 * 0x40 + 1));
|
room_gfx_canvas_.DrawBackground(ImVec2(0x100 + 1, 0x10 * 0x40 + 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_) {
|
||||||
@@ -593,26 +600,19 @@ void DungeonEditor::LoadRoomEntrances() {
|
|||||||
// ============================================================================
|
// ============================================================================
|
||||||
|
|
||||||
void DungeonEditor::CalculateUsageStats() {
|
void DungeonEditor::CalculateUsageStats() {
|
||||||
// Create a hash map of the usage for elements of each Dungeon Room such as
|
|
||||||
// the blockset, spriteset, palette, etc. This is so we can keep track of
|
|
||||||
// which graphics sets and palette sets are in use and which are not.
|
|
||||||
|
|
||||||
for (const auto& room : rooms_) {
|
for (const auto& room : rooms_) {
|
||||||
// Blockset
|
|
||||||
if (blockset_usage_.find(room.blockset) == blockset_usage_.end()) {
|
if (blockset_usage_.find(room.blockset) == blockset_usage_.end()) {
|
||||||
blockset_usage_[room.blockset] = 1;
|
blockset_usage_[room.blockset] = 1;
|
||||||
} else {
|
} else {
|
||||||
blockset_usage_[room.blockset] += 1;
|
blockset_usage_[room.blockset] += 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Spriteset
|
|
||||||
if (spriteset_usage_.find(room.spriteset) == spriteset_usage_.end()) {
|
if (spriteset_usage_.find(room.spriteset) == spriteset_usage_.end()) {
|
||||||
spriteset_usage_[room.spriteset] = 1;
|
spriteset_usage_[room.spriteset] = 1;
|
||||||
} else {
|
} else {
|
||||||
spriteset_usage_[room.spriteset] += 1;
|
spriteset_usage_[room.spriteset] += 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Palette
|
|
||||||
if (palette_usage_.find(room.palette) == palette_usage_.end()) {
|
if (palette_usage_.find(room.palette) == palette_usage_.end()) {
|
||||||
palette_usage_[room.palette] = 1;
|
palette_usage_[room.palette] = 1;
|
||||||
} else {
|
} else {
|
||||||
@@ -756,22 +756,14 @@ void DungeonEditor::DrawUsageStats() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void DungeonEditor::DrawUsageGrid() {
|
void DungeonEditor::DrawUsageGrid() {
|
||||||
// Create a grid of 295 small squares which is 16 squares wide
|
|
||||||
// Each square represents a room in the game
|
|
||||||
// When you hover a square it should show a hover tooltip with the properties
|
|
||||||
// of the room such as the blockset, spriteset, palette, etc. Calculate the
|
|
||||||
// number of rows
|
|
||||||
int totalSquares = 296;
|
int totalSquares = 296;
|
||||||
int squaresWide = 16;
|
int squaresWide = 16;
|
||||||
int squaresTall = (totalSquares + squaresWide - 1) /
|
int squaresTall = (totalSquares + squaresWide - 1) /
|
||||||
squaresWide; // Ceiling of totalSquares/squaresWide
|
squaresWide; // Ceiling of totalSquares/squaresWide
|
||||||
|
|
||||||
// Loop through each row
|
|
||||||
for (int row = 0; row < squaresTall; ++row) {
|
for (int row = 0; row < squaresTall; ++row) {
|
||||||
// Start a new line for each row
|
|
||||||
ImGui::NewLine();
|
ImGui::NewLine();
|
||||||
|
|
||||||
// Loop through each column in the row
|
|
||||||
for (int col = 0; col < squaresWide; ++col) {
|
for (int col = 0; col < squaresWide; ++col) {
|
||||||
// Check if we have reached 295 squares
|
// Check if we have reached 295 squares
|
||||||
if (row * squaresWide + col >= totalSquares) {
|
if (row * squaresWide + col >= totalSquares) {
|
||||||
|
|||||||
@@ -46,6 +46,9 @@ class DungeonEditor : public Editor,
|
|||||||
void add_room(int i) { active_rooms_.push_back(i); }
|
void add_room(int i) { active_rooms_.push_back(i); }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
absl::Status Initialize();
|
||||||
|
absl::Status RefreshGraphics();
|
||||||
|
|
||||||
void LoadDungeonRoomSize();
|
void LoadDungeonRoomSize();
|
||||||
|
|
||||||
void UpdateDungeonRoomView();
|
void UpdateDungeonRoomView();
|
||||||
|
|||||||
Reference in New Issue
Block a user