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

See 40b94c1f9776e42c59ef95140f2a4a5fab3030d8
This commit is contained in:
rdb 2021-03-22 21:50:41 +01:00
parent 3732d3f1e6
commit 3ecc8c857a

View File

@ -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);