From a61c2e8d46cdd7ebb84ebd0748b51717a2d154ea Mon Sep 17 00:00:00 2001 From: JailDoctor Date: Fri, 2 Dec 2022 12:30:25 +0100 Subject: [PATCH] - [WIP] Modificaciones a la clase Textura --- source/common/texture.cpp | 98 ++++++++++----------------------------- source/common/texture.h | 10 ++-- 2 files changed, 30 insertions(+), 78 deletions(-) diff --git a/source/common/texture.cpp b/source/common/texture.cpp index dce9ed2..3359004 100644 --- a/source/common/texture.cpp +++ b/source/common/texture.cpp @@ -3,23 +3,26 @@ #define STB_IMAGE_IMPLEMENTATION #include "stb_image.h" #include +#include "systempalette.h" // Constructor -Texture::Texture(SDL_Renderer *renderer, std::string path, bool verbose) +Texture::Texture(SDL_Renderer *renderer, SDL_Texture *texture, std::string path, bool verbose) { // Copia punteros this->renderer = renderer; + this->texture = texture; this->path = path; // Inicializa - texture = nullptr; - width = 0; - height = 0; + this->pixels = nullptr; + this->width = 0; + this->height = 0; + this->color = 0xffffffff; // Carga el fichero en la textura if (path != "") { - loadFromFile(path, renderer, verbose); + loadFromFile(path, verbose); } } @@ -31,7 +34,7 @@ Texture::~Texture() } // Carga una imagen desde un fichero -bool Texture::loadFromFile(std::string path, SDL_Renderer *renderer, bool verbose) +bool Texture::loadFromFile(std::string path, bool verbose) { const std::string filename = path.substr(path.find_last_of("\\/") + 1); int req_format = STBI_rgb_alpha; @@ -50,90 +53,37 @@ bool Texture::loadFromFile(std::string path, SDL_Renderer *renderer, bool verbos } } - int depth, pitch; - Uint32 pixel_format; - if (req_format == STBI_rgb) - { - depth = 24; - pitch = 3 * width; // 3 bytes por pixel * pixels per linea - pixel_format = SDL_PIXELFORMAT_RGB24; - } - else - { // STBI_rgb_alpha (RGBA) - depth = 32; - pitch = 4 * width; - pixel_format = SDL_PIXELFORMAT_RGBA32; - } - // Limpia unload(); - // La textura final - SDL_Texture *newTexture = nullptr; - - // Carga la imagen desde una ruta específica - SDL_Surface *loadedSurface = SDL_CreateRGBSurfaceWithFormatFrom((void *)data, width, height, depth, pitch, pixel_format); - if (loadedSurface == nullptr) - { - if (verbose) - { - std::cout << "Unable to load image " << path.c_str() << std::endl; - } - } - else - { - // Crea la textura desde los pixels de la surface - newTexture = SDL_CreateTextureFromSurface(renderer, loadedSurface); - if (newTexture == nullptr) - { - if (verbose) - { - std::cout << "Unable to create texture from " << path.c_str() << "! SDL Error: " << SDL_GetError() << std::endl; - } - } - else - { - // Obtiene las dimensiones de la imagen - this->width = loadedSurface->w; - this->height = loadedSurface->h; - } - - // Elimina la textura cargada - SDL_FreeSurface(loadedSurface); - } + const int size = width*height; + this->pixels = new uint8_t[size]; + for (int i = 0; i < size; ++i) this->pixels[i] = SystemPalette::getEntry(data[i]); // Return success stbi_image_free(data); - texture = newTexture; - return texture != nullptr; + return this->pixels != nullptr; } // Crea una textura en blanco -bool Texture::createBlank(SDL_Renderer *renderer, int width, int height, SDL_TextureAccess access) +bool Texture::createBlank(int width, int height, SDL_TextureAccess access) { // Crea una textura sin inicializar - texture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGBA8888, access, width, height); - if (texture == nullptr) - { - std::cout << "Unable to create blank texture! SDL Error: " << SDL_GetError() << std::endl; - } - else - { - this->width = width; - this->height = height; - } + this->pixels = new uint8_t[width*height]; + this->width = width; + this->height = height; - return texture != nullptr; + return this->pixels != nullptr; } // Libera la memoria de la textura void Texture::unload() { // Libera la textura si existe - if (texture != nullptr) + if (pixels != nullptr) { - SDL_DestroyTexture(texture); - texture = nullptr; + delete[] pixels; + pixels = nullptr; width = 0; height = 0; } @@ -142,19 +92,19 @@ void Texture::unload() // Establece el color para la modulacion void Texture::setColor(Uint8 red, Uint8 green, Uint8 blue) { - SDL_SetTextureColorMod(texture, red, green, blue); + this->color = (red << 24) + (green << 16) + (blue << 8) + 255; } // Establece el blending void Texture::setBlendMode(SDL_BlendMode blending) { - SDL_SetTextureBlendMode(texture, blending); + //SDL_SetTextureBlendMode(texture, blending); } // Establece el alpha para la modulación void Texture::setAlpha(Uint8 alpha) { - SDL_SetTextureAlphaMod(texture, alpha); + //SDL_SetTextureAlphaMod(texture, alpha); } // Renderiza la textura en un punto específico diff --git a/source/common/texture.h b/source/common/texture.h index d83d7e2..f21f898 100644 --- a/source/common/texture.h +++ b/source/common/texture.h @@ -11,26 +11,28 @@ class Texture { private: // Objetos y punteros - SDL_Texture *texture; // La textura + uint8_t *pixels; // Los pixels de esta textura + SDL_Texture *texture; // La textura SDL sobre la que pintaremos (debe haber sido creada con SDL_TEXTUREACCESS_STREAMING) SDL_Renderer *renderer; // Renderizador donde dibujar la textura // Variables int width; // Ancho de la imagen int height; // Alto de la imagen std::string path; // Ruta de la imagen de la textura + uint32_t color; // Color para el pintado de 1 bit (sprites y tal) public: // Constructor - Texture(SDL_Renderer *renderer, std::string path = "", bool verbose = false); + Texture(SDL_Renderer *renderer, SDL_Texture *texture, std::string path = "", bool verbose = false); // Destructor ~Texture(); // Carga una imagen desde un fichero - bool loadFromFile(std::string path, SDL_Renderer *renderer, bool verbose = false); + bool loadFromFile(std::string path, bool verbose = false); // Crea una textura en blanco - bool createBlank(SDL_Renderer *renderer, int width, int height, SDL_TextureAccess = SDL_TEXTUREACCESS_STREAMING); + bool createBlank(int width, int height, SDL_TextureAccess = SDL_TEXTUREACCESS_STREAMING); // Libera la memoria de la textura void unload();