diff --git a/src/graphics.cpp b/src/graphics.cpp index 1afb20000c03c503e3061ee8cc189b99b2c79644..0e3e626535b802bce442da2f81d9d7e6cd5056c0 100644 --- a/src/graphics.cpp +++ b/src/graphics.cpp @@ -46,6 +46,10 @@ float zoom = 1.0; bool MouseActive = false; int last_x = 0, last_y = 0; +bool showAxes=true; +bool showFrame=false; +bool showBox=true; + bool showWholeMesh=true; bool showVertexSurface=false; bool showQuadricSurface=false; @@ -76,7 +80,7 @@ void step(int count) } -///draws the frame around the playground +///draws a flat frame around the playground void displayFrame(void) { glColor3f(params.sceneBorderColour.r, @@ -91,6 +95,45 @@ void displayFrame(void) glEnd(); } +///draws a frame box around the playground +void displayBox(void) +{ + glColor3f(params.sceneBorderColour.r, + params.sceneBorderColour.g, + params.sceneBorderColour.b); + glLineWidth(1); + //front square/plane + glBegin(GL_LINE_LOOP); + glVertex3f( params.sceneOffset.x , params.sceneOffset.y , params.sceneOffset.z ); + glVertex3f( params.sceneOffset.x + params.sceneSize.x , params.sceneOffset.y , params.sceneOffset.z ); + glVertex3f( params.sceneOffset.x + params.sceneSize.x , params.sceneOffset.y + params.sceneSize.y , params.sceneOffset.z ); + glVertex3f( params.sceneOffset.x , params.sceneOffset.y + params.sceneSize.y , params.sceneOffset.z ); + glEnd(); + + //rear square/plane + glBegin(GL_LINE_LOOP); + glVertex3f( params.sceneOffset.x , params.sceneOffset.y , params.sceneOffset.z + params.sceneSize.z ); + glVertex3f( params.sceneOffset.x + params.sceneSize.x , params.sceneOffset.y , params.sceneOffset.z + params.sceneSize.z ); + glVertex3f( params.sceneOffset.x + params.sceneSize.x , params.sceneOffset.y + params.sceneSize.y , params.sceneOffset.z + params.sceneSize.z ); + glVertex3f( params.sceneOffset.x , params.sceneOffset.y + params.sceneSize.y , params.sceneOffset.z + params.sceneSize.z ); + glEnd(); + + //sideways "connectors" + glBegin(GL_LINES); + glVertex3f( params.sceneOffset.x , params.sceneOffset.y , params.sceneOffset.z ); + glVertex3f( params.sceneOffset.x , params.sceneOffset.y , params.sceneOffset.z + params.sceneSize.z ); + + glVertex3f( params.sceneOffset.x + params.sceneSize.x , params.sceneOffset.y , params.sceneOffset.z ); + glVertex3f( params.sceneOffset.x + params.sceneSize.x , params.sceneOffset.y , params.sceneOffset.z + params.sceneSize.z ); + + glVertex3f( params.sceneOffset.x + params.sceneSize.x , params.sceneOffset.y + params.sceneSize.y , params.sceneOffset.z ); + glVertex3f( params.sceneOffset.x + params.sceneSize.x , params.sceneOffset.y + params.sceneSize.y , params.sceneOffset.z + params.sceneSize.z ); + + glVertex3f( params.sceneOffset.x , params.sceneOffset.y + params.sceneSize.y , params.sceneOffset.z ); + glVertex3f( params.sceneOffset.x , params.sceneOffset.y + params.sceneSize.y , params.sceneOffset.z + params.sceneSize.z ); + glEnd(); +} + void displayAxes(void) { glLineWidth(2); @@ -326,8 +369,11 @@ void display(void) //0.0, cosf(-uhel_y), sinf(-uhel_y)); // up 0.0, 1.0, 0.0); // up - displayFrame(); - displayAxes(); + glEnable(GL_FOG); + if (showBox) displayBox(); + if (showFrame) displayFrame(); + if (showAxes) displayAxes(); + glDisable(GL_FOG); if (showWholeMesh) mesh.displayMesh(); if (showVertexSurface) mesh.displayVertexAndNeigs(); @@ -382,7 +428,22 @@ void GetSceneViewSize(const int w,const int h, void printKeysHelp(void) { std::cout << "\nKeys:\n"; - std::cout << "ESC or 'q': quit\n"; + std::cout << "ESC or 'q': quit ENTER: enters empty line on a console\n"; + std::cout << "' ','n','z': simulation goes/stop at various steps\n"; + std::cout << "'r': resets the view\n"; + std::cout << "'o','O': zoom in,out\n"; + 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 << "'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"; + std::cout << "'t': toggle display of the test/debug function\n"; + std::cout << "'a': toggle display of the R,G,B <-> x,y,z axes \n"; + std::cout << "'f': toggle display of the frame/plane az z=0\n"; + std::cout << "'b': toggle display of the bounding box\n"; + std::cout << "'x','X': controls for some testing\n"; + std::cout << "'i': not used\n"; } @@ -413,6 +474,9 @@ void keyboard(unsigned char key, int mx, int my) case 'q': //quit exit(EXIT_SUCCESS); break; + case 13: //Enter key -- just empty lines + std::cout << std::endl; + break; //control execution of the simulation case ' ': //pause/unpause, refresh every 10 cycles @@ -436,7 +500,7 @@ void keyboard(unsigned char key, int mx, int my) step(1); break; - //etc stuff... + //view params case 'r': //set scale 1:1 uhel_x = 0.0; uhel_y = 0.0; @@ -444,12 +508,6 @@ void keyboard(unsigned char key, int mx, int my) glutReshapeWindow(int(params.imgSizeX),int(params.imgSizeY)); glutPostRedisplay(); break; - case 'h': //print help - printKeysHelp(); - break; - case 'd': //print what is displayed - printDispayedFeauters(); - break; case 'o': zoom -= 0.2f; if (zoom < 0.2f) zoom=0.2f; @@ -460,28 +518,61 @@ void keyboard(unsigned char key, int mx, int my) glutPostRedisplay(); break; - case 'v': - ++VertexID; - glutPostRedisplay(); + //control hints/help + case 'h': //print help + printKeysHelp(); + break; + case 'd': //print what is displayed + printDispayedFeauters(); break; - case 'M': + + //display objects + case 'm': showWholeMesh^=true; glutPostRedisplay(); break; - case 'V': + case 'v': showVertexSurface^=true; glutPostRedisplay(); break; - case 'Q': + case 'V': + ++VertexID; + glutPostRedisplay(); + break; + case 's': showQuadricSurface^=true; glutPostRedisplay(); break; - case 'T': + case 't': showTEST^=true; glutPostRedisplay(); break; + //annotation controls + case 'a': + showAxes^=true; + glutPostRedisplay(); + break; + case 'f': + showFrame^=true; + glutPostRedisplay(); + break; + case 'b': + showBox^=true; + glutPostRedisplay(); + break; + + //some testing controls + case 'x': + glEnable(GL_FOG); + glutPostRedisplay(); + break; + case 'X': + glDisable(GL_FOG); + glutPostRedisplay(); + break; + case 'i': //inspect a cell GetSceneViewSize(windowSizeX,windowSizeY, xVisF,xVisT,yVisF,yVisT); sx=(float)mx /(float)windowSizeX * (xVisT-xVisF) + xVisF; @@ -499,9 +590,6 @@ void keyboard(unsigned char key, int mx, int my) } */ break; - case 13: //Enter key -- just empty lines - std::cout << std::endl; - break; } } @@ -607,6 +695,7 @@ void initializeGL(void) glutInit(&Argc, Argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA); + //glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH); glutInitWindowSize(800, 800); glutInitWindowPosition(600, 100); glutCreateWindow(Argv[0]); @@ -620,10 +709,29 @@ void initializeGL(void) glutMotionFunc(MouseMotion); glClearColor(0.0, 0.0, 0.0, 0.0); + + //enables alfa-blending for every object/drawing glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glEnable(GL_POINT_SMOOTH); - glEnable(GL_CULL_FACE); + //glEnable(GL_CULL_FACE); + //glEnable(GL_DEPTH_TEST); + + //enable fog: + //glEnable(GL_FOG); + glFogi(GL_FOG_MODE,GL_LINEAR); + GLfloat fogColor[4]={0.4f*params.sceneBorderColour.r, + 0.4f*params.sceneBorderColour.g, + 0.4f*params.sceneBorderColour.b, + 1.0f}; //has no effect + glFogfv(GL_FOG_COLOR,fogColor); + //density is not required in linear mode + //glFogf(GL_FOG_DENSITY,0.3f); + //glHint(GL_FOG_HINT,GL_NICEST); //TODO adjust later + + glFogf(GL_FOG_START,params.sceneOffset.z); + glFogf(GL_FOG_END,params.sceneOffset.z+params.sceneSize.z); } void loopGL(void) diff --git a/src/main.cpp b/src/main.cpp index 7cc51374d38f4e4598a4b7ed98516d919c357bba..b5709ccfb74378033fb0aa6cb69c885c35253bb4 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -73,9 +73,9 @@ void ParamsSetup(void) params.sceneCentre+=params.sceneOffset; params.sceneOuterBorder=Vector3d<float>(2.f); - params.sceneBorderColour.r=0.5f; - params.sceneBorderColour.g=0.5f; - params.sceneBorderColour.b=0.5f; + params.sceneBorderColour.r=0.7f; + params.sceneBorderColour.g=0.7f; + params.sceneBorderColour.b=0.0f; params.inputCellsFilename="cells/cell%d.txt"; params.numberOfAgents=2;