git repos / sago_multi_scrambler_puzzle2

commit 8804d930

Poul Sander · 2024-11-02 12:34
8804d9303d6ca780f3ee974688a8c00deb310ea0 patch · browse files
parent 636cb96afff4cc5871ea9f74f1d739eb1935428e

Add sprite viewer

Changed files

M src/editor/SagoTextureSelector.cpp before
M src/editor/SagoTextureSelector.hpp before
M src/sago/SagoDataHolder.cpp before
M src/sago/SagoDataHolder.hpp before
M src/sago/SagoSprite.cpp before
M src/sago/SagoSprite.hpp before
M src/sago/SagoSpriteHolder.cpp before
M src/sago/SagoSpriteHolder.hpp before
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<std::string,std::shared_ptr<sago::SagoSprite>>& 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<std::string> 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 <memory>
-#include <unordered_map>
#include "rapidjson/document.h"
#include <iostream>
#include <string.h>
@@ -152,4 +150,8 @@ const SagoDataHolder& SagoSpriteHolder::GetDataHolder() const {
return *data->tex;
}
+const std::unordered_map<std::string,std::shared_ptr<sago::SagoSprite>>& 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 <memory>
#include <vector>
+#include <unordered_map>
namespace sago {
@@ -45,6 +47,7 @@ public:
void ReadSprites(const std::vector<std::string>& extra_sprites);
const sago::SagoSprite& GetSprite(const std::string &spritename) const;
const SagoDataHolder& GetDataHolder() const;
+ const std::unordered_map<std::string,std::shared_ptr<sago::SagoSprite>>& GetSprites() const;
private:
SagoSpriteHolder(const SagoSpriteHolder& base) = delete;
SagoSpriteHolder& operator=(const SagoSpriteHolder& base) = delete;