Added catmull clark subdivider. Thanks to Leon Kos for the code.

git-svn-id: http://www.openmesh.org/svnrepo/OpenMesh/trunk@609 fdac6126-5c0c-442c-9429-916003d36597
This commit is contained in:
Jan Möbius
2012-06-28 09:32:20 +00:00
parent 330ec3d133
commit 653b1b8f56
9 changed files with 857 additions and 5 deletions

View File

@@ -72,11 +72,10 @@
#include <OpenMesh/Tools/Subdivider/Uniform/Sqrt3T.hh>
#include <OpenMesh/Tools/Subdivider/Uniform/Sqrt3InterpolatingSubdividerLabsikGreinerT.hh>
#include <OpenMesh/Tools/Subdivider/Uniform/ModifiedButterFlyT.hh>
#include <OpenMesh/Tools/Subdivider/Uniform/CatmullClarkT.hh>
// My stuff
#include <OpenMesh/Apps/Subdivider/SubdivideWidget.hh>
//
using namespace OpenMesh::Subdivider;
@@ -149,6 +148,7 @@ SubdivideWidget(QWidget* _parent, const char* _name)
QRadioButton* radio4 = new QRadioButton( "Sqrt(3)" );
QRadioButton* radio5 = new QRadioButton( "Interpolating Sqrt3" );
QRadioButton* radio6 = new QRadioButton( "Modified Butterfly" );
// QRadioButton* radio7 = new QRadioButton( "Catmull Clark" ); // Disabled, as it needs a quad mesh!
radio3->setChecked( TRUE );
sel_topo_type = SOP_UniformLoop;
@@ -158,6 +158,7 @@ SubdivideWidget(QWidget* _parent, const char* _name)
buttonGroup->addButton(radio4, SOP_UniformSqrt3);
buttonGroup->addButton(radio5, SOP_UniformInterpolatingSqrt3);
buttonGroup->addButton(radio6, SOP_ModifiedButterfly);
//buttonGroup->addButton(radio7, SOP_CatmullClark);
vbox->addWidget(radio1);
vbox->addWidget(radio2);
@@ -165,6 +166,7 @@ SubdivideWidget(QWidget* _parent, const char* _name)
vbox->addWidget(radio4);
vbox->addWidget(radio5);
vbox->addWidget(radio6);
// vbox->addWidget(radio7);
QObject::connect( buttonGroup, SIGNAL( buttonPressed(int) ),
this, SLOT( slot_select_sop(int) ) );
@@ -191,6 +193,7 @@ SubdivideWidget(QWidget* _parent, const char* _name)
subdivider_[SOP_UniformSqrt3] = new Uniform::Sqrt3T<Mesh>;
subdivider_[SOP_UniformInterpolatingSqrt3] = new Uniform::InterpolatingSqrt3LGT< Mesh >;
subdivider_[SOP_ModifiedButterfly] = new Uniform::ModifiedButterflyT<Mesh>;
subdivider_[SOP_CatmullClark] = new Uniform::CatmullClarkT<Mesh>;
}
@@ -204,9 +207,10 @@ void SubdivideWidget::slot_select_sop(int i)
case SOP_UniformCompositeLoop:
case SOP_UniformCompositeSqrt3:
case SOP_UniformLoop:
case SOP_UniformSqrt3:
case SOP_UniformInterpolatingSqrt3:
case SOP_ModifiedButterfly:
case SOP_UniformSqrt3: sel_topo_type = (SOPType)i; break;
case SOP_CatmullClark: sel_topo_type = (SOPType)i; break;
default: sel_topo_type = SOP_Undefined;
}
}

View File

@@ -77,6 +77,7 @@ public:
SOP_UniformSqrt3,
SOP_UniformInterpolatingSqrt3,
SOP_ModifiedButterfly,
SOP_CatmullClark,
SOP_Undefined
};

View File

@@ -53,6 +53,7 @@
#include <OpenMesh/Tools/Subdivider/Uniform/CompositeLoopT.hh>
#include <OpenMesh/Tools/Subdivider/Uniform/Sqrt3InterpolatingSubdividerLabsikGreinerT.hh>
#include <OpenMesh/Tools/Subdivider/Uniform/ModifiedButterFlyT.hh>
#include <OpenMesh/Tools/Subdivider/Uniform/CatmullClarkT.hh>
// ----------------------------------------------------------------------------
@@ -68,6 +69,7 @@ typedef Uniform::CompositeSqrt3T< CMesh > CompositeSqrt3;
typedef Uniform::CompositeLoopT< CMesh > CompositeLoop;
typedef Uniform::InterpolatingSqrt3LGT< Mesh > InterpolatingSqrt3LG;
typedef Uniform::ModifiedButterflyT< Mesh > ModifiedButterfly;
typedef Uniform::CatmullClarkT< Mesh > CatmullClark;
using OpenMesh::Utils::Timer;
@@ -195,7 +197,8 @@ int main(int argc, char **argv)
TypeCompSqrt3,
TypeCompLoop,
TypeLabsikGreiner,
TypeModButterfly
TypeModButterfly,
TypeCatmullClark
} st = TypeSqrt3;
Timer::Format fmt = Timer::Automatic;
@@ -211,6 +214,7 @@ int main(int argc, char **argv)
case 'L': st = TypeCompLoop; break;
case 'b': st = TypeLabsikGreiner; break;
case 'B': st = TypeModButterfly; break;
case 'C': st = TypeCatmullClark; std::cerr << "Not yet supported, as it needs a poly mesh!"; break;
case 'f':
{
switch(*optarg)
@@ -255,6 +259,7 @@ int main(int argc, char **argv)
rc += mainT<CompositeLoop> ( n, ifname, "", fmt );
rc += mainT<InterpolatingSqrt3LG> ( n, ifname, "", fmt );
rc += mainT<ModifiedButterfly> ( n, ifname, "", fmt );
rc += mainT<CatmullClark> ( n, ifname, "", fmt );
if (rc)
return rc;
@@ -294,6 +299,8 @@ int main(int argc, char **argv)
return mainT<InterpolatingSqrt3LG> ( n, ifname, ofname, fmt );
case TypeModButterfly:
return mainT<ModifiedButterfly> ( n, ifname, ofname, fmt );
case TypeCatmullClark:
return mainT<CatmullClark> ( n, ifname, ofname, fmt );
}
return 1;
}
@@ -312,6 +319,7 @@ void usage_and_exit(int _xcode)
<< " -S\tComposite Sqrt3\n"
<< " -b\tInterpolating Sqrt3 Labsik-Greiner\n"
<< " -B\tModified Butterfly\n"
// << " -C\tCatmullClark\n"
<< std::endl;
exit(_xcode);
}