From 5928ca28b6c7d0084089595808381d8576fbb3b1 Mon Sep 17 00:00:00 2001 From: cignoni Date: Tue, 26 Mar 2013 11:33:17 +0000 Subject: [PATCH] Updated the generic packing sample and added a sample that (partially) repack textures of a mesh using the new packer --- apps/sample/sample.pro | 5 +- apps/sample/space_packer/space_packer.cpp | 81 +++++++++---------- apps/sample/space_packer/space_packer.pro | 25 ++---- .../trimesh_texture/trimesh_texture.cpp | 61 +++++++++++--- .../trimesh_texture/trimesh_texture.pro | 5 +- 5 files changed, 101 insertions(+), 76 deletions(-) diff --git a/apps/sample/sample.pro b/apps/sample/sample.pro index 795e7741..4783c296 100644 --- a/apps/sample/sample.pro +++ b/apps/sample/sample.pro @@ -12,7 +12,7 @@ SUBDIRS = trimesh_base \ trimesh_edge \ trimesh_fitting \ trimesh_geodesic \ -# trimesh_ext_mc \ + trimesh_ext_mc \ trimesh_hole \ trimesh_inertia \ trimesh_intersection \ @@ -21,12 +21,15 @@ SUBDIRS = trimesh_base \ trimesh_kdtree \ trimesh_normal \ trimesh_optional \ + trimesh_pointmatching \ trimesh_ray \ trimesh_refine \ trimesh_sampling \ trimesh_smooth \ trimesh_split_vertex \ + trimesh_texture \ trimesh_topology \ polygonmesh_base \ + space_packer \ aabb_binary_tree diff --git a/apps/sample/space_packer/space_packer.cpp b/apps/sample/space_packer/space_packer.cpp index bebf7d49..d6ccf321 100644 --- a/apps/sample/space_packer/space_packer.cpp +++ b/apps/sample/space_packer/space_packer.cpp @@ -26,9 +26,12 @@ #include #include #include -#include +#include +#include #include -#include +#include +#include + #include using namespace vcg; @@ -54,31 +57,16 @@ static void buildRandRectSet(int rectNum, vector &rectVec) } } -void buildRandRectSetOld(int rectNum, vector &rectVec) -{ - math::MarsenneTwisterRNG rnd; - float exp=5.0f; - rnd.initialize(time(0)); - for(int i=0;i trVec; vector trPolyVec; - vector< vector > polySet; + vector< vector > outline2Vec; vector< vector > multiPolySet; Point2f finalSize; std::vector finalSizeVec; - const Point2f containerSize(1000,1000); - PolyDumper::Param pp; + const Point2i containerSize(1024,1024); + Outline2Dumper::Param pp; std::vector contInd; vector rectVec; @@ -88,40 +76,51 @@ int main( int argc, char **argv ) RectPacker::Stat s = RectPacker::stat(); printf("RectPacker attempt %i time %5.3f %5.3f\n",s.pack_attempt_num,s.pack_total_time,s.pack_attempt_time); -// PolyDumper::rectSetToPolySet(rectVec,polySet); +// Outline2Dumper::rectSetToPolySet(rectVec,polySet); -// PolyDumper::multiRectSetToSinglePolySet(rectVec,trVec,contInd,0,polySet,trPolyVec); -// PolyDumper::dumpPolySetPNG("testpolyEq0.png",polySet,trPolyVec,pp); -// PolyDumper::multiRectSetToSinglePolySet(rectVec,trVec,contInd,1,polySet,trPolyVec); -// PolyDumper::dumpPolySetPNG("testpolyEq1.png",polySet,trPolyVec,pp); -// PolyDumper::multiRectSetToSinglePolySet(rectVec,trVec,contInd,2,polySet,trPolyVec); -// PolyDumper::dumpPolySetPNG("testpolyEq2.png",polySet,trPolyVec,pp); +// Outline2Dumper::multiRectSetToSinglePolySet(rectVec,trVec,contInd,0,polySet,trPolyVec); +// Outline2Dumper::dumpPolySetPNG("testpolyEq0.png",polySet,trPolyVec,pp); +// Outline2Dumper::multiRectSetToSinglePolySet(rectVec,trVec,contInd,1,polySet,trPolyVec); +// Outline2Dumper::dumpPolySetPNG("testpolyEq1.png",polySet,trPolyVec,pp); +// Outline2Dumper::multiRectSetToSinglePolySet(rectVec,trVec,contInd,2,polySet,trPolyVec); +// Outline2Dumper::dumpPolySetPNG("testpolyEq2.png",polySet,trPolyVec,pp); // buildRandPolySet(100,polySet); // PolyPacker::PackMultiAsObjectOrientedRect(polySet,containerSize,3,trVec,contInd,finalSizeVec); -// PolyDumper::multiPolySetToSinglePolySet(polySet,trVec,contInd,0,multiPolySet,trPolyVec); -// PolyDumper::dumpPolySetPNG("testpolyEq0.png",multiPolySet,trPolyVec,pp); +// Outline2Dumper::multiPolySetToSinglePolySet(polySet,trVec,contInd,0,multiPolySet,trPolyVec); +// Outline2Dumper::dumpPolySetPNG("testpolyEq0.png",multiPolySet,trPolyVec,pp); -// PolyDumper::multiPolySetToSinglePolySet(polySet,trVec,contInd,1,multiPolySet,trPolyVec); -// PolyDumper::dumpPolySetPNG("testpolyEq1.png",multiPolySet,trPolyVec,pp); +// Outline2Dumper::multiPolySetToSinglePolySet(polySet,trVec,contInd,1,multiPolySet,trPolyVec); +// Outline2Dumper::dumpPolySetPNG("testpolyEq1.png",multiPolySet,trPolyVec,pp); -// PolyDumper::multiPolySetToSinglePolySet(polySet,trVec,contInd,2,multiPolySet,trPolyVec); -// PolyDumper::dumpPolySetPNG("testpolyEq2.png",multiPolySet,trPolyVec,pp); +// Outline2Dumper::multiPolySetToSinglePolySet(polySet,trVec,contInd,2,multiPolySet,trPolyVec); +// Outline2Dumper::dumpPolySetPNG("testpolyEq2.png",multiPolySet,trPolyVec,pp); - // PolyDumper::dumpPolySetPNG("testpolyOO.png",polySet,trVec,pp); + // Outline2Dumper::dumpPolySetPNG("testpolyOO.png",polySet,trVec,pp); - vcg::tri::OutlineUtil::BuildRandomOutlineVec(25,polySet); + vcg::tri::OutlineUtil::BuildRandomOutlineVec(25,outline2Vec); - PolyPacker::PackAsEqualSquares(polySet,containerSize,trVec,finalSize); - PolyDumper::dumpOutline2VecPNG("testpolyEq.png",polySet,trVec,pp); + PolyPacker::PackAsEqualSquares(outline2Vec,containerSize,trVec,finalSize); + Outline2Dumper::dumpOutline2VecPNG("testpolyEq.png",outline2Vec,trVec,pp); - PolyPacker::PackAsAxisAlignedRect(polySet,containerSize,trVec,finalSize); - PolyDumper::dumpOutline2VecPNG("testpolyAA.png",polySet,trVec,pp); + PolyPacker::PackAsAxisAlignedRect(outline2Vec,containerSize,trVec,finalSize); + Outline2Dumper::dumpOutline2VecPNG("testpolyAA.png",outline2Vec,trVec,pp); + + PolyPacker::PackAsObjectOrientedRect(outline2Vec,containerSize,trVec,finalSize); + Outline2Dumper::dumpOutline2VecPNG("testpolyOO.png",outline2Vec,trVec,pp); + + RasterizedOutline2Packer::Parameters packingParam; + + packingParam.costFunction = RasterizedOutline2Packer::Parameters::LowestHorizon; + packingParam.doubleHorizon = true; + packingParam.cellSize = 4; + packingParam.rotationNum = 16; //number of rasterizations in 90° + + RasterizedOutline2Packer::Pack(outline2Vec,containerSize,trVec,packingParam); + Outline2Dumper::dumpOutline2VecPNG("testpolyRR.png",outline2Vec,trVec,pp); - PolyPacker::PackAsObjectOrientedRect(polySet,containerSize,trVec,finalSize); - PolyDumper::dumpOutline2VecPNG("testpolyOO.png",polySet,trVec,pp); return 0; } diff --git a/apps/sample/space_packer/space_packer.pro b/apps/sample/space_packer/space_packer.pro index 519a591f..020241f0 100644 --- a/apps/sample/space_packer/space_packer.pro +++ b/apps/sample/space_packer/space_packer.pro @@ -1,21 +1,6 @@ -QT += opengl svg +include(../common.pri) TARGET = space_packer -DEPENDPATH += . ../../.. -INCLUDEPATH += . ../../.. -CONFIG += console stl -TEMPLATE = app -SOURCES += space_packer.cpp ../../../../vcglib/wrap/qt/PolyToQImage.cpp -HEADERS += ../../../vcg/space/rect_packer.h \ - ../../../vcg/math/similarity2.h \ - ../../../vcg/space/poly_packer.h - - -# Mac specific Config required to avoid to make application bundles -CONFIG -= app_bundle - -# Awful problem with windows.. -win32{ - DEFINES += NOMINMAX -} - -QT += opengl svg \ No newline at end of file +SOURCES += space_packer.cpp \ + ../../../../vcglib/wrap/qt/Outline2ToQImage.cpp \ + ../../../../vcglib/wrap/qt/outline2_rasterizer.cpp +QT += opengl svg diff --git a/apps/sample/trimesh_texture/trimesh_texture.cpp b/apps/sample/trimesh_texture/trimesh_texture.cpp index d936010d..3a6b2df6 100644 --- a/apps/sample/trimesh_texture/trimesh_texture.cpp +++ b/apps/sample/trimesh_texture/trimesh_texture.cpp @@ -20,6 +20,7 @@ * for more details. * * * ****************************************************************************/ +#include #include @@ -31,11 +32,14 @@ #include #include -#include -#include -//#include -using namespace vcg; +#include +#include + +#include +#include + +using namespace vcg; class MyEdge; class MyFace; @@ -71,24 +75,55 @@ int main(int ,char ** ) tri::Clean::ConnectedComponents(tm,fpVec); printf("Mesh has %i texture components\n",fpVec.size()); tri::io::ExporterPLY::Save(tm,"out.ply"); - - std::vector< std::vector > outline3Vec; std::vector< std::vector > outline2Vec; - tri::OutlineUtil::ConvertMeshBoundaryToOutline3Vec(tm, outline3Vec); - printf("Mesh has %i texture components\n",outline3Vec.size()); - tri::OutlineUtil::ConvertOutline3VeToOutline2Vec(outline3Vec,outline2Vec); - PolyDumper::Param pp; + + for(size_t i=0; i::FaceClear(tm); + fpVec[i].second->SetS(); + tri::UpdateSelection::FaceConnectedFF(tm); + tri::UpdateSelection::VertexClear(tm); + tri::UpdateSelection::VertexFromFaceLoose(tm); + + MyMesh comp; + tri::Append::Mesh(comp, tm, true); + + std::vector< std::vector > outline3Vec; + tri::OutlineUtil::ConvertMeshBoundaryToOutline3Vec(comp, outline3Vec); + std::vector< std::vector > compOutline2Vec; + tri::OutlineUtil::ConvertOutline3VecToOutline2Vec(outline3Vec,compOutline2Vec); + int largestInd=tri::OutlineUtil::LargestOutline2(compOutline2Vec); + if(tri::OutlineUtil::Outline2Area(compOutline2Vec[largestInd])<0) + tri::OutlineUtil::ReverseOutline2(compOutline2Vec[largestInd]); + + outline2Vec.push_back(compOutline2Vec[largestInd]); + } + + printf("Mesh has %i texture components\n",outline2Vec.size()); + + Outline2Dumper::Param pp; Similarity2f sim; sim.sca=1024.0f; std::vector trVec(outline2Vec.size(),sim); printf("Mesh has %i texture components\n",outline2Vec.size()); - PolyDumper::dumpOutline2VecPNG("PrePack.png",outline2Vec,trVec,pp); + Outline2Dumper::dumpOutline2VecPNG("PrePack.png",outline2Vec,trVec,pp); - const Point2f containerSize(1024,1024); + const Point2i containerSize(1024,1024); Point2f finalSize(1024,1024); PolyPacker::PackAsAxisAlignedRect(outline2Vec,containerSize,trVec,finalSize); - PolyDumper::dumpOutline2VecPNG("PostPack.png",outline2Vec,trVec,pp); + Outline2Dumper::dumpOutline2VecPNG("PostPack.png",outline2Vec,trVec,pp); + + RasterizedOutline2Packer::Parameters packingParam; + + packingParam.costFunction = RasterizedOutline2Packer::Parameters::LowestHorizon; + packingParam.doubleHorizon = true; + packingParam.cellSize = 4; + packingParam.rotationNum = 16; //number of rasterizations in 90° + + RasterizedOutline2Packer::Pack(outline2Vec,containerSize,trVec,packingParam); + Outline2Dumper::dumpOutline2VecPNG("PostPackRR.png",outline2Vec,trVec,pp); + return 0; } diff --git a/apps/sample/trimesh_texture/trimesh_texture.pro b/apps/sample/trimesh_texture/trimesh_texture.pro index 202b9d67..0ef36f6f 100644 --- a/apps/sample/trimesh_texture/trimesh_texture.pro +++ b/apps/sample/trimesh_texture/trimesh_texture.pro @@ -1,4 +1,7 @@ include(../common.pri) QT += opengl svg TARGET = trimesh_texture -SOURCES += trimesh_texture.cpp ../../../../vcglib/wrap/qt/PolyToQImage.cpp ../../../wrap/ply/plylib.cpp +SOURCES += trimesh_texture.cpp \ +../../../../vcglib/wrap/qt/Outline2ToQImage.cpp \ +../../../../vcglib/wrap/qt/outline2_rasterizer.cpp \ +../../../wrap/ply/plylib.cpp