From 27e026234be657e7a0f939405914784633a2e1f3 Mon Sep 17 00:00:00 2001 From: Stijn Buys Date: Sat, 21 Mar 2009 09:58:26 +0000 Subject: autodetect hardware generated mipmap support --- src/render/textures.cc | 42 +++++++++++++++++++++++++++++------------- 1 file changed, 29 insertions(+), 13 deletions(-) (limited to 'src/render/textures.cc') diff --git a/src/render/textures.cc b/src/render/textures.cc index 8f9249a..f5a5c62 100644 --- a/src/render/textures.cc +++ b/src/render/textures.cc @@ -12,6 +12,7 @@ #include "render/tgafile.h" #include "render/pngfile.h" #include "render/jpgfile.h" +#include "render/state.h" #include "sys/sys.h" #include "core/application.h" @@ -165,20 +166,20 @@ size_t Textures::load(const std::string &name, const bool filter) glGenTextures(1, &textures[id]); glBindTexture(GL_TEXTURE_2D, textures[id]); - int texture_type; - if (image->channels() == 4) - texture_type = GL_RGBA; - else - texture_type = GL_RGB; - + int texture_format; + int texture_internalformat; + if (filter) { // scaling functions glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); // 4 levels of mipmaps glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 4); - // hardware generated mipmaps (requires OpenGL 1.4) - glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE); + + if (State::has_generate_mipmaps()) { + // hardware generated mipmaps (requires OpenGL 1.4) + glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE); + } } else { // scaling functions glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); @@ -186,11 +187,26 @@ size_t Textures::load(const std::string &name, const bool filter) // no mipmaps, base level only glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAX_LEVEL, 0); } - glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); + //glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); + + if (image->channels() == 4) { + texture_format = GL_RGBA; + texture_internalformat = GL_RGBA8; + } else { + texture_format = GL_RGB; + texture_internalformat = GL_RGB8; + } + + if (filter && !State::has_generate_mipmaps()) { + gluBuild2DMipmaps(GL_TEXTURE_2D, + texture_internalformat, image->width(), image->height(), + texture_format, GL_UNSIGNED_BYTE, image->data()); + } else { - glTexImage2D(GL_TEXTURE_2D, 0, - image->channels(), image->width(), image->height(), 0, - texture_type, GL_UNSIGNED_BYTE, image->data()); + glTexImage2D(GL_TEXTURE_2D, 0, + texture_internalformat, image->width(), image->height(), 0, + texture_format, GL_UNSIGNED_BYTE, image->data()); + } // add to the registry registry[name] = id; @@ -226,7 +242,7 @@ size_t Textures::bind(const std::string &name, const bool filter) id = (*it).second; glBindTexture(GL_TEXTURE_2D, textures[id]); } else { - id = load(name); + id = load(name, filter); } return id; -- cgit v1.2.3