53 #define ACG_STATUS_NODES_C
59 #include "StatusNodesT.hh"
60 #include "../GL/gl.hh"
66 namespace SceneGraph {
72 template <
class Mesh,
class Mod>
76 const std::string& _name )
78 bbMin_(FLT_MAX, FLT_MAX, FLT_MAX),
79 bbMax_(-FLT_MAX, -FLT_MAX, -FLT_MAX),
80 invalidGeometry_(true),
81 vertexIndexInvalid_(true),
82 halfedgeCacheInvalid_(true),
83 edgeIndexInvalid_(true),
84 faceIndexInvalid_(true)
94 template <
class Mesh,
class Mod>
99 _bbMin.minimize(bbMin_);
100 _bbMax.maximize(bbMax_);
107 template <
class Mesh,
class Mod>
121 template <
class Mesh,
class Mod>
126 if ( invalidGeometry_ ) {
127 bbMin_ =
Vec3d(FLT_MAX, FLT_MAX, FLT_MAX);
128 bbMax_ =
Vec3d(-FLT_MAX, -FLT_MAX, -FLT_MAX);
130 typename Mesh::ConstVertexIter v_it(mesh_.vertices_sbegin()),
131 v_end(mesh_.vertices_end());
133 for (; v_it!=v_end; ++v_it) {
134 bbMin_.minimize(mesh_.point(v_it));
135 bbMax_.maximize(mesh_.point(v_it));
138 invalidGeometry_ =
false;
147 template <
class Mesh,
class Mod>
175 (_drawMode & DrawModes::WIREFRAME));
192 if (shaded && mesh_.has_vertex_normals()) {
212 if (shaded && !smooth)
219 glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
221 glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
224 glPushAttrib( GL_ENABLE_BIT );
228 glPolygonOffset(0.001, 0.0);
249 template <
class Mesh,
class Mod>
251 StatusNodeT<Mesh, Mod>::
256 if ( vertexIndexInvalid_ ) {
258 typename Mesh::ConstVertexIter v_it(mesh_.vertices_sbegin()),
259 v_end(mesh_.vertices_end());
262 for (; v_it!=v_end; ++v_it) {
263 if (Mod::is_vertex_selected(mesh_, v_it.handle())) {
264 v_cache_.push_back(v_it.handle().idx());
268 vertexIndexInvalid_ =
false;
271 if ( !v_cache_.empty() )
272 glDrawElements(GL_POINTS,
282 template <
class Mesh,
class Mod>
284 StatusNodeT<Mesh, Mod>::
288 if ( edgeIndexInvalid_ ) {
290 typename Mesh::ConstEdgeIter e_it(mesh_.edges_sbegin()),
291 e_end(mesh_.edges_end());
292 typename Mesh::VertexHandle vh;
295 for (; e_it!=e_end; ++e_it) {
296 if (Mod::is_edge_selected(mesh_, e_it)) {
297 vh = mesh_.to_vertex_handle(mesh_.halfedge_handle(e_it, 0));
298 e_cache_.push_back(vh.idx());
299 vh = mesh_.to_vertex_handle(mesh_.halfedge_handle(e_it, 1));
300 e_cache_.push_back(vh.idx());
304 edgeIndexInvalid_ =
false;
307 if ( !e_cache_.empty() )
308 glDrawElements(GL_LINES,
318 template <
class Mesh,
class Mod>
320 StatusNodeT<Mesh, Mod>::
324 if ( halfedgeCacheInvalid_) {
326 typename Mesh::ConstHalfedgeIter he_it(mesh_.halfedges_sbegin()),
327 he_end(mesh_.halfedges_end());
331 for (; he_it!=he_end; ++he_it) {
332 if (Mod::is_halfedge_selected(mesh_, he_it)) {
334 he_points_.push_back( halfedge_point(he_it));
335 he_points_.push_back( halfedge_point(mesh_.prev_halfedge_handle(he_it)));
339 if(!mesh_.is_boundary(he_it))
340 fh = mesh_.face_handle(he_it);
342 fh = mesh_.face_handle(mesh_.opposite_halfedge_handle(he_it));
344 he_normals_.push_back( mesh_.normal(fh));
345 he_normals_.push_back( mesh_.normal(fh));
349 halfedgeCacheInvalid_ =
false;
354 if ( !he_points_.empty()) {
359 if ( !he_normals_.empty())
362 glDrawArrays(GL_LINES, 0, he_points_.size() );
371 template <
class Mesh,
class Mod>
373 StatusNodeT<Mesh, Mod>::
374 draw_faces(
bool _per_vertex)
378 if ( faceIndexInvalid_ ) {
380 typename Mesh::ConstFaceIter f_it(mesh_.faces_sbegin()),
381 f_end(mesh_.faces_end());
382 typename Mesh::ConstFaceVertexIter fv_it;
386 for (; f_it!=f_end; ++f_it) {
387 if (Mod::is_face_selected(mesh_, f_it)) {
388 fv_it = mesh_.cfv_iter(f_it);
389 f_cache_.push_back(fv_it.handle().idx()); ++fv_it;
390 f_cache_.push_back(fv_it.handle().idx()); ++fv_it;
391 f_cache_.push_back(fv_it.handle().idx());
392 fh_cache_.push_back(f_it);
395 faceIndexInvalid_ =
false;
398 typename std::vector<FaceHandle>::const_iterator fh_it(fh_cache_.begin()),
399 fh_end(fh_cache_.end());
400 typename Mesh::CFVIter fv_it;
404 if (mesh_.is_trimesh()) {
407 glBegin(GL_TRIANGLES);
408 for (; fh_it!=fh_end; ++fh_it) {
410 glVertex(mesh_.point(fv_it=mesh_.cfv_iter(*fh_it)));
418 if ( !f_cache_.empty() )
419 glDrawElements(GL_TRIANGLES,
430 for (; fh_it!=fh_end; ++fh_it) {
433 for (fv_it=mesh_.cfv_iter(*fh_it); fv_it; ++fv_it)
440 for (; fh_it!=fh_end; ++fh_it) {
442 for (fv_it=mesh_.cfv_iter(*fh_it); fv_it; ++fv_it) {
444 glArrayElement(fv_it.handle().idx());
457 template <
class Mesh,
class Mod>
459 StatusNodeT<Mesh, Mod>::
460 halfedge_point(
const HalfedgeHandle _heh)
462 typename Mesh::Point p = mesh_.point(mesh_.to_vertex_handle (_heh));
463 typename Mesh::Point pp = mesh_.point(mesh_.from_vertex_handle(_heh));
464 typename Mesh::Point pn = mesh_.point(mesh_.to_vertex_handle(mesh_.next_halfedge_handle(_heh)));
467 typename Mesh::Point fn;
468 if( !mesh_.is_boundary(_heh))
469 fn = mesh_.normal(mesh_.face_handle(_heh));
471 fn = mesh_.normal(mesh_.face_handle(mesh_.opposite_halfedge_handle(_heh)));
473 typename Mesh::Point upd = ((fn%(pn-p)).normalize() + (fn%(p-pp)).normalize()).normalize();
475 upd *= ((pn-p).norm()+(p-pp).norm())*0.08;
487 template <
class Mesh,
class Mod>
489 invalidGeometry_ =
true;
492 template <
class Mesh,
class Mod>
494 vertexIndexInvalid_ =
true;
495 halfedgeCacheInvalid_ =
true;
496 edgeIndexInvalid_ =
true;
497 faceIndexInvalid_ =
true;
501 template <
class Mesh,
class Mod>
503 vertexIndexInvalid_ =
true;
504 halfedgeCacheInvalid_ =
true;
505 edgeIndexInvalid_ =
true;
506 faceIndexInvalid_ =
true;