/* 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/gl.h" #include "render/dust.h" #include "render/textures.h" #include "render/tga.h" #include "render/render.h" #include "model/model.h" #include "core/core.h" #include "filesystem/filesystem.h" #include "sys/sys.h" namespace render { GLuint textures[32]; core::Cvar *r_arraysize = 0; core::Cvar *r_bbox = 0; core::Cvar *r_grid = 0; core::Cvar *r_radius = 0; core::Cvar *r_sky = 0; core::Cvar *r_wireframe = 0; using model::VertexArray; 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 << "^BInitializing renderer..." << std::endl; con_print << " renderer ^B" << gl::renderer() << std::endl; con_print << " vendor ^B" << gl::vendor() << std::endl; con_print << " version ^B" << gl::version() << std::endl; // size of the vertex array in megabytes r_arraysize = core::Cvar::get("r_arraysize", 0.0f , core::Cvar::Archive); r_arraysize->set_info("[int] size of the vertex array in Mb"); size_t mb = (size_t) r_arraysize->value(); if (mb < 4 * sizeof(float)) mb = 4 * sizeof(float); if (mb > 256) mb = 256; (*r_arraysize) = (float) mb; vertexarray = new VertexArray(mb); r_radius = core::Cvar::get("r_radius", "0", core::Cvar::Archive); r_radius->set_info("[bool] render entity radius"); r_wireframe = core::Cvar::get("r_wireframe", "0", core::Cvar::Archive); r_wireframe->set_info("[bool] render wireframe"); r_grid = core::Cvar::get("r_grid", "1", core::Cvar::Archive); r_grid->set_info("[bool] render the space grid"); r_bbox = core::Cvar::get("r_bbox", "0", core::Cvar::Archive); r_bbox->set_info("[bool] render model bounding box"); r_sky = core::Cvar::get("r_sky", "1", core::Cvar::Archive); r_sky->set_info("[bool] render the sky globe"); Camera::init(); Textures::init(); Text::init(); Dust::init(); } void shutdown() { con_print << "^BShutting down renderer..." << std::endl; // clear zone sky textures for (core::Zone::Registry::iterator it = core::Zone::registry().begin(); it != core::Zone::registry().end(); it++) { core::Zone *zone = (*it).second; zone->set_sky_texture(0); } // clear entity models, and globe textures, this will force a reload for (core::Entity::Registry::iterator it = core::Entity::registry().begin(); it != core::Entity::registry().end(); it++) { core::Entity *entity = (*it).second; if (entity->model()) entity->entity_model = 0; if (entity->type() == core::Entity::Globe) { core::EntityGlobe *globe = static_cast(entity); globe->render_texture = 0; } } // clear models model::Model::clear(); // clear vertex array delete vertexarray; vertexarray = 0; Text::shutdown(); Textures::shutdown(); Camera::shutdown(); Dust::shutdown(); } }