Project::OSiRiON - Git repositories
Project::OSiRiON
News . About . Screenshots . Downloads . Forum . Wiki . Tracker . Git
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStijn Buys <ingar@osirion.org>2010-02-20 21:52:31 +0000
committerStijn Buys <ingar@osirion.org>2010-02-20 21:52:31 +0000
commit745b4e04e5f23a02e5d9b12ebabf38d6dd034136 (patch)
tree53bf2cbe44067c5900a07d577e8533bf0b2b0796 /src/model/vertexarray.cc
parent60cbb49128dd9561858855886c765515c7e89593 (diff)
Use interleaved vertex arrays
Diffstat (limited to 'src/model/vertexarray.cc')
-rw-r--r--src/model/vertexarray.cc52
1 files changed, 30 insertions, 22 deletions
diff --git a/src/model/vertexarray.cc b/src/model/vertexarray.cc
index 057b80d..861090c 100644
--- a/src/model/vertexarray.cc
+++ b/src/model/vertexarray.cc
@@ -19,25 +19,21 @@ 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 / 3; // 3 arrays
- vertex_vertex = (float *) malloc(vertex_size * sizeof(float));
- vertex_normal = (float *) malloc(vertex_size * sizeof(float));
- vertex_texture = (float *) malloc(vertex_size * sizeof(float));
+ vertex_size = size * 1024 * 1024; // megabytes
+ vertex_size = vertex_size / sizeof(float); // sizeof float
+
+ vertex_data = (float *) malloc(vertex_size * sizeof(float));
con_print << "^BInitializing vertex array..." << std::endl;
- con_print << " " << size << " Mb allocated" << std::endl;
+ con_print << " " << sizeof(vertex_data) / (1024 * 1024) << " Mb allocated" << std::endl;
clear();
}
VertexArray::~VertexArray()
{
- free(vertex_vertex);
- free(vertex_normal);
- free(vertex_texture);
+ free(vertex_data);
vertex_instance = 0 ;
}
@@ -47,9 +43,7 @@ void VertexArray::clear()
vertex_index = 0;
vertex_overflow = false;
- memset(vertex_vertex, 0, sizeof(vertex_vertex));
- memset(vertex_normal, 0, sizeof(vertex_normal));
- memset(vertex_texture, 0, sizeof(vertex_texture));
+ memset(vertex_data, 0, sizeof(vertex_data));
add_sphere();
}
@@ -136,7 +130,8 @@ void VertexArray::add_sphere()
size_t VertexArray::add_vertex(math::Vector3f const &v, math::Vector3f const &n, float tex_x, float tex_y)
{
- if (vertex_index + 3 >= vertex_size) {
+
+ if (vertex_index + 8 >= vertex_size) {
if (!vertex_overflow) {
con_warn << "VertexArray overflow!" << std::endl;
vertex_overflow = true;
@@ -144,20 +139,33 @@ size_t VertexArray::add_vertex(math::Vector3f const &v, math::Vector3f const &n,
return 0;
}
+ // GL_T2F_N3F_V3F
+
+ // texture coordinates
+ vertex_data[vertex_index] = tex_x;
+ vertex_data[vertex_index+1] = tex_y;
+
for (int i = 0; i < 3; i ++) {
- vertex_vertex[vertex_index+i] = v[i];
- vertex_normal[vertex_index+i] = n[i];
+ // normal
+ vertex_data[vertex_index+2+i] = n[i];
+ // vertex coordinates
+ vertex_data[vertex_index+5+i] = v[i];
}
-
- vertex_texture[vertex_index] = tex_x;
- vertex_texture[vertex_index+1] = tex_y;
- vertex_texture[vertex_index+2] = 0;
-
- vertex_index += 3;
+
+ vertex_index += 8;
return 1;
}
+void VertexArray::info() {
+ const size_t mbfl = 1024 * 1024 / sizeof(float);
+
+ con_print << " vertex array "
+ << vertex_index / mbfl << "/" << vertex_size / mbfl << "Mib "
+ << vertex_index / 8 << "/" << vertex_size / 8 << " verts "
+ << vertex_index * 100 / vertex_size << "% used"
+ << std::endl;
+}
}