48 # pragma warning(disable: 4267 4311) 54 #include <QApplication> 58 #include <OpenMesh/Apps/ProgViewer/ProgViewerWidget.hh> 59 #include <OpenMesh/Core/IO/BinaryHelper.hh> 60 #include <OpenMesh/Core/IO/MeshIO.hh> 61 #include <OpenMesh/Core/Utils/Endian.hh> 66 #include <OpenGL/gl.h> 79 unsigned int i, i0, i1, i2;
80 unsigned int v1, vl, vr;
83 std::ifstream ifs(_filename, std::ios::binary);
86 std::cerr <<
"read error\n";
94 ifs.read(c, 8); c[8] =
'\0';
95 if (std::string(c) != std::string(
"ProgMesh"))
97 std::cerr <<
"Wrong file format.\n";
104 n_max_vertices_ = n_base_vertices_ + n_detail_vertices_;
109 for (i=0; i<n_base_vertices_; ++i)
115 for (i=0; i<n_base_faces_; ++i)
120 mesh_.add_face(mesh_.vertex_handle(i0),
121 mesh_.vertex_handle(i1),
122 mesh_.vertex_handle(i2));
127 for (i=0; i<n_detail_vertices_; ++i)
139 pminfos_.push_back(pminfo);
141 pmiter_ = pminfos_.begin();
149 MyMesh::ConstVertexIter
150 vIt(mesh_.vertices_begin()),
151 vEnd(mesh_.vertices_end());
155 bbMin = bbMax = mesh_.point(*vIt);
156 for (; vIt!=vEnd; ++vIt)
158 bbMin.minimize(mesh_.point(*vIt));
159 bbMax.maximize(mesh_.point(*vIt));
163 set_scene_pos(0.5f*(bbMin + bbMax), 0.5*(bbMin - bbMax).norm());
166 std::cerr << mesh_.n_vertices() <<
" vertices, " 167 << mesh_.n_edges() <<
" edge, " 168 << mesh_.n_faces() <<
" faces, " 169 << n_detail_vertices_ <<
" detail vertices\n";
171 setWindowTitle( QFileInfo(_filename).fileName() );
180 size_t n_vertices = mesh_.n_vertices();
182 while (n_vertices < _n && pmiter_ != pminfos_.end())
196 std::cerr << n_vertices <<
" vertices\n";
205 size_t n_vertices = mesh_.n_vertices();
207 while (n_vertices > _n && pmiter_ != pminfos_.begin())
211 MyMesh::HalfedgeHandle hh =
212 mesh_.find_halfedge(pmiter_->v0, pmiter_->v1);
219 mesh_.garbage_collection();
223 std::cerr << n_vertices <<
" vertices\n";
229 void ProgViewerWidget::keyPressEvent(QKeyEvent* _event)
231 switch (_event->key())
234 if ( _event->modifiers() & ShiftModifier)
235 coarsen(mesh_.n_vertices()-1);
237 coarsen((
unsigned int)(0.9*mesh_.n_vertices()));
242 if (_event->modifiers() & ShiftModifier)
243 refine(mesh_.n_vertices()+1);
245 refine((
unsigned int)(std::max( 1.1*mesh_.n_vertices(),
246 mesh_.n_vertices()+1.0) ));
251 coarsen(n_base_vertices_);
256 if (timer_->isActive())
259 std::cout <<
"animation stopped!" << std::endl;
263 timer_->setSingleShot(
true);
265 std::cout <<
"animation started!" << std::endl;
270 refine(n_base_vertices_ + n_detail_vertices_);
276 const size_t refine_max = 100000;
277 const size_t n_loop = 5;
282 coarsen(0); count = mesh_.n_vertices();
283 refine(refine_max); count = mesh_.n_vertices() - count;
286 for (
size_t i=0; i<n_loop; ++i)
293 std::cout <<
"# collapses/splits: " << 2*(n_loop+1)*count <<
" in " 295 std::cout <<
"# collapses or splits per seconds: " 296 << 2*(n_loop+1)*count/t.
seconds() <<
"\n";
308 std::clog <<
"Current mesh stored in 'result.off'\n";
312 this->Base::keyPressEvent(_event);
316 void ProgViewerWidget::animate(
void )
318 if (animateRefinement_)
320 refine((
unsigned int)( 1.1*(mesh_.n_vertices()+1) ));
321 if ( mesh_.n_vertices() > n_base_vertices_+(0.5*n_detail_vertices_))
322 animateRefinement_ =
false;
326 coarsen((
unsigned int)(0.9*(mesh_.n_vertices()-1)));
327 if ( mesh_.n_vertices() == n_base_vertices_ )
328 animateRefinement_ =
true;
331 timer_->setSingleShot(
true);
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.
Kernel::Point Point
Coordinate type.
std::string as_string(Format format=Automatic)
double seconds(void) const
Returns measured time in seconds, if the timer is in state 'Stopped'.
HalfedgeHandle vertex_split(Point _v0_point, VertexHandle _v1, VertexHandle _vl, VertexHandle _vr)
Vertex Split: inverse operation to collapse().
void stop(void)
Stop measurement.
Little endian (Intel family and clones)
void update_vertex_normals()
Update normal vectors for all vertices.
SmartVertexHandle add_vertex(const Point &_p)
Alias for new_vertex(const Point&).
void update_face_normals()
Update normal vectors for all faces.
void start(void)
Start measurement.
Kernel::VertexHandle VertexHandle
Handle for referencing the corresponding item.
static Type local()
Return endian type of host system.