diff -r c4384f43c739 -r 262828ae9682 Shark.cpp --- a/Shark.cpp Sun Dec 03 19:22:42 2023 +0100 +++ b/Shark.cpp Mon Dec 04 21:03:53 2023 +0100 @@ -29,6 +29,7 @@ #include "Logger.h" #include "MappedFile.h" #include "ImageLoader.h" +#include "Texture.h" #include "Shader.h" #include "Program.h" #include "FileMonitor.h" @@ -155,18 +156,6 @@ } initialCtx, ctx; - class Texture { - public: - GLuint id; - std::string fileName; - int width; - int height; - - GLfloat getRatio() const { - return (GLfloat) width / (GLfloat) height; - } - }; - Display* dpy; Window win; XVisualInfo* vi; @@ -177,7 +166,7 @@ ImageLoader imageLoader; std::vector> shaders; std::shared_ptr shaderProgram; - std::vector textures; + std::vector> textures; Configuration cfg; std::ostream& logOutput = std::cerr; @@ -192,8 +181,6 @@ void log(LogLevel level, std::string message); int setNonBlocking(int fd); void loadVertices(); - Texture loadTexture(const std::string& fileName); - void updateTexture(Texture& tex, const Buffer& file); bool reloadTexture(const std::string& fileName); void loadTextures(); std::shared_ptr loadShaders(); @@ -208,11 +195,10 @@ } Shark::~Shark() { - // TODO: more SBRM + impl->textures.clear(); impl->shaders.clear(); impl->shaderProgram = nullptr; XFree(impl->vi); - // for (auto page : pdfTextures) glDeleteTextures(1, &page.texture); glXMakeCurrent(impl->dpy, None, NULL); glXDestroyContext(impl->dpy, impl->glc); XDestroyWindow(impl->dpy, impl->win); @@ -498,8 +484,8 @@ void Shark::Impl::loadVertices() { for (int i = 0; i < textures.size(); i++) { - const Texture& tex = textures[i]; - GLfloat ratio = tex.getRatio(); + std::shared_ptr tex = textures[i]; + GLfloat ratio = tex->getRatio(); const std::vector vertices = { // Vertex XYZ Texture XY -0.80f * ratio, +0.80f, +0.0, /**/ 0.0, 0.0, @@ -543,7 +529,7 @@ } const std::string -Shark::Shark::Impl::getDefaultFile(const std::string& relativePath) { +Shark::Impl::getDefaultFile(const std::string& relativePath) { const char* envName = "SHADER_SHARK_DATA_DIR"; const char* envValue = ::getenv(envName); if (envValue) { @@ -555,44 +541,16 @@ } } -Shark::Impl::Texture Shark::Impl::loadTexture(const std::string& fileName) { - Texture tex; - tex.fileName = fileName; - MappedFile file(tex.fileName); - updateTexture(tex, file); - return tex; -} - -void Shark::Impl::updateTexture(Texture& tex, const Buffer& file) { - std::shared_ptr img(imageLoader.loadImage(file)); - - tex.width = img->width; - tex.height = img->height; - - glGenTextures(1, &tex.id); - glBindTexture(GL_TEXTURE_2D, tex.id); - auto GLT2D = GL_TEXTURE_2D; - glTexImage2D(GLT2D, 0, GL_RGBA, - tex.width, tex.height, - 0, GL_RGBA, GL_UNSIGNED_BYTE, - img->getData()); - glTexParameteri(GLT2D, GL_TEXTURE_WRAP_S, GL_REPEAT); - glTexParameteri(GLT2D, GL_TEXTURE_WRAP_T, GL_REPEAT); - glTexParameteri(GLT2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glTexParameteri(GLT2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); - glGenerateMipmap(GLT2D); - std::cerr << "loadTexture(\"" << tex.fileName.c_str() << "\", " - << tex.width << ", " << tex.height << ") = " << tex.id << std::endl; - checkError(&std::cerr); -} - void Shark::Impl::loadTextures() { // Load default texture if there is no configured: if (cfg.textures.empty()) cfg.textures.push_back({getDefaultFile("textures/default.png")}); for (const Configuration::Texture& tex : cfg.textures) { - textures.push_back(loadTexture(tex.fileName)); + std::shared_ptr + img(imageLoader.loadImage(MappedFile(tex.fileName))); + textures.push_back(std::make_shared( + img->width, img->height, *img, tex.fileName)); watchedFiles.push_back(fileMonitor.watch(tex.fileName)); // TODO: review texture loading and binding // works even without this - default texture @@ -602,9 +560,11 @@ } bool Shark::Impl::reloadTexture(const std::string& fileName) { - for (Texture& tex : textures) { - if (tex.fileName == fileName) { - updateTexture(tex, MappedFile(fileName)); + for (std::shared_ptr tex : textures) { + if (tex->getFileName() == fileName) { + std::shared_ptr + img(imageLoader.loadImage(MappedFile(fileName))); + tex->update(img->width, img->height, *img); loadVertices(); return true; }