47 #include <OpenMesh/Core/IO/MeshIO.hh> 48 #include <OpenMesh/Core/Mesh/TriMesh_ArrayKernelT.hh> 50 #include <OpenMesh/Tools/Utils/getopt.h> 80 std::map< std::string, double > timings;
84 template <
typename Subdiv
ider >
85 bool subdivide(
typename Subdivider::mesh_t& _m,
size_t _n,
92 std::cout <<
"Subdivide " << _n
93 <<
" times with '" << subdivide.name() <<
"'\n";
103 std::cout <<
" Done [" << t.
as_string(_fmt) <<
"]\n";
104 timings[subdivide.name()] = t.
seconds();
107 std::cout <<
" Failed!\n";
113 void usage_and_exit(
int _xcode);
117 template <
typename Subdiv
ider >
118 int mainT(
size_t _n,
119 const std::string& _ifname,
120 const std::string& _ofname,
121 const Timer::Format _fmt )
124 std::cout <<
"Read mesh from file " << _ifname << std::endl;
126 typename Subdivider::mesh_t mesh;
129 std::cout <<
" Ok\n";
132 std::cout <<
" Failed!\n";
136 std::cout <<
" #V " << mesh.n_vertices()
137 <<
", #F " << mesh.n_faces()
138 <<
", #E " << mesh.n_edges() << std::endl;
143 if (!subdivide< Subdivider >( mesh, _n, _fmt ))
146 catch(std::bad_alloc& x)
148 std::cerr <<
"Out of memory: " << x.what() << std::endl;
151 catch(std::exception& x)
153 std::cerr << x.what() << std::endl;
158 std::cerr <<
"Unknown exception!\n";
164 std::cout <<
" #V " << mesh.n_vertices()
165 <<
", #F " << mesh.n_faces()
166 <<
", #E " << mesh.n_edges() << std::endl;
168 if ( !_ofname.empty() )
170 std::cout <<
"Write resulting mesh to file " << _ofname <<
"..";
177 std::cerr <<
"Failed! Could not write file!\n";
187 int main(
int argc,
char **argv)
191 bool compare_all =
false;
206 Timer::Format fmt = Timer::Automatic;
208 while ( (c=getopt(argc, argv,
"csSlLbBhf:"))!=-1 )
212 case 'c': compare_all=
true;
break;
213 case 's': st = TypeSqrt3;
break;
214 case 'S': st = TypeCompSqrt3;
break;
215 case 'l': st = TypeLoop;
break;
216 case 'L': st = TypeCompLoop;
break;
217 case 'b': st = TypeLabsikGreiner;
break;
218 case 'B': st = TypeModButterfly;
break;
219 case 'C': st = TypeCatmullClark; std::cerr <<
"Not yet supported, as it needs a poly mesh!";
break;
224 case 'm': fmt = Timer::MSeconds;
break;
225 case 'c': fmt = Timer::HSeconds;
break;
226 case 's': fmt = Timer::Seconds;
break;
228 default: fmt = Timer::Automatic;
break;
232 case 'h': usage_and_exit(0);
break;
234 default: usage_and_exit(1);
243 std::stringstream str; str << argv[optind]; str >> n;
247 ifname = argv[++optind];
250 if ( ++optind < argc )
251 ofname = argv[optind];
258 rc = mainT<Sqrt3> ( n, ifname,
"", fmt );
259 rc += mainT<Loop> ( n, ifname,
"", fmt );
260 rc += mainT<CompositeSqrt3> ( n, ifname,
"", fmt );
261 rc += mainT<CompositeLoop> ( n, ifname,
"", fmt );
262 rc += mainT<InterpolatingSqrt3LG> ( n, ifname,
"", fmt );
263 rc += mainT<ModifiedButterfly> ( n, ifname,
"", fmt );
264 rc += mainT<CatmullClark> ( n, ifname,
"", fmt );
269 std::cout << std::endl;
271 std::map< std::string, double >::iterator it;
273 std::cout <<
"Timings:\n";
274 for(it = timings.begin();it!=timings.end();++it)
275 std::cout << it->first <<
": " << Timer::as_string(it->second)
277 std::cout << std::endl;
278 std::cout <<
"Ratio composite/native algorithm:\n";
279 std::cout <<
"sqrt(3): " 280 << timings[
"Uniform Composite Sqrt3"]/timings[
"Uniform Sqrt3"]
283 << timings[
"Uniform Composite Loop"]/timings[
"Uniform Loop"]
285 <<
"Interpolating sqrt(3) : " 286 << timings[
"Uniform Interpolating Sqrt3"]/timings[
"Uniform Sqrt3"]
293 return mainT<Sqrt3>( n, ifname, ofname, fmt );
295 return mainT<Loop>( n, ifname, ofname, fmt );
297 return mainT<CompositeSqrt3>( n, ifname, ofname, fmt );
299 return mainT<CompositeLoop> ( n, ifname, ofname, fmt );
300 case TypeLabsikGreiner:
301 return mainT<InterpolatingSqrt3LG> ( n, ifname, ofname, fmt );
302 case TypeModButterfly:
303 return mainT<ModifiedButterfly> ( n, ifname, ofname, fmt );
304 case TypeCatmullClark:
305 return mainT<CatmullClark> ( n, ifname, ofname, fmt );
312 void usage_and_exit(
int _xcode)
314 std::cout <<
"Usage: subdivide [Subdivider Type] #Iterations Input [Output].\n";
315 std::cout << std::endl;
316 std::cout <<
"Subdivider Type\n" 319 <<
" -L\tComposite Loop\n" 321 <<
" -S\tComposite Sqrt3\n" 322 <<
" -b\tInterpolating Sqrt3 Labsik-Greiner\n" 323 <<
" -B\tModified Butterfly\n" bool write_mesh(const Mesh &_mesh, const std::string &_filename, Options _opt=Options::Default, std::streamsize _precision=6)
Write a mesh to the file _filename.
std::string as_string(Format format=Automatic)
double seconds(void) const
Returns measured time in seconds, if the timer is in state 'Stopped'.
void stop(void)
Stop measurement.
bool read_mesh(Mesh &_mesh, const std::string &_filename)
Read a mesh from file _filename.
void start(void)
Start measurement.