diff --git a/cmath3d/TriangleMesh.h b/cmath3d/TriangleMesh.h index 7aa390972040f3077171215ec08f17a3d0805fea..4f1165ef41f8e16ee44039e15a77ecfeaa3a97cc 100644 --- a/cmath3d/TriangleMesh.h +++ b/cmath3d/TriangleMesh.h @@ -105,6 +105,7 @@ class ActiveMesh //the following functions are all defined in graphics.cpp void displayMesh(void); + void displayMeshEdges(void); void displayVertexAndNeigs(void); void displayQuadricSurface(void); void displayTEST(void); diff --git a/src/graphics.cpp b/src/graphics.cpp index 5fd0ecde6ddef776a9756e812d01a05a532d669a..e5dbc8d3673d9e57b94f64e762768a3e1d172c15 100644 --- a/src/graphics.cpp +++ b/src/graphics.cpp @@ -51,6 +51,7 @@ bool showFrame=false; bool showBox=true; bool showWholeMesh=true; +bool showWholeMeshEdges=false; bool showVertexSurface=false; bool showQuadricSurface=false; bool showTEST=false; @@ -150,7 +151,6 @@ void displayAxes(void) glVertex3f(params.sceneCentre.x,params.sceneCentre.y,params.sceneCentre.z); glVertex3f(params.sceneCentre.x,params.sceneCentre.y,params.sceneCentre.z+params.sceneSize.z/4.f); glEnd(); - glLineWidth(1); } @@ -338,12 +338,31 @@ void ActiveMesh::displayQuadricSurface(void) void ActiveMesh::displayMesh(void) { - glColor3f(0.6f,0.6f,0.6f); + const float gray=0.6f; + glColor4f(gray,gray,gray,1.0f); + glLineWidth(1); + + long unsigned int* id=ID.data(); + for (unsigned int i=0; i < ID.size(); i+=3) + { + glBegin(GL_TRIANGLES); + glNormal3f(norm[i/3].x,norm[i/3].y,norm[i/3].z); + glVertex3f(Pos[*id].x,Pos[*id].y,Pos[*id].z); ++id; + glVertex3f(Pos[*id].x,Pos[*id].y,Pos[*id].z); ++id; + glVertex3f(Pos[*id].x,Pos[*id].y,Pos[*id].z); ++id; + glEnd(); + } +} + +void ActiveMesh::displayMeshEdges(void) +{ + const float gray=0.8f; + glColor4f(gray,gray,gray,1.0f); + glLineWidth(3); long unsigned int* id=ID.data(); for (unsigned int i=0; i < ID.size(); i+=3) { - //glBegin(GL_TRIANGLES); glBegin(GL_LINE_LOOP); glNormal3f(norm[i/3].x,norm[i/3].y,norm[i/3].z); glVertex3f(Pos[*id].x,Pos[*id].y,Pos[*id].z); ++id; @@ -356,7 +375,7 @@ void ActiveMesh::displayMesh(void) void display(void) { - glClear(GL_COLOR_BUFFER_BIT); + glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glLoadIdentity(); glTranslatef(params.sceneCentre.x,params.sceneCentre.y,params.sceneCentre.z); glScalef(zoom,zoom,zoom); @@ -372,14 +391,16 @@ void display(void) glEnable(GL_FOG); if (showBox) displayBox(); if (showFrame) displayFrame(); - if (showAxes) displayAxes(); glDisable(GL_FOG); if (showWholeMesh) mesh.displayMesh(); + if (showWholeMeshEdges) mesh.displayMeshEdges(); if (showVertexSurface) mesh.displayVertexAndNeigs(); if (showQuadricSurface) mesh.displayQuadricSurface(); if (showTEST) mesh.displayTEST(); + if (showAxes) displayAxes(); + glFlush(); glutSwapBuffers(); } @@ -435,6 +456,7 @@ void printKeysHelp(void) std::cout << "'h': displays this help\n"; std::cout << "'d': displays enabled features,displays status\n"; std::cout << "'m': toggle display of the mesh\n"; + std::cout << "'e': toggle display of the mesh wireframe (triangle edges)'\n"; std::cout << "'v': toggle display of the vertex supporting region\n"; std::cout << "'V': chooses another vertex\n"; std::cout << "'s': toggle display of the fitted quadratic surface \n"; @@ -532,6 +554,10 @@ void keyboard(unsigned char key, int mx, int my) showWholeMesh^=true; glutPostRedisplay(); break; + case 'e': + showWholeMeshEdges^=true; + glutPostRedisplay(); + break; case 'v': showVertexSurface^=true; glutPostRedisplay(); @@ -565,11 +591,24 @@ void keyboard(unsigned char key, int mx, int my) //some testing controls case 'x': - //glEnable(GL_FOG); + glPolygonMode(GL_FRONT,GL_LINE); glutPostRedisplay(); break; case 'X': - //glDisable(GL_FOG); + glPolygonMode(GL_FRONT,GL_FILL); + glutPostRedisplay(); + /* + GLfloat ranges[10]; + glGetFloatv(GL_DEPTH_RANGE,ranges); + std::cout << "near=" << ranges[0] << ", far=" << ranges[1] << "\n"; + */ + break; + case 'c': + glDisable(GL_DEPTH_TEST); + glutPostRedisplay(); + break; + case 'C': + glEnable(GL_DEPTH_TEST); glutPostRedisplay(); break; @@ -694,8 +733,7 @@ void initializeGL(void) glutInit(&Argc, Argv); - glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA); - //glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH); + glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH); glutInitWindowSize(800, 800); glutInitWindowPosition(600, 100); glutCreateWindow(Argv[0]); @@ -714,9 +752,21 @@ void initializeGL(void) glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + //filter rendered points (should look nicer) glEnable(GL_POINT_SMOOTH); - //glEnable(GL_CULL_FACE); - //glEnable(GL_DEPTH_TEST); + + //default displaying mode for triangles + //frontfaces are just lines, backfaces are opaque + glPolygonMode(GL_FRONT,GL_LINE); + glPolygonMode(GL_BACK, GL_FILL); + + //but, well, do not draw backfaces at all + glEnable(GL_CULL_FACE); + glCullFace(GL_BACK); + + //enable z-buffer; + //otherwise it would depend on the order of primitives drawing + glEnable(GL_DEPTH_TEST); //set up the fog (is enabled/disabled before/after drawing frames): GLfloat fogColor[4]={0.4f*params.sceneBorderColour.r, @@ -731,6 +781,8 @@ void initializeGL(void) // glFogf(GL_FOG_START,params.sceneOffset.z); glFogf(GL_FOG_END,params.sceneOffset.z+params.sceneSize.z); + + //some OpenGL info, for fun... std::cout << "Vendor : " << glGetString(GL_VENDOR) << "\n"; std::cout << "Renderer: " << glGetString(GL_RENDERER) << "\n"; std::cout << "Version : " << glGetString(GL_VERSION) << "\n";