Browse Source

gobj: Also fix GeomPrimitive::offset_vertices() overload with begin/end

See 40b94c1f9776e42c59ef95140f2a4a5fab3030d8
rdb 4 years ago
parent
commit
3ecc8c857a
1 changed files with 40 additions and 7 deletions
  1. 40 7
      panda/src/gobj/geomPrimitive.cxx

+ 40 - 7
panda/src/gobj/geomPrimitive.cxx

@@ -542,16 +542,49 @@ offset_vertices(int offset, int begin_row, int end_row) {
 
     consider_elevate_index_type(cdata, max_vertex + offset);
 
-    GeomVertexRewriter index(do_modify_vertices(cdata), 0);
-    index.set_row_unsafe(begin_row);
-    for (int j = begin_row; j < end_row; ++j) {
-      int vertex = index.get_data1i();
-      if (vertex != strip_cut_index) {
-        index.set_data1i(vertex + offset);
+    {
+      GeomVertexArrayDataHandle handle(cdata->_vertices.get_write_pointer(),
+                                       Thread::get_current_thread());
+
+      unsigned char *ptr = handle.get_write_pointer();
+      switch (cdata->_index_type) {
+      case GeomEnums::NT_uint8:
+        for (int i = begin_row; i < end_row; ++i) {
+          uint8_t &v = ((uint8_t *)ptr)[i];
+          if (v != 0xff) {
+            v += offset;
+          }
+        }
+        break;
+
+      case GeomEnums::NT_uint16:
+        for (int i = begin_row; i < end_row; ++i) {
+          uint16_t &v = ((uint16_t *)ptr)[i];
+          if (v != 0xffff) {
+            v += offset;
+          }
+        }
+        break;
+
+      case GeomEnums::NT_uint32:
+        for (int i = begin_row; i < end_row; ++i) {
+          uint32_t &v = ((uint32_t *)ptr)[i];
+          if (v != 0xffffffff) {
+            v += offset;
+          }
+        }
+        break;
+
+      default:
+        nassert_raise("unsupported index type");
+        break;
       }
     }
 
-  } else {
+    cdata->_modified = Geom::get_next_modified();
+    cdata->_got_minmax = false;
+  }
+  else {
     // The supplied values cover all vertices, so we don't need to make it
     // indexed.
     CDWriter cdata(_cycler, true);