mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-01 01:07:51 -04:00
optimize index traversal
This commit is contained in:
parent
d6a9ea874d
commit
e45a354a05
@ -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 {
|
||||
|
@ -133,6 +133,7 @@ private:
|
||||
int _vertices_size;
|
||||
|
||||
static PStatCollector _vertices_immediate_pcollector;
|
||||
static PStatCollector _draw_transform_pcollector;
|
||||
|
||||
public:
|
||||
static TypeHandle get_class_type() {
|
||||
|
Loading…
x
Reference in New Issue
Block a user