diff options
author | Stijn Buys <ingar@osirion.org> | 2008-07-20 13:50:24 +0000 |
---|---|---|
committer | Stijn Buys <ingar@osirion.org> | 2008-07-20 13:50:24 +0000 |
commit | aaaae14884eefe5571b5c5d6ce1606085e0b9376 (patch) | |
tree | 1a35d43e22497dd233afbcb5a67456e914005b64 /src/model/map.cc | |
parent | c3d90b226bdd83592d08704aa918f155f4c757e2 (diff) |
handle vertexarray overflows more gracefull
Diffstat (limited to 'src/model/map.cc')
-rw-r--r-- | src/model/map.cc | 75 |
1 files changed, 44 insertions, 31 deletions
diff --git a/src/model/map.cc b/src/model/map.cc index 972ae82..192814c 100644 --- a/src/model/map.cc +++ b/src/model/map.cc @@ -157,7 +157,8 @@ Model * Map::load(std::string const &name) mapfile.close(); - if (VertexArray::instance() && ((mapfile.class_tris.size() + mapfile.class_etris.size() + mapfile.class_ltris.size()) > 0)) { + // process the triangles calculated by the mapfile and add them to the vertex array + if (VertexArray::instance() && !VertexArray::instance()->overflow() && ((mapfile.class_tris.size() + mapfile.class_etris.size() + mapfile.class_ltris.size()) > 0)) { math::Vector3f center = (mapfile.class_minbbox + mapfile.class_maxbbox) / 2; @@ -168,24 +169,28 @@ Model * Map::load(std::string const &name) // structural triangles model->model_first_vertex = VertexArray::instance()->index()/3; - for (std::list<Triangle *>::iterator it = mapfile.class_tris.begin(); it != mapfile.class_tris.end(); it++) { + for (std::list<Triangle *>::iterator it = mapfile.class_tris.begin(); it != mapfile.class_tris.end() && !VertexArray::instance()->overflow(); it++) { Triangle *triangle = (*it); if (!triangle->detail()) { - 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->model_vertex_count += 3; + size_t count = 0; + count += VertexArray::instance()->add_vertex(triangle->triangle_v0-center, triangle->normal(), triangle->color() ); + count += VertexArray::instance()->add_vertex(triangle->triangle_v1-center, triangle->normal(), triangle->color() ); + count += VertexArray::instance()->add_vertex(triangle->triangle_v2-center, triangle->normal(), triangle->color() ); + if (count == 3) + model->model_vertex_count += count; } } // detail triangles - for (std::list<Triangle *>::iterator it = mapfile.class_tris.begin(); it != mapfile.class_tris.end(); it++) { + for (std::list<Triangle *>::iterator it = mapfile.class_tris.begin(); it != mapfile.class_tris.end() && !VertexArray::instance()->overflow(); it++) { Triangle *triangle = (*it); if (triangle->detail()) { - 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->model_vertex_countdetail += 3; + size_t count = 0; + count += VertexArray::instance()->add_vertex(triangle->triangle_v0-center, triangle->normal(), triangle->color() ); + count += VertexArray::instance()->add_vertex(triangle->triangle_v1-center, triangle->normal(), triangle->color() ); + count += VertexArray::instance()->add_vertex(triangle->triangle_v2-center, triangle->normal(), triangle->color() ); + if (count == 3) + model->model_vertex_countdetail += count; } delete triangle; } @@ -193,24 +198,28 @@ Model * Map::load(std::string const &name) // structural etriangles model->model_first_evertex = VertexArray::instance()->index()/3; - for (std::list<Triangle *>::iterator it = mapfile.class_etris.begin(); it != mapfile.class_etris.end(); it++) { + for (std::list<Triangle *>::iterator it = mapfile.class_etris.begin(); it != mapfile.class_etris.end() && !VertexArray::instance()->overflow(); it++) { Triangle *triangle = (*it); if (!triangle->detail()) { - 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->model_evertex_count += 3; + size_t count = 0; + count += VertexArray::instance()->add_vertex(triangle->triangle_v0-center, triangle->normal(), triangle->color() ); + count += VertexArray::instance()->add_vertex(triangle->triangle_v1-center, triangle->normal(), triangle->color() ); + count += VertexArray::instance()->add_vertex(triangle->triangle_v2-center, triangle->normal(), triangle->color() ); + if (count == 3) + model->model_evertex_count += count; } } // detail etriangles - for (std::list<Triangle *>::iterator it = mapfile.class_etris.begin(); it != mapfile.class_etris.end(); it++) { + for (std::list<Triangle *>::iterator it = mapfile.class_etris.begin(); it != mapfile.class_etris.end() && !VertexArray::instance()->overflow(); it++) { Triangle *triangle = (*it); if (triangle->detail()) { - 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->model_evertex_countdetail += 3; + size_t count = 0; + count += VertexArray::instance()->add_vertex(triangle->triangle_v0-center, triangle->normal(), triangle->color() ); + count += VertexArray::instance()->add_vertex(triangle->triangle_v1-center, triangle->normal(), triangle->color() ); + count += VertexArray::instance()->add_vertex(triangle->triangle_v2-center, triangle->normal(), triangle->color() ); + if (count == 3) + model->model_evertex_countdetail += count; } delete triangle; } @@ -218,24 +227,28 @@ Model * Map::load(std::string const &name) // structural ltriangles model->model_first_lvertex = VertexArray::instance()->index()/3; - for (std::list<Triangle *>::iterator it = mapfile.class_ltris.begin(); it != mapfile.class_ltris.end(); it++) { + for (std::list<Triangle *>::iterator it = mapfile.class_ltris.begin(); it != mapfile.class_ltris.end() && !VertexArray::instance()->overflow(); it++) { Triangle *triangle = (*it); if (!triangle->detail()) { - 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->model_lvertex_count += 3; + size_t count = 0; + count += VertexArray::instance()->add_vertex(triangle->triangle_v0-center, triangle->normal(), triangle->color() ); + count += VertexArray::instance()->add_vertex(triangle->triangle_v1-center, triangle->normal(), triangle->color() ); + count += VertexArray::instance()->add_vertex(triangle->triangle_v2-center, triangle->normal(), triangle->color() ); + if (count == 3) + model->model_lvertex_count += count; } } // detail ltriangles - for (std::list<Triangle *>::iterator it = mapfile.class_ltris.begin(); it != mapfile.class_ltris.end(); it++) { + for (std::list<Triangle *>::iterator it = mapfile.class_ltris.begin(); it != mapfile.class_ltris.end() && !VertexArray::instance()->overflow(); it++) { Triangle *triangle = (*it); if (triangle->detail()) { - 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->model_lvertex_countdetail += 3; + size_t count = 0; + count += VertexArray::instance()->add_vertex(triangle->triangle_v0-center, triangle->normal(), triangle->color() ); + count += VertexArray::instance()->add_vertex(triangle->triangle_v1-center, triangle->normal(), triangle->color() ); + count += VertexArray::instance()->add_vertex(triangle->triangle_v2-center, triangle->normal(), triangle->color() ); + if (count == 3) + model->model_lvertex_countdetail += count; } delete triangle; } |