/* render/render.cc This file is part of the Osirion project and is distributed under the terms of the GNU General Public License version 2 */ #include #include #include #include #include "render/render.h" #include "render/tga.h" #include "render/gl.h" #include "core/core.h" #include "filesystem/filesystem.h" #include "sys/sys.h" namespace render { GLuint textures[32]; core::Cvar *r_radius = 0; core::Cvar *r_wireframe = 0; core::Cvar * r_arraysize = 0; core::VertexArray *vertexarray = 0; bool texture(const char *filename, size_t id) { Image *image = TGA::load(filename); if (!image) return false; 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); return true; } void init() { con_print << "Initializing renderer..." << std::endl; con_print << " renderer " << gl::renderer() << std::endl; con_print << " vendor " << gl::vendor() << std::endl; con_print << " version " << gl::version() << std::endl; con_print << "Loading textures..." << std::endl; if (!texture( "bitmaps/loader.tga", 0)) { con_error << "Essential file bitmaps/loader.tga missing" << std::endl; core::application()->shutdown(); } if (!texture("bitmaps/conchars.tga", 1)) { con_error << "Essential file bitmaps/conchars.tga missing" << std::endl; core::application()->shutdown(); } if (!texture("bitmaps/crosshair.tga", 2)) { con_error << "Essential file bitmaps/crosshair.tga missing" << std::endl; core::application()->shutdown(); } r_arraysize = core::Cvar::get("r_arraysize", 4.0f * (float) sizeof(float) , core::Cvar::Archive); size_t mb = (size_t) r_arraysize->value(); if (mb < 8) mb = 8; if (mb > 256) mb = 256; (*r_arraysize) = (float) mb; vertexarray = new core::VertexArray(mb); r_radius = core::Cvar::get("r_radius", "0", core::Cvar::Archive); r_wireframe = core::Cvar::get("r_wireframe", "0", core::Cvar::Archive); } void shutdown() { con_print << "Shutting down renderer..." << std::endl; glDeleteTextures(2, textures); // clear entity models, this will force a reload for (std::map::iterator it=core::Entity::registry.begin(); it != core::Entity::registry.end(); it++) { core::Entity *entity = (*it).second; if (entity->model()) entity->entity_model = 0; } core::Model::clear(); delete vertexarray; vertexarray = 0; } }