diff --git a/src/application/Data/rom.cc b/src/application/Data/rom.cc index 0dd0068f..e01ab88c 100644 --- a/src/application/Data/rom.cc +++ b/src/application/Data/rom.cc @@ -249,7 +249,6 @@ SDL_Surface* ROM::GetGraphicsSheet(int num_sheets) { SDL_CreateRGBSurfaceWithFormat(0, 128, height, 8, SDL_PIXELFORMAT_INDEX8); std::cout << "Drawing surface" << std::endl; uchar *sheet_buffer = nullptr; - // int sheet_buffer_pos = 0; for (int i = 0; i < 8; i++) { surface->format->palette->colors[i].r = (unsigned char)(i * 31); surface->format->palette->colors[i].g = (unsigned char)(i * 31); @@ -264,7 +263,7 @@ SDL_Surface* ROM::GetGraphicsSheet(int num_sheets) { 16) | ((unsigned char)(current_rom_[0x505F + i]) << 8) | - ((unsigned char)(current_rom_[0x513E])))); + ((unsigned char)(current_rom_[0x513E + i])))); pcAddr = SnesToPc(snesAddr); std::cout << "Decompressing..." << std::endl; char *decomp = Decompress(pcAddr); diff --git a/src/application/Data/rom.h b/src/application/Data/rom.h index 102302eb..07e1ecff 100644 --- a/src/application/Data/rom.h +++ b/src/application/Data/rom.h @@ -40,7 +40,7 @@ class ROM { uchar* SNES3bppTo8bppSheet(uchar* buffer_in, int sheet_id = 0); char* Decompress(int pos, bool reversed = false); - SDL_Surface* GetGraphicsSheet(int num_sheets); + SDL_Surface* GetGraphicsSheet(int num_sheets = 1); unsigned int SnesToPc(unsigned int addr) { if (addr >= 0x808000) { diff --git a/src/application/Editor/editor.cc b/src/application/Editor/editor.cc index fb4931d2..6d941b05 100644 --- a/src/application/Editor/editor.cc +++ b/src/application/Editor/editor.cc @@ -306,7 +306,7 @@ void Editor::DrawGraphicsSheet(int offset) { snesAddr = (unsigned int)(( ((unsigned char)(rom_.GetRawData()[0x4F80 + offset]) << 16) | ((unsigned char)(rom_.GetRawData()[0x505F + offset]) << 8) | - ((unsigned char)(rom_.GetRawData()[0x513E])))); + ((unsigned char)(rom_.GetRawData()[0x513E + offset])))); pcAddr = rom_.SnesToPc(snesAddr); std::cout << "Decompressing..." << std::endl; char *decomp = rom_.Decompress(pcAddr); @@ -316,6 +316,7 @@ void Editor::DrawGraphicsSheet(int offset) { surface->pixels = sheet_buffer; std::cout << "Creating texture from surface..." << std::endl; sheet_texture = SDL_CreateTextureFromSurface(sdl_renderer_.get(), surface); + imagesCache[offset] = sheet_texture; if (sheet_texture == nullptr) { std::cout << "Error: " << SDL_GetError() << std::endl; } @@ -323,8 +324,9 @@ void Editor::DrawGraphicsSheet(int offset) { void Editor::DrawProjectEditor() { if (ImGui::BeginTabItem("Project")) { - if (ImGui::BeginTable("##projectTable", 2, - ImGuiTableFlags_SizingFixedFit | ImGuiTableFlags_Resizable)) { + if (ImGui::BeginTable( + "##projectTable", 2, + ImGuiTableFlags_SizingFixedFit | ImGuiTableFlags_Resizable)) { ImGui::TableSetupColumn("##inputs", ImGuiTableColumnFlags_WidthStretch); ImGui::TableSetupColumn("##outputs"); @@ -346,6 +348,17 @@ void Editor::DrawProjectEditor() { loaded_image = true; } } + + BASIC_BUTTON("Get Multiple Sheets") { + if (rom_.isLoaded()) { + sheet_texture = SDL_CreateTextureFromSurface( + sdl_renderer_.get(), rom_.GetGraphicsSheet(tilesheet_offset)); + if (sheet_texture == nullptr) { + std::cout << "Error: " << SDL_GetError() << std::endl; + } + } + } + ImGui::Separator(); // ---------------------------------------------------------------------- @@ -380,16 +393,16 @@ void Editor::DrawProjectEditor() { } } - static int i = 0; - for (auto &[key, texture] : imagesCache) { - ImGui::Image((void *)(SDL_Texture *)texture, ImVec2(32, 32)); - if (i != 16) { - ImGui::SameLine(); - } else if (i == 16) { - i = 0; - } - i++; - } + // static int i = 0; + // for (auto &[key, texture] : imagesCache) { + // ImGui::Image((void *)(SDL_Texture *)texture, ImVec2(32, 32)); + // if (i != 16) { + // ImGui::SameLine(); + // } else if (i == 16) { + // i = 0; + // } + // i++; + // } ImGui::TableNextColumn(); @@ -457,9 +470,20 @@ void Editor::DrawProjectEditor() { } if (loaded_image) { - draw_list->AddImage((void *)(SDL_Texture *)sheet_texture, - ImVec2(canvas_p0.x + 2, canvas_p0.y + 2), - ImVec2(canvas_p0.x + 512, canvas_p0.y + 128)); + // draw_list->AddImage((void *)(SDL_Texture *)sheet_texture, + // ImVec2(canvas_p0.x + 2, canvas_p0.y + 2), + // ImVec2(canvas_p0.x + 512, canvas_p0.y + 128)); + + for (const auto &[key, value] : imagesCache) { + int offset = 128 * (key + 1); + int top_left_y = canvas_p0.y + 2; + if (key >= 1) { + top_left_y = canvas_p0.y + 128 * key; + } + draw_list->AddImage((void *)(SDL_Texture *)value, + ImVec2(canvas_p0.x + 2, top_left_y), + ImVec2(canvas_p0.x + 512, canvas_p0.y + offset)); + } } draw_list->PopClipRect();