From 714a49685f5d24b782708470dfb6a10103134d7b Mon Sep 17 00:00:00 2001 From: MihailRis Date: Sun, 21 Jan 2024 22:29:14 +0300 Subject: [PATCH] Texture.readData --- src/graphics/Texture.cpp | 69 +++++++++++++++++++++++----------------- src/graphics/Texture.h | 2 ++ 2 files changed, 41 insertions(+), 30 deletions(-) diff --git a/src/graphics/Texture.cpp b/src/graphics/Texture.cpp index 0d5ae803..5531be1e 100644 --- a/src/graphics/Texture.cpp +++ b/src/graphics/Texture.cpp @@ -1,52 +1,61 @@ #include "Texture.h" #include #include +#include #include "ImageData.h" Texture::Texture(uint id, int width, int height) - : id(id), width(width), height(height) { + : id(id), width(width), height(height) { } Texture::Texture(ubyte* data, int width, int height, uint format) - : width(width), height(height) { - glGenTextures(1, &id); - glBindTexture(GL_TEXTURE_2D, id); - glPixelStorei(GL_UNPACK_ALIGNMENT, 1); - glTexImage2D(GL_TEXTURE_2D, 0, format, width, height, 0, - format, GL_UNSIGNED_BYTE, (GLvoid *) data); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - glGenerateMipmap(GL_TEXTURE_2D); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 2); - glBindTexture(GL_TEXTURE_2D, 0); + : width(width), height(height) { + glGenTextures(1, &id); + glBindTexture(GL_TEXTURE_2D, id); + glPixelStorei(GL_UNPACK_ALIGNMENT, 1); + glTexImage2D(GL_TEXTURE_2D, 0, format, width, height, 0, + format, GL_UNSIGNED_BYTE, (GLvoid *) data); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glGenerateMipmap(GL_TEXTURE_2D); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 2); + glBindTexture(GL_TEXTURE_2D, 0); } Texture::~Texture() { - glDeleteTextures(1, &id); + glDeleteTextures(1, &id); } void Texture::bind(){ - glBindTexture(GL_TEXTURE_2D, id); + glBindTexture(GL_TEXTURE_2D, id); } void Texture::reload(ubyte* data){ - glBindTexture(GL_TEXTURE_2D, id); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, - GL_RGBA, GL_UNSIGNED_BYTE, (GLvoid *) data); - glBindTexture(GL_TEXTURE_2D, 0); + glBindTexture(GL_TEXTURE_2D, id); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, + GL_RGBA, GL_UNSIGNED_BYTE, (GLvoid *) data); + glBindTexture(GL_TEXTURE_2D, 0); +} + +ImageData* Texture::readData() { + std::unique_ptr data (new ubyte[width * height * 4]); + glBindTexture(GL_TEXTURE_2D, id); + glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, data.get()); + glBindTexture(GL_TEXTURE_2D, 0); + return new ImageData(ImageFormat::rgba8888, width, height, data.release()); } Texture* Texture::from(const ImageData* image) { - uint width = image->getWidth(); - uint height = image->getHeight(); - uint format; - const void* data = image->getData(); - switch (image->getFormat()) { - case ImageFormat::rgb888: format = GL_RGB; break; - case ImageFormat::rgba8888: format = GL_RGBA; break; - default: - throw std::runtime_error("unsupported image data format"); - } - return new Texture((ubyte*)data, width, height, format); -} \ No newline at end of file + uint width = image->getWidth(); + uint height = image->getHeight(); + uint format; + const void* data = image->getData(); + switch (image->getFormat()) { + case ImageFormat::rgb888: format = GL_RGB; break; + case ImageFormat::rgba8888: format = GL_RGBA; break; + default: + throw std::runtime_error("unsupported image data format"); + } + return new Texture((ubyte*)data, width, height, format); +} diff --git a/src/graphics/Texture.h b/src/graphics/Texture.h index 4e85cb86..595ba411 100644 --- a/src/graphics/Texture.h +++ b/src/graphics/Texture.h @@ -18,6 +18,8 @@ public: void bind(); void reload(ubyte* data); + ImageData* readData(); + static Texture* from(const ImageData* image); };