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