93 ImGui::Text(
"Lyra ROM rev%d: %d stored / %d active / %s", layout.revision,
94 layout.capacity, layout.active_count,
95 lyra_writable ?
"A0 terrain Save As" :
"read-only");
97 ImGui::TextDisabled(
"Sprite lists and area overlays unavailable");
99 ImGui::SetNextItemWidth(210.0f);
100 if (ImGui::SliderInt(
"Inspect map", &map_id, 0x80, 0xBF,
"0x%02X")) {
106 ?
"Offline map data; gameplay requires an Oracle build"
107 :
"Runtime-declared map data; inspection only");
112 "OverworldLyra/radio:WalkableFloor",
"radio", ImGui::GetItemID());
117 "OverworldLyra/radio:BlockingBorder",
"radio", ImGui::GetItemID());
120 "Click A0 terrain. Center entry/return cells stay walkable.");
135 if (editor_->sidebar_) {
136 editor_->sidebar_->DrawQuickProperties(
137 editor_->current_map_, editor_->current_map_lock_,
138 editor_->dependencies_.project, true);
143 if (!lyra_preview && editor_->current_world_ == 2 &&
144 !editor_->lyra_canvas_status_.ok()) {
145 ImGui::TextWrapped(
"%s", editor_->lyra_canvas_status_.ToString().c_str());
155 const bool show_context_menu = !lyra_preview;
170 if (editor_->canvas_nav_) {
171 editor_->canvas_nav_->BeginCanvasViewport();
173 ImGui::BeginChild(ImGui::GetID(
reinterpret_cast<void*
>(intptr_t{7})),
174 ImGui::GetContentRegionAvail(),
true,
175 ImGuiWindowFlags_AlwaysVerticalScrollbar |
176 ImGuiWindowFlags_AlwaysHorizontalScrollbar |
177 ImGuiWindowFlags_NoScrollWithMouse);
181 editor_->ow_map_canvas_.set_scrolling(ImVec2(0, 0));
187 if (editor_->canvas_nav_) {
188 editor_->canvas_nav_->EndCanvasViewport(canvas_rt.hovered);
191 if (editor_->overworld_.is_loaded()) {
195 editor_->status_ = editor_->CheckForCurrentMap();
196 if (lyra_writable && canvas_rt.hovered &&
197 ImGui::IsMouseClicked(ImGuiMouseButton_Left)) {
199 editor_->current_world_, editor_->game_state_, ImGui::GetMousePos(),
200 canvas_rt.canvas_p0, canvas_rt.scrolling, canvas_rt.scale,
202 if (target && target->map_id == 0xA0) {
203 editor_->status_ = editor_->PaintLyraA0Terrain(
205 static_cast<int>(target->world_position.x) % 512 / 32,
206 static_cast<int>(target->world_position.y) % 512 / 32,
207 static_cast<uint16_t
>(editor_->lyra_terrain_brush_));
217 editor_->status_ = editor_->CheckForCurrentMap();
218 gui::TileDragPayload tile_drop;
220 editor_->RequestTile16Selection(tile_drop.tile_id);
224 const bool placing_project_entity =
225 editor_->lyra_canvas_.entity_placement_active();
226 const bool project_terrain =
227 editor_->IsProjectTerrainMap(editor_->current_map_) ||
228 editor_->IsProjectTerrainMap(editor_->hovered_map_);
229 if (editor_->current_world_ == 2 && editor_->lyra_canvas_.loaded()) {
230 const auto assets = editor_->lyra_canvas_.PrepareMapAssets(
231 editor_->overworld_, editor_->game_state_);
233 editor_->status_ = assets;
234 editor_->lyra_canvas_.DrawSpecialWorld(canvas_rt);
235 if (editor_->show_entities_) {
236 editor_->lyra_canvas_.DrawEntities(canvas_rt, editor_->current_world_,
237 editor_->game_state_);
238 editor_->lyra_canvas_.HandleEntityInput(
239 canvas_rt, editor_->current_world_, editor_->overworld_,
240 editor_->undo_manager_);
242 if (editor_->IsProjectTerrainMap(editor_->current_map_)) {
243 const int local_map = editor_->current_map_ - 0x80;
250 editor_->lyra_canvas_.FinishStroke(editor_->undo_manager_);
252 const bool tile_tool = !placing_project_entity &&
255 if (!tile_tool && editor_->tile_painting_)
256 editor_->tile_painting_->SuspendCanvasGestures();
258 if (editor_->current_world_ != 2 && editor_->lyra_canvas_.loaded() &&
259 editor_->show_entities_) {
260 editor_->lyra_canvas_.DrawEntities(canvas_rt, editor_->current_world_,
261 editor_->game_state_);
262 editor_->lyra_canvas_.HandleEntityInput(
263 canvas_rt, editor_->current_world_, editor_->overworld_,
264 editor_->undo_manager_);
267 if (editor_->entity_renderer_ && editor_->show_entities_) {
268 editor_->entity_renderer_->DrawExits(canvas_rt, editor_->current_world_);
269 editor_->entity_renderer_->DrawEntrances(canvas_rt,
270 editor_->current_world_);
271 editor_->entity_renderer_->DrawItems(canvas_rt, editor_->current_world_);
272 editor_->entity_renderer_->DrawSprites(canvas_rt, editor_->current_world_,
273 editor_->game_state_);
274 FilterHoveredEntityByMode();
275 DrawEntityHoverTooltip();
276 }
else if (editor_->entity_renderer_) {
278 editor_->entity_renderer_->ResetHoveredEntity();
286 if (canvas_rt.hovered) {
287 editor_->HandleMapInteraction();
291 editor_->CheckForOverworldEdits();
294 if (placing_project_entity) {
301 editor_->TryPlaceArmedItem()) {
304 editor_->entity_renderer_) {
305 auto hovered_entity = editor_->entity_renderer_->hovered_entity();
308 if (!editor_->is_dragging_entity_ && hovered_entity &&
309 ImGui::IsMouseClicked(ImGuiMouseButton_Left)) {
310 editor_->dragged_entity_ = hovered_entity;
311 entity_drag_origin_ = ImVec2(hovered_entity->x_, hovered_entity->y_);
312 editor_->is_dragging_entity_ =
true;
313 editor_->drag_item_snapshot_.reset();
314 if (hovered_entity->entity_type_ ==
316 editor_->SelectItemByIdentity(
317 *
static_cast<zelda3::OverworldItem*
>(hovered_entity));
319 editor_->drag_item_snapshot_ = editor_->CaptureItemUndoSnapshot();
321 if (editor_->dragged_entity_->entity_type_ ==
323 editor_->dragged_entity_free_movement_ =
true;
328 if (editor_->is_dragging_entity_ && editor_->dragged_entity_ &&
329 ImGui::IsMouseDragging(ImGuiMouseButton_Left)) {
330 ImGui::SetMouseCursor(ImGuiMouseCursor_Hand);
331 ImVec2 mouse_delta = ImGui::GetIO().MouseDelta;
332 float scale = canvas_rt.scale;
334 editor_->dragged_entity_->x_ += mouse_delta.x / scale;
335 editor_->dragged_entity_->y_ += mouse_delta.y / scale;
340 if (editor_->is_dragging_entity_ &&
341 ImGui::IsMouseReleased(ImGuiMouseButton_Left)) {
342 if (editor_->dragged_entity_) {
343 float end_scale = canvas_rt.scale;
346 editor_->dragged_entity_free_movement_, end_scale);
348 const int new_map = editor_->current_world_ * 64 +
349 editor_->dragged_entity_->x_ / 512 +
350 (editor_->dragged_entity_->y_ / 512) * 8;
352 editor_->dragged_entity_->UpdateMapProperties(new_map,
353 &editor_->overworld_);
355 editor_->dragged_entity_->UpdateMapProperties(
356 editor_->dragged_entity_->map_id_, &editor_->overworld_);
358 if (editor_->drag_item_snapshot_) {
360 editor_->PushItemUndoAction(
361 std::move(*editor_->drag_item_snapshot_),
362 "Move overworld item");
366 editor_->rom_->set_dirty(
true);
368 editor_->drag_item_snapshot_.reset();
369 editor_->is_dragging_entity_ =
false;
370 editor_->dragged_entity_ =
nullptr;
371 editor_->dragged_entity_free_movement_ =
false;
372 entity_drag_origin_.reset();
381 editor_->DrawItemInsertPopup();
471void OverworldCanvasRenderer::DrawOverworldMaps() {
473 float scale = editor_->ow_map_canvas_.global_scale();
481 constexpr int kMaxMapBuildsPerFrame = 4;
482 int builds_this_frame = 0;
483 const ImVec2 clip_min = ImGui::GetWindowDrawList()->GetClipRectMin();
484 const ImVec2 clip_max = ImGui::GetWindowDrawList()->GetClipRectMax();
485 const ImVec2 canvas_origin(editor_->ow_map_canvas_.zero_point().x +
486 editor_->ow_map_canvas_.scrolling().x,
487 editor_->ow_map_canvas_.zero_point().y +
488 editor_->ow_map_canvas_.scrolling().y);
491 for (
int i = 0; i < 0x40; i++) {
492 const int xx = i % 8;
493 const int yy = i / 8;
494 int world_index = i + (editor_->current_world_ * 0x40);
497 if (world_index < 0 ||
498 world_index >= editor_->overworld_.inspected_map_count()) {
506 const float left = canvas_origin.x + map_x;
507 const float top = canvas_origin.y + map_y;
508 if (left >= clip_max.x || top >= clip_max.y ||
509 left + map_extent <= clip_min.x || top + map_extent <= clip_min.y) {
515 auto& map_bitmap = editor_->maps_bmp_[world_index];
516 if (!map_bitmap.is_active()) {
517 if (builds_this_frame < kMaxMapBuildsPerFrame) {
518 editor_->EnsureMapTexture(world_index);
521 }
else if (!map_bitmap.texture()) {
522 editor_->EnsureMapTexture(world_index);
528 bool can_draw = editor_->maps_bmp_[world_index].texture() &&
529 editor_->maps_bmp_[world_index].is_active();
532 DrawMapWithAreaLayers(world_index, map_x, map_y, scale);
535 ImDrawList* draw_list = ImGui::GetWindowDrawList();
536 ImVec2 canvas_pos = editor_->ow_map_canvas_.zero_point();
537 ImVec2 scrolling = editor_->ow_map_canvas_.scrolling();
539 ImVec2 placeholder_pos = ImVec2(canvas_pos.x + scrolling.x + map_x,
540 canvas_pos.y + scrolling.y + map_y);
543 ImVec2 placeholder_size = ImVec2(scaled_size, scaled_size);
546 const auto& theme = AgentUI::GetTheme();
547 draw_list->AddRectFilled(
549 ImVec2(placeholder_pos.x + placeholder_size.x,
550 placeholder_pos.y + placeholder_size.y),
552 theme.editor_background));
555 ImVec2 spinner_pos = ImVec2(placeholder_pos.x + placeholder_size.x / 2,
556 placeholder_pos.y + placeholder_size.y / 2);
558 const float spinner_radius = 8.0f * scale;
559 const float rotation =
static_cast<float>(ImGui::GetTime()) * 3.0f;
560 const float start_angle = rotation;
561 const float end_angle = rotation +
IM_PI * 1.5f;
563 draw_list->PathArcTo(spinner_pos, spinner_radius, start_angle, end_angle,
565 draw_list->PathStroke(ImGui::GetColorU32(theme.status_active), 0,
575absl::Status OverworldCanvasRenderer::DrawTile16Selector() {
576 if (!editor_->blockset_selector_) {
578 const auto& theme = AgentUI::GetTheme();
589 editor_->blockset_selector_ = std::make_unique<gui::TileSelectorWidget>(
590 "OwBlocksetSelector", selector_config);
591 editor_->blockset_selector_->AttachCanvas(&editor_->blockset_canvas_);
594 editor_->blockset_canvas_.SetShowBuiltinContextMenu(
false);
595 editor_->blockset_selector_->SetHoverDetailProvider(
596 [
this](
int tile_id) -> std::string {
598 tile_id >=
static_cast<int>(tile16_usage_counts_.size())) {
601 return absl::StrFormat(
"Placed %d times (%s)",
602 tile16_usage_counts_[tile_id],
607 editor_->UpdateBlocksetSelectorState();
608 editor_->blockset_canvas_.ClearContextMenuItems();
610 auto open_tile16_editor = [
this](
int tile_id) {
611 editor_->RequestTile16Selection(tile_id);
612 if (editor_->dependencies_.window_manager) {
613 const size_t session_id =
614 editor_->dependencies_.window_manager->GetActiveSessionId();
615 editor_->dependencies_.window_manager->OpenWindowFloating(
616 session_id, OverworldPanelIds::kTile16Editor);
617 editor_->dependencies_.window_manager->MarkWindowRecentlyUsed(
618 OverworldPanelIds::kTile16Editor);
622 gui::CanvasMenuItem edit_tile_item;
623 edit_tile_item.label =
"Edit Tile16";
625 edit_tile_item.shortcut =
"Double-click";
626 edit_tile_item.enabled_condition = [
this]() {
627 return editor_->blockset_selector_ &&
628 editor_->blockset_selector_->GetSelectedTileID() >= 0;
630 edit_tile_item.callback = [
this, open_tile16_editor]() {
631 if (!editor_->blockset_selector_) {
634 open_tile16_editor(editor_->blockset_selector_->GetSelectedTileID());
636 editor_->blockset_canvas_.AddContextMenuItem(edit_tile_item);
637 auto graphics_item = edit_tile_item;
638 graphics_item.label =
"Edit Graphics...";
640 graphics_item.callback = [
this]() {
641 if (editor_->blockset_selector_) {
642 editor_->status_ = editor_->OpenGraphicsForTile16Quadrant(
643 editor_->blockset_selector_->GetSelectedTileID(), 0);
646 editor_->blockset_canvas_.AddContextMenuItem(std::move(graphics_item));
647 editor_->blockset_canvas_.AddContextMenuItem(
648 editor_->blockset_selector_->CopyTileIdMenuItem());
650 const float selector_available_width = ImGui::GetContentRegionAvail().x;
652 const int tile_rows =
654 kTile16SelectorColumns;
655 const gui::AdaptiveSheetLayout selector_layout =
657 selector_available_width, 16 * kTile16SelectorColumns, 16 * tile_rows,
658 tile16_scale_mode_, 0.25f, 4.0f,
660 editor_->blockset_selector_->SetDisplayScale(selector_layout.display_scale);
662 ImGui::TextDisabled(
"%.2fx", selector_layout.display_scale);
668 if (editor_->blockset_selector_->DrawFilterBar()) {
669 editor_->RequestTile16Selection(
670 editor_->blockset_selector_->GetSelectedTileID());
672 DrawTile16ViewControls();
673 RefreshTile16Order(tile16_grid_hovered_);
677 ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(0.0f, 0.0f));
678 const bool grid_visible = ImGui::BeginChild(
679 "##Tile16Grid", ImVec2(0.0f, 0.0f), ImGuiChildFlags_None,
680 ImGuiWindowFlags_AlwaysVerticalScrollbar);
681 ImGui::PopStyleVar();
684 return absl::OkStatus();
687 const bool project_terrain =
688 editor_->IsProjectTerrainMap(editor_->current_map_);
690 project_terrain ? editor_->lyra_canvas_.MapAtlas(editor_->current_map_)
691 : editor_->tile16_blockset_.atlas;
693 atlas.is_active() && (project_terrain || editor_->map_blockset_loaded_);
696 const ImVec2 grid_size = editor_->blockset_selector_->GetGridContentSize();
697 const float canvas_scale = editor_->blockset_canvas_.global_scale();
698 editor_->blockset_canvas_.SetCanvasSize(
699 ImVec2(grid_size.x / canvas_scale, grid_size.y / canvas_scale));
700 auto result = editor_->blockset_selector_->Render(atlas, atlas_ready);
702 if (result.selection_changed) {
703 editor_->RequestTile16Selection(result.selected_tile);
710 if (result.tile_double_clicked) {
711 open_tile16_editor(result.selected_tile);
714 tile16_grid_hovered_ = ImGui::IsWindowHovered();
716 return absl::OkStatus();
779void OverworldCanvasRenderer::RefreshTile16Order(
bool grid_hovered) {
780 constexpr double kRecountIntervalSeconds = 0.5;
781 auto* selector = editor_->blockset_selector_.get();
782 if (selector ==
nullptr) {
785 if (!editor_->overworld_.is_loaded()) {
790 const auto* current_map =
791 editor_->overworld_.overworld_map(editor_->current_map_);
792 const int current_parent =
793 current_map !=
nullptr ? current_map->parent() : editor_->current_map_;
794 const bool inputs_changed =
795 (tile16_scope_ == Tile16UsageScope::kCurrentWorld &&
796 editor_->current_world_ != tile16_counted_world_) ||
797 (tile16_scope_ == Tile16UsageScope::kCurrentArea &&
798 current_parent != tile16_counted_parent_);
799 const double now = ImGui::GetTime();
800 const bool busy = grid_hovered || ImGui::IsAnyMouseDown();
801 const bool stale = now - tile16_last_count_time_ >= kRecountIntervalSeconds;
802 if (!tile16_order_dirty_ && (busy || (!inputs_changed && !stale))) {
807 for (
const int map_id : Tile16ScopeMaps()) {
809 static_cast<int>(editor_->overworld_.overworld_maps().size())) {
811 editor_->overworld_.GetMapTiles(std::min(map_id / 0x40, 2)),
812 map_id % 0x40, &counts);
815 if (editor_->lyra_canvas_.loaded() && editor_->lyra_canvas_.document()) {
816 const auto* doc = editor_->lyra_canvas_.document();
817 const auto& lyra_maps = doc->maps();
820 bool include_map =
false;
821 if (tile16_scope_ == Tile16UsageScope::kAllMaps) {
823 }
else if (tile16_scope_ == Tile16UsageScope::kCurrentWorld &&
824 editor_->current_world_ == 2) {
826 }
else if (tile16_scope_ == Tile16UsageScope::kCurrentArea &&
827 editor_->current_map_ == map_id) {
829 }
else if (tile16_scope_ == Tile16UsageScope::kArea &&
830 tile16_scope_area_ == map_id) {
834 for (uint16_t tile : lyra_maps[m]) {
835 if (tile < counts.size()) {
842 tile16_last_count_time_ = now;
843 tile16_counted_world_ = editor_->current_world_;
844 tile16_counted_parent_ = current_parent;
845 const bool order_changed =
846 tile16_order_dirty_ || counts != tile16_usage_counts_;
847 tile16_usage_counts_ = std::move(counts);
848 tile16_order_dirty_ =
false;
849 if (!order_changed) {
854 selector->ClearDisplayOrder();
857 tile16_usage_counts_, tile16_sort_, tile16_hide_unused_));
993absl::Status OverworldCanvasRenderer::DrawAreaGraphics() {
994 const int graphics_map = editor_->IsProjectTerrainMap(editor_->current_map_)
996 : editor_->current_map_;
997 const bool project_graphics =
998 editor_->IsProjectTerrainMap(editor_->current_map_);
999 if (project_graphics) {
1001 editor_->overworld_, editor_->game_state_));
1003 if (!project_graphics && editor_->overworld_.is_loaded()) {
1005 if (!editor_->current_graphics_set_.contains(graphics_map)) {
1006 auto status = editor_->overworld_.EnsureMapBuilt(graphics_map);
1010 const auto* map = editor_->overworld_.overworld_map(graphics_map);
1012 return absl::FailedPreconditionError(
1013 "Current overworld map not loaded");
1015 editor_->palette_ = map->current_palette();
1016 auto bmp = std::make_unique<gfx::Bitmap>();
1018 bmp->SetPalette(editor_->palette_);
1019 editor_->current_graphics_set_[graphics_map] = std::move(bmp);
1022 editor_->current_graphics_set_[graphics_map].get());
1026 const float available_width = ImGui::GetContentRegionAvail().x;
1030 0.35f, 4.0f, ImGui::GetStyle().ScrollbarSize);
1046 ImGui::BeginGroup();
1049 auto canvas_rt =
gui::BeginCanvas(editor_->current_gfx_canvas_, frame_opts);
1052 if (project_graphics &&
1053 editor_->lyra_canvas_.MapGraphics(editor_->current_map_)) {
1054 editor_->current_gfx_canvas_.DrawBitmap(
1055 *editor_->lyra_canvas_.MapGraphics(editor_->current_map_), 2, 2,
1057 }
else if (editor_->current_graphics_set_.contains(graphics_map) &&
1058 editor_->current_graphics_set_[graphics_map]->is_active()) {
1059 editor_->current_gfx_canvas_.DrawBitmap(
1060 *editor_->current_graphics_set_[graphics_map], 2, 2,
1063 editor_->current_gfx_canvas_.DrawTileSelector(16.0f *
1066 gui::EndCanvas(editor_->current_gfx_canvas_, canvas_rt, frame_opts);
1069 return absl::OkStatus();
1235void OverworldCanvasRenderer::DrawOverworldProperties() {
1236 static bool init_properties =
false;
1238 if (!init_properties) {
1239 for (
int i = 0; i < 0x40; i++) {
1240 std::string area_graphics_str = absl::StrFormat(
1241 "%02hX", editor_->overworld_.overworld_map(i)->area_graphics());
1242 editor_->properties_canvas_
1243 .mutable_labels(OverworldEditor::OverworldProperty::LW_AREA_GFX)
1244 ->push_back(area_graphics_str);
1246 area_graphics_str = absl::StrFormat(
1248 editor_->overworld_.overworld_map(i + 0x40)->area_graphics());
1249 editor_->properties_canvas_
1250 .mutable_labels(OverworldEditor::OverworldProperty::DW_AREA_GFX)
1251 ->push_back(area_graphics_str);
1253 std::string area_palette_str = absl::StrFormat(
1254 "%02hX", editor_->overworld_.overworld_map(i)->area_palette());
1255 editor_->properties_canvas_
1256 .mutable_labels(OverworldEditor::OverworldProperty::LW_AREA_PAL)
1257 ->push_back(area_palette_str);
1259 area_palette_str = absl::StrFormat(
1260 "%02hX", editor_->overworld_.overworld_map(i + 0x40)->area_palette());
1261 editor_->properties_canvas_
1262 .mutable_labels(OverworldEditor::OverworldProperty::DW_AREA_PAL)
1263 ->push_back(area_palette_str);
1265 std::string sprite_gfx_str = absl::StrFormat(
1266 "%02hX", editor_->overworld_.overworld_map(i)->sprite_graphics(1));
1267 editor_->properties_canvas_
1268 .mutable_labels(OverworldEditor::OverworldProperty::LW_SPR_GFX_PART1)
1269 ->push_back(sprite_gfx_str);
1271 sprite_gfx_str = absl::StrFormat(
1272 "%02hX", editor_->overworld_.overworld_map(i)->sprite_graphics(2));
1273 editor_->properties_canvas_
1274 .mutable_labels(OverworldEditor::OverworldProperty::LW_SPR_GFX_PART2)
1275 ->push_back(sprite_gfx_str);
1277 sprite_gfx_str = absl::StrFormat(
1279 editor_->overworld_.overworld_map(i + 0x40)->sprite_graphics(1));
1280 editor_->properties_canvas_
1281 .mutable_labels(OverworldEditor::OverworldProperty::DW_SPR_GFX_PART1)
1282 ->push_back(sprite_gfx_str);
1284 sprite_gfx_str = absl::StrFormat(
1286 editor_->overworld_.overworld_map(i + 0x40)->sprite_graphics(2));
1287 editor_->properties_canvas_
1288 .mutable_labels(OverworldEditor::OverworldProperty::DW_SPR_GFX_PART2)
1289 ->push_back(sprite_gfx_str);
1291 std::string sprite_palette_str = absl::StrFormat(
1292 "%02hX", editor_->overworld_.overworld_map(i)->sprite_palette(1));
1293 editor_->properties_canvas_
1294 .mutable_labels(OverworldEditor::OverworldProperty::LW_SPR_PAL_PART1)
1295 ->push_back(sprite_palette_str);
1297 sprite_palette_str = absl::StrFormat(
1298 "%02hX", editor_->overworld_.overworld_map(i)->sprite_palette(2));
1299 editor_->properties_canvas_
1300 .mutable_labels(OverworldEditor::OverworldProperty::LW_SPR_PAL_PART2)
1301 ->push_back(sprite_palette_str);
1303 sprite_palette_str = absl::StrFormat(
1305 editor_->overworld_.overworld_map(i + 0x40)->sprite_palette(1));
1306 editor_->properties_canvas_
1307 .mutable_labels(OverworldEditor::OverworldProperty::DW_SPR_PAL_PART1)
1308 ->push_back(sprite_palette_str);
1310 sprite_palette_str = absl::StrFormat(
1312 editor_->overworld_.overworld_map(i + 0x40)->sprite_palette(2));
1313 editor_->properties_canvas_
1314 .mutable_labels(OverworldEditor::OverworldProperty::DW_SPR_PAL_PART2)
1315 ->push_back(sprite_palette_str);
1317 init_properties =
true;
1320 ImGui::Text(tr(
"Area Gfx LW/DW"));
1321 editor_->properties_canvas_.UpdateInfoGrid(
1322 ImVec2(256, 256), 32, OverworldEditor::OverworldProperty::LW_AREA_GFX);
1324 editor_->properties_canvas_.UpdateInfoGrid(
1325 ImVec2(256, 256), 32, OverworldEditor::OverworldProperty::DW_AREA_GFX);
1328 ImGui::Text(tr(
"Sprite Gfx LW/DW"));
1329 editor_->properties_canvas_.UpdateInfoGrid(
1330 ImVec2(256, 256), 32,
1331 OverworldEditor::OverworldProperty::LW_SPR_GFX_PART1);
1333 editor_->properties_canvas_.UpdateInfoGrid(
1334 ImVec2(256, 256), 32,
1335 OverworldEditor::OverworldProperty::DW_SPR_GFX_PART1);
1337 editor_->properties_canvas_.UpdateInfoGrid(
1338 ImVec2(256, 256), 32,
1339 OverworldEditor::OverworldProperty::LW_SPR_GFX_PART2);
1341 editor_->properties_canvas_.UpdateInfoGrid(
1342 ImVec2(256, 256), 32,
1343 OverworldEditor::OverworldProperty::DW_SPR_GFX_PART2);
1346 ImGui::Text(tr(
"Area Pal LW/DW"));
1347 editor_->properties_canvas_.UpdateInfoGrid(
1348 ImVec2(256, 256), 32, OverworldEditor::OverworldProperty::LW_AREA_PAL);
1350 editor_->properties_canvas_.UpdateInfoGrid(
1351 ImVec2(256, 256), 32, OverworldEditor::OverworldProperty::DW_AREA_PAL);
1353 static bool show_gfx_group =
false;
1354 ImGui::Checkbox(tr(
"Show Gfx Group Editor"), &show_gfx_group);
1355 if (show_gfx_group) {
1357 editor_->status_ = editor_->gfx_group_editor_.Update();