/* Response to a redraw event: renders the scene */ void display(){ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(40, width/(float)height, 0.01, 10); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glTranslate( -observerPos ); track.GetView(); track.Apply(false); glPushMatrix(); float d=mesh.bbox.Diag(); glScale(1.5f/d); Point3f p = glWrap.m->bbox.Center(); p[1] = glWrap.m->bbox.min[1]; glTranslate(-p); // the trimesh drawing calls switch(drawMode) { case 0: glWrap.Draw<vcg::GLW::DMSmooth, vcg::GLW::CMNone,vcg::GLW::TMNone> ();break; case 1: glWrap.Draw<vcg::GLW::DMWire, vcg::GLW::CMNone,vcg::GLW::TMNone> ();break; case 2: glWrap.Draw<vcg::GLW::DMFlatWire, vcg::GLW::CMNone,vcg::GLW::TMNone> ();break; case 3: glWrap.Draw<vcg::GLW::DMHidden, vcg::GLW::CMNone,vcg::GLW::TMNone> ();break; case 4: glWrap.Draw<vcg::GLW::DMFlat, vcg::GLW::CMNone,vcg::GLW::TMNone> ();break; default: break; } glPopMatrix(); RenderFloor(); track.DrawPostApply(); SDL_GL_SwapBuffers(); }
void display(){ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(40, width/(float)height, 0.1, 100); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(0,0,5, 0,0,0, 0,1,0); track.center=Point3f(0, 0, 0); track.radius= 1; track.GetView(); track.Apply(); glPushMatrix(); float d=1.0f/mesh.bbox.Diag(); glScale(d); glTranslate(-glWrap.m->bbox.Center()); // the trimesh drawing calls switch(drawMode) { case 0: glWrap.Draw<vcg::GLW::DMSmooth, vcg::GLW::CMNone,vcg::GLW::TMNone> ();break; case 1: glWrap.Draw<vcg::GLW::DMPoints, vcg::GLW::CMNone,vcg::GLW::TMNone> ();break; case 2: glWrap.Draw<vcg::GLW::DMWire, vcg::GLW::CMNone,vcg::GLW::TMNone> ();break; case 3: glWrap.Draw<vcg::GLW::DMFlatWire, vcg::GLW::CMNone,vcg::GLW::TMNone> ();break; case 4: glWrap.Draw<vcg::GLW::DMHidden, vcg::GLW::CMNone,vcg::GLW::TMNone> ();break; case 5: glWrap.Draw<vcg::GLW::DMFlat, vcg::GLW::CMNone,vcg::GLW::TMNone> ();break; default: break; } glPopMatrix(); track.DrawPostApply(); SDL_GL_SwapBuffers(); }
void GLWidget::keyReleaseEvent (QKeyEvent * e) { e->ignore (); if (e->key () == Qt::Key_Control) track.ButtonUp (QT2VCG (Qt::NoButton, Qt::ControlModifier)); if (e->key () == Qt::Key_Shift) track.ButtonUp (QT2VCG (Qt::NoButton, Qt::ShiftModifier)); if (e->key () == Qt::Key_Alt) track.ButtonUp (QT2VCG (Qt::NoButton, Qt::AltModifier)); updateGL (); }
// - retunrs true if anything changed. bool onTimer(){ int res = false; if ( track.IsAnimating() ) { track.Animate(1000/FPS); res = true; } // insert any other animation processing here return res; }
void GLWidget::keyPressEvent (QKeyEvent * e) { e->ignore (); if (e->key () == Qt::Key_Control) track.ButtonDown (QT2VCG (Qt::NoButton, Qt::ControlModifier)); if (e->key () == Qt::Key_Shift) track.ButtonDown (QT2VCG (Qt::NoButton, Qt::ShiftModifier)); if (e->key () == Qt::Key_Alt) track.ButtonDown (QT2VCG (Qt::NoButton, Qt::AltModifier)); TwKeyPressQt(e); updateGL (); }
void ProcessClick(int button, int state, int x, int y){ if(button == GLUT_LEFT_BUTTON && state == GLUT_DOWN) track.MouseDown(x,glutGet(GLUT_WINDOW_HEIGHT)-y,vcg::Trackball::BUTTON_LEFT); if(button == GLUT_LEFT_BUTTON && state == GLUT_UP) track.MouseUp(x,glutGet(GLUT_WINDOW_HEIGHT)-y,vcg::Trackball::BUTTON_LEFT); if (button == 3 && state == GLUT_DOWN) //wheel up track.MouseWheel(0.8); else if (button == 4 && state == GLUT_DOWN) //wheel down track.MouseWheel(-0.8); }
int main(int argc, char *argv[]) { // Generic loading of the mesh from disk if(vcg::tri::io::Importer<CMesh>::Open(mesh,argv[1])!=0) { fprintf(stderr,"Error reading file %s\n",argv[1]); exit(0); } // Initialize the mesh itself vcg::tri::UpdateBounding<CMesh>::Box(mesh); // update bounding box //vcg::tri::UpdateNormals<CMesh>::PerVertexNormalizePerFaceNormalized(mesh); // update Normals vcg::tri::UpdateNormals<CMesh>::PerVertexPerFace(mesh); // update Normals // Initialize the wrapper glWrap.m = &mesh; glWrap.Update(); SetTrackball(trackballMode); // we will do exaclty an animation step every 1000/FPS msecs. track.SetFixedTimesteps(true); initSDL("SDL_minimal_viewer"); initGL(); sdlLoop(); exit(0); }
void GLWidget::mouseMoveEvent (QMouseEvent * e) { if (e->buttons ()) { track.MouseMove (e->x (), height () - e->y ()); updateGL (); } TwMouseMotion(e->x (), e->y ()); }
/* Sets the trackball in a new mode: standard mode (rotate object in front of camera) or Navigation mode (navigate around/inside object) */ void SetTrackball(int mode){ // we define all possible trackModes that we could be using (static) static vcg::PolarMode polarMode; static vcg::SphereMode sphereMode; static vcg::NavigatorWasdMode navigatorMode; static vcg::InactiveMode inactiveMode; static vcg::ScaleMode scaleMode; static vcg::PanMode panMode; static vcg::ZMode zMode; // customize navigation mode... navigatorMode.SetTopSpeedsAndAcc(1.2f,0.6f,6); // this adds a neat human stepping effect navigatorMode.SetStepOnWalk(0.5f,0.015f); track.modes.clear(); track.Reset(); switch (mode) { case 1: // switch to navigator mode track.modes[vcg::Trackball::BUTTON_NONE] = NULL; track.modes[vcg::Trackball::WHEEL] = track.modes[vcg::Trackball::BUTTON_LEFT] = track.idle_and_keys_mode = &navigatorMode; track.inactive_mode = NULL; // nothing to draw when inactive track.SetPosition( observerPos ); break; default: // sweitch to default trackmode -- this is equivalent to a call to track->SetDefault() track.modes[vcg::Trackball::BUTTON_NONE] = NULL; track.modes[vcg::Trackball::BUTTON_LEFT] = &sphereMode; track.modes[vcg::Trackball::BUTTON_LEFT | vcg::Trackball::KEY_CTRL] = track.modes[vcg::Trackball::BUTTON_MIDDLE] = &panMode; track.modes[vcg::Trackball::WHEEL] = track.modes[vcg::Trackball::BUTTON_LEFT | vcg::Trackball::KEY_SHIFT] = &scaleMode; track.modes[vcg::Trackball::BUTTON_LEFT | vcg::Trackball::KEY_ALT] = &zMode; track.modes[vcg::Trackball::BUTTON_MIDDLE | vcg::Trackball::KEY_ALT] = track.idle_and_keys_mode = &sphereMode; track.inactive_mode = &inactiveMode; // draw a sphere when inactive track.SetPosition( objectPos ); } }
/* The main event Loop */ int sdlLoop() { bool quit=false; bool redraw_needed = false; // true whan a scene needs a redraw SDL_Event event; while( !quit ) { SDL_WaitEvent(&event); switch( event.type ) { case SDL_QUIT: quit = true; break; case SDL_VIDEORESIZE : myReshapeFunc(event.resize.w,event.resize.h); break; case SDL_KEYDOWN: switch (event.key.keysym.sym) { case SDLK_ESCAPE: exit(0); break; case SDLK_F1: drawMode= (drawMode+1)%5; printf("Current Mode %i\n",drawMode); break; case SDLK_HOME: track.Reset(); break; case SDLK_SPACE: trackballMode= (trackballMode+1)%2; printf("Trackball Mode %i\n",drawMode); SetTrackball(trackballMode); break; default: track.ButtonDown( SDL2VCG( event.key.keysym.sym) ); } redraw_needed = true; break; case SDL_KEYUP: track.ButtonUp( SDL2VCG( event.key.keysym.sym) ); break; case SDL_MOUSEBUTTONDOWN: switch(event.button.button) { case SDL_BUTTON_WHEELUP: track.MouseWheel( 1); redraw_needed = true; break; case SDL_BUTTON_WHEELDOWN: track.MouseWheel(-1); redraw_needed = true; break; default: track.MouseDown(event.button.x, (height - event.button.y), SDL2VCG(event.button.button) ); break; } break; case SDL_MOUSEBUTTONUP: track.MouseUp(event.button.x, (height - event.button.y), SDL2VCG(event.button.button) ); break; break; case SDL_MOUSEMOTION: while(SDL_PeepEvents(&event, 1, SDL_GETEVENT, SDL_MOUSEMOTIONMASK)); track.MouseMove(event.button.x, (height - event.button.y)); redraw_needed = true; break; case SDL_TIMER: if (onTimer()) redraw_needed = true; if (redraw_needed) sendRedraw(); // justs sends a redraw event! redraw_needed = false; break; case SDL_VIDEOEXPOSE: // any rendering is done ONLY here. display(); drainRedrawEvents(); break; default: break; } } SDL_Quit(); return -1; }
void GLWidget::mousePressEvent (QMouseEvent * e) { if(!TwMousePressQt(e)) { e->accept (); setFocus (); track.MouseDown (e->x (), height () - e->y (), QT2VCG (e->button (), e->modifiers ())); } updateGL (); }
Point3f getDirFromTrackball(vcg::Trackball &tb){ glPushMatrix(); gluLookAt(1,-3,-5, 0,0,0, 0,1,0); tb.center=Point3f(0, 0, 0); tb.radius= 1; tb.GetView(); tb.Apply(false); float pos[4]={0.0f,0.0f,-1.0f,0.0f}; float d[16]; glGetFloatv(GL_MODELVIEW_MATRIX,d); glPopMatrix(); Point3f res(-d[8],-d[9],-d[10]); res.Normalize(); return res; }
void drawLightDir() { glPushMatrix(); lightTrack.GetView(); lightTrack.Apply(false); #if 0 glPushAttrib(GL_ENABLE_BIT | GL_CURRENT_BIT); glColor3f(1,1,0); glDisable(GL_LIGHTING); const int lineNum=3; glBegin(GL_LINES); for(unsigned int i=0;i<=lineNum;++i) for(unsigned int j=0;j<=lineNum;++j) { glVertex3f(-1.0f+i*2.0/lineNum,-1.0f+j*2.0/lineNum,-2); glVertex3f(-1.0f+i*2.0/lineNum,-1.0f+j*2.0/lineNum, 2); } glEnd(); glPopAttrib(); #endif glPopMatrix(); }
void GLWidget::paintGL () { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(40, GLWidget::width()/(float)GLWidget::height(), 0.1, 100); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(0,0,3.5f, 0,0,0, 0,1,0); track.center=vcg::Point3f(0, 0, 0); track.radius= 1; track.GetView(); glPushMatrix(); track.Apply(false); glPushMatrix(); if(mesh.vert.size()>0) { vcg::glScale(2.0f/mesh.bbox.Diag()); glTranslate(-mesh.bbox.Center()); glWrap.Draw(GLW::DrawMode(drawmode),GLW::CMNone,GLW::TMNone); } glPopMatrix(); track.DrawPostApply(); glPopMatrix(); if(hasToPick) { hasToPick=false; Point3f pp; if(Pick<Point3f>(pointToPick[0],pointToPick[1],pp)) { track.Translate(-pp); track.Scale(1.25f); QCursor::setPos(mapToGlobal(QPoint(width()/2+2,height()/2+2))); } } TwDraw(); }
// The Event Loop Processor int sdl_idle() { bool quit=false; SDL_Event event; while( !quit ) { SDL_WaitEvent(&event); switch( event.type ) { case SDL_QUIT: quit = true; break; case SDL_VIDEORESIZE : myReshapeFunc(event.resize.w,event.resize.h); break; case SDL_KEYDOWN: switch(event.key.keysym.sym) { case SDLK_RCTRL: case SDLK_LCTRL: track.ButtonDown(vcg::Trackball::KEY_CTRL); break; case SDLK_q: exit(0); break; case SDLK_SPACE: drawMode=((drawMode+1)%6); printf("Current Mode %i\n",drawMode); break; } break; case SDL_KEYUP: switch(event.key.keysym.sym) { case SDLK_RCTRL: case SDLK_LCTRL: track.ButtonUp(vcg::Trackball::KEY_CTRL); break; } break; case SDL_MOUSEBUTTONDOWN: switch(event.button.button) { case SDL_BUTTON_WHEELUP: track.MouseWheel( 1); break; case SDL_BUTTON_WHEELDOWN: track.MouseWheel(-1); break; case SDL_BUTTON_LEFT: track.MouseDown(event.button.x, (height - event.button.y), vcg::Trackball::BUTTON_LEFT); break; case SDL_BUTTON_RIGHT: track.MouseDown(event.button.x, (height - event.button.y), vcg::Trackball::BUTTON_RIGHT);break; } break; case SDL_MOUSEBUTTONUP: switch(event.button.button) { case SDL_BUTTON_LEFT: track.MouseUp(event.button.x, (height - event.button.y), vcg::Trackball::BUTTON_LEFT); break; case SDL_BUTTON_RIGHT: track.MouseUp(event.button.x, (height - event.button.y), vcg::Trackball::BUTTON_RIGHT);break; } break; case SDL_MOUSEMOTION: while(SDL_PeepEvents(&event, 1, SDL_GETEVENT, SDL_MOUSEMOTIONMASK)); track.MouseMove(event.button.x, (height - event.button.y)); break; case SDL_VIDEOEXPOSE: default: break; } display(); } SDL_Quit(); return -1; }
void ProcessActiveMouseMotion(int x, int y){ track.MouseMove(x,glutGet(GLUT_WINDOW_HEIGHT)-y); }
void drawFrame() { cgSettings.MakeShaders(); if (mol.DoingAO()) { // do at least one more step per rendering mol.PrepareAOstep(1); // continue until decent while (!mol.DecentAO()) mol.PrepareAOstep(1); } /*if (cgSettings.UseHalo()>0) { // write depth in HaloTexture glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, haloFrame); } else { // write depth in depthbuffer glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); }*/ mainCanvas.SetAsOutput(); if (cgSettings.doingAlphaSnapshot) glClearColor( cgSettings.P_halo_col, cgSettings.P_halo_col, cgSettings.P_halo_col, 0.0f); else glClearColor( cgSettings.P_bg_color_R, cgSettings.P_bg_color_G, cgSettings.P_bg_color_B, 0.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); Point3f lightDir; if ( cgSettings.P_sem_effect // fixed light dir sem effect // || mol.sticks // quick Hack: fixed light dir when bonds ) lightDir= Point3f(0,0,1); else lightDir=getDirFromTrackball(lightTrack); setLightDir( lightDir ); // gluLookAt(0,0,-3, 0,0,0, 0,1,0); original // gluLookAt(0,0,-3, 0,0,0, 0,1,0); ok for tra if (mol.hasDefaultView()) gluLookAt(0,0, 40, 0,0,0, 0,1,0); else gluLookAt(0,0,-40, 0,0,0, 0,1,0); if(MovingLightMode) drawLightDir(); glColor3f(1,1,1); if (mol.hasDefaultView()) { float angle, axisX, axisY, axisZ; mol.getDefaultViewRotation(&angle, &axisX, &axisY, &axisZ); glRotatef(angle, axisX, axisY, axisZ); } if (1) { //track.center=Point3f(0, 0, 0); //track.radius= 1; //setProjection(); if (aniStep>=0) // BH: Doesn't normally seem to be aniStep>=0 { double extraRot=360.0*aniStep; // set extra rotation for GIF animation: switch (hardSettings.GIF_ANIMATION_MODE) { default: case 0: glRotated(-hardSettings.GIF_ROT_SIDEVIEW_ANGLE,1,0,0); glRotated(extraRot,0,1,0); break; case 1: glRotated(-extraRot,0,0,1); glRotated(hardSettings.GIF_INSP_ANGLE,0,1,0); glRotated(extraRot,0,0,1); break; case 2:{ double substep[6]; for (int i=0; i<6; i++) { substep[i]=(aniStep*6-i)*90.0; if (substep[i]<0) substep[i]=0; if (substep[i]>90.0) substep[i]=90.0; } glRotated(-substep[5], 1,0,0); glRotated(-substep[4], 0,1,0); glRotated(-substep[3], 0,1,0); glRotated(-substep[2], 1,0,0); glRotated(-substep[1], 0,1,0); glRotated(-substep[0], 0,1,0); }break; } } setProjection( mainCanvas.GetVideoSize() ); track.GetView(); track.Apply(false); // Set to true to see the trackball itself. setProjection( mainCanvas.GetSoftRes() ); if (cgSettings.P_use_shadowmap()) { shadowmap.computeAsTexture( getGlLightPos() , cgSettings.do_use_doubleshadow(), shadowmapCanvas); //shadowmap.computeAsTexture( Point3f(0,1,0) ); } cgSettings.BindShaders(); glEnable(GL_TEXTURE_2D); //glBindTexture(GL_TEXTURE_2D, molTexture); glActiveTextureARB(GL_TEXTURE1_ARB); shadowmapCanvas.SetAsTexture(); mol.Draw(); // shadowmap.m.DrawShadowmap(false); glDisable(GL_VERTEX_PROGRAM_ARB); glDisable(GL_FRAGMENT_PROGRAM_ARB); glDisable(GL_BLEND); if (cgSettings.UseHalo()>0) mol.DrawHalos(); } }
// Draw prime numbers pattern : void DisplayFunc() { float zoom; float X, Y; unsigned int primeNumberCounter; PreDisplay(); zoom = 1.0f / (greatestPrimeNumber+1.0f); primeNumberCounter = 0; glPointSize(3.f); int nbParticlesLeft = 0; std::vector<float> currentColor; int currentIndex = 0; std::map<int, std::vector<float> >::iterator it; if(previousNbPositions > 0){ it = tableColorProducer.find(currentMessageTrace.at(currentIndex)); nbParticlesLeft = currentMessageTrace.at(currentIndex+1); } glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(60.0,(GLfloat)glutGet(GLUT_WINDOW_WIDTH) / (GLfloat)glutGet(GLUT_WINDOW_HEIGHT), 1.0, 2000.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(0,0,5, 0,0,0, 0,1,0); track.center=vcg::Point3f(0, 0, 0); track.radius= 1; track.GetView(); track.Apply(false); glPushMatrix(); float d=2.0f/(sqrt(dx*dx + dy*dy + dz*dz)); glScalef(d,d,d); glTranslatef(-cx,-cy,-cz); glBegin(GL_POINTS); for(unsigned int i = 0; i < previousNbPositions; i++){ if(it != tableColorProducer.end()) glColor3f(it->second.at(0),it->second.at(1),it->second.at(2)); else glColor3f(1.f,1.f,1.f); glVertex3d(positions[i * 3],positions[i * 3 + 1],positions[ i * 3 + 2]); glColor3f(1.f,1.f,1.f); nbParticlesLeft--; if(nbParticlesLeft <= 0 && currentIndex <( (int)(currentMessageTrace.size()) - 2)){ currentIndex+=2; it = tableColorProducer.find(currentMessageTrace.at(currentIndex)); nbParticlesLeft = currentMessageTrace.at(currentIndex+1); } } glEnd(); DrawSimulationArea(); glPopMatrix(); track.DrawPostApply(); PostDisplay(); }
void GLWidget::wheelEvent (QWheelEvent * e) { const int WHEEL_STEP = 120; track.MouseWheel (e->delta () / float (WHEEL_STEP), QTWheel2VCG (e->modifiers ())); updateGL (); }
void GLWidget::mouseReleaseEvent (QMouseEvent * e) { track.MouseUp (e->x (), height () - e->y (), QT2VCG (e->button (), e->modifiers ())); TwMouseReleaseQt(e); updateGL (); }