diff --git a/apps/meshes/bunny10k_textured.ply b/apps/meshes/bunny10k_textured.ply new file mode 100644 index 00000000..9078b785 Binary files /dev/null and b/apps/meshes/bunny10k_textured.ply differ diff --git a/apps/sample/trimesh_texture/trimesh_texture.cpp b/apps/sample/trimesh_texture/trimesh_texture.cpp index b6cdc986..c3281d4e 100644 --- a/apps/sample/trimesh_texture/trimesh_texture.cpp +++ b/apps/sample/trimesh_texture/trimesh_texture.cpp @@ -20,8 +20,6 @@ * for more details. * * * ****************************************************************************/ -#include - #include // input output @@ -35,6 +33,14 @@ #include #include +/*! \file trimesh_texture.cpp +\ingroup code_sample + +\brief a small example about packing texture regions + +It takes a sample mesh as input, computes the connected +components of its parametrization and pack them again using two different strategies +*/ using namespace vcg; @@ -53,27 +59,26 @@ int main(int ,char ** ) MyMesh m,tm; tri::io::ImporterPLY::Open(m,"../../meshes/bunny10k_textured.ply"); - tri::Allocator::AddVertices(tm,m.fn*3); - tri::Allocator::AddFaces(tm,m.fn); - - for(size_t i=0;i::AddFace(tm, + Point3f(f.WT(0).U(),f.WT(0).V(),0), + Point3f(f.WT(1).U(),f.WT(1).V(),0), + Point3f(f.WT(2).U(),f.WT(2).V(),0)); } + + // 2) compute connected components (e.g. texture regions in an atlas) tri::Clean::RemoveDuplicateVertex(tm); - std::vector > fpVec; tri::UpdateTopology::FaceFace(tm); + std::vector > fpVec; tri::Clean::ConnectedComponents(tm,fpVec); printf("Mesh has %lu texture components\n",fpVec.size()); tri::io::ExporterPLY::Save(tm,"out.ply"); std::vector< std::vector > outline2Vec; - + + // build the 2D outlines of each regions for(size_t i=0; i::FaceClear(tm); @@ -103,16 +108,19 @@ int main(int ,char ** ) sim.sca=1024.0f; std::vector trVec(outline2Vec.size(),sim); printf("Mesh has %lu texture components\n",outline2Vec.size()); + + // Dump the original parametrization as a png Outline2Dumper::dumpOutline2VecPNG("PrePack.png",outline2Vec,trVec,pp); + // Pack using Axis Aligned Rect const Point2i containerSize(1024,1024); Point2f finalSize(1024,1024); PolyPacker::PackAsAxisAlignedRect(outline2Vec,containerSize,trVec,finalSize); Outline2Dumper::dumpOutline2VecPNG("PostPack.png",outline2Vec,trVec,pp); + // Pack using Oriented Rect RasterizedOutline2Packer::Parameters packingParam; - packingParam.costFunction = RasterizedOutline2Packer::Parameters::LowestHorizon; packingParam.doubleHorizon = true; packingParam.cellSize = 4; @@ -121,7 +129,6 @@ int main(int ,char ** ) RasterizedOutline2Packer::Pack(outline2Vec,containerSize,trVec,packingParam); Outline2Dumper::dumpOutline2VecPNG("PostPackRR.png",outline2Vec,trVec,pp); - return 0; } diff --git a/wrap/qt/outline2_rasterizer.cpp b/wrap/qt/outline2_rasterizer.cpp index 1cac3aec..55f102bb 100644 --- a/wrap/qt/outline2_rasterizer.cpp +++ b/wrap/qt/outline2_rasterizer.cpp @@ -1,7 +1,5 @@ #include #include -#include "stdio.h" -#include "math.h" #include #include