1#ifndef YAZE_APP_EDITOR_DUNGEON_DUNGEON_CANVAS_VIEWER_H
2#define YAZE_APP_EDITOR_DUNGEON_DUNGEON_CANVAS_VIEWER_H
10#include <unordered_map>
22#include "imgui/imgui.h"
32class MinecartTrackEditorPanel;
33class DungeonCanvasViewerTestPeer;
80 std::vector<DungeonConnectedRoomLink>
links;
95 "Object draw mismatch",
96 "Door render mismatch",
98 "Overlay or collision mismatch",
99 "General room render mismatch",
103 return static_cast<int>(category);
148 const DungeonConnectedRoomLink& link);
153 const DungeonStaircaseIssue& issue);
162 constexpr int kCols = 16;
163 const int row = room_id / kCols;
164 const int col = room_id % kCols;
169 candidate = row > 0 ? room_id - kCols : -1;
172 candidate = room_id + kCols;
175 candidate = col > 0 ? room_id - 1 : -1;
178 candidate = col < kCols - 1 ? room_id + 1 : -1;
217 [
this](
int target_room, std::optional<size_t> target_door_index,
218 int target_tile_x,
int target_tile_y) {
220 if (target_tile_x >= 0 && target_tile_y >= 0) {
226 if (target_door_index.has_value()) {
236 void Draw(
int room_id);
241 const std::vector<zelda3::RoomObject>& previous_objects,
242 const std::vector<zelda3::RoomObject>& next_objects);
574 ? it->second.GetLayerBlendMode(layer)
580 uint8_t alpha = 128) {
687 std::vector<DungeonConnectedRoomLink>
links;
749 const std::string& summary,
750 const std::string& kind_label,
751 const std::string& diagnostics,
int room_id,
752 int default_category_index);
754 const std::string& summary,
755 const std::string& kind_label,
756 const std::string& diagnostics,
757 int room_id,
int default_category_index);
825 ImVec2(0x200, 0x200)};
874 std::function<void(
int,
int)>
912 std::unordered_map<int, DungeonRenderingHelpers::CollisionOverlayCache>
The Rom class is used to load, save, and modify Rom data. This is a generic SNES ROM container and do...
bool show_coordinate_overlay_
bool * mutable_show_track_collision_legend()
void RecordVisitedRoom(int room_id)
std::optional< zelda3::RoomObject > GetObjectUnderContextCursor(int room_id)
bool issue_report_popup_status_is_error_
void SetHeaderReadOnly(bool read_only)
gui::CanvasMenuItem BuildLayerVisibilityContextMenu(int room_id)
void SetCurrentPaletteId(uint64_t id)
int connected_graph_cache_start_room_id_
bool show_object_bounds() const
void PopulateCanvasContextMenu(int room_id)
void HandleRoomCanvasDropTargets(zelda3::Room &room, int room_id)
bool RoomHasNonExitDoorInDirection(int room_id, zelda3::DoorDirection dir)
const zelda3::RoomLayerManager & GetRoomLayerManager(int room_id) const
bool * mutable_show_camera_quadrant_overlay()
bool DrawRoomBackgroundLayers(int room_id)
void DrawChangePingOverlay(const gui::CanvasRuntime &canvas_rt, const zelda3::Room &room)
void SetShowEntranceListCallback(std::function< void()> callback)
gui::CanvasMenuItem BuildInsertContextMenu()
void ApplyTrackCollisionConfig()
std::string issue_report_popup_screenshot_dir_
bool show_custom_objects_overlay_
void DrawConnectedToolbarControls(int center_room_id)
std::vector< int > recently_visited_rooms_
void RefreshActiveRoomCanvasState(zelda3::Room &room, int room_id)
std::bitset< 256 > minecart_sprite_ids_
bool show_track_collision_legend_
void DrawLayerInfoWindow(int room_id)
zelda3::GameData * game_data_
gui::CanvasMenuItem BuildRoomContextMenu(int room_id)
std::vector< uint16_t > track_tile_order_
void ClearEntranceRenderContext()
gui::CanvasMenuItem BuildDebugContextMenu(int room_id)
friend class DungeonEditorPaletteRefreshTest_CachedRoomRefreshesThroughViewerCompositePreparation_Test
DungeonRoomStore * rooms() const
bool * mutable_show_texture_debug()
int issue_report_category_index_
int custom_grid_size() const
bool show_texture_debug() const
bool connected_side_panel_visible_last_frame_
bool AreSpritesVisible() const
void DrawRecentRoomBreadcrumbs(int room_id)
std::optional< std::pair< int, int > > pending_scroll_target_
bool * mutable_show_coordinate_overlay()
std::string connected_action_status_message_
bool has_canvas_capture_region_
bool show_minecart_tracks() const
ObjectOutlineToggles object_outline_toggles_
void MarkIssueReportDirty()
void SetLayerBlendMode(int room_id, zelda3::LayerType layer, zelda3::LayerBlendMode mode)
void SyncCanvasCaptureRegion(const gui::CanvasRuntime &canvas_rt)
std::vector< gui::CanvasMenuItem > BuildSelectionContextMenuItems(int room_id)
void SetEditorSystem(zelda3::DungeonEditorSystem *system)
bool show_camera_quadrant_overlay_
std::string issue_report_popup_status_message_
bool * mutable_show_layer_info()
int ApplyConnectedStaircaseIssueAutoFixes(int center_room_id)
void RenderPotItems(const gui::CanvasRuntime &rt, const zelda3::Room &room)
bool * mutable_show_grid()
std::optional< int > DrawConnectedRoomMatrix(int center_room_id)
absl::Status LoadAndRenderRoomGraphics(int room_id)
bool show_room_debug_info_
void set_show_layer_info(bool show)
void set_show_water_fill_overlay(bool show)
void DrawRoomNavigation(int room_id)
uint8_t current_entrance_blockset() const
bool IsBG1Visible(int room_id) const
void set_show_custom_collision_overlay(bool show)
int GetBG2LayerType(int room_id) const
bool connected_canvas_reset_requested_
void SetMinecartTrackPanel(MinecartTrackEditorPanel *panel)
void SetObjectTranslucent(int room_id, size_t object_index, bool translucent, uint8_t alpha=128)
bool HasPendingScrollTarget() const
int current_room_id() const
void SetShowItemPanelCallback(std::function< void()> callback)
std::function< void()> show_door_editor_callback_
void SetContext(EditorContext ctx)
void SetSpritesVisible(bool visible)
gui::CanvasMenuItem BuildOverlayContextMenu()
bool show_water_fill_overlay_
void SetRoomDetailsExpanded(bool expanded)
bool * mutable_show_minecart_tracks()
void SetPinned(bool pinned)
void SetCompactHeaderMode(bool compact)
void SetShowRoomGraphicsCallback(std::function< void()> callback)
EditorContext context() const
std::string issue_report_popup_id_
void set_show_track_collision_legend(bool show)
void DrawPersistentDebugWindows(int room_id)
void set_show_track_route_overlay(bool show)
std::string issue_report_popup_kind_
void set_custom_grid_size(int size)
void SetConnectedControlsInline(bool inline_controls)
void RefreshIssueReportOutputTargets()
void SetProject(const project::YazeProject *project)
std::string BuildIssueReportClipboardText() const
bool * mutable_show_track_collision_overlay()
bool show_track_gap_overlay() const
std::function< void(int, const zelda3::RoomObject &) edit_graphics_callback_)
void SyncCanvasConfigFromViewerState()
const DungeonRenderingHelpers::CollisionOverlayCache & GetCollisionOverlayCache(int room_id)
void set_show_custom_objects_overlay(bool show)
bool connected_action_status_is_error_
void set_show_texture_debug(bool show)
std::string issue_report_popup_screenshot_path_
int issue_report_popup_room_id_
void SetIssueReportPopupStatus(std::string message, bool is_error)
void set_active_rooms(const ImVector< int > &rooms)
void SetRenderer(gfx::IRenderer *renderer)
void SetEditGraphicsCallback(std::function< void(int, const zelda3::RoomObject &)> callback)
bool show_track_gap_overlay_
char issue_report_summary_[256]
void SetBG2LayerType(int room_id, int type)
zelda3::GameData * game_data() const
std::vector< uint16_t > switch_tile_order_
std::function< void()> show_entrance_list_callback_
bool object_interaction_enabled_
void SetHeaderVisible(bool visible)
bool show_custom_objects_overlay() const
float ConnectedCanvasScale() const
void SetCurrentPaletteGroup(const gfx::PaletteGroup &group)
bool show_custom_collision_overlay_
void DrawTextureDebugWindow(zelda3::Room &room, int room_id)
void set_show_track_collision_overlay(bool show)
zelda3::Room * EnsureRoomLoadedForConnectedView(int room_id)
void SetShowRoomListCallback(std::function< void()> callback)
int current_active_room_tab_
ConnectedRoomGraphData connected_graph_cache_
bool show_connected_current_room_preview_
bool show_track_collision_legend() const
bool compact_header_mode_
zelda3::Room * PrepareActiveRoomForCanvasFrame(int room_id)
DungeonCanvasViewer(Rom *rom=nullptr)
void RefreshRomBackedState(Rom *rom, zelda3::GameData *game_data, DungeonRoomStore *rooms, int room_id)
DungeonObjectInteraction object_interaction_
void SetObjectRenderMode(ObjectRenderMode mode)
void PrepareRoomStateForCanvas(zelda3::Room &room, int room_id)
void OpenIssueReportPopup(const std::string &title, const std::string &summary, const std::string &kind_label, const std::string &diagnostics, int room_id, int default_category_index)
uint64_t last_palette_hash_
void DrawRoomCanvasContent(const gui::CanvasRuntime &canvas_rt, zelda3::Room &room, int room_id)
double change_ping_start_time_
DungeonObjectInteraction & object_interaction()
absl::Status AppendIssueReportToLog()
void DrawRoomDebugWindow(zelda3::Room &room, int room_id)
ConnectedRoomGraphData BuildConnectedRoomGraph(int start_room_id)
void DrawCoordinateOverlayHud(int room_id)
ImVec2 connected_controls_custom_position_value_
void ClearPreviewObject()
friend class DungeonEditorPaletteRefreshTest_CachedCompositePreparationPreservesTargetEntranceContext_Test
std::string BuildRoomMetadataSummary(const zelda3::Room &room, int room_id) const
std::function< void()> show_room_list_callback_
void set_show_minecart_sprite_overlay(bool show)
void DrawIssueReportStatusMessage() const
bool compact_header_mode() const
bool show_coordinate_overlay() const
void TriggerCanvasPingRect(int pixel_x, int pixel_y, int pixel_w, int pixel_h)
bool * mutable_show_room_debug_info()
bool show_header_hidden_metadata_hud() const
void SetShowRoomMatrixCallback(std::function< void()> callback)
const project::YazeProject * project_
bool show_room_debug_info() const
bool show_track_collision_overlay() const
void SetRoomNavigationCallback(std::function< void(int)> callback)
void DrawCompactLayerToggles(int room_id)
int last_connected_matrix_room_id_
void SetHeaderHiddenMetadataHudVisible(bool visible)
gui::CanvasMenuItem BuildReportContextMenu(int room_id)
void SetShowSpritePanelCallback(std::function< void()> callback)
void SetPreviewObject(const zelda3::RoomObject &object)
std::function< void()> show_object_panel_callback_
std::function< void(bool)> pin_callback_
bool show_connected_overview_
std::optional< std::pair< int, int > > GetPendingScrollTarget() const
int current_entrance_id() const
void SetBG1Visible(int room_id, bool visible)
void SetBG2Visible(int room_id, bool visible)
ImVector< int > active_rooms_
bool IsLayerVisible(int room_id, zelda3::LayerType layer) const
bool show_minecart_sprite_overlay_
bool show_minecart_sprite_overlay() const
void AddLoadedRoomContextMenuItems(int room_id)
void DrawIssueReportStorageSummary() const
std::unordered_map< int, DungeonRenderingHelpers::CollisionOverlayCache > collision_overlay_cache_
void DrawLayerControls(zelda3::Room &room, int room_id)
bool IsObjectInteractionEnabled() const
bool header_read_only() const
absl::Status EnsureIssueReportPersisted()
void SetShowObjectPanelCallback(std::function< void()> callback)
void RenderSprites(const gui::CanvasRuntime &rt, const zelda3::Room &room)
gfx::Bitmap * PrepareRoomCompositeBitmap(int room_id)
uint64_t current_palette_id_
zelda3::RoomLayerManager & GetRoomLayerManager(int room_id)
uint8_t current_entrance_blockset_
ObjectRenderMode GetObjectRenderMode() const
bool show_water_fill_overlay() const
int canvas_capture_height_
bool track_direction_map_enabled_
std::string issue_report_popup_diagnostics_
void set_current_palette_group_id(uint64_t id)
gfx::PaletteGroup current_palette_group_
bool show_track_route_overlay_
bool show_camera_quadrant_overlay() const
void DrawMaskHighlights(const gui::CanvasRuntime &rt, const zelda3::Room &room)
void set_show_object_bounds(bool show)
void AddInteractionContextMenuItems(int room_id)
void TriggerObjectChangePing(const std::vector< zelda3::RoomObject > &previous_objects, const std::vector< zelda3::RoomObject > &next_objects)
bool ValidateRoomCanvasRequest(int room_id)
gui::CanvasFrameOptions BuildRoomCanvasFrameOptions() const
bool CanNavigateRooms() const
uint64_t current_palette_group_id_
DungeonRoomStore * rooms_
std::string BuildDrawIssueReport(const zelda3::Room &room, int room_id) const
void SetObjectInteractionEnabled(bool enabled)
void SetEntranceRenderContext(int entrance_id, uint8_t entrance_blockset)
gfx::IRenderer * renderer_
absl::Status PrepareIssueReportPopup(const std::string &title, const std::string &summary, const std::string &kind_label, const std::string &diagnostics, int room_id, int default_category_index)
ImVec2 GetConnectedContentSize(int center_room_id)
void set_show_coordinate_overlay(bool show)
std::function< void()> show_dungeon_settings_callback_
void SetRoomSwapCallback(std::function< void(int, int)> callback)
bool connected_controls_inline_
bool connected_canvas_initialized_
const project::YazeProject * project() const
void set_show_room_debug_info(bool show)
bool issue_report_popup_persisted_
void set_show_minecart_tracks(bool show)
std::function< void()> show_room_matrix_callback_
gui::CanvasTouchHandler touch_handler_
EntityVisibility entity_visibility_
void ScrollToTile(int tile_x, int tile_y)
bool connected_controls_custom_position_
friend class DungeonCanvasViewerTestPeer
void NavigateToRoom(int target_room)
zelda3::LayerBlendMode GetLayerBlendMode(int room_id, zelda3::LayerType layer) const
bool IsBG2Visible(int room_id) const
std::function< void()> show_room_graphics_callback_
void ConsumePendingCanvasScroll(const gui::CanvasRuntime &canvas_rt)
bool * mutable_show_object_bounds()
void SetSaveRoomCallback(std::function< void(int)> callback)
void set_current_active_room_tab(int tab)
bool show_track_route_overlay() const
absl::Status CaptureIssueReportScreenshot()
void set_show_track_gap_overlay(bool show)
void DrawDungeonCanvas(int room_id)
void DrawRoomHeader(zelda3::Room &room, int room_id)
gui::Canvas connected_canvas_
void set_show_camera_quadrant_overlay(bool show)
std::function< void(int)> room_navigation_callback_
char issue_report_notes_[2048]
void RenderEntityOverlay(const gui::CanvasRuntime &rt, const zelda3::Room &room)
bool * mutable_show_custom_collision_overlay()
std::function< void()> show_item_panel_callback_
void SyncViewerStateFromCanvasConfig()
std::map< int, zelda3::RoomLayerManager > room_layer_managers_
std::vector< ObjectRenderCache > object_render_cache_
void DisplayObjectInfo(const gui::CanvasRuntime &rt, const zelda3::RoomObject &object, int canvas_x, int canvas_y)
bool show_minecart_tracks_
std::string issue_report_popup_last_log_path_
std::function< void()> show_sprite_panel_callback_
bool ArePotItemsVisible() const
std::function< void(int, int)> room_swap_callback_
ObjectRenderMode object_render_mode_
DungeonRenderingHelpers::TrackCollisionConfig track_collision_config_
void SetLayerVisible(int room_id, zelda3::LayerType layer, bool visible)
bool header_visible() const
std::string issue_report_popup_log_target_path_
void SetPotItemsVisible(bool visible)
void DrawObjectPositionOutlines(const gui::CanvasRuntime &rt, const zelda3::Room &room)
std::optional< gui::CanvasMenuItem > BuildOpenContextMenu()
bool show_layer_info() const
void DrawRoomPropertyTable(zelda3::Room &room, int room_id)
void HandleTouchLongPressContextMenu(const gui::CanvasRuntime &rt, const zelda3::Room &room)
void SetShowDungeonSettingsCallback(std::function< void()> callback)
void DeleteSelectedObjects()
void SetRooms(DungeonRoomStore *rooms)
MinecartTrackEditorPanel * minecart_track_panel_
bool * mutable_show_minecart_sprite_overlay()
int canvas_capture_width_
std::vector< ChangePingRect > change_ping_rects_
bool connected_canvas_fit_requested_
bool show_custom_collision_overlay() const
std::string issue_report_popup_title_
void DrawHeaderHiddenMetadataHud(int room_id)
void DrawRoomCanvasOverlays(const gui::CanvasRuntime &rt, zelda3::Room &room, int room_id)
std::string BuildSelectionIssueReport(const zelda3::Room &room, int room_id) const
void set_show_grid(bool show)
const gui::Canvas & canvas() const
gui::CanvasMenuItem BuildCopyExportContextMenu(int room_id)
void SetGameData(zelda3::GameData *game_data)
void SetShowDoorEditorCallback(std::function< void()> callback)
void SetPinCallback(std::function< void(bool)> callback)
std::function< void(int)> save_room_callback_
bool show_track_collision_overlay_
bool show_header_hidden_metadata_hud_
Handles object selection, placement, and interaction within the dungeon canvas.
void HandleDeleteSelected()
void SetCurrentPaletteGroup(const gfx::PaletteGroup &group)
void SetDoorPairNavigationCallback(std::function< void(int, std::optional< size_t >, int, int)> callback)
SelectedEntity GetSelectedEntity() const
void SetEditorSystem(zelda3::DungeonEditorSystem *system)
std::vector< size_t > GetSelectedObjectIndices() const
bool HasEntitySelection() const
void SelectEntity(EntityType type, size_t index)
void SetPreviewObject(const zelda3::RoomObject &object, bool loaded)
Represents a bitmap image optimized for SNES ROM hacking.
Defines an abstract interface for all rendering operations.
Handles touch input integration for Canvas.
Modern, robust canvas for drawing and manipulating graphics.
Core dungeon editing system.
RoomLayerManager - Manages layer visibility and compositing.
void SetLayerBlendMode(LayerType layer, LayerBlendMode mode)
void SetLayerVisible(LayerType layer, bool visible)
void SetObjectTranslucency(size_t object_index, bool translucent, uint8_t alpha=128)
std::string FormatDungeonConnectedLinkDescription(const DungeonConnectedRoomLink &link)
int NeighborRoomId(int room_id, zelda3::DoorDirection dir)
DungeonConnectedRoomLinkDiagnostics CollectDungeonConnectedRoomLinkDiagnostics(int room_id, const zelda3::Room &room, const std::function< bool(int, zelda3::DoorDirection)> &has_reciprocal_door)
DungeonStaircaseIssueKind
const char * GetIssueCategoryLabel(int index)
constexpr std::array< const char *, 6 > kDungeonIssueCategoryLabels
zelda3::DoorDirection OppositeDir(zelda3::DoorDirection dir)
DungeonIssueCategory GetDefaultSelectionIssueCategory(const DungeonObjectInteraction &object_interaction)
ObjectRenderMode
Handles the main dungeon canvas rendering and interaction.
constexpr int ToIssueCategoryIndex(DungeonIssueCategory category)
std::vector< DungeonConnectedRoomLink > CollectDungeonConnectedRoomLinks(int room_id, const zelda3::Room &room, const std::function< bool(int, zelda3::DoorDirection)> &has_reciprocal_door)
std::string FormatDungeonStaircaseIssueDescription(const DungeonStaircaseIssue &issue)
@ GeneralRoomRenderMismatch
@ OverlayCollisionMismatch
DoorType
Door types from ALTTP.
@ NormalDoor
Normal door (upper layer)
LayerBlendMode
Layer blend modes for compositing.
LayerType
Layer types for the 4-way visibility system.
constexpr int kNumberOfRooms
DoorDirection
Door direction on room walls.
@ South
Bottom wall (horizontal door, 4x3 tiles)
@ North
Top wall (horizontal door, 4x3 tiles)
@ East
Right wall (vertical door, 3x4 tiles)
@ West
Left wall (vertical door, 3x4 tiles)
std::array< RoomPlacement, zelda3::kNumberOfRooms > room_positions
std::array< std::string, zelda3::kNumberOfRooms > room_floor_labels
bool dungeon_scope_active
std::array< bool, zelda3::kNumberOfRooms > room_mask
std::vector< DungeonConnectedRoomLink > out_of_scope_links
std::vector< DungeonStaircaseIssue > staircase_issues
std::vector< std::string > floor_order
std::vector< DungeonConnectedRoomLink > links
gfx::Bitmap rendered_bitmap
std::vector< DungeonConnectedRoomLink > links
std::vector< DungeonStaircaseIssue > staircase_issues
zelda3::DoorDirection direction
zelda3::DoorType door_type
DungeonConnectedLinkType type
DungeonStaircaseIssueKind kind
Lightweight view into the essential runtime context (Rom + GameData)
zelda3::GameData * game_data
Represents a group of palettes.
Modern project structure with comprehensive settings consolidation.