24 if (editor !=
nullptr) {
27 rooms_ = &dungeon_editor->rooms();
34 ImGui::TextDisabled(
"No room data available");
40 if (active_room_id < 0 ||
41 active_room_id >=
static_cast<int>(
rooms_->size())) {
42 ImGui::TextDisabled(
"Invalid room ID: %d", active_room_id);
47 auto& room = (*rooms_)[active_room_id];
49 room.LoadRoomGraphics(room.blockset());
50 auto blocks = room.blocks();
56 constexpr float kBlockWidth = 128.0f;
57 constexpr float kBlockHeight = 32.0f;
58 constexpr int kBlocksPerRow = 2;
59 constexpr float kPadding = 4.0f;
61 const int block_count =
static_cast<int>(blocks.size());
63 std::max(1, (block_count + kBlocksPerRow - 1) / kBlocksPerRow);
64 const ImVec2 canvas_size(
65 kPadding + (kBlockWidth + kPadding) *
static_cast<float>(kBlocksPerRow),
66 kPadding + (kBlockHeight + kPadding) *
static_cast<float>(row_count));
68 ImGui::Text(
"Room %03X Graphics Blocks", active_room_id);
69 ImGui::TextDisabled(
"Blockset %02X | Spriteset %02X", room.blockset(),
83 ImDrawList* draw_list = ImGui::GetWindowDrawList();
84 for (
int i = 0; i < block_count; ++i) {
85 const uint8_t block_id = blocks[
static_cast<size_t>(i)];
86 const int row = i / kBlocksPerRow;
87 const int col = i % kBlocksPerRow;
88 const ImVec2 local_pos(kPadding + col * (kBlockWidth + kPadding),
89 kPadding + row * (kBlockHeight + kPadding));
92 if (block_id < sheets.size() && sheets[block_id].texture() != 0) {
94 (ImTextureID)(intptr_t)sheets[block_id].texture(), local_pos,
95 ImVec2(kBlockWidth, kBlockHeight));
99 const ImVec2 screen_pos(zero.x + local_pos.x, zero.y + local_pos.y);
100 const ImVec2 screen_end(screen_pos.x + kBlockWidth * scale,
101 screen_pos.y + kBlockHeight * scale);
102 draw_list->AddRect(screen_pos, screen_end,
104 draw_list->AddText(ImVec2(screen_pos.x + 6.0f, screen_pos.y + 6.0f),
Editor * current_editor()
Get the currently active editor.