diff --git a/vcg/complex/algorithms/create/tetramesh_support.h b/vcg/complex/algorithms/create/tetramesh_support.h new file mode 100644 index 00000000..b45eba3c --- /dev/null +++ b/vcg/complex/algorithms/create/tetramesh_support.h @@ -0,0 +1,55 @@ +/**************************************************************************** +* VCGLib o o * +* Visual and Computer Graphics Library o o * +* _ O _ * +* Copyright(C) 2004-2016 \/)\/ * +* 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 TETRAMESH_SUPPORT_H +#define TETRAMESH_SUPPORT_H + +namespace vcg { +namespace tri { + +template +inline void CreateTriMeshFromTTBorder(TetraMesh & tetramesh, TriMesh & trimesh) +{ + RequireTTAdjacency(tetramesh); + tri::UpdateTopology::TetraTetra(tetramesh); + trimesh.Clear(); + + typedef typename TetraMesh::TetraType TetraType; + ForEachTetra(tetramesh, [&] (TetraType & t) { + for (int i = 0; i < 4; ++i) + if (IsTTBorder(t, i)) + { + tri::Allocator::AddFace(trimesh, + t.V(Tetra::VofF(i, 0)), + t.V(Tetra::VofF(i, 1)), + t.V(Tetra::VofF(i, 2))); + } + }); + + vcg::tri::Clean::RemoveDuplicateVertex(trimesh); + vcg::tri::Allocator::CompactEveryVector(trimesh); +} + +} // end namespace tri +} // end namespace vcg + +#endif // EXTRUDE_H diff --git a/vcg/complex/algorithms/update/flag.h b/vcg/complex/algorithms/update/flag.h index c4d74ac4..2a7957c2 100644 --- a/vcg/complex/algorithms/update/flag.h +++ b/vcg/complex/algorithms/update/flag.h @@ -189,7 +189,7 @@ public: if(!(*ti).IsD()) for(int j = 0; j < 4; ++j) { - if (tetrahedron::IsBorder(*ti,j)) (*ti).SetB(j); + if (IsTTBorder(*ti,j)) (*ti).SetB(j); else (*ti).ClearB(j); } } @@ -205,7 +205,7 @@ public: if(!(*ti).IsD()) for(int j = 0; j < 4; ++j) { - if (tetrahedron::IsBorder(*ti,j)) + if (IsTTBorder(*ti,j)) { for (int i = 0; i < 3; ++i) ti->V(Tetra::VofF(j, i))->SetB(); diff --git a/vcg/simplex/tetrahedron/topology.h b/vcg/simplex/tetrahedron/topology.h index 74668c53..5203af47 100644 --- a/vcg/simplex/tetrahedron/topology.h +++ b/vcg/simplex/tetrahedron/topology.h @@ -24,9 +24,6 @@ #ifndef _VCG_TETRA_TOPOLOGY #define _VCG_TETRA_TOPOLOGY -#include -#include - namespace vcg { namespace tetrahedron { /** \addtogroup tetrahedron */ @@ -37,7 +34,7 @@ namespace tetrahedron { @return true if j is an face of border, false otherwise */ template -inline bool IsBorder(TetraType const & t, const int j ) +inline bool IsTTBorder(TetraType const & t, const int j ) { if(TetraType::HasTTAdjacency()) return t.cTTp(j)==&t; @@ -45,61 +42,6 @@ inline bool IsBorder(TetraType const & t, const int j ) return true; } -template -inline void TriMeshFromBorder(TetraMesh & tetramesh, TriMesh & trimesh) -{ - typedef typename TriMesh::VertexPointer VertexPointer; - typedef typename TriMesh::FacePointer FacePointer; - - RequireTTAdjacency(tetramesh); - tri::UpdateTopology::TetraTetra(tetramesh); - - trimesh.Clear(); - - std::vector verts; - std::vector faces; - - typedef typename TetraMesh::TetraType TetraType; - ForEachTetra(tetramesh, [&] (TetraType & t) { - for (int i = 0; i < 4; ++i) - if (IsBorder(t, i)) - { - verts.push_back(t.V(Tetra::VofF(i, 0))); - verts.push_back(t.V(Tetra::VofF(i, 1))); - verts.push_back(t.V(Tetra::VofF(i, 2))); - } - }); - - typedef typename TriMesh::VertexIterator VertexIterator; - typedef typename TriMesh::FaceIterator FaceIterator; - - VertexIterator vi = tri::Allocator::AddVertices(trimesh, verts.size()); - FaceIterator fi = tri::Allocator::AddFaces(trimesh, verts.size() / 3); - - for (int i = 0; i < verts.size(); i += 3) - { - fi->Alloc(3); - - vi->P() = verts[i + 0]->P(); - fi->V(0) = &*vi; - ++vi; - - vi->P() = verts[i + 1]->P(); - fi->V(1) = &*vi; - ++vi; - - vi->P() = verts[i + 2]->P(); - fi->V(2) = &*vi; - ++vi; - - ++fi; - } - - //do it while you build the mehs - vcg::tri::Clean::RemoveDuplicateVertex(trimesh); - vcg::tri::Allocator::CompactEveryVector(trimesh); -} - } }