1#ifndef YAZE_APP_EDITOR_DUNGEON_DUNGEON_CANVAS_VIEWER_H
2#define YAZE_APP_EDITOR_DUNGEON_DUNGEON_CANVAS_VIEWER_H
12#include <unordered_map>
31#include "imgui/imgui.h"
51class MinecartTrackEditorPanel;
52class DungeonCanvasViewerTestPeer;
99 std::vector<DungeonConnectedRoomLink>
links;
114 "Object draw mismatch",
115 "Door render mismatch",
117 "Overlay or collision mismatch",
118 "General room render mismatch",
122 return static_cast<int>(category);
140 case EntityType::Door:
142 case EntityType::Sprite:
143 case EntityType::Item:
167 const DungeonConnectedRoomLink& link);
172 const DungeonStaircaseIssue& issue);
181 constexpr int kCols = 16;
182 const int row = room_id / kCols;
183 const int col = room_id % kCols;
188 candidate = row > 0 ? room_id - kCols : -1;
191 candidate = room_id + kCols;
194 candidate = col > 0 ? room_id - 1 : -1;
197 candidate = col < kCols - 1 ? room_id + 1 : -1;
236 [
this](
int target_room, std::optional<size_t> target_door_index,
237 int target_tile_x,
int target_tile_y) {
238 if (target_door_index &&
243 bool focused_target_door =
false;
244 if (target_door_index.has_value() &&
rooms_ !=
nullptr) {
246 if (target !=
nullptr &&
247 *target_door_index < target->GetDoors().size()) {
248 const auto [x, y, width, height] =
249 target->
GetDoors()[*target_door_index].GetEditorBounds();
250 ScrollToTile((x + width / 2) / 8, (y + height / 2) / 8);
254 focused_target_door =
true;
257 if (!focused_target_door && target_tile_x >= 0 &&
258 target_tile_y >= 0) {
261 }
else if (!focused_target_door) {
267 const auto semantics =
274 switch (semantics.effective_bg_layer) {
293 const std::vector<char>& layer_visible,
294 bool show_overlay,
float scale);
298 void Draw(
int room_id);
304 std::function<absl::Status(
const std::vector<RoomMetadataRequest>&)>;
306 std::function<absl::Status(
int,
size_t, uint8_t,
bool)>;
309 std::function<absl::StatusOr<DungeonConnectionPlan>(
334 std::function<
void(
int,
size_t)> callback) {
351 std::function<absl::StatusOr<std::string>(
int)>;
353 std::function<absl::StatusOr<DungeonRoomTransferPlan>(
366 int source_room_id,
const std::string& json,
374 const std::vector<RoomMetadataRequest>& requests);
375 absl::Status
EditChest(
int room_id,
size_t index, uint8_t item_id,
377 absl::Status
DeleteChest(
int room_id,
size_t index);
386 const std::vector<zelda3::RoomObject>& previous_objects,
387 const std::vector<zelda3::RoomObject>& next_objects);
469 bool force_refresh =
false) {
472 for (
int i = 0; !palette_changed && i < static_cast<int>(group.
size());
477 if (!palette_changed && !force_refresh) {
745 ? it->second.manager.IsLayerVisible(layer)
784 ? it->second.manager.GetLayerBlendMode(layer)
790 uint8_t alpha = 128) {
876 return ImGui::GetCurrentContext() !=
nullptr &&
880 return ImGui::GetCurrentContext() !=
nullptr &&
913 std::vector<DungeonConnectedRoomLink>
links;
970 int room_id, std::optional<zelda3::RoomObject> context_object);
985 const std::string& summary,
986 const std::string& kind_label,
987 const std::string& diagnostics,
int room_id,
988 int default_category_index);
990 const std::string& summary,
991 const std::string& kind_label,
992 const std::string& diagnostics,
993 int room_id,
int default_category_index);
1075 ImVec2(0x200, 0x200)};
1124 std::optional<std::pair<zelda3::LayerMergeType, zelda3::EffectKey>>
1144 std::function<void(
int,
int)>
1214 std::unordered_map<int, DungeonRenderingHelpers::CollisionOverlayCache>
1278 "Report Dungeon Issue##DungeonIssueReportPopup";
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::function< absl::StatusOr< DungeonConnectionPlan >( const DungeonConnectionRequest &)> DoorConnectionPreviewCallback
RoomTransferPreviewCallback room_transfer_preview_callback_
friend class DungeonEditorPaletteRefreshTestPeer
std::optional< zelda3::RoomObject > GetObjectUnderContextCursor(int room_id)
bool issue_report_popup_status_is_error_
void SetCheckObjectCoverageCallback(std::function< void(int, const zelda3::RoomObject &)> callback)
void SetHeaderReadOnly(bool read_only)
gui::CanvasMenuItem BuildLayerVisibilityContextMenu(int room_id)
void SetCurrentPaletteId(uint64_t id)
void SetChestEditCallback(ChestEditCallback callback)
int connected_graph_cache_start_room_id_
bool CanNavigateDoorConnectionTarget() const
void PruneConnectedRoomCompositeOutputs()
bool show_object_bounds() const
void PopulateCanvasContextMenu(int room_id)
float room_viewport_last_scale_
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)
std::function< absl::Status(int, size_t)> ChestDeleteCallback
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_
DungeonRoomTransferEditorState room_transfer_state_
void DrawConnectedToolbarControls(int center_room_id)
void SetMetadataBatchEditCallback(MetadataBatchEditCallback callback)
void set_show_crumble_floor(bool show)
std::vector< int > recently_visited_rooms_
std::function< absl::Status(const std::vector< RoomMetadataRequest > &)> MetadataBatchEditCallback
void RefreshActiveRoomCanvasState(zelda3::Room &room, int room_id)
std::bitset< 256 > minecart_sprite_ids_
gfx::Bitmap * PrepareConnectedRoomCompositeBitmap(int room_id)
bool show_track_collision_legend_
std::function< void(int, size_t)> door_connection_navigation_callback_
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 SetDoorConnectionCallbacks(DoorConnectionPreviewCallback preview, DoorConnectionApplyCallback apply)
std::string BuildDrawIssueReport(const zelda3::Room &room, int room_id)
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_
std::function< void(int, const zelda3::RoomObject &) check_object_coverage_callback_)
ChestDeleteCallback chest_delete_callback_
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_
absl::Status ApplyRoomTransfer(const DungeonRoomTransferPlan &plan)
std::string issue_report_popup_status_message_
bool * mutable_show_layer_info()
int ApplyConnectedStaircaseIssueAutoFixes(int center_room_id)
absl::StatusOr< std::string > ExportRoomDocument(int room_id)
void RenderPotItems(const gui::CanvasRuntime &rt, const zelda3::Room &room)
bool * mutable_show_grid()
RoomTransferApplyCallback room_transfer_apply_callback_
std::optional< int > DrawConnectedRoomMatrix(int center_room_id)
absl::Status LoadAndRenderRoomGraphics(int room_id)
bool show_room_debug_info_
gfx::Bitmap * PrepareRoomCompositeWithOutput(int room_id, RoomCompositeOutput &output)
void set_show_layer_info(bool show)
int connected_composite_prune_frame_
DungeonChestEditorState & chest_editor_state()
void set_show_water_fill_overlay(bool show)
void DrawRoomNavigation(int room_id)
DoorConnectionPreviewCallback door_connection_preview_callback_
uint8_t current_entrance_blockset() const
ChestEditCallback chest_edit_callback_
void UpdateRoomCanvasShortcutFocus(bool hovered, bool pointer_pressed, int frame_index)
bool IsBG1Visible(int room_id) const
void set_show_custom_collision_overlay(bool show)
CrumbleFloorView crumble_floor_view_
std::function< absl::Status(int, size_t, uint8_t, bool)> ChestEditCallback
int GetBG2LayerType(int room_id) const
bool connected_canvas_reset_requested_
friend class DungeonEditorPaletteRefreshTest_DungeonMainNotificationSkipsUnrelatedCachedViewerWork_Test
void SetMinecartTrackPanel(MinecartTrackEditorPanel *panel)
absl::Status ApplyDoorConnection(const DungeonConnectionPlan &plan)
void SetObjectTranslucent(int room_id, size_t object_index, bool translucent, uint8_t alpha=128)
RoomDocumentExportCallback room_document_export_callback_
absl::Status EditRoomMetadataBatch(const std::vector< RoomMetadataRequest > &requests)
void SetRoomTransferCallbacks(RoomDocumentExportCallback export_document, RoomTransferPreviewCallback preview, RoomTransferApplyCallback apply)
bool HasPendingScrollTarget() const
RoomCompositeOutput primary_composite_output_
int current_room_id() const
void SetShowItemPanelCallback(std::function< void()> callback)
std::function< void()> show_door_editor_callback_
MinecartCanvasTool minecart_canvas_tool_
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)
std::function< void(int, const zelda3::RoomObject &) edit_object_tiles_callback_)
void RefreshIssueReportOutputTargets()
zelda3::SpritePreviewResourceCache sprite_preview_resources_
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)
std::map< int, ConnectedRoomCompositeEntry > connected_composite_outputs_
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_
DungeonChestEditorState chest_editor_state_
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::optional< DungeonEntranceCameraState > entrance_camera_overlay_
friend class DungeonEditorPaletteRefreshTest_CachedPanelPaletteRefreshSurvivesWorkbenchModeAndPreservesRoomPalette_Test
DungeonConnectionEditorState & connection_editor_state()
std::vector< uint16_t > switch_tile_order_
std::function< void()> show_entrance_list_callback_
bool object_interaction_enabled_
bool DrawCrumbleCanvas(const gui::CanvasRuntime &rt)
const std::optional< DungeonEntranceCameraState > & entrance_camera_overlay() const
void SetHeaderVisible(bool visible)
bool show_custom_objects_overlay() const
float ConnectedCanvasScale() const
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_
friend class DungeonRoomEditsTestPeer
absl::Status EditRoomMetadata(int room_id, const RoomMetadataEdit &edit)
absl::StatusOr< DungeonConnectionPlan > PreviewDoorConnection(const DungeonConnectionRequest &request)
bool show_connected_current_room_preview_
bool DrawMinecartCanvas(const gui::CanvasRuntime &rt, zelda3::Room &room, int room_id)
bool show_track_collision_legend() const
void SetEntranceBlocksetResolver(std::function< uint8_t(int)> resolver)
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()
bool room_viewport_auto_fit_
absl::Status AppendIssueReportToLog()
void ResetRoomCompositeOutputs()
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
bool room_canvas_shortcut_focus_
std::function< void()> show_room_list_callback_
void SetChestDeleteCallback(ChestDeleteCallback 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()
absl::Status EditChest(int room_id, size_t index, uint8_t item_id, bool big_chest)
bool show_header_hidden_metadata_hud() const
void SetShowRoomMatrixCallback(std::function< void()> callback)
const project::YazeProject * project_
MinecartCollisionTool minecart_collision_tool_
bool show_room_debug_info() const
bool show_track_collision_overlay() const
void SetChestContentsVisible(bool visible)
std::function< uint8_t(int)> entrance_blockset_resolver_
bool NavigateToDoorConnectionTarget(int room_id, size_t door_index)
DoorConnectionApplyCallback door_connection_apply_callback_
void SetRoomNavigationCallback(std::function< void(int)> callback)
void DrawCompactLayerToggles(int room_id)
int last_connected_matrix_room_id_
absl::StatusOr< DungeonRoomTransferPlan > PreviewRoomTransfer(int source_room_id, const std::string &json, const DungeonRoomTransferOptions &options)
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 UpdateRoomCanvasViewport(ImVec2 viewport_size)
void SetBG1Visible(int room_id, bool visible)
void SetBG2Visible(int room_id, bool visible)
ImVector< int > active_rooms_
void ClearEntranceCameraOverlay()
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)
std::function< absl::Status(const DungeonConnectionPlan &)> DoorConnectionApplyCallback
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::function< absl::Status(int, const RoomMetadataEdit &)> MetadataEditCallback
std::string issue_report_popup_diagnostics_
void set_current_palette_group_id(uint64_t id)
gfx::PaletteGroup current_palette_group_
std::function< absl::StatusOr< DungeonRoomTransferPlan >( int, int, const std::string &, const DungeonRoomTransferOptions &)> RoomTransferPreviewCallback
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_
void SetMetadataEditCallback(MetadataEditCallback callback)
friend class DungeonCanvasCrumbleTestPeer
DungeonRoomStore * rooms_
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)
util::LruCache< SpritePreviewKey, CachedSpritePreview > sprite_preview_cache_
void RenderChestContents(const gui::CanvasRuntime &rt, const zelda3::Room &room)
bool HasRoomCanvasShortcutFocusForFrame(int frame_index) const
ImVec2 GetConnectedContentSize(int center_room_id)
absl::Status DeleteChest(int room_id, size_t index)
void set_show_coordinate_overlay(bool show)
std::function< void()> show_dungeon_settings_callback_
bool AreChestContentsVisible() const
void SetRoomSwapCallback(std::function< void(int, int)> callback)
MetadataBatchEditCallback metadata_batch_edit_callback_
bool connected_controls_inline_
bool connected_canvas_initialized_
DungeonRoomTransferEditorState & room_transfer_state()
const project::YazeProject * project() const
void set_show_room_debug_info(bool show)
bool issue_report_popup_persisted_
void SetEditObjectTilesCallback(std::function< void(int, const zelda3::RoomObject &)> callback)
void set_show_minecart_tracks(bool show)
std::function< void()> show_room_matrix_callback_
int camera_overlay_entrance_slot_
gui::CanvasTouchHandler touch_handler_
EntityVisibility entity_visibility_
void InvalidateConnectedRoomGraph()
void ScrollToTile(int tile_x, int tile_y)
void CancelMinecartGesture()
bool connected_controls_custom_position_
MetadataEditCallback metadata_edit_callback_
friend class DungeonCanvasViewerTestPeer
void NavigateToRoom(int target_room)
void SetDoorConnectionNavigationCallback(std::function< void(int, size_t)> callback)
std::function< absl::Status(const DungeonRoomTransferPlan &)> RoomTransferApplyCallback
DungeonConnectionEditorState connection_editor_state_
std::function< absl::StatusOr< std::string >(int)> RoomDocumentExportCallback
int room_canvas_last_draw_frame_
bool minecart_owned_input_
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)
ImVec2 GetProposalPreviewContentSize(const DungeonProposalOverlay &overlay, float scale) const
friend class DungeonRoomTransferEditorTestPeer
void SetCurrentPaletteGroup(const gfx::PaletteGroup &group, bool force_refresh=false)
bool show_track_route_overlay() const
absl::Status CaptureIssueReportScreenshot()
void DrawProposalPreview(const DungeonProposalOverlay &overlay, const std::vector< char > &layer_visible, bool show_overlay, float scale)
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::vector< ObjectRenderCache > object_render_cache_
void DisplayObjectInfo(const gui::CanvasRuntime &rt, const zelda3::RoomObject &object, int canvas_x, int canvas_y)
std::tuple< uint64_t, uint8_t, int, bool > SpritePreviewKey
bool show_minecart_tracks_
std::string issue_report_popup_last_log_path_
std::function< void()> show_sprite_panel_callback_
bool ArePotItemsVisible() const
bool OwnsRoomNavigationShortcutFocus() 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
friend class DungeonCanvasMinecartTestPeer
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 SetEntranceCameraOverlay(int entrance_slot, const DungeonEntranceCameraState &state)
void SetRooms(DungeonRoomStore *rooms)
MinecartTrackEditorPanel * minecart_track_panel_
bool * mutable_show_minecart_sprite_overlay()
int canvas_capture_width_
void HandleRoomCanvasNavigation(gui::CanvasRuntime &canvas_rt)
std::vector< ChangePingRect > change_ping_rects_
bool CanHandleRoomCanvasShortcut() const
bool connected_canvas_fit_requested_
bool show_custom_collision_overlay() const
void InvalidateExternalSpriteResources()
std::string issue_report_popup_title_
bool show_crumble_floor() const
std::map< int, RoomLayerState > room_layer_managers_
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 SetObjectSelectionVisibilityPredicate(std::function< bool(int, const zelda3::RoomObject &)> predicate)
absl::Status HandleDeleteSelected()
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
void SetCurrentPaletteGroup(const gfx::PaletteGroup &group, bool force_refresh=false)
bool HasEntitySelection() const
void SelectEntity(EntityType type, size_t index)
void SetPreviewObject(const zelda3::RoomObject &object, bool loaded)
zelda3::Room * TryEnsureRoom(int room_id)
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)
const std::vector< Door > & GetDoors() const
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.
ObjectLayerSemantics GetEffectiveObjectLayerSemantics(const RoomObject &object)
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::vector< uint8_t > pixels
std::unique_ptr< RoomCompositeOutput > output
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::optional< std::pair< zelda3::LayerMergeType, zelda3::EffectKey > > room_settings
zelda3::RoomLayerManager manager
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.
const SnesPalette & palette_ref(int i) const
Modern project structure with comprehensive settings consolidation.