From b328a5f94aedb4d653537207d93f549be632098c Mon Sep 17 00:00:00 2001 From: cignoni Date: Mon, 3 Nov 2014 14:50:37 +0000 Subject: [PATCH] Added the new mechanism for run time checking of mesh adequacy to a given algorithm. While the many RequireXXX functions allow to check the static correctness of a mesh and have a O(1) complexity, in many cases we need to run more complex checks to be sure that the subsequent algorithm can run without issues. Typical cases are the fact that there are no unreferenced vertices (NoUnreferencedVertex) or a given adjacency is correctly initialized (and not only statically present as a type component). --- vcg/complex/algorithms/mesh_assert.h | 93 ++++++++++++++++++++++++++++ vcg/complex/complex.h | 1 + vcg/complex/exception.h | 17 ++++- 3 files changed, 110 insertions(+), 1 deletion(-) create mode 100644 vcg/complex/algorithms/mesh_assert.h diff --git a/vcg/complex/algorithms/mesh_assert.h b/vcg/complex/algorithms/mesh_assert.h new file mode 100644 index 00000000..fd2dcf36 --- /dev/null +++ b/vcg/complex/algorithms/mesh_assert.h @@ -0,0 +1,93 @@ +/**************************************************************************** +* VCGLib o o * +* Visual and Computer Graphics Library o o * +* _ O _ * +* Copyright(C) 2014 \/)\/ * +* Visual Computing Lab /\/| * +* ISTI - Italian National Research Council | * +* \ * +* All rights reserved. * +* * +* This program is free software; you can redistribute it and/or modify * +* it under the terms of the GNU General Public License as published by * +* the Free Software Foundation; either version 2 of the License, or * +* (at your option) any later version. * +* * +* This program 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 General Public License (http://www.gnu.org/licenses/gpl.txt) * +* for more details. * +* * +****************************************************************************/ +#ifndef __VCGLIB_MESH_ASSERT +#define __VCGLIB_MESH_ASSERT + +#include + +namespace vcg { +namespace tri { +/** + * \brief For checking the adequacy of a mesh to a given algorithm. + * + * While the many RequireXXX functions allow to check the static correctness of a mesh and + * have a O(1) complexity, in many cases we need to run more complex checks to be sure that + * the subsequent algorithm can run without issues. + * Typical cases are the fact that there are no unreferenced vertices (NoUnreferencedVertex) + * or a given adjacency is correctly initialized (and not only statically present as a type component). + * + */ +template +class MeshAssert +{ +public: + typedef typename MeshType::VertexType VertexType; + typedef typename MeshType::VertexIterator VertexIterator; + typedef typename MeshType::FaceType FaceType; + typedef typename MeshType::FaceIterator FaceIterator; + typedef typename MeshType::CoordType CoordType; + typedef typename MeshType::ScalarType ScalarType; + + static void FFAdjacencyIsInitialized(MeshType &m) + { + for(FaceIterator fi=m.face.begin();fi!=m.face.end();++fi) + { + if(!fi->IsD()) + for(int i=0;iVN();++i) + { + if(fi->FFp(i)==0) + throw vcg::MissingPreconditionException("FF adjacency is not initialized"); + } + } + } + + static void VFAdjacencyIsInitialized(MeshType &m) + { + for(VertexIterator vi=m.vert.begin();vi!=m.vert.end();++vi) if(!vi->IsD()) + { + if(vi->VFp().IsNull()) + throw vcg::MissingPreconditionException("VF adjacency is not initialized"); + } + } + + static void NoUnreferencedVertex(MeshType &m) + { + tri::UpdateFlags::VertexClearV(m); + for(FaceIterator fi=m.face.begin();fi!=m.face.end();++fi) if(!fi->IsD()) + { + for(int i=0;iVN();++i) fi->V(i)->SetV(); + } + + for(VertexIterator vi=m.vert.begin();vi!=m.vert.end();++vi) + if(!vi->IsD()) + { + if(!vi->IsV()) + throw vcg::MissingPreconditionException("There are unreferenced vertices"); + } + } + +}; + +} // end namespace tri +} // end namespace vcg +#endif // __VCGLIB_MESH_ASSERT diff --git a/vcg/complex/complex.h b/vcg/complex/complex.h index 138db127..48df6034 100644 --- a/vcg/complex/complex.h +++ b/vcg/complex/complex.h @@ -44,6 +44,7 @@ #include #include #include +#include #include #undef __VCG_MESH diff --git a/vcg/complex/exception.h b/vcg/complex/exception.h index 7dfa3e13..467866c2 100644 --- a/vcg/complex/exception.h +++ b/vcg/complex/exception.h @@ -82,6 +82,21 @@ public: return buf; } }; -} +class MissingPreconditionException : public std::runtime_error +{ +public: + MissingPreconditionException(const std::string &err):std::runtime_error(err) + { + std::cout << "Mesh does not satisfy the following precondition:" << err << "- \n"; + } + + virtual const char *what() const throw () + { + static char buf[128]="Mesh does not satisfy precondition"; + return buf; + } +}; + +} // end namespace vcg #endif // EXCEPTION_H