Added two new subdivision schemes (Interpolating Sqrt3 Labsik-Greiner and Modified Butterfly) to subdivider applications.

git-svn-id: http://www.openmesh.org/svnrepo/OpenMesh/trunk@389 fdac6126-5c0c-442c-9429-916003d36597
This commit is contained in:
Mike Kremer
2011-04-06 07:25:32 +00:00
parent 6dec1d3668
commit 76423b8d22
3 changed files with 44 additions and 12 deletions

View File

@@ -70,6 +70,8 @@
#include <OpenMesh/Tools/Subdivider/Uniform/CompositeSqrt3T.hh> #include <OpenMesh/Tools/Subdivider/Uniform/CompositeSqrt3T.hh>
#include <OpenMesh/Tools/Subdivider/Uniform/LoopT.hh> #include <OpenMesh/Tools/Subdivider/Uniform/LoopT.hh>
#include <OpenMesh/Tools/Subdivider/Uniform/Sqrt3T.hh> #include <OpenMesh/Tools/Subdivider/Uniform/Sqrt3T.hh>
#include <OpenMesh/Tools/Subdivider/Uniform/Sqrt3InterpolatingSubdividerLabsikGreinerT.hh>
#include <OpenMesh/Tools/Subdivider/Uniform/ModifiedButterFlyT.hh>
// My stuff // My stuff
#include <OpenMesh/Apps/Subdivider/SubdivideWidget.hh> #include <OpenMesh/Apps/Subdivider/SubdivideWidget.hh>
@@ -144,20 +146,25 @@ SubdivideWidget(QWidget* _parent, const char* _name)
QRadioButton* radio1 = new QRadioButton( "Comp. Loop" ); QRadioButton* radio1 = new QRadioButton( "Comp. Loop" );
QRadioButton* radio2 = new QRadioButton( "Comp. SQRT(3)" ); QRadioButton* radio2 = new QRadioButton( "Comp. SQRT(3)" );
QRadioButton* radio3 = new QRadioButton( "Loop" ); QRadioButton* radio3 = new QRadioButton( "Loop" );
QRadioButton* radio4 = new QRadioButton( "Sqrt(3)" );
QRadioButton* radio5 = new QRadioButton( "Interpolating Sqrt3" );
QRadioButton* radio6 = new QRadioButton( "Modified Butterfly" );
radio3->setChecked( TRUE ); radio3->setChecked( TRUE );
sel_topo_type = SOP_UniformLoop; sel_topo_type = SOP_UniformLoop;
QRadioButton* radio4 = new QRadioButton( "Sqrt(3)" );
buttonGroup->addButton(radio1, SOP_UniformCompositeLoop); buttonGroup->addButton(radio1, SOP_UniformCompositeLoop);
buttonGroup->addButton(radio2, SOP_UniformCompositeSqrt3); buttonGroup->addButton(radio2, SOP_UniformCompositeSqrt3);
buttonGroup->addButton(radio3, SOP_UniformLoop); buttonGroup->addButton(radio3, SOP_UniformLoop);
buttonGroup->addButton(radio4, SOP_UniformSqrt3); buttonGroup->addButton(radio4, SOP_UniformSqrt3);
buttonGroup->addButton(radio5, SOP_UniformInterpolatingSqrt3);
buttonGroup->addButton(radio6, SOP_ModifiedButterfly);
vbox->addWidget(radio1); vbox->addWidget(radio1);
vbox->addWidget(radio2); vbox->addWidget(radio2);
vbox->addWidget(radio3); vbox->addWidget(radio3);
vbox->addWidget(radio4); vbox->addWidget(radio4);
vbox->addWidget(radio5);
vbox->addWidget(radio6);
QObject::connect( buttonGroup, SIGNAL( buttonPressed(int) ), QObject::connect( buttonGroup, SIGNAL( buttonPressed(int) ),
this, SLOT( slot_select_sop(int) ) ); this, SLOT( slot_select_sop(int) ) );
@@ -178,10 +185,12 @@ SubdivideWidget(QWidget* _parent, const char* _name)
// -------------------- // --------------------
subdivider_[SOP_UniformCompositeLoop] = new Uniform::CompositeLoopT<Mesh>; subdivider_[SOP_UniformCompositeLoop] = new Uniform::CompositeLoopT<Mesh>;
subdivider_[SOP_UniformCompositeSqrt3] = new Uniform::CompositeSqrt3T<Mesh>; subdivider_[SOP_UniformCompositeSqrt3] = new Uniform::CompositeSqrt3T<Mesh>;
subdivider_[SOP_UniformLoop] = new Uniform::LoopT<Mesh>; subdivider_[SOP_UniformLoop] = new Uniform::LoopT<Mesh>;
subdivider_[SOP_UniformSqrt3] = new Uniform::Sqrt3T<Mesh>; subdivider_[SOP_UniformSqrt3] = new Uniform::Sqrt3T<Mesh>;
subdivider_[SOP_UniformInterpolatingSqrt3] = new Uniform::InterpolatingSqrt3LGT< Mesh >;
subdivider_[SOP_ModifiedButterfly] = new Uniform::ModifiedButterflyT<Mesh>;
} }
@@ -195,6 +204,8 @@ void SubdivideWidget::slot_select_sop(int i)
case SOP_UniformCompositeLoop: case SOP_UniformCompositeLoop:
case SOP_UniformCompositeSqrt3: case SOP_UniformCompositeSqrt3:
case SOP_UniformLoop: case SOP_UniformLoop:
case SOP_UniformInterpolatingSqrt3:
case SOP_ModifiedButterfly:
case SOP_UniformSqrt3: sel_topo_type = (SOPType)i; break; case SOP_UniformSqrt3: sel_topo_type = (SOPType)i; break;
default: sel_topo_type = SOP_Undefined; default: sel_topo_type = SOP_Undefined;
} }

