6#define IM_PI 3.14159265358979323846f
14#include "absl/status/status.h"
15#include "absl/strings/str_format.h"
16#include "imgui/imgui.h"
92 bool show_context_menu =
163 if (canvas_rt.hovered) {
175 ImGui::IsMouseClicked(ImGuiMouseButton_Left)) {
178 if (hovered_entity->entity_type_ ==
191 ImGui::IsMouseDragging(ImGuiMouseButton_Left)) {
192 ImGui::SetMouseCursor(ImGuiMouseCursor_Hand);
193 ImVec2 mouse_delta = ImGui::GetIO().MouseDelta;
194 float scale = canvas_rt.scale;
203 ImGui::IsMouseReleased(ImGuiMouseButton_Left)) {
205 float end_scale = canvas_rt.scale;
250 for (
int i = 0; i < 0x40; i++) {
254 if (world_index < 0 ||
281 ImDrawList* draw_list = ImGui::GetWindowDrawList();
285 ImVec2 placeholder_pos = ImVec2(canvas_pos.x + scrolling.x + map_x,
286 canvas_pos.y + scrolling.y + map_y);
289 ImVec2 placeholder_size = ImVec2(scaled_size, scaled_size);
293 draw_list->AddRectFilled(
295 ImVec2(placeholder_pos.x + placeholder_size.x,
296 placeholder_pos.y + placeholder_size.y),
298 theme.editor_background));
301 ImVec2 spinner_pos = ImVec2(placeholder_pos.x + placeholder_size.x / 2,
302 placeholder_pos.y + placeholder_size.y / 2);
304 const float spinner_radius = 8.0f * scale;
305 const float rotation =
static_cast<float>(ImGui::GetTime()) * 3.0f;
306 const float start_angle = rotation;
307 const float end_angle = rotation +
IM_PI * 1.5f;
309 draw_list->PathArcTo(spinner_pos, spinner_radius, start_angle, end_angle,
311 draw_list->PathStroke(ImGui::GetColorU32(theme.status_active), 0,
342 "OwBlocksetSelector", selector_config);
349 auto open_tile16_editor = [
this](
int tile_id) {
352 const size_t session_id =
363 edit_tile_item.
shortcut =
"Double-click";
368 edit_tile_item.
callback = [
this, open_tile16_editor]() {
379 "##Tile16SelectorScrollRegion",
394 if (result.selection_changed) {
402 if (result.tile_double_clicked) {
403 open_tile16_editor(result.selected_tile);
408 return absl::OkStatus();
427 int offset = 0x40 * (key + 1);
428 int top_left_y = canvas_rt.canvas_p0.y + 2;
430 top_left_y = canvas_rt.canvas_p0.y + 0x40 * key;
432 auto texture = value.texture();
433 canvas_rt.draw_list->AddImage(
434 (ImTextureID)(intptr_t)texture,
435 ImVec2(canvas_rt.canvas_p0.x + 2, top_left_y),
436 ImVec2(canvas_rt.canvas_p0.x + 0x100,
437 canvas_rt.canvas_p0.y + offset));
456 return absl::FailedPreconditionError(
457 "Current overworld map not loaded");
460 auto bmp = std::make_unique<gfx::Bitmap>();
497 return absl::OkStatus();
502 ImGui::TextWrapped(tr(
"ZSCustomOverworld v3 settings"));
510 const uint8_t asm_version =
512 ImGui::Text(tr(
"ASM Version: 0x%02X"), asm_version);
514 if (asm_version == 0x00 || asm_version == 0xFF || asm_version < 0x03) {
516 ImGui::TextColored(ImVec4(1.0f, 0.75f, 0.25f, 1.0f),
517 tr(
"v3 controls require ZSCustomOverworld v3+"));
518 ImGui::TextDisabled(tr(
"Apply the v3 patch to enable map-size editing."));
524 ImGui::TextDisabled(tr(
"Current map is unavailable."));
530 ImGui::Text(tr(
"Parent map: 0x%02X"), map->parent());
532 static int selected_area_size = 0;
533 selected_area_size =
static_cast<int>(map->area_size());
534 const char* area_size_labels[] = {
"Small",
"Wide",
"Tall",
"Large"};
535 ImGui::SetNextItemWidth(220.0f);
536 ImGui::Combo(tr(
"Area Size"), &selected_area_size, area_size_labels,
537 IM_ARRAYSIZE(area_size_labels));
550 tr(
"Area-size changes update sibling map relationships for this parent "
556 static bool show_custom_bg_color_editor =
false;
557 static bool show_overlay_editor =
false;
562 show_custom_bg_color_editor, show_overlay_editor);
566 if (show_custom_bg_color_editor) {
567 ImGui::OpenPopup(
"CustomBGColorEditor");
568 show_custom_bg_color_editor =
false;
570 if (show_overlay_editor) {
571 ImGui::OpenPopup(
"OverlayEditor");
572 show_overlay_editor =
false;
575 if (ImGui::BeginPopup(
"CustomBGColorEditor")) {
583 if (ImGui::BeginPopup(
"OverlayEditor")) {
586 show_overlay_editor);
593 static bool init_properties =
false;
595 if (!init_properties) {
596 for (
int i = 0; i < 0x40; i++) {
597 std::string area_graphics_str = absl::StrFormat(
601 ->push_back(area_graphics_str);
603 area_graphics_str = absl::StrFormat(
608 ->push_back(area_graphics_str);
610 std::string area_palette_str = absl::StrFormat(
614 ->push_back(area_palette_str);
616 area_palette_str = absl::StrFormat(
620 ->push_back(area_palette_str);
622 std::string sprite_gfx_str = absl::StrFormat(
626 ->push_back(sprite_gfx_str);
628 sprite_gfx_str = absl::StrFormat(
632 ->push_back(sprite_gfx_str);
634 sprite_gfx_str = absl::StrFormat(
639 ->push_back(sprite_gfx_str);
641 sprite_gfx_str = absl::StrFormat(
646 ->push_back(sprite_gfx_str);
648 std::string sprite_palette_str = absl::StrFormat(
652 ->push_back(sprite_palette_str);
654 sprite_palette_str = absl::StrFormat(
658 ->push_back(sprite_palette_str);
660 sprite_palette_str = absl::StrFormat(
665 ->push_back(sprite_palette_str);
667 sprite_palette_str = absl::StrFormat(
672 ->push_back(sprite_palette_str);
674 init_properties =
true;
677 ImGui::Text(tr(
"Area Gfx LW/DW"));
685 ImGui::Text(tr(
"Sprite Gfx LW/DW"));
687 ImVec2(256, 256), 32,
691 ImVec2(256, 256), 32,
695 ImVec2(256, 256), 32,
699 ImVec2(256, 256), 32,
703 ImGui::Text(tr(
"Area Pal LW/DW"));
710 static bool show_gfx_group =
false;
711 ImGui::Checkbox(tr(
"Show Gfx Group Editor"), &show_gfx_group);
712 if (show_gfx_group) {
void set_dirty(bool dirty)
EditorDependencies dependencies_
absl::Status DrawTile16Selector()
Draw the tile16 selector panel.
OverworldCanvasRenderer(OverworldEditor *editor)
absl::Status DrawAreaGraphics()
Draw the area graphics panel.
void DrawMapProperties()
Draw the map properties panel (sidebar-based)
void DrawOverworldProperties()
Draw the overworld properties grid (debug/info view)
OverworldEditor * editor_
Non-owning pointer to the parent editor.
void DrawOverworldCanvas()
Draw the main overworld canvas with toolbar, maps, and entities. This is the primary entry point call...
void DrawV3Settings()
Draw the v3 settings panel.
void DrawTile8Selector()
Draw the tile8 selector panel (graphics bin)
void DrawOverworldMaps()
Render the 64 overworld map bitmaps to the canvas.
Main UI class for editing overworld maps in A Link to the Past.
std::unique_ptr< MapPropertiesSystem > map_properties_system_
void HandleMapInteraction()
bool map_blockset_loaded_
absl::Status CheckForCurrentMap()
Check for map changes and refresh if needed.
void RequestTile16Selection(int tile_id)
gfx::Tilemap tile16_blockset_
gui::Canvas ow_map_canvas_
ScratchSpace scratch_space_
zelda3::GameEntity * dragged_entity_
std::array< gfx::Bitmap, zelda3::kNumOverworldMaps > maps_bmp_
bool show_map_properties_panel_
void RefreshOverworldMap()
void CheckForOverworldEdits()
Check for tile edits - delegates to TilePaintingManager.
void RefreshSiblingMapGraphics(int map_index, bool include_self=false)
gui::Canvas current_gfx_canvas_
bool show_overlay_editor_
std::unique_ptr< OverworldSidebar > sidebar_
void HandleOverworldPan()
bool dragged_entity_free_movement_
bool NormalizeCurrentSelectionState()
Clamp and synchronize stale map/world selection before panels draw.
gui::Canvas blockset_canvas_
void UpdateBlocksetSelectorState()
std::unique_ptr< OverworldEntityRenderer > entity_renderer_
void EnsureMapTexture(int map_index)
Ensure a specific map has its texture created.
EntityEditMode entity_edit_mode_
std::unique_ptr< OverworldToolbar > toolbar_
GfxGroupEditor gfx_group_editor_
std::unique_ptr< gui::TileSelectorWidget > blockset_selector_
bool show_overlay_preview_
gui::Canvas graphics_bin_canvas_
gfx::BitmapTable current_graphics_set_
bool show_custom_bg_color_editor_
zelda3::Overworld overworld_
void HandleOverworldZoom()
gui::Canvas properties_canvas_
gfx::SnesPalette palette_
bool SelectItemByIdentity(const zelda3::OverworldItem &item_identity)
Select an overworld item using value identity matching.
size_t GetActiveSessionId() const
bool OpenWindow(size_t session_id, const std::string &base_window_id)
void MarkWindowRecentlyUsed(const std::string &window_id)
void QueueTextureCommand(TextureCommandType type, Bitmap *bitmap)
std::array< gfx::Bitmap, 223 > & gfx_sheets()
Get reference to all graphics sheets.
Represents a bitmap image optimized for SNES ROM hacking.
void set_scrolling(ImVec2 scroll)
void DrawBitmap(Bitmap &bitmap, int border_offset, float scale)
auto global_scale() const
auto select_rect_active() const
void SetUsageMode(CanvasUsage usage)
auto selected_tiles() const
void UpdateInfoGrid(ImVec2 bg_size, float grid_size=64.0f, int label_id=0)
bool DrawTileSelector(int size, int size_y=0)
void ClearContextMenuItems()
auto mutable_labels(int i)
void AddContextMenuItem(const gui::CanvasMenuItem &item)
virtual void UpdateMapProperties(uint16_t map_id, const void *context=nullptr)=0
Update entity properties based on map position.
enum yaze::zelda3::GameEntity::EntityType entity_type_
auto overworld_map(int i) const
absl::Status EnsureMapBuilt(int map_index)
Build a map on-demand if it hasn't been built yet.
absl::Status ConfigureMultiAreaMap(int parent_index, AreaSizeEnum size)
Configure a multi-area map structure (Large/Wide/Tall)
#define ICON_MD_GRID_VIEW
const AgentUITheme & GetTheme()
Editors are the view controllers for the application.
constexpr ImVec2 kOverworldCanvasSize(kOverworldMapSize *8, kOverworldMapSize *8)
constexpr unsigned int kOverworldMapSize
constexpr ImVec2 kCurrentGfxCanvasSize(0x100+1, 0x10 *0x40+1)
void MoveEntityOnGrid(zelda3::GameEntity *entity, ImVec2 canvas_p0, ImVec2 scrolling, bool free_movement, float scale)
Move entity to grid-aligned position based on mouse.
constexpr ImVec2 kGraphicsBinCanvasSize(0x100+1, kNumSheetsToLoad *0x40+1)
void EndCanvas(Canvas &canvas)
void BeginChildBothScrollbars(int id)
void BeginCanvas(Canvas &canvas, ImVec2 child_size)
bool AcceptTileDrop(TileDragPayload *out)
Accept a tile16 drop. Returns true if a payload was accepted.
void CenterText(const char *text)
void EndWindowWithDisplaySettings()
void BeginWindowWithDisplaySettings(const char *id, bool *active, const ImVec2 &size, ImGuiWindowFlags flags)
void BeginChildWithScrollbar(const char *str_id)
constexpr int kNumTile16Individual
AreaSizeEnum
Area size enumeration for v3+ ROMs.
constexpr int OverworldCustomASMHasBeenApplied
project::YazeProject * project
SharedClipboard * shared_clipboard
WorkspaceWindowManager * window_manager
static constexpr const char * kTile16Editor
Bitmap atlas
Master bitmap containing all tiles.
std::optional< float > grid_step