5#define IM_PI 3.14159265358979323846f
13#include "absl/status/status.h"
14#include "absl/strings/str_format.h"
15#include "imgui/imgui.h"
84 bool show_context_menu =
158 if (canvas_rt.hovered) {
169 ImGui::IsMouseClicked(ImGuiMouseButton_Left)) {
180 ImGui::IsMouseDragging(ImGuiMouseButton_Left)) {
181 ImGui::SetMouseCursor(ImGuiMouseCursor_Hand);
182 ImVec2 mouse_delta = ImGui::GetIO().MouseDelta;
183 float scale = canvas_rt.scale;
192 ImGui::IsMouseReleased(ImGuiMouseButton_Left)) {
194 float end_scale = canvas_rt.scale;
239 for (
int i = 0; i < 0x40; i++) {
243 if (world_index < 0 ||
267 map_x, map_y, scale);
270 ImDrawList* draw_list = ImGui::GetWindowDrawList();
274 ImVec2 placeholder_pos = ImVec2(canvas_pos.x + scrolling.x + map_x,
275 canvas_pos.y + scrolling.y + map_y);
278 ImVec2 placeholder_size = ImVec2(scaled_size, scaled_size);
282 draw_list->AddRectFilled(
284 ImVec2(placeholder_pos.x + placeholder_size.x,
285 placeholder_pos.y + placeholder_size.y),
287 theme.editor_background));
290 ImVec2 spinner_pos = ImVec2(placeholder_pos.x + placeholder_size.x / 2,
291 placeholder_pos.y + placeholder_size.y / 2);
293 const float spinner_radius = 8.0f * scale;
294 const float rotation =
static_cast<float>(ImGui::GetTime()) * 3.0f;
295 const float start_angle = rotation;
296 const float end_angle = rotation +
IM_PI * 1.5f;
298 draw_list->PathArcTo(spinner_pos, spinner_radius, start_angle, end_angle,
300 draw_list->PathStroke(ImGui::GetColorU32(theme.status_active), 0,
336 "OwBlocksetSelector", selector_config);
349 util::logf(
"Failed to set tile16: %s", status.message().data());
357 if (result.selection_changed) {
363 util::logf(
"Failed to set tile16: %s", status.message().data());
371 if (result.tile_double_clicked) {
380 return absl::OkStatus();
400 int offset = 0x40 * (key + 1);
401 int top_left_y = canvas_rt.canvas_p0.y + 2;
403 top_left_y = canvas_rt.canvas_p0.y + 0x40 * key;
405 auto texture = value.texture();
406 canvas_rt.draw_list->AddImage(
407 (ImTextureID)(intptr_t)texture,
408 ImVec2(canvas_rt.canvas_p0.x + 2, top_left_y),
409 ImVec2(canvas_rt.canvas_p0.x + 0x100,
410 canvas_rt.canvas_p0.y + offset));
424 auto bmp = std::make_unique<gfx::Bitmap>();
463 return absl::OkStatus();
468 ImGui::TextWrapped(
"ZSCustomOverworld v3 settings panel");
477 "This panel will contain ZSCustomOverworld configuration options "
478 "such as custom map sizes, extended tile sets, and other v3 features.");
490 static bool show_custom_bg_color_editor =
false;
491 static bool show_overlay_editor =
false;
492 static int game_state = 0;
497 show_custom_bg_color_editor, show_overlay_editor);
501 if (show_custom_bg_color_editor) {
502 ImGui::OpenPopup(
"CustomBGColorEditor");
503 show_custom_bg_color_editor =
false;
505 if (show_overlay_editor) {
506 ImGui::OpenPopup(
"OverlayEditor");
507 show_overlay_editor =
false;
510 if (ImGui::BeginPopup(
"CustomBGColorEditor")) {
518 if (ImGui::BeginPopup(
"OverlayEditor")) {
528 static bool init_properties =
false;
530 if (!init_properties) {
531 for (
int i = 0; i < 0x40; i++) {
532 std::string area_graphics_str = absl::StrFormat(
537 ->push_back(area_graphics_str);
539 area_graphics_str = absl::StrFormat(
544 ->push_back(area_graphics_str);
546 std::string area_palette_str = absl::StrFormat(
551 ->push_back(area_palette_str);
553 area_palette_str = absl::StrFormat(
558 ->push_back(area_palette_str);
560 std::string sprite_gfx_str = absl::StrFormat(
566 ->push_back(sprite_gfx_str);
568 sprite_gfx_str = absl::StrFormat(
574 ->push_back(sprite_gfx_str);
576 sprite_gfx_str = absl::StrFormat(
582 ->push_back(sprite_gfx_str);
584 sprite_gfx_str = absl::StrFormat(
590 ->push_back(sprite_gfx_str);
592 std::string sprite_palette_str = absl::StrFormat(
598 ->push_back(sprite_palette_str);
600 sprite_palette_str = absl::StrFormat(
606 ->push_back(sprite_palette_str);
608 sprite_palette_str = absl::StrFormat(
614 ->push_back(sprite_palette_str);
616 sprite_palette_str = absl::StrFormat(
622 ->push_back(sprite_palette_str);
624 init_properties =
true;
627 ImGui::Text(
"Area Gfx LW/DW");
629 ImVec2(256, 256), 32,
633 ImVec2(256, 256), 32,
637 ImGui::Text(
"Sprite Gfx LW/DW");
639 ImVec2(256, 256), 32,
643 ImVec2(256, 256), 32,
647 ImVec2(256, 256), 32,
651 ImVec2(256, 256), 32,
655 ImGui::Text(
"Area Pal LW/DW");
657 ImVec2(256, 256), 32,
661 ImVec2(256, 256), 32,
664 static bool show_gfx_group =
false;
665 ImGui::Checkbox(
"Show Gfx Group Editor", &show_gfx_group);
666 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.
gfx::Tilemap tile16_blockset_
Tile16Editor tile16_editor_
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 CheckForOverworldEdits()
Check for tile edits - delegates to TilePaintingManager.
gui::Canvas current_gfx_canvas_
bool show_overlay_editor_
std::unique_ptr< OverworldSidebar > sidebar_
void HandleOverworldPan()
bool dragged_entity_free_movement_
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 ShowPanel(size_t session_id, const std::string &base_card_id)
absl::Status SetCurrentTile(int 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)
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 current_area_palette() const
auto current_graphics() const
auto overworld_map(int i) const
void set_current_map(int i)
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)
void logf(const absl::FormatSpec< Args... > &format, Args &&... args)
constexpr int kNumTile16Individual
PanelManager * panel_manager
static constexpr const char * kTile16Editor
Bitmap atlas
Master bitmap containing all tiles.
std::optional< float > grid_step