View File

@@ -75,6 +75,8 @@ public:
SOP_UniformCompositeSqrt3, SOP_UniformCompositeSqrt3,
SOP_UniformLoop, SOP_UniformLoop,
SOP_UniformSqrt3, SOP_UniformSqrt3,
SOP_UniformInterpolatingSqrt3,
SOP_ModifiedButterfly,
SOP_Undefined SOP_Undefined
}; };

View File

@@ -51,6 +51,8 @@
#include <OpenMesh/Tools/Subdivider/Uniform/LoopT.hh> #include <OpenMesh/Tools/Subdivider/Uniform/LoopT.hh>
#include <OpenMesh/Tools/Subdivider/Uniform/CompositeSqrt3T.hh> #include <OpenMesh/Tools/Subdivider/Uniform/CompositeSqrt3T.hh>
#include <OpenMesh/Tools/Subdivider/Uniform/CompositeLoopT.hh> #include <OpenMesh/Tools/Subdivider/Uniform/CompositeLoopT.hh>
#include <OpenMesh/Tools/Subdivider/Uniform/Sqrt3InterpolatingSubdividerLabsikGreinerT.hh>
#include <OpenMesh/Tools/Subdivider/Uniform/ModifiedButterFlyT.hh>
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
@@ -64,6 +66,8 @@ typedef Uniform::Sqrt3T< Mesh > Sqrt3;
typedef Uniform::LoopT< Mesh > Loop; typedef Uniform::LoopT< Mesh > Loop;
typedef Uniform::CompositeSqrt3T< CMesh > CompositeSqrt3; typedef Uniform::CompositeSqrt3T< CMesh > CompositeSqrt3;
typedef Uniform::CompositeLoopT< CMesh > CompositeLoop; typedef Uniform::CompositeLoopT< CMesh > CompositeLoop;
typedef Uniform::InterpolatingSqrt3LGT< Mesh > InterpolatingSqrt3LG;
typedef Uniform::ModifiedButterflyT< Mesh > ModifiedButterfly;
using OpenMesh::Utils::Timer; using OpenMesh::Utils::Timer;
@@ -189,12 +193,14 @@ int main(int argc, char **argv)
TypeSqrt3, TypeSqrt3,
TypeLoop, TypeLoop,
TypeCompSqrt3, TypeCompSqrt3,
TypeCompLoop TypeCompLoop,
TypeLabsikGreiner,
TypeModButterfly
} st = TypeSqrt3; } st = TypeSqrt3;
Timer::Format fmt = Timer::Automatic; Timer::Format fmt = Timer::Automatic;
while ( (c=getopt(argc, argv, "csSlLhf:"))!=-1 ) while ( (c=getopt(argc, argv, "csSlLbBhf:"))!=-1 )
{ {
switch(c) switch(c)
{ {
@@ -203,6 +209,8 @@ int main(int argc, char **argv)
case 'S': st = TypeCompSqrt3; break; case 'S': st = TypeCompSqrt3; break;
case 'l': st = TypeLoop; break; case 'l': st = TypeLoop; break;
case 'L': st = TypeCompLoop; break; case 'L': st = TypeCompLoop; break;
case 'b': st = TypeLabsikGreiner; break;
case 'B': st = TypeModButterfly; break;
case 'f': case 'f':
{ {
switch(*optarg) switch(*optarg)
@@ -241,10 +249,12 @@ int main(int argc, char **argv)
if ( compare_all ) if ( compare_all )
{ {
int rc; int rc;
rc = mainT<Sqrt3> ( n, ifname, "", fmt ); rc = mainT<Sqrt3> ( n, ifname, "", fmt );
rc += mainT<Loop> ( n, ifname, "", fmt ); rc += mainT<Loop> ( n, ifname, "", fmt );
rc += mainT<CompositeSqrt3>( n, ifname, "", fmt ); rc += mainT<CompositeSqrt3> ( n, ifname, "", fmt );
rc += mainT<CompositeLoop> ( n, ifname, "", fmt ); rc += mainT<CompositeLoop> ( n, ifname, "", fmt );
rc += mainT<InterpolatingSqrt3LG> ( n, ifname, "", fmt );
rc += mainT<ModifiedButterfly> ( n, ifname, "", fmt );
if (rc) if (rc)
return rc; return rc;
@@ -264,6 +274,9 @@ int main(int argc, char **argv)
<< std::endl << std::endl
<< "loop : " << "loop : "
<< timings["Uniform Composite Loop"]/timings["Uniform Loop"] << timings["Uniform Composite Loop"]/timings["Uniform Loop"]
<< std::endl
<< "Interpolating sqrt(3) : "
<< timings["Uniform Interpolating Sqrt3"]/timings["Uniform Sqrt3"]
<< std::endl; << std::endl;
return 0; return 0;
} }
@@ -277,6 +290,10 @@ int main(int argc, char **argv)
return mainT<CompositeSqrt3>( n, ifname, ofname, fmt ); return mainT<CompositeSqrt3>( n, ifname, ofname, fmt );
case TypeCompLoop: case TypeCompLoop:
return mainT<CompositeLoop> ( n, ifname, ofname, fmt ); return mainT<CompositeLoop> ( n, ifname, ofname, fmt );
case TypeLabsikGreiner:
return mainT<InterpolatingSqrt3LG> ( n, ifname, ofname, fmt );
case TypeModButterfly:
return mainT<ModifiedButterfly> ( n, ifname, ofname, fmt );
} }
return 1; return 1;
} }
@@ -293,6 +310,8 @@ void usage_and_exit(int _xcode)
<< " -L\tComposite Loop\n" << " -L\tComposite Loop\n"
<< " -s\tSqrt3\n" << " -s\tSqrt3\n"
<< " -S\tComposite Sqrt3\n" << " -S\tComposite Sqrt3\n"
<< " -b\tInterpolating Sqrt3 Labsik-Greiner\n"
<< " -B\tModified Butterfly\n"
<< std::endl; << std::endl;
exit(_xcode); exit(_xcode);
} }