/* render/model.h This file is part of the Osirion project and is distributed under the terms of the GNU General Public License version 2 */ #include "sys/sys.h" #include "model/model.h" #include "model/map.h" #include "model/vertexarray.h" namespace model { // static model registry Model::Registry Model::model_registry; Model::Model(std::string const & name) : model_name(name) { model_radius = 0.5f; model_enginesound = 0; model_tris_detail_count = 0; model_tris_count = 0; model_quad_detail_count = 0; model_quad_count = 0; } Model::~Model() { // delete all fragments for (Fragments::iterator fragit = model_fragments.begin(); fragit != model_fragments.end(); fragit++) { delete(*fragit); } model_fragments.clear(); // delete all engines for (Engines::iterator eit = model_engines.begin(); eit != model_engines.end(); eit++) { delete(*eit); } model_engines.clear(); // delete all lights for (Lights::iterator lit = model_lights.begin(); lit != model_lights.end(); lit++) { delete(*lit); } model_lights.clear(); // delete all flares for (Flares::iterator flit = model_flares.begin(); flit != model_flares.end(); flit++) { delete(*flit); } model_flares.clear(); } void Model::add_engine(Engine *engine) { model_engines.push_back(engine); } void Model::add_light(Light *light) { model_lights.push_back(light); } void Model::add_flare(Flare *flare) { model_flares.push_back(flare); } Model *Model::find(std::string const & name) { Registry::iterator it = model_registry.find(name); if (it == model_registry.end()) return 0; else return (*it).second; } Model *Model::load(std::string const & name) { Model *model = find(name); if (!model) { model = Map::load(name); if (model) { model_registry[model->name()] = model; } } return model; } void Model::clear() { // delete all models in the registry for (Registry::iterator mit = model_registry.begin(); mit != model_registry.end(); mit++) { delete(*mit).second; } model_registry.clear(); // clear the vertex array if (VertexArray::instance()) VertexArray::instance()->clear(); } void Model::list_model(Model *model) { con_print << " " << model->name() << " " << model->fragments().size() << " frags " << model->model_tris_count << "/" << model->model_tris_detail_count << " tris/detail " << model->model_quad_count << "/" << model->model_quad_detail_count << " quads/detail" << std::endl; } void Model::list() { for (Registry::iterator mit = model_registry.begin(); mit != model_registry.end(); mit++) { list_model((*mit).second); } con_print << model_registry.size() << " registered models" << std::endl; if (VertexArray::instance()) con_print << "vertex array " << (VertexArray::instance()->index() * 100 / VertexArray::instance()->size()) << "% of " << VertexArray::instance()->size() * 4 *sizeof(float) / (1024*1024) << "Mb used" << std::endl; } }