From 703e4512b3368c94378df09b6c8aeaa08e9a93ad Mon Sep 17 00:00:00 2001 From: David Rose Date: Thu, 27 Jul 2006 00:24:13 +0000 Subject: [PATCH] fix assertion failure with threading --- panda/src/gobj/geomPrimitive.cxx | 47 ++++++++++++++++++++------------ panda/src/gobj/geomPrimitive.h | 1 + 2 files changed, 31 insertions(+), 17 deletions(-) diff --git a/panda/src/gobj/geomPrimitive.cxx b/panda/src/gobj/geomPrimitive.cxx index 2fe0a6a5e0..41d49f2799 100644 --- a/panda/src/gobj/geomPrimitive.cxx +++ b/panda/src/gobj/geomPrimitive.cxx @@ -404,12 +404,16 @@ clear_vertices() { void GeomPrimitive:: offset_vertices(int offset) { if (is_indexed()) { - { - CDWriter cdata(_cycler, true); - consider_elevate_index_type(cdata, get_max_vertex() + offset); - } + CDWriter cdata(_cycler, true); - GeomVertexRewriter index(modify_vertices(), 0); + if (!cdata->_got_minmax) { + recompute_minmax(cdata); + nassertv(cdata->_got_minmax); + } + + consider_elevate_index_type(cdata, cdata->_max_vertex + offset); + + GeomVertexRewriter index(do_modify_vertices(cdata), 0); while (!index.is_at_end()) { index.set_data1i(index.get_data1i() + offset); } @@ -849,18 +853,7 @@ write(ostream &out, int indent_level) const { GeomVertexArrayData *GeomPrimitive:: modify_vertices() { CDWriter cdata(_cycler, true); - - if (cdata->_vertices == (GeomVertexArrayData *)NULL) { - do_make_indexed(cdata); - } - - if (cdata->_vertices->get_ref_count() > 1) { - cdata->_vertices = new GeomVertexArrayData(*cdata->_vertices); - } - - cdata->_modified = Geom::get_next_modified(); - cdata->_got_minmax = false; - return cdata->_vertices; + return do_modify_vertices(cdata); } //////////////////////////////////////////////////////////////////// @@ -1477,6 +1470,26 @@ do_set_index_type(CData *cdata, GeomPrimitive::NumericType index_type) { } } +//////////////////////////////////////////////////////////////////// +// Function: GeomPrimitive::do_modify_vertices +// Access: Private +// Description: The private implementation of modify_vertices(). +//////////////////////////////////////////////////////////////////// +GeomVertexArrayData *GeomPrimitive:: +do_modify_vertices(GeomPrimitive::CData *cdata) { + if (cdata->_vertices == (GeomVertexArrayData *)NULL) { + do_make_indexed(cdata); + } + + if (cdata->_vertices->get_ref_count() > 1) { + cdata->_vertices = new GeomVertexArrayData(*cdata->_vertices); + } + + cdata->_modified = Geom::get_next_modified(); + cdata->_got_minmax = false; + return cdata->_vertices; +} + //////////////////////////////////////////////////////////////////// // Function: GeomPrimitive::write_datagram // Access: Public, Virtual diff --git a/panda/src/gobj/geomPrimitive.h b/panda/src/gobj/geomPrimitive.h index 353d0b6420..eb9632d026 100644 --- a/panda/src/gobj/geomPrimitive.h +++ b/panda/src/gobj/geomPrimitive.h @@ -210,6 +210,7 @@ private: void do_make_indexed(CData *cdata); void consider_elevate_index_type(CData *cdata, int vertex); void do_set_index_type(CData *cdata, NumericType index_type); + GeomVertexArrayData *do_modify_vertices(CData *cdata); private: // A GeomPrimitive keeps a list (actually, a map) of all the