#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "visshader.h" using namespace vcg; using namespace std; // Vertex, Face, Mesh and Grid definitions. class MyEdge; class AFace; class AVertex : public VertexVCVN< float ,MyEdge,AFace > {}; class AFace : public FaceFCFN< AVertex,MyEdge,AFace > {}; class AMesh : public tri::TriMesh< vector, vector > {}; ///////// Global //////// int SampleNum=32; int WindowRes=800; bool SwapFlag=false; float lopass=0,hipass=1,gamma=1; bool LightFlag=true; bool ColorFlag=true; Trackball Q; int ScreenH,ScreenW; float ViewAngle=45; class TimeOracle { public: time_t start; time_t cur; char buf[128]; char const *TimeToEndStr(double perc) { time(&cur); double diff=difftime(cur,start); diff= diff/perc - diff; int hh=diff/3600; int mm=(diff-hh*3600)/60; int ss=diff-hh*3600-mm*60; sprintf(buf,"%02i:%02i:%02i",hh,mm,ss); return buf; } void Start(){time(&start);}; }; bool cb(const char *buf) { printf(buf); return true; } // prototypes void SaveTexturedGround(); void Draw(AMesh &mm) { AMesh::FaceIterator fi; glBegin(GL_TRIANGLES); for(fi=mm.face.begin();fi!=mm.face.end();++fi) { glNormal((*fi).V(0)->N()); glColor((*fi).V(0)->C()); glVertex((*fi).V(0)->P()); glNormal((*fi).V(1)->N()); glColor((*fi).V(1)->C()); glVertex((*fi).V(1)->P()); glNormal((*fi).V(2)->N()); glColor((*fi).V(2)->C()); glVertex((*fi).V(2)->P()); } glEnd(); } AMesh m; VertexVisShader Vis(m); string OutNameMsh; /* Called when the window is first opened and whenever * the window is reconfigured (moved or resized). */ void ViewReshape(GLsizei w, GLsizei h) { ScreenW=w; ScreenH=h; glMatrixMode (GL_PROJECTION); glLoadIdentity (); gluPerspective(ViewAngle,(float)w/(float)h,.1,10000); glViewport (0, 0, (GLsizei) w, (GLsizei) h); } void ViewDisplay (void) { glMatrixMode (GL_PROJECTION); glLoadIdentity (); gluPerspective(ViewAngle,1,.1,10); glMatrixMode (GL_MODELVIEW); glLoadIdentity (); glTranslatef(0,0,-4); glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); Q.GetView(); Q.Apply(); Q.Draw(); float d = 2.0/m.bbox.Diag(); glScalef(d, d, d); glTranslate(-m.bbox.Center()); if(LightFlag) glEnable(GL_LIGHTING); else glDisable(GL_LIGHTING); if(ColorFlag) glEnable(GL_COLOR_MATERIAL); else glDisable(GL_COLOR_MATERIAL); Draw(m); glutSwapBuffers(); } void ViewSpecialKey(int , int , int ) { glutPostRedisplay(); } void Toggle(bool &flag) {flag = !flag;} /*********************************************************************/ /*********************************************************************/ /*********************************************************************/ void ViewKey(unsigned char key, int , int ) { Point3f dir; switch (key) { case 27: exit(0); break; case 'l' : lopass=lopass+.05; printf("Lo %f, Hi %f Gamma %f\n",lopass,hipass,gamma); Vis.MapVisibility(gamma,lopass,hipass); break; case 'L' : lopass=lopass-.05; printf("Lo %f, Hi %f Gamma %f\n",lopass,hipass,gamma); Vis.MapVisibility(gamma,lopass,hipass); break; case 'h' : hipass=hipass-.05; printf("Lo %f, Hi %f Gamma %f\n",lopass,hipass,gamma); Vis.MapVisibility(gamma,lopass,hipass); break; case 'H' : hipass=hipass+.05; printf("Lo %f, Hi %f Gamma %f\n",lopass,hipass,gamma); Vis.MapVisibility(gamma,lopass,hipass); break; case 'g' : gamma=gamma-.05; printf("Lo %f, Hi %f Gamma %f\n",lopass,hipass,gamma); Vis.MapVisibility(gamma,lopass,hipass); break; case 'G' : gamma=gamma+.05; printf("Lo %f, Hi %f Gamma %f\n",lopass,hipass,gamma); Vis.MapVisibility(gamma,lopass,hipass); break; case 'c' : Vis.ComputeUniform(SampleNum,cb); Vis.MapVisibility(gamma,lopass,hipass); break; case ' ' : { Point3f dir = Q.camera.ViewPoint(); printf("ViewPoint %f %f %f\n",dir[0],dir[1],dir[2]); dir.Normalize(); dir=Inverse(Q.track.Matrix())*dir; printf("ViewPoint %f %f %f\n",dir[0],dir[1],dir[2]); dir.Normalize(); Vis.ComputeSingle(dir,cb); Vis.MapVisibility(gamma,lopass,hipass); } break; case 's' : Vis.SmoothVisibility(); Vis.MapVisibility(gamma,lopass,hipass); break; case 'S' : { vcg::tri::io::PlyInfo p; p.mask|=vcg::ply::PLYMask::PM_VERTCOLOR /* | vcg::ply::PLYMask::PM_VERTQUALITY*/ ; tri::io::ExporterPLY::Save(m,OutNameMsh.c_str(),false,p); } break; case 'a' : LightFlag = !LightFlag; printf("Toggled Light\n"); break; case 'A' : ColorFlag = !ColorFlag; printf("Toggled Color\n"); break; } glutPostRedisplay(); ; } void ViewMenu(int val) { ViewKey(val, 0, 0); } /*********************************************************************/ // TrackBall Functions /*********************************************************************/ int PressedButton; // What is the button actually pressed? int KeyMod; int GW,GH; // Grandezza della finestra int B[3]={0,0,0}; // Variabile globale che tiene lo stato dei tre bottoni; void ViewMouse(int button, int state, int x, int y) { static int glut_buttons=0; int m_mask = 0; KeyMod=glutGetModifiers(); if(GLUT_ACTIVE_SHIFT & KeyMod) m_mask |= Trackball::KEY_SHIFT; if(GLUT_ACTIVE_ALT & KeyMod) m_mask |= Trackball::KEY_ALT; if(GLUT_ACTIVE_CTRL & KeyMod) m_mask |= Trackball::KEY_CTRL; if(state == GLUT_DOWN) { glut_buttons |= (1<::Open(m,argv[i]); if(ret) {printf("Error unable to open mesh %s\n",argv[i]);exit(-1);} tri::UpdateNormals::PerVertexNormalized(m); tri::UpdateBounding::Box(m); printf("Mesh bbox (%f %f %f)-(%f %f %f)\n\n",m.bbox.min[0],m.bbox.min[1],m.bbox.min[2],m.bbox.max[0],m.bbox.max[1],m.bbox.max[2]); OutNameMsh=(string(argv[i]).substr(0,strlen(argv[i])-4)); OutNameMsh+="_vis.ply"; printf("Mesh Output filename %s\n",OutNameMsh.c_str()); printf("Mesh %iv %if bbox Diag %g\n",m.vn,m.fn,m.bbox.Diag()); glutInit(&argc, argv); glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH); glutInitWindowSize(WindowRes, WindowRes); glutInitWindowPosition (10,10); glutCreateWindow ("shadevis - Visual Computing Lab - vcg.isti.cnr.it "); glutDisplayFunc(ViewDisplay); glutReshapeFunc(ViewReshape); glutKeyboardFunc(ViewKey); glutSpecialFunc(ViewSpecialKey); glutMouseFunc(ViewMouse); glutMotionFunc(ViewMouseMotion); ViewInit(); glewInit(); glutMainLoop(); return(0); }