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 =
165 if (canvas_rt.hovered) {
176 ImGui::IsMouseClicked(ImGuiMouseButton_Left)) {
179 if (hovered_entity->entity_type_ ==
192 ImGui::IsMouseDragging(ImGuiMouseButton_Left)) {
193 ImGui::SetMouseCursor(ImGuiMouseCursor_Hand);
194 ImVec2 mouse_delta = ImGui::GetIO().MouseDelta;
195 float scale = canvas_rt.scale;
204 ImGui::IsMouseReleased(ImGuiMouseButton_Left)) {
206 float end_scale = canvas_rt.scale;
251 for (
int i = 0; i < 0x40; i++) {
255 if (world_index < 0 ||
282 ImDrawList* draw_list = ImGui::GetWindowDrawList();
286 ImVec2 placeholder_pos = ImVec2(canvas_pos.x + scrolling.x + map_x,
287 canvas_pos.y + scrolling.y + map_y);
290 ImVec2 placeholder_size = ImVec2(scaled_size, scaled_size);
294 draw_list->AddRectFilled(
296 ImVec2(placeholder_pos.x + placeholder_size.x,
297 placeholder_pos.y + placeholder_size.y),
299 theme.editor_background));
302 ImVec2 spinner_pos = ImVec2(placeholder_pos.x + placeholder_size.x / 2,
303 placeholder_pos.y + placeholder_size.y / 2);
305 const float spinner_radius = 8.0f * scale;
306 const float rotation =
static_cast<float>(ImGui::GetTime()) * 3.0f;
307 const float start_angle = rotation;
308 const float end_angle = rotation +
IM_PI * 1.5f;
310 draw_list->PathArcTo(spinner_pos, spinner_radius, start_angle, end_angle,
312 draw_list->PathStroke(ImGui::GetColorU32(theme.status_active), 0,
343 "OwBlocksetSelector", selector_config);
350 auto open_tile16_editor = [
this](
int tile_id) {
353 const size_t session_id =
364 edit_tile_item.
shortcut =
"Double-click";
369 edit_tile_item.
callback = [
this, open_tile16_editor]() {
380 "##Tile16SelectorScrollRegion",
395 if (result.selection_changed) {
403 if (result.tile_double_clicked) {
404 open_tile16_editor(result.selected_tile);
409 return absl::OkStatus();
428 int offset = 0x40 * (key + 1);
429 int top_left_y = canvas_rt.canvas_p0.y + 2;
431 top_left_y = canvas_rt.canvas_p0.y + 0x40 * key;
433 auto texture = value.texture();
434 canvas_rt.draw_list->AddImage(
435 (ImTextureID)(intptr_t)texture,
436 ImVec2(canvas_rt.canvas_p0.x + 2, top_left_y),
437 ImVec2(canvas_rt.canvas_p0.x + 0x100,
438 canvas_rt.canvas_p0.y + offset));
457 return absl::FailedPreconditionError(
458 "Current overworld map not loaded");
461 auto bmp = std::make_unique<gfx::Bitmap>();
498 return absl::OkStatus();
503 ImGui::TextWrapped(tr(
"ZSCustomOverworld v3 settings"));
511 const uint8_t asm_version =
513 ImGui::Text(tr(
"ASM Version: 0x%02X"), asm_version);
515 if (asm_version == 0x00 || asm_version == 0xFF || asm_version < 0x03) {
517 ImGui::TextColored(ImVec4(1.0f, 0.75f, 0.25f, 1.0f),
518 tr(
"v3 controls require ZSCustomOverworld v3+"));
519 ImGui::TextDisabled(tr(
"Apply the v3 patch to enable map-size editing."));
525 ImGui::TextDisabled(tr(
"Current map is unavailable."));
531 ImGui::Text(tr(
"Parent map: 0x%02X"), map->parent());
533 static int selected_area_size = 0;
534 selected_area_size =
static_cast<int>(map->area_size());
535 const char* area_size_labels[] = {
"Small",
"Wide",
"Tall",
"Large"};
536 ImGui::SetNextItemWidth(220.0f);
537 ImGui::Combo(tr(
"Area Size"), &selected_area_size, area_size_labels,
538 IM_ARRAYSIZE(area_size_labels));
551 tr(
"Area-size changes update sibling map relationships for this parent "
557 static bool show_custom_bg_color_editor =
false;
558 static bool show_overlay_editor =
false;
563 show_custom_bg_color_editor, show_overlay_editor);
567 if (show_custom_bg_color_editor) {
568 ImGui::OpenPopup(
"CustomBGColorEditor");
569 show_custom_bg_color_editor =
false;
571 if (show_overlay_editor) {
572 ImGui::OpenPopup(
"OverlayEditor");
573 show_overlay_editor =
false;
576 if (ImGui::BeginPopup(
"CustomBGColorEditor")) {
584 if (ImGui::BeginPopup(
"OverlayEditor")) {
587 show_overlay_editor);
594 static bool init_properties =
false;
596 if (!init_properties) {
597 for (
int i = 0; i < 0x40; i++) {
598 std::string area_graphics_str = absl::StrFormat(
602 ->push_back(area_graphics_str);
604 area_graphics_str = absl::StrFormat(
609 ->push_back(area_graphics_str);
611 std::string area_palette_str = absl::StrFormat(
615 ->push_back(area_palette_str);
617 area_palette_str = absl::StrFormat(
621 ->push_back(area_palette_str);
623 std::string sprite_gfx_str = absl::StrFormat(
627 ->push_back(sprite_gfx_str);
629 sprite_gfx_str = absl::StrFormat(
633 ->push_back(sprite_gfx_str);
635 sprite_gfx_str = absl::StrFormat(
640 ->push_back(sprite_gfx_str);
642 sprite_gfx_str = absl::StrFormat(
647 ->push_back(sprite_gfx_str);
649 std::string sprite_palette_str = absl::StrFormat(
653 ->push_back(sprite_palette_str);
655 sprite_palette_str = absl::StrFormat(
659 ->push_back(sprite_palette_str);
661 sprite_palette_str = absl::StrFormat(
666 ->push_back(sprite_palette_str);
668 sprite_palette_str = absl::StrFormat(
673 ->push_back(sprite_palette_str);
675 init_properties =
true;
678 ImGui::Text(tr(
"Area Gfx LW/DW"));
686 ImGui::Text(tr(
"Sprite Gfx LW/DW"));
688 ImVec2(256, 256), 32,
692 ImVec2(256, 256), 32,
696 ImVec2(256, 256), 32,
700 ImVec2(256, 256), 32,
704 ImGui::Text(tr(
"Area Pal LW/DW"));
711 static bool show_gfx_group =
false;
712 ImGui::Checkbox(tr(
"Show Gfx Group Editor"), &show_gfx_group);
713 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