From 902ada10b8ed57dd03396f7269ede2358ccbf668 Mon Sep 17 00:00:00 2001 From: rdb Date: Mon, 14 Dec 2020 11:09:53 +0100 Subject: [PATCH] gobj: Slight optimization for GeomTristrips::append_unused_vertices() --- panda/src/gobj/geomTristrips.cxx | 29 +++++++++++++++++++++-------- tests/gobj/test_geom_primitives.py | 20 ++++++++++++++++++++ 2 files changed, 41 insertions(+), 8 deletions(-) diff --git a/panda/src/gobj/geomTristrips.cxx b/panda/src/gobj/geomTristrips.cxx index 15b46c409a..cb4253f396 100644 --- a/panda/src/gobj/geomTristrips.cxx +++ b/panda/src/gobj/geomTristrips.cxx @@ -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; + } } /** diff --git a/tests/gobj/test_geom_primitives.py b/tests/gobj/test_geom_primitives.py index 49cce11e31..6fd2d6b369 100644 --- a/tests/gobj/test_geom_primitives.py +++ b/tests/gobj/test_geom_primitives.py @@ -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)