Browse Source

gobj: Slight optimization for GeomTristrips::append_unused_vertices()

rdb 5 years ago
parent
commit
902ada10b8
2 changed files with 42 additions and 9 deletions
  1. 22 9
      panda/src/gobj/geomTristrips.cxx
  2. 20 0
      tests/gobj/test_geom_primitives.py

+ 22 - 9
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();
-
-  GeomVertexWriter to(vertices, 0);
-  to.set_row_unsafe(vertices->get_num_rows());
-
-  to.add_data1i(prev);
-  to.add_data1i(vertex);
+  size_t offset = vertices->get_num_rows();
+  vertices->set_num_rows(offset + 2);
+
+  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;
+  }
 }
 
 /**

+ 20 - 0
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)