diff --git a/panda/src/gobj/geomPrimitive.cxx b/panda/src/gobj/geomPrimitive.cxx index ca51d95079..68647082ae 100644 --- a/panda/src/gobj/geomPrimitive.cxx +++ b/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);