25 const auto blocks = room.
blocks();
46 std::vector<SDL_Color> palette_colors;
47 if (SDL_Surface* bg_surface = room.
bg1_buffer().bitmap().surface()) {
49 palette_colors.assign(palette->colors,
50 palette->colors + palette->ncolors);
55 constexpr size_t kSheetBytes = 128 * 32;
58 const size_t offset = i * kSheetBytes;
61 meta.block_id = blocks[i];
62 meta.source_offset = offset;
63 if (offset + kSheetBytes > gfx_buffer.size()) {
69 std::vector<uint8_t> sheet_pixels(
70 gfx_buffer.begin() + offset, gfx_buffer.begin() + offset + kSheetBytes);
71 meta.nonzero_pixels =
static_cast<int>(
72 std::count_if(sheet_pixels.begin(), sheet_pixels.end(),
73 [](uint8_t value) { return value != 0; }));
77 if (!palette_colors.empty()) {
92 meta.palette_colors =
static_cast<int>(palette_colors.size());
110 rooms_ = &ctx.editor->rooms();
116 ImGui::TextDisabled(tr(
"No room data available"));
121 if (active_room_id < 0 ||
122 active_room_id >=
static_cast<int>(
rooms_->
size())) {
123 ImGui::TextDisabled(tr(
"Invalid room ID: %d"), active_room_id);
127 auto& room = (*rooms_)[active_room_id];
128 bool needs_render =
false;
129 if (room.blocks().empty()) {
130 room.LoadRoomGraphics();
133 if (!room.AreObjectsLoaded()) {
137 auto& bg1_bitmap = room.bg1_buffer().bitmap();
138 if (needs_render || !bg1_bitmap.is_active() || bg1_bitmap.width() == 0) {
139 room.RenderRoomGraphics();
142 room.LoadRoomGraphics();
148 auto blocks = room.blocks();
150 constexpr float kBlockWidth = 128.0f;
151 constexpr float kBlockHeight = 32.0f;
152 constexpr int kBlocksPerRow = 2;
153 constexpr float kPadding = 4.0f;
155 const int block_count =
static_cast<int>(blocks.size());
156 const int row_count =
157 std::max(1, (block_count + kBlocksPerRow - 1) / kBlocksPerRow);
158 const ImVec2 canvas_size(
159 std::max(ImGui::GetContentRegionAvail().x,
160 kPadding + (kBlockWidth + kPadding) *
161 static_cast<float>(kBlocksPerRow)),
162 kPadding + (kBlockHeight + kPadding) *
static_cast<float>(row_count));
164 ImGui::Text(tr(
"Room %03X Graphics Blocks"), active_room_id);
165 ImGui::TextDisabled(tr(
"Blockset %02X | Spriteset %02X"), room.blockset(),
180 const float grid_width =
181 kPadding + (kBlockWidth + kPadding) *
static_cast<float>(kBlocksPerRow);
182 const float x_offset = std::max(0.0f, (canvas_size.x - grid_width) * 0.5f);
183 ImDrawList* draw_list = ImGui::GetWindowDrawList();
184 for (
int i = 0; i < block_count; ++i) {
185 const uint8_t block_id = blocks[
static_cast<size_t>(i)];
186 const int row = i / kBlocksPerRow;
187 const int col = i % kBlocksPerRow;
188 const ImVec2 local_pos(x_offset + kPadding + col * (kBlockWidth + kPadding),
189 kPadding + row * (kBlockHeight + kPadding));
195 preview_opts.
dest_size = ImVec2(kBlockWidth, kBlockHeight);
206 const ImVec2 screen_pos(zero.x + local_pos.x, zero.y + local_pos.y);
207 const ImVec2 screen_end(screen_pos.x + kBlockWidth * scale,
208 screen_pos.y + kBlockHeight * scale);
209 draw_list->AddRect(screen_pos, screen_end,
211 draw_list->AddText(ImVec2(screen_pos.x + 6.0f, screen_pos.y + 6.0f),
213 block_id == 0 ?
"Empty" :
"Missing");
221 ImGuiTreeNodeFlags_DefaultOpen)) {
222 ImGui::TextDisabled(tr(
223 "Source: Room::get_gfx_buffer() -> preview bitmap -> queued texture"));
224 ImGui::TextDisabled(tr(
"Room buffer bytes: %zu"),
225 room.get_gfx_buffer().size());
228 i < std::min(block_count,
232 const uintptr_t texture_value =
reinterpret_cast<uintptr_t
>(
236 tr(
"Slot %02d | Block %02X | Buf +0x%04zX | %dx%d | nz=%d | pal=%d | "
237 "active=%d surf=%d tex=%d (0x%zx)"),
238 i, meta.block_id, meta.source_offset, meta.width, meta.height,
239 meta.nonzero_pixels, meta.palette_colors, meta.bitmap_active,
240 meta.has_surface, meta.has_texture, texture_value);
std::array< uint8_t, 16 > preview_block_ids_
void RefreshSheetPreviews(const zelda3::Room &room)
void Draw(bool *p_open) override
Draw the panel content.
gfx::IRenderer * renderer_
~RoomGraphicsContent() override
std::array< gfx::Bitmap, 16 > sheet_previews_
uint64_t preview_graphics_revision_
std::array< SheetPreviewMetadata, 16 > sheet_preview_metadata_
DungeonRoomStore * rooms_
gui::Canvas room_gfx_canvas_