diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/Textures.cpp | 105 | ||||
-rw-r--r-- | src/Textures.h | 28 |
2 files changed, 75 insertions, 58 deletions
diff --git a/src/Textures.cpp b/src/Textures.cpp index dbd3674..3c1bcca 100644 --- a/src/Textures.cpp +++ b/src/Textures.cpp @@ -1,21 +1,51 @@ -/* -(c) 2008 Victor "ErV" Eremin, Voronezh, Russia. -mailto: ErV2005@rambler.ru, erv@box.vsi.ru -for non-ncommercial use only -*/ -#include "Textures.h" -#include <GL/glu.h> -#include <SDL/SDL_image.h> +// Texture loader implementation +// Copyright (C) 2021 Nguyễn Gia Phong +// +// This file is part of Black Shades. +// +// Black Shades is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published +// by the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Black Shades is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Black Shades. If not, see <https://www.gnu.org/licenses/>. + #include <stdio.h> -GLuint loadTexture(const char* filename_, GLenum minFilter, GLenum magFilter, bool mipmaps){ +#define STB_IMAGE_IMPLEMENTATION +#include <stb/stb_image.h> +#include <GL/glu.h> + +#include "Textures.h" + +GLuint loadTexture(const char* filename_, GLenum minFilter, + GLenum magFilter, bool mipmaps) +{ + // TODO: get rid of the :Data: thing char filename[1024]; strcpy(filename, filename_+1); - while(true){ + while (true) { char *c = strchr(filename, ':'); if (!c) break; *c = '/'; } + + int req_format = STBI_rgb_alpha; + int width, height, orig_format; + unsigned char* data = stbi_load(filename, &width, &height, + &orig_format, req_format); + if (data == nullptr) { + fprintf(stderr, "Loading image failed: %s\n", + stbi_failure_reason()); + return 0; + } + GLuint tex = 0; glGenTextures(1, &tex); glBindTexture(GL_TEXTURE_2D, tex); @@ -23,50 +53,23 @@ GLuint loadTexture(const char* filename_, GLenum minFilter, GLenum magFilter, bo glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, magFilter); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, minFilter); - SDL_Surface *surface = IMG_Load(filename); - if (!surface){ - fprintf(stderr, "couldn't load file %s!\n", filename); - return 0; + GLint internal_format; + GLenum pixel_format; + if (req_format == STBI_rgb) { + internal_format = 3; + pixel_format = GL_RGB; + } else { // STBI_rgb_alpha (RGBA) + internal_format = 4; + pixel_format = GL_RGBA; } glPixelStorei(GL_UNPACK_ALIGNMENT, 1); - GLenum format = GL_RGBA; - int numColors = surface->format->BytesPerPixel; - if (surface){ - switch (numColors){ - case (4):{ - if (surface->format->Rmask == 0x000000ff) - format = GL_RGBA; - else - format = GL_BGRA; - break; - }; - case (3):{ - if (surface->format->Rmask == 0x000000ff) - format = GL_RGB; - else - format = GL_BGR; - }; - }; - - //well, our textures are upside down. Fixing it here. - Uint32 bytesPerRow = surface->format->BytesPerPixel*surface->w; - char * buf = new char[bytesPerRow]; - char* p = (char*)surface->pixels; - for (Uint32 i = 0; i < surface->h/2; i++){ - Uint32 offset1 = i*bytesPerRow; - Uint32 offset2 = (surface->h - i - 1)*bytesPerRow; - memcpy(buf, &p[offset1], bytesPerRow); - memcpy(&p[offset1], &p[offset2], bytesPerRow); - memcpy(&p[offset2], buf, bytesPerRow); - } - delete[] buf; - - glTexImage2D(GL_TEXTURE_2D, 0, numColors, surface->w, surface->h, 0, format, GL_UNSIGNED_BYTE, surface->pixels); - if (mipmaps) - gluBuild2DMipmaps(GL_TEXTURE_2D, format, surface->w, surface->h, format, GL_UNSIGNED_BYTE, surface->pixels); - } + glTexImage2D(GL_TEXTURE_2D, 0, internal_format, width, height, 0, + pixel_format, GL_UNSIGNED_BYTE, data); + if (mipmaps) + gluBuild2DMipmaps(GL_TEXTURE_2D, internal_format, width, height, + pixel_format, GL_UNSIGNED_BYTE, data); - delete surface; + // stbi_image_free(data); return tex; } diff --git a/src/Textures.h b/src/Textures.h index 6deeb1e..4332d26 100644 --- a/src/Textures.h +++ b/src/Textures.h @@ -1,14 +1,28 @@ -/* -(c) 2008 Victor "ErV" Eremin (Voronezh, Russia) -mailto:ErV2005@rambler.ru, erv@box.vsi.ru -for non-commercial use only -*/ +// Texture loader header +// Copyright (C) 2021 Nguyễn Gia Phong +// +// This file is part of Black Shades. +// +// Black Shades is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published +// by the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Black Shades is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Black Shades. If not, see <https://www.gnu.org/licenses/>. + #ifndef TEXTURES_H #define TEXTURES_H #include <SDL/SDL.h> #include <GL/gl.h> -GLuint loadTexture(const char* filename, GLenum minFilter = GL_LINEAR, GLenum magFilter = GL_LINEAR, bool mipmaps = true); +GLuint loadTexture(const char* filename, GLenum minFilter = GL_LINEAR, + GLenum magFilter = GL_LINEAR, bool mipmaps = true); -#endif +#endif // TEXTURES_H |