/* 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 { 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; void func_list_textures(std::string const &args) { Textures::list(); } 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(); core::Func *func = core::Func::add("list_textures", func_list_textures); func->set_info("list loaded textures"); } void clear() { // 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; } void unload() { clear(); Textures::shutdown(); Textures::init(); 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); } void shutdown() { con_print << "^BShutting down renderer..." << std::endl; core::Func::remove("list_textures"); clear(); Text::shutdown(); Textures::shutdown(); Camera::shutdown(); Dust::shutdown(); } }