diff --git a/src/app/editor/graphics/screen_editor.cc b/src/app/editor/graphics/screen_editor.cc index 7400ad35..b5c3c66c 100644 --- a/src/app/editor/graphics/screen_editor.cc +++ b/src/app/editor/graphics/screen_editor.cc @@ -251,6 +251,33 @@ absl::Status ScreenEditor::LoadDungeonMapTile16( return absl::OkStatus(); } +absl::Status ScreenEditor::SaveDungeonMapTile16() { + for (int i = 0; i < 186; i++) { + int addr = zelda3::screen::kDungeonMapTile16; + if (rom()->data()[zelda3::screen::kDungeonMapExpCheck] != 0xB9) { + addr = zelda3::screen::kDungeonMapTile16Expanded; + } + + gfx::TileInfo t1 = tile16_sheet_.tile_info()[i].tiles[0]; + gfx::TileInfo t2 = tile16_sheet_.tile_info()[i].tiles[1]; + gfx::TileInfo t3 = tile16_sheet_.tile_info()[i].tiles[2]; + gfx::TileInfo t4 = tile16_sheet_.tile_info()[i].tiles[3]; + + auto tl = gfx::TileInfoToWord(t1); + RETURN_IF_ERROR(rom()->WriteWord(addr + (i * 8), tl)); + + auto tr = gfx::TileInfoToWord(t2); + RETURN_IF_ERROR(rom()->WriteWord(addr + 2 + (i * 8), tr)); + + auto bl = gfx::TileInfoToWord(t3); + RETURN_IF_ERROR(rom()->WriteWord(addr + 4 + (i * 8), bl)); + + auto br = gfx::TileInfoToWord(t4); + RETURN_IF_ERROR(rom()->WriteWord(addr + 6 + (i * 8), br)); + } + return absl::OkStatus(); +} + void ScreenEditor::DrawDungeonMapsTabs() { auto& current_dungeon = dungeon_maps_[selected_dungeon]; if (ImGui::BeginTabBar("##DungeonMapTabs")) { @@ -416,6 +443,8 @@ void ScreenEditor::DrawDungeonMapsEditor() { if (!tilesheet_canvas_.points().empty()) { selected_tile16_ = tilesheet_canvas_.points().front().x / 32 + (tilesheet_canvas_.points().front().y / 32) * 16; + current_tile16_info = tile16_sheet_.tile_info().at(selected_tile16_); + // Draw the selected tile if (!screen_canvas_.points().empty()) { dungeon_maps_[selected_dungeon] @@ -423,6 +452,32 @@ void ScreenEditor::DrawDungeonMapsEditor() { tilesheet_canvas_.mutable_points()->clear(); } } + + ImGui::Separator(); + current_tile_canvas_.DrawBackground(ImVec2(64 * 2 + 2, 64 * 2 + 4)); + current_tile_canvas_.DrawContextMenu(); + current_tile_canvas_.DrawBitmap(tile16_individual_[selected_tile16_], 2, + 4.0f); + current_tile_canvas_.DrawGrid(16.f); + current_tile_canvas_.DrawOverlay(); + + static bool modified = false; + modified |= gui::InputTileInfo("TL", ¤t_tile16_info.tiles[0]); + ImGui::SameLine(); + modified |= gui::InputTileInfo("TR", ¤t_tile16_info.tiles[1]); + modified |= gui::InputTileInfo("BL", ¤t_tile16_info.tiles[2]); + ImGui::SameLine(); + modified |= gui::InputTileInfo("BR", ¤t_tile16_info.tiles[3]); + + if (modified) { + tile16_sheet_.ModifyTile16( + rom()->graphics_buffer(), current_tile16_info.tiles[0], + current_tile16_info.tiles[1], current_tile16_info.tiles[2], + current_tile16_info.tiles[3], selected_tile16_, 212); + Renderer::GetInstance().RenderBitmap( + &tile16_individual_[selected_tile16_]); + modified = false; + } } ImGui::EndChild(); diff --git a/src/app/editor/graphics/screen_editor.h b/src/app/editor/graphics/screen_editor.h index 29a0dbc9..0bea8621 100644 --- a/src/app/editor/graphics/screen_editor.h +++ b/src/app/editor/graphics/screen_editor.h @@ -66,6 +66,7 @@ class ScreenEditor : public SharedRom, public Editor { absl::Status LoadDungeonMaps(); absl::Status LoadDungeonMapTile16(const std::vector& gfx_data, bool bin_mode = false); + absl::Status SaveDungeonMapTile16(); void DrawDungeonMapsTabs(); void DrawDungeonMapsEditor(); @@ -88,13 +89,16 @@ class ScreenEditor : public SharedRom, public Editor { std::unordered_map tile16_individual_; std::vector dungeon_maps_; std::vector>> dungeon_map_labels_; + std::array current_tile16_data_; absl::Status status_; gfx::SnesPalette palette_; gfx::BitmapTable sheets_; gfx::Tilesheet tile16_sheet_; + gfx::InternalTile16 current_tile16_info; + gui::Canvas current_tile_canvas_{"##CurrentTileCanvas"}; gui::Canvas screen_canvas_; gui::Canvas tilesheet_canvas_; gui::Canvas tilemap_canvas_; diff --git a/src/app/gui/canvas.h b/src/app/gui/canvas.h index f03b29cd..4e483597 100644 --- a/src/app/gui/canvas.h +++ b/src/app/gui/canvas.h @@ -1,13 +1,12 @@ #ifndef YAZE_GUI_CANVAS_H #define YAZE_GUI_CANVAS_H -#include "imgui/imgui.h" - #include #include #include "app/gfx/bitmap.h" #include "app/rom.h" +#include "imgui/imgui.h" namespace yaze { namespace app { @@ -36,6 +35,9 @@ enum class CanvasGridSize { k8x8, k16x16, k32x32, k64x64 }; class Canvas : public SharedRom { public: Canvas() = default; + explicit Canvas(const std::string& id) : canvas_id_(id) { + context_id_ = id + "Context"; + } explicit Canvas(const std::string& id, ImVec2 canvas_size) : canvas_id_(id), custom_canvas_size_(true), canvas_sz_(canvas_size) { context_id_ = id + "Context";