optimize index traversal

This commit is contained in:
David Rose 2008-05-05 06:00:27 +00:00
parent d6a9ea874d
commit e45a354a05
2 changed files with 112 additions and 12 deletions

View File

@ -35,6 +35,7 @@ extern "C" {
TypeHandle TinyGraphicsStateGuardian::_type_handle;
PStatCollector TinyGraphicsStateGuardian::_vertices_immediate_pcollector("Vertices:Immediate mode");
PStatCollector TinyGraphicsStateGuardian::_draw_transform_pcollector("Draw:Transform");
static const ZB_fillTriangleFunc fill_tri_funcs
@ -910,6 +911,8 @@ begin_draw_primitives(const GeomPipelineReader *geom_reader,
}
nassertr(_data_reader != (GeomVertexDataPipelineReader *)NULL, false);
PStatTimer timer(_draw_transform_pcollector);
// Set up the proper transform.
if (_data_reader->is_vertex_transformed()) {
// If the vertex data claims to be already transformed into clip
@ -1228,11 +1231,45 @@ draw_triangles(const GeomPrimitivePipelineReader *reader, bool force) {
_vertices_immediate_pcollector.add_level(num_vertices);
if (reader->is_indexed()) {
for (int i = 0; i < num_vertices; i += 3) {
GLVertex *v0 = &_vertices[reader->get_vertex(i) - _min_vertex];
GLVertex *v1 = &_vertices[reader->get_vertex(i + 1) - _min_vertex];
GLVertex *v2 = &_vertices[reader->get_vertex(i + 2) - _min_vertex];
gl_draw_triangle(_c, v0, v1, v2);
switch (reader->get_index_type()) {
case Geom::NT_uint8:
{
PN_uint8 *index = (PN_uint8 *)reader->get_read_pointer(true);
for (int i = 0; i < num_vertices; i += 3) {
GLVertex *v0 = &_vertices[index[i] - _min_vertex];
GLVertex *v1 = &_vertices[index[i + 1] - _min_vertex];
GLVertex *v2 = &_vertices[index[i + 2] - _min_vertex];
gl_draw_triangle(_c, v0, v1, v2);
}
}
break;
case Geom::NT_uint16:
{
PN_uint16 *index = (PN_uint16 *)reader->get_read_pointer(true);
for (int i = 0; i < num_vertices; i += 3) {
GLVertex *v0 = &_vertices[index[i] - _min_vertex];
GLVertex *v1 = &_vertices[index[i + 1] - _min_vertex];
GLVertex *v2 = &_vertices[index[i + 2] - _min_vertex];
gl_draw_triangle(_c, v0, v1, v2);
}
}
break;
case Geom::NT_uint32:
{
PN_uint32 *index = (PN_uint32 *)reader->get_read_pointer(true);
for (int i = 0; i < num_vertices; i += 3) {
GLVertex *v0 = &_vertices[index[i] - _min_vertex];
GLVertex *v1 = &_vertices[index[i + 1] - _min_vertex];
GLVertex *v2 = &_vertices[index[i + 2] - _min_vertex];
gl_draw_triangle(_c, v0, v1, v2);
}
}
break;
default:
break;
}
} else {
@ -1266,10 +1303,42 @@ draw_lines(const GeomPrimitivePipelineReader *reader, bool force) {
_vertices_immediate_pcollector.add_level(num_vertices);
if (reader->is_indexed()) {
for (int i = 0; i < num_vertices; i += 2) {
GLVertex *v0 = &_vertices[reader->get_vertex(i) - _min_vertex];
GLVertex *v1 = &_vertices[reader->get_vertex(i + 1) - _min_vertex];
gl_draw_line(_c, v0, v1);
switch (reader->get_index_type()) {
case Geom::NT_uint8:
{
PN_uint8 *index = (PN_uint8 *)reader->get_read_pointer(true);
for (int i = 0; i < num_vertices; i += 2) {
GLVertex *v0 = &_vertices[index[i] - _min_vertex];
GLVertex *v1 = &_vertices[index[i + 1] - _min_vertex];
gl_draw_line(_c, v0, v1);
}
}
break;
case Geom::NT_uint16:
{
PN_uint16 *index = (PN_uint16 *)reader->get_read_pointer(true);
for (int i = 0; i < num_vertices; i += 2) {
GLVertex *v0 = &_vertices[index[i] - _min_vertex];
GLVertex *v1 = &_vertices[index[i + 1] - _min_vertex];
gl_draw_line(_c, v0, v1);
}
}
break;
case Geom::NT_uint32:
{
PN_uint32 *index = (PN_uint32 *)reader->get_read_pointer(true);
for (int i = 0; i < num_vertices; i += 2) {
GLVertex *v0 = &_vertices[index[i] - _min_vertex];
GLVertex *v1 = &_vertices[index[i + 1] - _min_vertex];
gl_draw_line(_c, v0, v1);
}
}
break;
default:
break;
}
} else {
@ -1302,9 +1371,39 @@ draw_points(const GeomPrimitivePipelineReader *reader, bool force) {
_vertices_immediate_pcollector.add_level(num_vertices);
if (reader->is_indexed()) {
for (int i = 0; i < num_vertices; ++i) {
GLVertex *v0 = &_vertices[reader->get_vertex(i) - _min_vertex];
gl_draw_point(_c, v0);
switch (reader->get_index_type()) {
case Geom::NT_uint8:
{
PN_uint8 *index = (PN_uint8 *)reader->get_read_pointer(true);
for (int i = 0; i < num_vertices; ++i) {
GLVertex *v0 = &_vertices[index[i] - _min_vertex];
gl_draw_point(_c, v0);
}
}
break;
case Geom::NT_uint16:
{
PN_uint16 *index = (PN_uint16 *)reader->get_read_pointer(true);
for (int i = 0; i < num_vertices; ++i) {
GLVertex *v0 = &_vertices[index[i] - _min_vertex];
gl_draw_point(_c, v0);
}
}
break;
case Geom::NT_uint32:
{
PN_uint32 *index = (PN_uint32 *)reader->get_read_pointer(true);
for (int i = 0; i < num_vertices; ++i) {
GLVertex *v0 = &_vertices[index[i] - _min_vertex];
gl_draw_point(_c, v0);
}
}
break;
default:
break;
}
} else {

View File

@ -133,6 +133,7 @@ private:
int _vertices_size;
static PStatCollector _vertices_immediate_pcollector;
static PStatCollector _draw_transform_pcollector;
public:
static TypeHandle get_class_type() {