diff --git a/src/editor/SagoTextureSelector.cpp b/src/editor/SagoTextureSelector.cpp index c3588e8..efe202f 100644 --- a/src/editor/SagoTextureSelector.cpp +++ b/src/editor/SagoTextureSelector.cpp @@ -15,13 +15,11 @@ static void addLinesToCanvas(SDL_Renderer* renderer, SDL_Texture* texture, int x SDL_SetRenderDrawColor(renderer, 255, 0, 0, SDL_ALPHA_OPAQUE); if (xstep > 0) { for (int i = 0; i < width+1; i += xstep) { - //SDL_RenderDrawLine(renderer, i, 0, i, height); ImGui::GetWindowDrawList()->AddLine(ImVec2(i+xoffset, yoffset), ImVec2(i+xoffset, height+yoffset), IM_COL32(255, 0, 0, 255)); } } if (ystep > 0) { for (int i = 0; i < height+1; i += ystep) { - //SDL_RenderDrawLine(renderer, 0, i, width, i); ImGui::GetWindowDrawList()->AddLine(ImVec2(xoffset, i+yoffset), ImVec2(width+xoffset, i+yoffset), IM_COL32(255, 0, 0, 255)); } } @@ -49,6 +47,50 @@ std::string remove_file_extension(const std::string& filename) { return filename.substr(0, lastindex); } +void SagoTextureSelector::runSpriteSelectorFrame(SDL_Renderer* target) { + ImGui::Begin("SpriteList", nullptr, ImGuiWindowFlags_NoCollapse); + static char filter[256] = ""; + ImGui::InputText("Filter", filter, IM_ARRAYSIZE(filter)); + ImGui::Separator(); + const std::unordered_map>& sprites = globalData.spriteHolder->GetSprites(); + for (const auto& sprite : sprites) { + std::string sprite_name = sprite.first; + if (filter[0] == '\0' || sprite_name.find(filter) != std::string::npos) { + if (ImGui::Selectable(sprite_name.c_str(), selected_sprite == sprite_name)) { + selected_sprite = sprite_name; + } + } + } + + ImGui::End(); + + ImGui::Begin("SpriteViewer"); + if (selected_sprite.length()) { + int tex_w, tex_h; + const sago::SagoSprite& current_sprite = globalData.spriteHolder->GetSprite(selected_sprite); + SDL_Texture* current_texture = globalData.dataHolder->getTexturePtr(current_sprite.GetTextureName()); + SDL_QueryTexture(current_texture, nullptr, nullptr, &tex_w, &tex_h); + float sprite_w = current_sprite.GetWidth(); + float sprite_h = current_sprite.GetHeight(); + float topx = current_sprite.GetTopX(); + float topy = current_sprite.GetTopY(); + ImGui::Text("Size: %d x %d", tex_w, tex_h); + ImGui::BeginChild("Test"); + ImVec2 p = ImGui::GetCursorScreenPos(); + + // Normalized coordinates of pixel (10,10) in a 256x256 texture. + ImVec2 uv0 = ImVec2(topx / tex_h, topy / tex_w); + + // Normalized coordinates of pixel (110,210) in a 256x256 texture. + ImVec2 uv1 = ImVec2( (topx+sprite_h) / tex_h, (topy+sprite_w) / tex_w); + + + ImGui::Image((ImTextureID)(intptr_t)current_texture, ImVec2((float)sprite_w, (float)sprite_h), uv0, uv1); + ImGui::EndChild(); + } + ImGui::End(); +} + void SagoTextureSelector::runTextureSelectorFrame(SDL_Renderer* target) { ImGui::Begin("TextureList", nullptr, ImGuiWindowFlags_NoCollapse); static char filter[256] = ""; @@ -98,6 +140,7 @@ void SagoTextureSelector::ProcessInput(const SDL_Event& event, bool &processed) void SagoTextureSelector::Draw(SDL_Renderer* target) { runTextureSelectorFrame(target); + runSpriteSelectorFrame(target); } void SagoTextureSelector::Update() { diff --git a/src/editor/SagoTextureSelector.hpp b/src/editor/SagoTextureSelector.hpp index 2d14f0e..3ce51b9 100644 --- a/src/editor/SagoTextureSelector.hpp +++ b/src/editor/SagoTextureSelector.hpp @@ -43,9 +43,11 @@ public: void Init(); void runTextureSelectorFrame(SDL_Renderer* target); + void runSpriteSelectorFrame(SDL_Renderer* target); private: bool isActive = true; std::vector textures; std::string selected_texture; + std::string selected_sprite; }; \ No newline at end of file diff --git a/src/sago/SagoDataHolder.cpp b/src/sago/SagoDataHolder.cpp index a5f0c2e..418fbc9 100644 --- a/src/sago/SagoDataHolder.cpp +++ b/src/sago/SagoDataHolder.cpp @@ -263,6 +263,10 @@ SDL_Texture* TextureHandler::get() { return data; } +std::string TextureHandler::GetTextureName() const { + return textureName; +} + MusicHandler::MusicHandler(const SagoDataHolder* holder, const std::string& musicName) { this->holder = holder; diff --git a/src/sago/SagoDataHolder.hpp b/src/sago/SagoDataHolder.hpp index 9fbd9cd..1552973 100644 --- a/src/sago/SagoDataHolder.hpp +++ b/src/sago/SagoDataHolder.hpp @@ -41,6 +41,7 @@ public: TextureHandler() {}; TextureHandler(const SagoDataHolder* holder, const std::string &textureName); SDL_Texture* get(); + std::string GetTextureName() const; private: std::string textureName; const SagoDataHolder* holder = nullptr; diff --git a/src/sago/SagoSprite.cpp b/src/sago/SagoSprite.cpp index f9d5126..65d1a26 100644 --- a/src/sago/SagoSprite.cpp +++ b/src/sago/SagoSprite.cpp @@ -174,4 +174,17 @@ int SagoSprite::GetHeight() const { return data->imgCord.h; } +int SagoSprite::GetTopX() const { + return data->imgCord.x; +} + +int SagoSprite::GetTopY() const { + return data->imgCord.y; +} + + +const std::string SagoSprite::GetTextureName() const { + return data->tex.GetTextureName(); +} + } //namespace sago diff --git a/src/sago/SagoSprite.hpp b/src/sago/SagoSprite.hpp index 742cf76..097ca21 100644 --- a/src/sago/SagoSprite.hpp +++ b/src/sago/SagoSprite.hpp @@ -95,6 +95,9 @@ public: SagoSprite& operator=(const SagoSprite& base); int GetWidth() const; int GetHeight() const; + int GetTopX() const; + int GetTopY() const; + const std::string GetTextureName() const; ~SagoSprite(); private: struct SagoSpriteData; diff --git a/src/sago/SagoSpriteHolder.cpp b/src/sago/SagoSpriteHolder.cpp index 94c4c1c..c72bad9 100644 --- a/src/sago/SagoSpriteHolder.cpp +++ b/src/sago/SagoSpriteHolder.cpp @@ -24,8 +24,6 @@ SOFTWARE. #include "SagoSpriteHolder.hpp" #include "SagoMisc.hpp" -#include -#include #include "rapidjson/document.h" #include #include @@ -152,4 +150,8 @@ const SagoDataHolder& SagoSpriteHolder::GetDataHolder() const { return *data->tex; } +const std::unordered_map>& SagoSpriteHolder::GetSprites() const { + return data->sprites; +} + } diff --git a/src/sago/SagoSpriteHolder.hpp b/src/sago/SagoSpriteHolder.hpp index be76b51..daab364 100644 --- a/src/sago/SagoSpriteHolder.hpp +++ b/src/sago/SagoSpriteHolder.hpp @@ -27,7 +27,9 @@ SOFTWARE. #include "SagoDataHolder.hpp" #include "SagoSprite.hpp" +#include #include +#include namespace sago { @@ -45,6 +47,7 @@ public: void ReadSprites(const std::vector& extra_sprites); const sago::SagoSprite& GetSprite(const std::string &spritename) const; const SagoDataHolder& GetDataHolder() const; + const std::unordered_map>& GetSprites() const; private: SagoSpriteHolder(const SagoSpriteHolder& base) = delete; SagoSpriteHolder& operator=(const SagoSpriteHolder& base) = delete;