11#include "imgui/imgui.h"
17ImVec4 WithAlpha(ImVec4 color,
float alpha) {
28 const float scale = std::max(canvas_rt.
scale, 0.01f);
31 const ImVec2 room_max(room_min.x + (512.0f * scale),
32 room_min.y + (512.0f * scale));
39 ImGui::GetColorU32(WithAlpha(theme.editor_background, 0.92f)));
40 canvas_rt.
draw_list->AddRect(room_min, room_max,
41 ImGui::GetColorU32(theme.panel_border_color),
43 canvas_rt.
draw_list->AddText(ImVec2(room_min.x + 12.0f, room_min.y + 12.0f),
44 ImGui::GetColorU32(theme.text_secondary_gray),
45 "Room image pending");
71 constexpr int kRoomPixelWidth = 512;
72 constexpr int kRoomPixelHeight = 512;
73 constexpr int kDungeonTileSize = 8;
81 const float pixel_x =
static_cast<float>(target_x * kDungeonTileSize) * scale;
82 const float pixel_y =
static_cast<float>(target_y * kDungeonTileSize) * scale;
83 const ImVec2 view_size = canvas_rt.
canvas_sz;
84 const ImVec2 content_size(
static_cast<float>(kRoomPixelWidth) * scale,
85 static_cast<float>(kRoomPixelHeight) * scale);
87 const ImVec2 desired_scroll((view_size.x * 0.5f) - pixel_x,
88 (view_size.y * 0.5f) - pixel_y);
101 snprintf(text1,
sizeof(text1),
"[%03X] %s", room_id, label.c_str());
104 bool show_meta =
false;
108 snprintf(text2,
sizeof(text2),
"B:%02X P:%02X L:%02X S:%02X RO",
109 room->blockset(), room->palette(), room->layout_id(),
112 snprintf(text2,
sizeof(text2),
"B:%02X P:%02X L:%02X S:%02X",
113 room->blockset(), room->palette(), room->layout_id(),
119 snprintf(text2,
sizeof(text2),
"Read-only");
123 const float pad = 10.0f;
126 const ImVec2 hud_size(0, 0);
129 ImGui::TextUnformatted(text1);
131 ImGui::TextDisabled(
"%s", text2);
171 if (tile_x >= 0 && tile_x < 64 && tile_y >= 0 && tile_y < 64) {
172 const uint8_t object_size = obj_drop.
size;
174 static_cast<uint8_t
>(tile_x),
175 static_cast<uint8_t
>(tile_y), object_size, 0);
178 room_id, new_obj, tile_x, tile_y);
189 const auto [room_x, room_y] =
195 static_cast<uint8_t
>(sprite_x),
196 static_cast<uint8_t
>(sprite_y), 0, 0);
218 if (!drew_background) {
219 DrawRoomRenderFallback(canvas_rt);
236 if (selected.size() == 1) {
238 const size_t idx = selected.front();
239 if (idx < objects.size()) {
240 const auto& obj = objects[idx];
242 obj.x_, obj.y_, obj.size_);
250 if (sel.index < sprites.size()) {
251 const auto& sprite = sprites[sel.index];
InteractionContext * context() const
Get the interaction context.
void HandleRoomCanvasDropTargets(zelda3::Room &room, int room_id)
bool DrawRoomBackgroundLayers(int room_id)
std::optional< std::pair< int, int > > pending_scroll_target_
bool has_canvas_capture_region_
void SyncCanvasCaptureRegion(const gui::CanvasRuntime &canvas_rt)
bool object_interaction_enabled_
DungeonObjectInteraction object_interaction_
void PrepareRoomStateForCanvas(zelda3::Room &room, int room_id)
void DrawRoomCanvasContent(const gui::CanvasRuntime &canvas_rt, zelda3::Room &room, int room_id)
uint8_t current_entrance_blockset_
int canvas_capture_height_
void DrawMaskHighlights(const gui::CanvasRuntime &rt, const zelda3::Room &room)
DungeonRoomStore * rooms_
gfx::IRenderer * renderer_
void ConsumePendingCanvasScroll(const gui::CanvasRuntime &canvas_rt)
void RenderEntityOverlay(const gui::CanvasRuntime &rt, const zelda3::Room &room)
void HandleTouchLongPressContextMenu(const gui::CanvasRuntime &rt, const zelda3::Room &room)
int canvas_capture_width_
void DrawHeaderHiddenMetadataHud(int room_id)
bool show_header_hidden_metadata_hud_
void SetSelectedObjects(const std::vector< size_t > &indices)
void HandleCanvasMouseInput()
bool IsMaskModeActive() const
SelectedEntity GetSelectedEntity() const
void DrawEntitySelectionHighlights()
void DrawSelectionHighlights()
void SetCurrentRoom(DungeonRoomStore *rooms, int room_id)
std::vector< size_t > GetSelectedObjectIndices() const
InteractionCoordinator & entity_coordinator()
Get the interaction coordinator for entity handling.
bool HasEntitySelection() const
void CheckForObjectSelection()
zelda3::Room * TryEnsureRoom(int room_id)
SpriteInteractionHandler & sprite_handler()
TileObjectHandler & tile_handler()
bool PlaceObjectAt(int room_id, const zelda3::RoomObject &object, int x, int y)
Place a new object. Returns false if blocked by ROM limits.
void ProcessTextureQueue(IRenderer *renderer)
void set_scrolling(ImVec2 scroll)
auto global_scale() const
bool ArePotItemsLoaded() const
const std::vector< zelda3::Sprite > & GetSprites() const
void PrepareForRender(std::optional< uint8_t > entrance_blockset=std::nullopt)
const std::vector< RoomObject > & GetTileObjects() const
bool AreObjectsLoaded() const
bool AreSpritesLoaded() const
A class for managing sprites in the overworld and underworld.
const AgentUITheme & GetTheme()
void DrawRoomRenderFallback(const gui::CanvasRuntime &canvas_rt)
bool IsWithinBounds(int canvas_x, int canvas_y, int margin=0)
Check if coordinates are within room bounds.
constexpr int kSpriteTileSize
Editors are the view controllers for the application.
bool BeginSpriteDragSource(int sprite_id, int room_id)
ImVec2 ClampScroll(ImVec2 scroll, ImVec2 content_px, ImVec2 canvas_px)
void DrawCanvasHUD(const char *label, const ImVec2 &pos, const ImVec2 &size, std::function< void()> draw_content)
Draw a stylized Heads-Up Display (HUD) for canvas status.
bool AcceptRoomObjectDrop(RoomObjectDragPayload *out)
bool AcceptSpriteDrop(SpriteDragPayload *out)
bool BeginRoomObjectDragSource(uint16_t object_id, int room_id, int pos_x, int pos_y, uint8_t size=0)
std::string GetRoomLabel(int id)
Convenience function to get a room label.