blob: c7af2e3d65c0e775995fb9be191e2d8662b65e9c (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
|
/*
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
{
std::map<std::string, Model*> Model::registry;
Model::Model(std::string const & name) :
model_name(name)
{
model_first_vertex = 0;
model_first_evertex = 0;
model_vertex_count = 0;
model_vertex_countdetail = 0;
model_evertex_count = 0;
model_evertex_countdetail = 0;
model_radius = 0.5f;
}
Model::~Model()
{
// delete all engines
for (std::list<Engine *>::iterator eit = model_engine.begin(); eit != model_engine.end(); eit++) {
delete(*eit);
}
model_engine.clear();
// delete all lights
for (std::list<Light *>::iterator lit = model_light.begin(); lit != model_light.end(); lit++) {
delete (*lit);
}
model_light.clear();
}
size_t Model::tris() const
{
return ((model_vertex_count + model_vertex_countdetail +
model_evertex_count + model_evertex_countdetail)/3);
}
size_t Model::details() const
{
return ((model_vertex_countdetail + model_evertex_countdetail)/3);
}
void Model::add_engine(Engine *engine)
{
model_engine.push_back(engine);
}
void Model::add_light(Light *light)
{
model_light.push_back(light);
}
Model *Model::find(std::string const & name)
{
std::map<std::string, Model*>::iterator it = registry.find(name);
if (it == 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)
registry[model->name()] = model;
}
return model;
}
void Model::clear()
{
// delete all models in the registry
for (std::map<std::string, Model*>::iterator mit = registry.begin(); mit != registry.end(); mit++) {
delete(*mit).second;
}
registry.clear();
// clear the vertex array
if (VertexArray::instance())
VertexArray::instance()->clear();
}
void Model::list()
{
for (std::map<std::string, Model*>::iterator mit = registry.begin(); mit != registry.end(); mit++) {
con_print << " " << (*mit).second->name() << " "
<< (*mit).second->tris() << " triangles ("
<< (*mit).second->details() << " detail) "
<< (*mit).second->model_engine.size() << " engines "
<< (*mit).second->model_light.size() << " lights\n";
}
con_print << registry.size() << " registered models" << std::endl;
if (VertexArray::instance())
con_print << "vertex array " << (VertexArray::instance()->index() * 100 / VertexArray::instance()->size())
<< "% used" << std::endl;
}
}
|