diff --git a/vcg/complex/algorithms/parametrization/voronoi_atlas.h b/vcg/complex/algorithms/parametrization/voronoi_atlas.h index da65ca33..a9d089ce 100644 --- a/vcg/complex/algorithms/parametrization/voronoi_atlas.h +++ b/vcg/complex/algorithms/parametrization/voronoi_atlas.h @@ -4,6 +4,7 @@ #include #include #include +#include #include #include #include @@ -28,8 +29,6 @@ public: class VoroEdge : public Edge< VoroUsedTypes>{}; class VoroMesh : public tri::TriMesh< std::vector, std::vector , std::vector > {}; - - typedef typename VoroMesh::FaceIterator FaceIterator; typedef typename VoroMesh::VertexType VertexType; typedef typename VoroMesh::FaceType FaceType; @@ -80,12 +79,36 @@ public: public: + struct VoronoiAtlasParam + { + VoronoiAtlasParam() + { + sampleNum=10; + overlap=false; + } + + struct Stat + { + void clear() { totalTime=unwrapTime=voronoiTime=samplingTime=0;} + int totalTime; + int unwrapTime; + int voronoiTime; + int samplingTime; + }; + + int sampleNum; + bool overlap; + Stat vas; + }; + // Main parametrization function: // it takes a startMesh, copy it and - static void Build( MeshType &startMesh, MeshType ¶Mesh, int sampleNum, bool overlap) + static void Build( MeshType &startMesh, MeshType ¶Mesh, VoronoiAtlasParam &pp) { + pp.vas.clear(); + int t0=clock(); VoroMesh m; // the mesh used for the processing is a copy of the passed one. tri::Append::Mesh(m, startMesh); tri::Clean::RemoveUnreferencedVertex(m); @@ -95,11 +118,16 @@ public: tri::UpdateBounding::Box(m); std::vector meshRegionVec; std::vector< std::vector > uvBorders; + + // Main processing loop do { + int st0=clock(); std::vector PoissonSamples; float diskRadius=0; - tri::PoissonSampling(m,PoissonSamples,sampleNum,diskRadius); + tri::PoissonSampling(m,PoissonSamples,pp.sampleNum,diskRadius); + int st1=clock(); + pp.vas.samplingTime+= st1-st0; printf("Sampling created a new mesh of %lu points\n",PoissonSamples.size()); std::vector seedVec; tri::VoronoiProcessing::SeedToVertexConversion(m,PoissonSamples,seedVec); @@ -107,23 +135,20 @@ public: tri::VoronoiProcessing::ComputePerVertexSources(m,seedVec); tri::VoronoiProcessing::FaceAssociateRegion(m); tri::VoronoiProcessing::VoronoiColoring(m,seedVec,true); - tri::io::ExporterPLY::Save(m,"dd.ply",tri::io::Mask::IOM_VERTCOLOR); - std::vector badRegionVec; - + int st2=clock(); + pp.vas.voronoiTime+=st2-st1; for(size_t i=0; i::FaceSelectAssociateRegion(m,seedVec[i]); assert(selCnt>0); - if(overlap){ + if(pp.overlap){ tri::UpdateSelection::VertexFromFaceLoose(m); tri::UpdateSelection::FaceFromVertexLoose(m); } tri::Append::Mesh(*rm, m, true); - char buf[100]; sprintf(buf,"reg%02i.ply",i); - tri::io::ExporterPLY::Save(*rm,buf,tri::io::Mask::IOM_VERTCOLOR|tri::io::Mask::IOM_WEDGTEXCOORD ); - + int tp0=clock(); tri::PoissonSolver PS(*rm); if(PS.IsFeaseable()) { @@ -142,6 +167,8 @@ public: qDebug("ACH - mesh %i is NOT homeomorphic to a disk\n",i); badRegionVec.push_back(rm); } + int tp1=clock(); + pp.vas.unwrapTime +=tp1-tp0; } VoroMesh *rm = new VoroMesh(); @@ -154,24 +181,19 @@ public: badRegionVec.push_back(rm); } m.Clear(); - sampleNum = 10; + pp.sampleNum = 10; if(!badRegionVec.empty()) { for(size_t i=0;ifn>10) tri::Append::Mesh(m, *badRegionVec[i], false); -// tri::io::ExporterPLY::Save(m,"buf.ply",tri::io::Mask::IOM_VERTCOLOR|tri::io::Mask::IOM_WEDGTEXCOORD ); - tri::Clean::RemoveDuplicateFace(m); tri::Clean::RemoveUnreferencedVertex(m); - tri::UpdateNormals::PerVertexPerFace(m); tri::Allocator::CompactVertexVector(m); tri::Allocator::CompactFaceVector(m); - qDebug("Still %i faces (from %i regions) to process\n",m.fn,badRegionVec.size()); } } while (m.fn>0); -// tri::io::ExporterPLY::Save(m,"vorocolor.ply",tri::io::Mask::IOM_VERTCOLOR); std::vector trVec; Point2f finalSize; @@ -190,13 +212,12 @@ public: fi->WT(j).V()=newpp[1]/1024.0f; } } - - char buf[32]; sprintf(buf,"region_aa_%03i.ply",i); -// tri::io::ExporterPLY::Save(*rm,buf,tri::io::Mask::IOM_VERTCOLOR|tri::io::Mask::IOM_WEDGTEXCOORD ); tri::Append::Mesh(paraMesh, *rm, false); } + int t2=clock(); + pp.vas.totalTime=t2-t0; } -}; +}; //end } // end namespace vcg