From 12584beb4274cdd6de208588269b5dd9eb632d50 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20M=C3=B6bius?= Date: Mon, 27 Apr 2009 12:42:13 +0000 Subject: [PATCH] Fixed bad property handling in OpenMesh Stripifier doing create and delete of properties in generator function not in constructor/destructor. git-svn-id: http://www.openmesh.org/svnrepo/OpenMesh/trunk@102 fdac6126-5c0c-442c-9429-916003d36597 --- Tools/Utils/StripifierT.cc | 160 +++++++++++++++++++------------------ Tools/Utils/StripifierT.hh | 55 +++++++------ 2 files changed, 110 insertions(+), 105 deletions(-) diff --git a/Tools/Utils/StripifierT.cc b/Tools/Utils/StripifierT.cc index fa51e7d7..e05a6423 100644 --- a/Tools/Utils/StripifierT.cc +++ b/Tools/Utils/StripifierT.cc @@ -1,31 +1,31 @@ //============================================================================= -// -// OpenMesh -// Copyright (C) 2001-2003 by Computer Graphics Group, RWTH Aachen -// www.openmesh.org -// +// +// OpenMesh +// Copyright (C) 2001-2003 by Computer Graphics Group, RWTH Aachen +// www.openmesh.org +// //----------------------------------------------------------------------------- -// -// License -// -// This library is free software; you can redistribute it and/or modify it -// under the terms of the GNU Lesser General Public License as published -// by the Free Software Foundation, version 2.1. -// -// This library is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -// +// +// License +// +// This library is free software; you can redistribute it and/or modify it +// under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, version 2.1. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +// //----------------------------------------------------------------------------- -// +// // $Revision$ // $Date$ -// +// //============================================================================= //============================================================================= @@ -45,33 +45,39 @@ //== NAMESPACES =============================================================== namespace OpenMesh { - - + + //== IMPLEMENTATION ========================================================== - - + +template +StripifierT:: +StripifierT(Mesh& _mesh) : + mesh_(_mesh) +{ + // preprocess: add new properties + mesh_.add_property( processed_ ); + mesh_.add_property( used_ ); + mesh_.request_face_status(); +} + +template +StripifierT:: +~StripifierT() { + // postprocess: remove properties + mesh_.remove_property(processed_); + mesh_.remove_property(used_); + mesh_.release_face_status(); +} + template unsigned int StripifierT:: stripify() { - // preprocess: add new properties - mesh_.add_property( processed_ ); - mesh_.add_property( used_ ); - mesh_.request_face_status(); - - // build strips clear(); build_strips(); - - - // postprocess: remove properties - //mesh_.remove_property(processed_); - //mesh_.remove_property(used_); - //mesh_.release_face_status(); - - + return n_strips(); } @@ -90,9 +96,9 @@ build_strips() FaceHandles faces[3]; typename FaceHandles::iterator fh_it, fh_end; typename Mesh::FaceIter f_it, f_end=mesh_.faces_end(); - - - + + + // init faces to be un-processed and un-used // deleted or hidden faces are marked processed if (mesh_.has_face_status()) @@ -108,9 +114,9 @@ build_strips() for (f_it=mesh_.faces_begin(); f_it!=f_end; ++f_it) processed(f_it) = used(f_it) = false; } - - - + + + for (f_it=mesh_.faces_begin(); true; ) { // find start face @@ -118,39 +124,39 @@ build_strips() if (!processed(f_it)) break; if (f_it==f_end) break; // stop if all have been processed - - + + // collect starting halfedges h[0] = mesh_.halfedge_handle(f_it.handle()); h[1] = mesh_.next_halfedge_handle(h[0]); h[2] = mesh_.next_halfedge_handle(h[1]); - - + + // build 3 strips, take best one best_length = best_idx = 0; for (unsigned int i=0; i<3; ++i) { build_strip(h[i], experiments[i], faces[i]); - if ((length = experiments[i].size()) > best_length) + if ((length = experiments[i].size()) > best_length) { best_length = length; best_idx = i; } - - for (fh_it=faces[i].begin(), fh_end=faces[i].end(); + + for (fh_it=faces[i].begin(), fh_end=faces[i].end(); fh_it!=fh_end; ++fh_it) used(*fh_it) = false; } - - + + // update processed status fh_it = faces[best_idx].begin(); fh_end = faces[best_idx].end(); for (; fh_it!=fh_end; ++fh_it) processed(*fh_it) = true; - - - + + + // add best strip to strip-list strips_.push_back(experiments[best_idx]); } @@ -170,17 +176,17 @@ build_strip(typename Mesh::HalfedgeHandle _start_hh, std::list strip; typename Mesh::HalfedgeHandle hh; typename Mesh::FaceHandle fh; - - + + // reset face list _faces.clear(); - - + + // init strip strip.push_back(mesh_.from_vertex_handle(_start_hh).idx()); strip.push_back(mesh_.to_vertex_handle(_start_hh).idx()); - - + + // walk along the strip: 1st direction hh = mesh_.prev_halfedge_handle(mesh_.opposite_halfedge_handle(_start_hh)); while (1) @@ -191,23 +197,23 @@ build_strip(typename Mesh::HalfedgeHandle _start_hh, hh = mesh_.next_halfedge_handle(hh); if (mesh_.is_boundary(hh)) break; fh = mesh_.face_handle(hh); - if (processed(fh) || used(fh)) break; + if (processed(fh) || used(fh)) break; _faces.push_back(fh); used(fh) = true; strip.push_back(mesh_.to_vertex_handle(hh).idx()); - + // go left hh = mesh_.opposite_halfedge_handle(hh); hh = mesh_.next_halfedge_handle(hh); if (mesh_.is_boundary(hh)) break; fh = mesh_.face_handle(hh); - if (processed(fh) || used(fh)) break; + if (processed(fh) || used(fh)) break; _faces.push_back(fh); used(fh) = true; strip.push_back(mesh_.to_vertex_handle(hh).idx()); } - - + + // walk along the strip: 2nd direction bool flip(false); hh = mesh_.prev_halfedge_handle(_start_hh); @@ -219,28 +225,28 @@ build_strip(typename Mesh::HalfedgeHandle _start_hh, hh = mesh_.next_halfedge_handle(hh); if (mesh_.is_boundary(hh)) break; fh = mesh_.face_handle(hh); - if (processed(fh) || used(fh)) break; + if (processed(fh) || used(fh)) break; _faces.push_back(fh); used(fh) = true; strip.push_front(mesh_.to_vertex_handle(hh).idx()); flip = true; - + // go left hh = mesh_.opposite_halfedge_handle(hh); hh = mesh_.next_halfedge_handle(hh); if (mesh_.is_boundary(hh)) break; fh = mesh_.face_handle(hh); - if (processed(fh) || used(fh)) break; + if (processed(fh) || used(fh)) break; _faces.push_back(fh); used(fh) = true; strip.push_front(mesh_.to_vertex_handle(hh).idx()); flip = false; } - + if (flip) strip.push_front(strip.front()); - - - + + + // copy final strip to _strip _strip.clear(); _strip.reserve(strip.size()); diff --git a/Tools/Utils/StripifierT.hh b/Tools/Utils/StripifierT.hh index 1b3458db..5a9e87f9 100644 --- a/Tools/Utils/StripifierT.hh +++ b/Tools/Utils/StripifierT.hh @@ -1,31 +1,31 @@ //============================================================================= -// -// OpenMesh -// Copyright (C) 2001-2003 by Computer Graphics Group, RWTH Aachen -// www.openmesh.org -// +// +// OpenMesh +// Copyright (C) 2001-2003 by Computer Graphics Group, RWTH Aachen +// www.openmesh.org +// //----------------------------------------------------------------------------- -// -// License -// -// This library is free software; you can redistribute it and/or modify it -// under the terms of the GNU Lesser General Public License as published -// by the Free Software Foundation, version 2.1. -// -// This library is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -// +// +// License +// +// This library is free software; you can redistribute it and/or modify it +// under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, version 2.1. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +// //----------------------------------------------------------------------------- -// +// // $Revision$ // $Date$ -// +// //============================================================================= //============================================================================= @@ -57,7 +57,7 @@ namespace OpenMesh { - + /** \class StripifierT StripifierT.hh This class decomposes a triangle mesh into several triangle strips. */ @@ -66,7 +66,7 @@ template class StripifierT { public: - + typedef unsigned int Index; typedef std::vector Strip; typedef typename Strip::const_iterator IndexIterator; @@ -75,11 +75,10 @@ public: /// Default constructor - StripifierT(Mesh& _mesh) : mesh_(_mesh) {} + StripifierT(Mesh& _mesh); /// Destructor - ~StripifierT() {} - + ~StripifierT(); /// Compute triangle strips, returns number of strips unsigned int stripify();