Project::OSiRiON - Git repositories
Project::OSiRiON
News . About . Screenshots . Downloads . Forum . Wiki . Tracker . Git
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'src/render/textures.cc')
-rw-r--r--src/render/textures.cc136
1 files changed, 136 insertions, 0 deletions
diff --git a/src/render/textures.cc b/src/render/textures.cc
new file mode 100644
index 0000000..6880d87
--- /dev/null
+++ b/src/render/textures.cc
@@ -0,0 +1,136 @@
+/*
+ render/textures.cc
+ This file is part of the Osirion project and is distributed under
+ the terms of the GNU General Public License version 2
+*/
+
+
+
+#include "render/gl.h"
+#include "render/textures.h"
+#include "render/tga.h"
+
+#include "sys/sys.h"
+#include "core/application.h"
+
+namespace render {
+
+std::map<std::string, size_t> Textures::registry;
+size_t Textures::index = 0;
+GLuint Textures::textures[MAXTEXTURES];
+
+void Textures::init()
+{
+ clear();
+ con_print << "Loading textures..." << std::endl;
+
+ // "no texture" bitmap
+ load("textures/common/notex");
+
+ // console characters
+ if (load("bitmaps/conchars") == 0) {
+ con_error << "Essential file bitmaps/conchars missing" << std::endl;
+ core::application()->shutdown();
+ }
+
+ // loading screen background
+ load("bitmaps/loader");
+
+ // crosshairs
+ load("bitmaps/crosshair");
+
+ // light flares
+ load("bitmaps/fx/flare00");
+ load("bitmaps/fx/flare01");
+}
+
+void Textures::shutdown()
+{
+ clear();
+}
+
+void Textures::clear()
+{
+ if (index)
+ glDeleteTextures(index, textures);
+
+ registry.clear();
+ memset(textures,0, sizeof(textures));
+ index = 0;
+}
+
+size_t Textures::load(std::string name)
+{
+ // check if it is already loaded
+ iterator it = registry.find(name);
+ if (it != registry.end())
+ return (*it).second;
+
+ // try the tga version
+ std::string filename(name);
+ filename.append(".tga");
+ Image *image = TGA::load(filename.c_str());
+ if (!image) {
+ // add to the registry with id 0 (texture not found)
+ registry[name] = 0;
+ return 0;
+ }
+
+ if (index == MAXTEXTURES) {
+ con_error << "Texture limit " << MAXTEXTURES << " exceeded!" << std::endl;
+ delete image;
+ registry[name] = 0;
+ return 0;
+ }
+
+ size_t id = index;
+
+ 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;
+
+ gluBuild2DMipmaps(GL_TEXTURE_2D, image->channels(),
+ image->width(), image->height(), texture_type, GL_UNSIGNED_BYTE, image->data());
+
+ glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST);
+ glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR_MIPMAP_LINEAR);
+
+ // add to the registry
+ registry[name] = id;
+ index++;
+
+ // delete image data
+ delete image;
+
+ return id;
+}
+
+size_t Textures::bind(std::string name)
+{
+ size_t id = 0;
+ iterator it = registry.find(name);
+ if (it != registry.end())
+ id = (*it).second;
+ else
+ id = load(name);
+
+ glBindTexture(GL_TEXTURE_2D, textures[id]);
+ return id;
+}
+
+size_t Textures::bind(size_t texture)
+{
+ size_t id = texture;
+ if (texture >= index)
+ id = 0;
+
+ glBindTexture(GL_TEXTURE_2D, textures[id]);
+ return id;
+}
+
+}