#include "displayer.h" #include #include #include "geometry.h" #include "dual.h" #include "stripper.h" extern int box; extern int wire; extern int flat; extern int triangles; extern GLfloat diffuse[4]; extern GLfloat specular[4]; extern GLfloat shininess[1]; extern GLfloat white[4]; extern int drawMode; extern bool m3; Displayer::Displayer(Stripper* s, dual* d) :_stripper(s), _dual(d) { } void Displayer::draw() { unsigned int i; if (box) { glDisable(GL_COLOR_MATERIAL); glDisable(GL_LIGHTING); glColor3f(1.0, 0.0, 0.0); glPointSize(5.0); glBegin(GL_LINE_LOOP); glVertex3f(_dual->_ply.min[0], _dual->_ply.min[1], _dual->_ply.min[2]); glVertex3f(_dual->_ply.min[0], _dual->_ply.min[1], _dual->_ply.max[2]); glVertex3f(_dual->_ply.min[0], _dual->_ply.max[1], _dual->_ply.max[2]); glVertex3f(_dual->_ply.min[0], _dual->_ply.max[1], _dual->_ply.min[2]); glEnd(); glBegin(GL_LINE_LOOP); glVertex3f(_dual->_ply.max[0], _dual->_ply.max[1], _dual->_ply.max[2]); glVertex3f(_dual->_ply.max[0], _dual->_ply.max[1], _dual->_ply.min[2]); glVertex3f(_dual->_ply.max[0], _dual->_ply.min[1], _dual->_ply.min[2]); glVertex3f(_dual->_ply.max[0], _dual->_ply.min[1], _dual->_ply.max[2]); glEnd(); glBegin(GL_LINES); glVertex3f(_dual->_ply.min[0], _dual->_ply.min[1], _dual->_ply.min[2]); glVertex3f(_dual->_ply.max[0], _dual->_ply.min[1], _dual->_ply.min[2]); glVertex3f(_dual->_ply.min[0], _dual->_ply.min[1], _dual->_ply.max[2]); glVertex3f(_dual->_ply.max[0], _dual->_ply.min[1], _dual->_ply.max[2]); glVertex3f(_dual->_ply.min[0], _dual->_ply.max[1], _dual->_ply.max[2]); glVertex3f(_dual->_ply.max[0], _dual->_ply.max[1], _dual->_ply.max[2]); glVertex3f(_dual->_ply.min[0], _dual->_ply.max[1], _dual->_ply.min[2]); glVertex3f(_dual->_ply.max[0], _dual->_ply.max[1], _dual->_ply.min[2]); glEnd(); } // setup default material glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, diffuse); glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, specular); glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, shininess); glColor3fv(diffuse); // setup per-point color mode if (_dual->hascolor) { glEnable(GL_COLOR_MATERIAL); glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE); } // render wireframe model if (wire) { glDisable(GL_LIGHTING); // glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); glColor3f(0.0, 0.0, 0.0); glLineWidth(2.5); for (i = 0; i < _dual->_nodes.size(); i++) { glBegin(GL_LINE_LOOP); glVertex3f(_dual->_vertices[_dual->_nodes[i].v1].x,_dual->_vertices[_dual->_nodes[i].v1].y, _dual->_vertices[_dual->_nodes[i].v1].z); // vertex coordinates glVertex3f(_dual->_vertices[_dual->_nodes[i].v2].x,_dual->_vertices[_dual->_nodes[i].v2].y, _dual->_vertices[_dual->_nodes[i].v2].z); // vertex coordinates glVertex3f(_dual->_vertices[_dual->_nodes[i].v3].x,_dual->_vertices[_dual->_nodes[i].v3].y, _dual->_vertices[_dual->_nodes[i].v3].z); // vertex coordinates glEnd(); } glLineWidth(1); // glEnable(GL_POLYGON_OFFSET_FILL); // glPolygonOffset(0.5, 1.0); } // setup texture mode if (_dual->hastexture) { glEnable(GL_TEXTURE_2D); // setup white object color for use with texture modulation glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, white); } // set lighting if enabled glEnable(GL_LIGHTING); glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); if (triangles) { glBegin(GL_TRIANGLES); for (i = 0; i < _dual->_nodes.size(); i++) { if (flat) glNormal3f(_dual->_nodes[i].fnx, _dual->_nodes[i].fny, _dual->_nodes[i].fnz); // face normal if (_dual->hascolor) { glColor3ub(_dual->_vertices[_dual->_nodes[i].v1].cr,_dual->_vertices[_dual->_nodes[i].v1].cg, _dual->_vertices[_dual->_nodes[i].v1].cb); // vertex coordinates glVertex3f(_dual->_vertices[_dual->_nodes[i].v1].x,_dual->_vertices[_dual->_nodes[i].v1].y, _dual->_vertices[_dual->_nodes[i].v1].z); // vertex coordinates glColor3ub(_dual->_vertices[_dual->_nodes[i].v2].cr,_dual->_vertices[_dual->_nodes[i].v2].cg, _dual->_vertices[_dual->_nodes[i].v2].cb); // vertex coordinates glVertex3f(_dual->_vertices[_dual->_nodes[i].v2].x,_dual->_vertices[_dual->_nodes[i].v2].y, _dual->_vertices[_dual->_nodes[i].v2].z); // vertex coordinates glColor3ub(_dual->_vertices[_dual->_nodes[i].v3].cr,_dual->_vertices[_dual->_nodes[i].v3].cg, _dual->_vertices[_dual->_nodes[i].v3].cb); // vertex coordinates glVertex3f(_dual->_vertices[_dual->_nodes[i].v3].x,_dual->_vertices[_dual->_nodes[i].v3].y, _dual->_vertices[_dual->_nodes[i].v3].z); // vertex coordinates } else if (_dual->hastexture) { glTexCoord2f(_dual->_vertices[_dual->_nodes[i].v1].u, _dual->_vertices[_dual->_nodes[i].v1].v); // set texture coordinates glVertex3f(_dual->_vertices[_dual->_nodes[i].v1].x,_dual->_vertices[_dual->_nodes[i].v1].y, _dual->_vertices[_dual->_nodes[i].v1].z); // vertex coordinates glTexCoord2f(_dual->_vertices[_dual->_nodes[i].v2].u, _dual->_vertices[_dual->_nodes[i].v2].v); // set texture coordinates glVertex3f(_dual->_vertices[_dual->_nodes[i].v2].x,_dual->_vertices[_dual->_nodes[i].v2].y, _dual->_vertices[_dual->_nodes[i].v2].z); // vertex coordinates glTexCoord2f(_dual->_vertices[_dual->_nodes[i].v3].u, _dual->_vertices[_dual->_nodes[i].v3].v); // set texture coordinates glVertex3f(_dual->_vertices[_dual->_nodes[i].v3].x,_dual->_vertices[_dual->_nodes[i].v3].y, _dual->_vertices[_dual->_nodes[i].v3].z); // vertex coordinates } else if (!flat) { glNormal3f(_dual->_vertices[_dual->_nodes[i].v1].nx, _dual->_vertices[_dual->_nodes[i].v1].ny, _dual->_vertices[_dual->_nodes[i].v1].nz); // vertex normal glVertex3f(_dual->_vertices[_dual->_nodes[i].v1].x,_dual->_vertices[_dual->_nodes[i].v1].y, _dual->_vertices[_dual->_nodes[i].v1].z); // vertex coordinates glNormal3f(_dual->_vertices[_dual->_nodes[i].v2].nx, _dual->_vertices[_dual->_nodes[i].v2].ny, _dual->_vertices[_dual->_nodes[i].v2].nz); // vertex normal glVertex3f(_dual->_vertices[_dual->_nodes[i].v2].x,_dual->_vertices[_dual->_nodes[i].v2].y, _dual->_vertices[_dual->_nodes[i].v2].z); // vertex coordinates glNormal3f(_dual->_vertices[_dual->_nodes[i].v3].nx, _dual->_vertices[_dual->_nodes[i].v3].ny, _dual->_vertices[_dual->_nodes[i].v3].nz); // vertex normal glVertex3f(_dual->_vertices[_dual->_nodes[i].v3].x,_dual->_vertices[_dual->_nodes[i].v3].y, _dual->_vertices[_dual->_nodes[i].v3].z); // vertex coordinates } else { glVertex3f(_dual->_vertices[_dual->_nodes[i].v1].x,_dual->_vertices[_dual->_nodes[i].v1].y, _dual->_vertices[_dual->_nodes[i].v1].z); // vertex coordinates glVertex3f(_dual->_vertices[_dual->_nodes[i].v2].x,_dual->_vertices[_dual->_nodes[i].v2].y, _dual->_vertices[_dual->_nodes[i].v2].z); // vertex coordinates glVertex3f(_dual->_vertices[_dual->_nodes[i].v3].x,_dual->_vertices[_dual->_nodes[i].v3].y, _dual->_vertices[_dual->_nodes[i].v3].z); // vertex coordinates } } glEnd(); } if (drawMode == 1) // draw the matching { glDisable(GL_LIGHTING); glLineWidth(2.5); glBegin(GL_LINES); for (unsigned int e = 0; e < _dual->_edges.size(); e++) { #if 1 if (_stripper->_matching.size()) { if (_stripper->_matching2.size()) { // both matchings if (_stripper->_matching[e]) { glColor3f(0,0,1); glVertex3fv(nodeCenter(_dual->_edges[e].v1, 0.008).getData()); glVertex3fv(nodeCenter(_dual->_edges[e].v2, 0.008).getData()); } #if 1 if (!m3 && _stripper->_matching2[e]) { glColor3f(1,0,0); glVertex3fv(nodeCenter(_dual->_edges[e].v1, 0.008).getData()); glVertex3fv(nodeCenter(_dual->_edges[e].v2, 0.008).getData()); } #endif #if 1 if (m3 && _stripper->_matching3[e]) { glColor3f(0,1,0); glVertex3fv(nodeCenter(_dual->_edges[e].v1, 0.008).getData()); glVertex3fv(nodeCenter(_dual->_edges[e].v2, 0.008).getData()); } #endif } else // only the first matching { glColor3f(0,0,1); if (!_stripper->_matching[e]) { glVertex3fv(nodeCenter(_dual->_edges[e].v1, 0.008).getData()); glVertex3fv(nodeCenter(_dual->_edges[e].v2, 0.008).getData()); } } } else // the complete non-boundary graph { glColor3f(0,0,1); if ((_dual->boundaryEdges(_dual->_edges[e].v1) == 0)&&(_dual->boundaryEdges(_dual->_edges[e].v2) == 0)) { glVertex3fv(nodeCenter(_dual->_edges[e].v1, 0.008).getData()); glVertex3fv(nodeCenter(_dual->_edges[e].v2, 0.008).getData()); } } #endif //glVertex3fv(nodeCenter(_dual->_edges[e].v1, 0.008).getData()); //glVertex3fv(nodeCenter(_dual->_edges[e].v2, 0.008).getData()); } glEnd(); glLineWidth(1); /* Draw the Cut edges */ glDisable(GL_LIGHTING); glLineWidth(2.5); glBegin(GL_LINES); for (unsigned int e = 0; e < _stripper->_cutedges.size(); e++) { glColor3f(1,0,0); assert(_dual->boundaryEdges(_dual->_edges[_stripper->_cutedges[e]].v1) == 0); assert(_dual->boundaryEdges(_dual->_edges[_stripper->_cutedges[e]].v2) == 0); glVertex3fv(nodeCenter(_dual->_edges[_stripper->_cutedges[e]].v1, 0.01).getData()); glVertex3fv(nodeCenter(_dual->_edges[_stripper->_cutedges[e]].v2, 0.01).getData()); } glEnd(); glLineWidth(1); } #if 1 /* Color the junction triangles RED */ glDisable(GL_LIGHTING); glColor3f(1,0,0); glBegin(GL_POINTS); for(unsigned int i=0 ; i<_stripper->_junctions.size() ; i++) { glVertex3f(_dual->_vertices[_dual->_nodes[_stripper->_junctions[i]].v1].x, _dual->_vertices[_dual->_nodes[_stripper->_junctions[i]].v1].y, _dual->_vertices[_dual->_nodes[_stripper->_junctions[i]].v1].z); // vertex coordinates glVertex3f(_dual->_vertices[_dual->_nodes[_stripper->_junctions[i]].v2].x, _dual->_vertices[_dual->_nodes[_stripper->_junctions[i]].v2].y, _dual->_vertices[_dual->_nodes[_stripper->_junctions[i]].v2].z); // vertex coordinates glVertex3f(_dual->_vertices[_dual->_nodes[_stripper->_junctions[i]].v3].x, _dual->_vertices[_dual->_nodes[_stripper->_junctions[i]].v3].y, _dual->_vertices[_dual->_nodes[_stripper->_junctions[i]].v3].z); // vertex coordinates } glEnd(); glBegin(GL_TRIANGLES); for(unsigned int i=0 ; i<_stripper->_junctions.size() ; i++) { glVertex3f(_dual->_vertices[_dual->_nodes[_stripper->_junctions[i]].v1].x, _dual->_vertices[_dual->_nodes[_stripper->_junctions[i]].v1].y, _dual->_vertices[_dual->_nodes[_stripper->_junctions[i]].v1].z); // vertex coordinates glVertex3f(_dual->_vertices[_dual->_nodes[_stripper->_junctions[i]].v2].x, _dual->_vertices[_dual->_nodes[_stripper->_junctions[i]].v2].y, _dual->_vertices[_dual->_nodes[_stripper->_junctions[i]].v2].z); // vertex coordinates glVertex3f(_dual->_vertices[_dual->_nodes[_stripper->_junctions[i]].v3].x, _dual->_vertices[_dual->_nodes[_stripper->_junctions[i]].v3].y, _dual->_vertices[_dual->_nodes[_stripper->_junctions[i]].v3].z); // vertex coordinates } glEnd(); #endif glDisable(GL_POLYGON_OFFSET_FILL); if (_dual->hascolor) glDisable(GL_COLOR_MATERIAL); if (_dual->hastexture) glDisable(GL_TEXTURE_2D); } /* Returns a vertex slightly up from the face center */ Geometry::Vector3Df Displayer::nodeCenter(int n, double scale) { Geometry::Vector3Df sum; sum += Geometry::Vector3Df(_dual->_vertices[_dual->_nodes[n].v1].x, _dual->_vertices[_dual->_nodes[n].v1].y, _dual->_vertices[_dual->_nodes[n].v1].z) / 3; sum += Geometry::Vector3Df(_dual->_vertices[_dual->_nodes[n].v2].x, _dual->_vertices[_dual->_nodes[n].v2].y, _dual->_vertices[_dual->_nodes[n].v2].z) / 3; sum += Geometry::Vector3Df(_dual->_vertices[_dual->_nodes[n].v3].x, _dual->_vertices[_dual->_nodes[n].v3].y, _dual->_vertices[_dual->_nodes[n].v3].z) / 3; Geometry::Vector3Df fnormal(_dual->_nodes[n].fnx, _dual->_nodes[n].fny, _dual->_nodes[n].fnz); sum += fnormal*scale; return sum; }