Project::OSiRiON - Git repositories
Project::OSiRiON
News . About . Screenshots . Downloads . Forum . Wiki . Tracker . Git
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/model.cc')
-rw-r--r--src/core/model.cc106
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;
}
}