gobj: Slight optimization for GeomTristrips::append_unused_vertices()

This commit is contained in:
rdb 2020-12-14 11:09:53 +01:00
parent 454179a276
commit 902ada10b8
2 changed files with 41 additions and 8 deletions

View File

@ -482,15 +482,28 @@ requires_unused_vertices() const {
*/
void GeomTristrips::
append_unused_vertices(GeomVertexArrayData *vertices, int vertex) {
GeomVertexReader from(vertices, 0);
from.set_row_unsafe(vertices->get_num_rows() - 1);
int prev = from.get_data1i();
size_t offset = vertices->get_num_rows();
vertices->set_num_rows(offset + 2);
GeomVertexWriter to(vertices, 0);
to.set_row_unsafe(vertices->get_num_rows());
to.add_data1i(prev);
to.add_data1i(vertex);
PT(GeomVertexArrayDataHandle) handle = vertices->modify_handle();
unsigned char *ptr = handle->get_write_pointer();
switch (vertices->get_array_format()->get_stride()) {
case 1:
((uint8_t *)ptr)[offset] = ((uint8_t *)ptr)[offset - 1];
((uint8_t *)ptr)[offset + 1] = vertex;
break;
case 2:
((uint16_t *)ptr)[offset] = ((uint16_t *)ptr)[offset - 1];
((uint16_t *)ptr)[offset + 1] = vertex;
break;
case 4:
((uint32_t *)ptr)[offset] = ((uint32_t *)ptr)[offset - 1];
((uint32_t *)ptr)[offset + 1] = vertex;
break;
default:
nassert_raise("unsupported index type");
break;
}
}
/**

View File

@ -1,6 +1,26 @@
from panda3d import core
def test_geom_tristrips():
prim = core.GeomTristrips(core.GeomEnums.UH_static)
prim.add_vertex(0)
prim.add_vertex(1)
prim.add_vertex(2)
prim.add_vertex(3)
prim.close_primitive()
prim.add_vertex(0)
prim.add_vertex(1)
prim.add_vertex(2)
prim.close_primitive()
verts = prim.get_vertex_list()
assert tuple(verts) == (
0, 1, 2, 3,
3, 0,
0, 1, 2,
)
def test_geom_triangles_adjacency():
prim = core.GeomTriangles(core.GeomEnums.UH_static)
prim.add_vertex(0)