diff options
Diffstat (limited to 'src/core/model.cc')
-rw-r--r-- | src/core/model.cc | 106 |
1 files changed, 54 insertions, 52 deletions
diff --git a/src/core/model.cc b/src/core/model.cc index 1ddefca..a09c7fd 100644 --- a/src/core/model.cc +++ b/src/core/model.cc @@ -19,37 +19,51 @@ namespace core { -//const float MAX_BOUNDS = 8192; const float MAX_BOUNDS = 16384; - const float delta = 10e-10; /* ---------- core::VertexArray ------------------------------------ */ -float VertexArray::vertex[VERTEXARRAYSIZE]; -float VertexArray::vertex_color[VERTEXARRAYSIZE]; -float VertexArray::vertex_normal[VERTEXARRAYSIZE]; +VertexArray *VertexArray::vertex_instance = 0 ; + +VertexArray::VertexArray(size_t size) +{ + vertex_instance = this; + vertex_size = size * 1024*1024; // megabytes + vertex_size = vertex_size / sizeof(float); // sizeof float + vertex_size = vertex_size / 4; // 4 arrays + + vertex_vertex = (float *) malloc(vertex_size * sizeof(float)); + vertex_color = (float *) malloc(vertex_size * sizeof(float)); + vertex_normal = (float *) malloc(vertex_size * sizeof(float)); + vertex_texture = (float *) malloc(vertex_size * sizeof(float)); -//float VertexArray::evertex[VERTEXARRAYSIZE]; -//float VertexArray::evertex_normal[VERTEXARRAYSIZE]; + con_print << "Initializing vertex array..." << std::endl; + con_debug << " " << size << " Mb allocated" << std::endl; -size_t VertexArray::vertex_index; -//size_t VertexArray::evertex_index; + clear(); +} + +VertexArray::~VertexArray() +{ + free(vertex_vertex); + free(vertex_normal); + free(vertex_color); + free(vertex_texture); + + vertex_instance = 0 ; +} void VertexArray::clear() { vertex_index = 0; - // The VertexArray is only used by the client - if (!(Cvar::sv_dedicated && Cvar::sv_dedicated->value())) { - memset(vertex, 0, sizeof(vertex)); - memset(vertex_color, 0, sizeof(vertex_color)); - memset(vertex_normal, 0, sizeof(vertex_normal)); - - add_sphere(); - } + memset(vertex_vertex, 0, sizeof(vertex_vertex)); + memset(vertex_color, 0, sizeof(vertex_color)); + memset(vertex_normal, 0, sizeof(vertex_normal)); + memset(vertex_texture, 0, sizeof(vertex_normal)); - + add_sphere(); } void VertexArray::add_sphere() @@ -122,13 +136,13 @@ void VertexArray::add_sphere() } void VertexArray::add_vertex(math::Vector3f const &v, math::Vector3f const &n, math::Color const &color) { - if (vertex_index + 3 >= VERTEXARRAYSIZE) { + if (vertex_index + 3 >= vertex_size) { con_warn << "VertexArray overflow!" << std::endl; return; } for (int i = 0; i < 3; i ++) { - vertex[vertex_index+i] = v[i]; + vertex_vertex[vertex_index+i] = v[i]; vertex_normal[vertex_index+i] = n[i]; } @@ -139,21 +153,6 @@ void VertexArray::add_vertex(math::Vector3f const &v, math::Vector3f const &n, m vertex_index += 3; } -/* -void VertexArray::add_evertex(math::Vector3f const &v, math::Vector3f const &n) { - if (evertex_index + 3 >= VERTEXARRAYSIZE) { - con_warn << "EVertexArray overflow!" << std::endl; - return; - } - - for (int i = 0; i < 3; i ++) { - evertex[evertex_index+i] = v[i]; - evertex_normal[evertex_index+i] = n[i]; - } - - evertex_index += 3; -} -*/ /* ---------- core::Triangle --------------------------------------- */ Triangle::Triangle(math::Vector3f const &v0, math::Vector3f const &v1, math::Vector3f const &v2, math::Vector3f const &n, math::Color *color, bool detail) : @@ -272,7 +271,7 @@ Model::Model(std::string const & name) : //cout << " LEVEL -" << level << std::endl; if ((level == 2) && (class_name == "worldspawn")) { - if (!(Cvar::sv_dedicated && Cvar::sv_dedicated->value())) { + if (VertexArray::instance()) { // for every face std::vector<Vector3f *>points; for (std::vector<Plane3f *>::iterator face = planes.begin(); face != planes.end(); face++) { @@ -412,13 +411,13 @@ Model::Model(std::string const & name) : model_radius = model_maxbbox.length(); // structural triangles - model_first_vertex = VertexArray::vertex_index/3; + model_first_vertex = VertexArray::instance()->index()/3; for (std::list<Triangle *>::iterator it = model_tris.begin(); it != model_tris.end(); it++) { Triangle *triangle = (*it); if (!triangle->detail()) { - VertexArray::add_vertex(triangle->triangle_v0-center, triangle->normal(), triangle->color() ); - VertexArray::add_vertex(triangle->triangle_v1-center, triangle->normal(), triangle->color() ); - VertexArray::add_vertex(triangle->triangle_v2-center, triangle->normal(), triangle->color() ); + VertexArray::instance()->add_vertex(triangle->triangle_v0-center, triangle->normal(), triangle->color() ); + VertexArray::instance()->add_vertex(triangle->triangle_v1-center, triangle->normal(), triangle->color() ); + VertexArray::instance()->add_vertex(triangle->triangle_v2-center, triangle->normal(), triangle->color() ); model_vertex_count += 3; } } @@ -426,9 +425,9 @@ Model::Model(std::string const & name) : for (std::list<Triangle *>::iterator it = model_tris.begin(); it != model_tris.end(); it++) { Triangle *triangle = (*it); if (triangle->detail()) { - VertexArray::add_vertex(triangle->triangle_v0-center, triangle->normal(), triangle->color() ); - VertexArray::add_vertex(triangle->triangle_v1-center, triangle->normal(), triangle->color() ); - VertexArray::add_vertex(triangle->triangle_v2-center, triangle->normal(), triangle->color() ); + VertexArray::instance()->add_vertex(triangle->triangle_v0-center, triangle->normal(), triangle->color() ); + VertexArray::instance()->add_vertex(triangle->triangle_v1-center, triangle->normal(), triangle->color() ); + VertexArray::instance()->add_vertex(triangle->triangle_v2-center, triangle->normal(), triangle->color() ); model_vertex_countdetail += 3; } delete triangle; @@ -436,13 +435,13 @@ Model::Model(std::string const & name) : model_tris.clear(); // structural etriangles - model_first_evertex = VertexArray::vertex_index/3; + model_first_evertex = VertexArray::instance()->index()/3; for (std::list<Triangle *>::iterator it = model_etris.begin(); it != model_etris.end(); it++) { Triangle *triangle = (*it); if (!triangle->detail()) { - VertexArray::add_vertex(triangle->triangle_v0-center, triangle->normal(), triangle->color() ); - VertexArray::add_vertex(triangle->triangle_v1-center, triangle->normal(), triangle->color() ); - VertexArray::add_vertex(triangle->triangle_v2-center, triangle->normal(), triangle->color() ); + VertexArray::instance()->add_vertex(triangle->triangle_v0-center, triangle->normal(), triangle->color() ); + VertexArray::instance()->add_vertex(triangle->triangle_v1-center, triangle->normal(), triangle->color() ); + VertexArray::instance()->add_vertex(triangle->triangle_v2-center, triangle->normal(), triangle->color() ); model_evertex_count += 3; } } @@ -451,9 +450,9 @@ Model::Model(std::string const & name) : for (std::list<Triangle *>::iterator it = model_etris.begin(); it != model_etris.end(); it++) { Triangle *triangle = (*it); if (triangle->detail()) { - VertexArray::add_vertex(triangle->triangle_v0-center, triangle->normal(), triangle->color() ); - VertexArray::add_vertex(triangle->triangle_v1-center, triangle->normal(), triangle->color() ); - VertexArray::add_vertex(triangle->triangle_v2-center, triangle->normal(), triangle->color() ); + VertexArray::instance()->add_vertex(triangle->triangle_v0-center, triangle->normal(), triangle->color() ); + VertexArray::instance()->add_vertex(triangle->triangle_v1-center, triangle->normal(), triangle->color() ); + VertexArray::instance()->add_vertex(triangle->triangle_v2-center, triangle->normal(), triangle->color() ); model_evertex_countdetail += 3; } delete triangle; @@ -820,7 +819,8 @@ void Model::clear() registry.clear(); // clear the vertex array - VertexArray::clear(); + if (VertexArray::instance()) + VertexArray::instance()->clear(); } void Model::list() @@ -833,7 +833,9 @@ void Model::list() << (*mit).second->model_light.size() << " lights\n"; } con_print << registry.size() << " registered models" << std::endl; - con_print << "vertex array " << VertexArray::vertex_index/3 << "/" << VERTEXARRAYSIZE/3 << " used" << std::endl; + if (VertexArray::instance()) + con_print << "vertex array " << (VertexArray::instance()->index() * 100 / VertexArray::instance()->size()) + << "% used" << std::endl; } } |