From d6081e9add95eb3ae40167b85900de91f212c862 Mon Sep 17 00:00:00 2001 From: scawful Date: Mon, 12 Sep 2022 13:04:03 -0500 Subject: [PATCH] canvas and ow edit changes --- src/app/editor/overworld_editor.cc | 8 ++--- src/app/editor/overworld_editor.h | 1 + src/app/rom.cc | 56 +++++++++--------------------- src/gui/canvas.cc | 26 ++++++++++++++ src/gui/canvas.h | 7 ++++ 5 files changed, 54 insertions(+), 44 deletions(-) diff --git a/src/app/editor/overworld_editor.cc b/src/app/editor/overworld_editor.cc index 0e84643e..c4244298 100644 --- a/src/app/editor/overworld_editor.cc +++ b/src/app/editor/overworld_editor.cc @@ -24,15 +24,15 @@ namespace editor { namespace { void UpdateSelectedTile16(int selected, gfx::Bitmap &tile16_blockset, - gfx::Bitmap &selected_tile) { + Bytes &selected_tile) { + selected_tile.reserve(256); auto blockset = tile16_blockset.GetData(); - auto bitmap = selected_tile.GetData(); int src_pos = ((selected - ((selected / 0x08) * 0x08)) * 0x10) + ((selected / 0x08) * 2048); for (int yy = 0; yy < 0x10; yy++) { for (int xx = 0; xx < 0x10; xx++) { - bitmap[xx + (yy * 0x10)] = blockset[src_pos + xx + (yy * 0x80)]; + selected_tile[xx + (yy * 0x10)] = blockset[src_pos + xx + (yy * 0x80)]; } } } @@ -70,7 +70,7 @@ absl::Status OverworldEditor::Update() { selected_tile_bmp_.Create(16, 16, 64, 256); } UpdateSelectedTile16(selected_tile_, tile16_blockset_bmp_, - selected_tile_bmp_); + selected_tile_data_); selected_tile_bmp_.ApplyPalette(palette_); rom_.RenderBitmap(&selected_tile_bmp_); update_selected_tile_ = false; diff --git a/src/app/editor/overworld_editor.h b/src/app/editor/overworld_editor.h index 35c500ce..ccbaf9b1 100644 --- a/src/app/editor/overworld_editor.h +++ b/src/app/editor/overworld_editor.h @@ -97,6 +97,7 @@ class OverworldEditor { gfx::Bitmap current_gfx_bmp_; gfx::Bitmap all_gfx_bmp; gfx::Bitmap selected_tile_bmp_; + Bytes selected_tile_data_; gui::Canvas overworld_map_canvas_; gui::Canvas current_gfx_canvas_; diff --git a/src/app/rom.cc b/src/app/rom.cc index 8b67fa68..91f8826d 100644 --- a/src/app/rom.cc +++ b/src/app/rom.cc @@ -534,25 +534,26 @@ absl::StatusOr ROM::Decompress(int offset, int size, int mode) { if (mode == kNintendoMode1) { // Reversed byte order for overworld maps // addr = (s2 | s1); - addr = (rom_data_[offset + 1]) | ((rom_data_[offset]) << 8); + addr = (rom_data_[offset + 1] & kSnesByteMax) | + ((rom_data_[offset] & kSnesByteMax) << 8); + if (addr > offset) { + return absl::InternalError(absl::StrFormat( + "DecompressOverworld: Offset for command copy exceeds " + "current position (Offset : %#04x | Pos : %#06x)\n", + addr, offset)); + } + + if (buffer_pos + length >= size) { + size *= 2; + buffer.resize(size); + } + memcpy(buffer.data() + buffer_pos, buffer.data() + addr, length); buffer_pos += length; offset += 2; break; } - if (addr > offset) { - return absl::InternalError(absl::StrFormat( - "DecompressOverworld: Offset for command copy exceeds " - "current position (Offset : %#04x | Pos : %#06x)\n", - addr, offset)); - } - - if (buffer_pos + length >= size) { - size *= 2; - buffer.resize(size); - } - for (int i = 0; i < length; i++) { buffer[buffer_pos] = buffer[addr + i]; buffer_pos++; @@ -687,7 +688,7 @@ void ROM::RenderBitmap(gfx::Bitmap* bitmap) const { } gfx::SNESColor ROM::ReadColor(int offset) { - short color = (short)((rom_data_[offset + 1] << 8) + rom_data_[offset]); + short color = toint16(offset); gfx::snes_color new_color; new_color.red = (color & 0x1F) * 8; new_color.green = ((color >> 5) & 0x1F) * 8; @@ -701,7 +702,7 @@ gfx::SNESPalette ROM::ReadPalette(int offset, int num_colors) { std::vector colors(num_colors); while (color_offset < num_colors) { - short color = (short)((rom_data_[offset + 1] << 8) + rom_data_[offset]); + short color = toint16(offset); gfx::snes_color new_color; new_color.red = (color & 0x1F) * 8; new_color.green = ((color >> 5) & 0x1F) * 8; @@ -783,31 +784,6 @@ void ROM::LoadAllPalettes() { palette_groups_["ow_mini_map"].AddPalette( ReadPalette(core::overworldMiniMapPalettes + (i * 256), 128)); } - - // TODO: check for the paletts in the empty bank space that kan will allocate - // and read them in here - // TODO magic colors - // LW - // int j = 0; - // while (j < 64) { - // zelda3::overworld_BackgroundPalette[j++] = - // Color.FromArgb(0xFF, 0x48, 0x98, 0x48); - // } - - // // DW - // while (j < 128) { - // zelda3::overworld_BackgroundPalette[j++] = - // Color.FromArgb(0xFF, 0x90, 0x88, 0x50); - // } - - // // SP - // while (j < core::kNumOverworldMaps) { - // zelda3::overworld_BackgroundPalette[j++] = - // Color.FromArgb(0xFF, 0x48, 0x98, 0x48); - // } - - // zelda3::overworld_BackgroundPalette = - // ReadPalette(core::customAreaSpecificBGPalette, 160); } } // namespace app diff --git a/src/gui/canvas.cc b/src/gui/canvas.cc index 23873c0b..eaf7f7c5 100644 --- a/src/gui/canvas.cc +++ b/src/gui/canvas.cc @@ -6,6 +6,7 @@ #include #include "app/gfx/bitmap.h" +#include "app/rom.h" namespace yaze { namespace gui { @@ -63,6 +64,10 @@ void Canvas::DrawContextMenu() { ImGui::OpenPopupOnItemClick("context", ImGuiPopupFlags_MouseButtonRight); if (ImGui::BeginPopup("context")) { + if (ImGui::MenuItem("Reset Position", nullptr, false)) { + scrolling_.x = 0; + scrolling_.y = 0; + } if (ImGui::MenuItem("Remove all", nullptr, false, points_.Size > 0)) { points_.clear(); } @@ -70,6 +75,27 @@ void Canvas::DrawContextMenu() { } } +void Canvas::DrawTilesFromUser(app::ROM &rom, Bytes &tile, + app::gfx::SNESPalette &pal) { + ImVec2 draw_tile_outline_pos; + + // Add rectangle + if (is_hovered_ && ImGui::IsMouseClicked(ImGuiMouseButton_Left)) { + draw_tile_outline_pos.x = + std::round((double)mouse_pos_in_canvas_.x / 16) * 16; + draw_tile_outline_pos.y = + std::round((double)mouse_pos_in_canvas_.y / 16) * 16; + + points_.push_back(draw_tile_outline_pos); + points_.push_back( + ImVec2(draw_tile_outline_pos.x + 16, draw_tile_outline_pos.y + 16)); + + changed_tiles_.emplace_back(app::gfx::Bitmap(16, 16, 64, tile.data())); + changed_tiles_.back().ApplyPalette(pal); + rom.RenderBitmap(&(changed_tiles_.back())); + } +} + void Canvas::DrawBitmap(const Bitmap &bitmap, int border_offset) { draw_list_->AddImage( (void *)bitmap.GetTexture(), diff --git a/src/gui/canvas.h b/src/gui/canvas.h index a563f2bd..341cab0f 100644 --- a/src/gui/canvas.h +++ b/src/gui/canvas.h @@ -7,6 +7,7 @@ #include #include "app/gfx/bitmap.h" +#include "app/rom.h" namespace yaze { namespace gui { @@ -21,6 +22,8 @@ class Canvas { void DrawBackground(ImVec2 canvas_size = ImVec2(0, 0)); void DrawContextMenu(); + void DrawTilesFromUser(app::ROM& rom, Bytes& tile, + app::gfx::SNESPalette& pal); void DrawBitmap(const Bitmap& bitmap, int border_offset = 0); void DrawBitmap(const Bitmap& bitmap, int x_offset, int y_offset); void DrawOutline(int x, int y, int w, int h); @@ -39,6 +42,7 @@ class Canvas { bool enable_grid_ = true; bool enable_context_menu_ = true; bool custom_canvas_size_ = false; + bool is_hovered_ = false; ImDrawList* draw_list_; ImVector points_; @@ -46,6 +50,9 @@ class Canvas { ImVec2 canvas_sz_; ImVec2 canvas_p0_; ImVec2 canvas_p1_; + ImVec2 mouse_pos_in_canvas_; + + std::vector changed_tiles_; std::string title_; };