Changeset 798


Ignore:
Timestamp:
May 14, 2008, 6:44:55 PM (16 years ago)
Author:
garnier
Message:

r834@wl-72126: garnier | 2008-05-14 18:44:52 +0200
SPINNING ok

Location:
trunk/geant4/visualization/OpenGL
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/geant4/visualization/OpenGL/include/G4OpenGLQtViewer.hh

    r797 r798  
    105105#endif
    106106  void G4keyPressEvent (QKeyEvent * event);
    107   void rotateScene(int, int);
    108   void moveScene(int, int, int,bool);
     107  void rotateQtScene(float, float);
     108  void rotateQtCamera(float, float);
     109  void moveScene(float, float, float,bool);
    109110
    110111
     
    146147
    147148  mouseActions fMouseAction; // 1: rotate 2:move 3:pick 4:shortcuts
    148   QPoint fLastPos;
    149   /** delta X of move event */
    150   G4double fDeltaPosX;
    151   /** delta Y of move event */
    152   G4double fDeltaPosY;
     149  QPoint fLastPos1;
     150  QPoint fLastPos2;
     151  QPoint fLastPos3;
    153152  /** delta of scene rotation. This delta is put in degree */
    154153  G4double fDeltaRotation;
     
    187186  QTime *fLastEventTime;
    188187  int fSpinningDelay;
     188  int fLaunchSpinDelay;
    189189
    190190private slots :
  • trunk/geant4/visualization/OpenGL/include/G4OpenGLViewer.hh

    r754 r798  
    6767  virtual void CreateFontLists () {}
    6868  virtual void print();
     69  void rotateScene (G4double dx, G4double dy,G4double delta);
    6970//////////////////////////////Vectored PostScript production functions///
    7071  void printBuffer(GLint, GLfloat*);
  • trunk/geant4/visualization/OpenGL/src/G4OpenGLQtViewer.cc

    r797 r798  
    295295  ,fDeltaSceneTranslation(0.01)
    296296  ,fDeltaDepth(0.01)
    297   ,fDeltaZoom(0.1)
     297  ,fDeltaZoom(0.05)
    298298  ,fDeltaMove(0.05)
    299299  ,fHoldKeyEvent(false)
     
    309309  ,fRecordingStep(WAIT)
    310310  ,fProcess(NULL)
     311  ,fLaunchSpinDelay(100)
    311312{
    312313
     
    314315  G4Qt* interactorManager = G4Qt::getInstance ();
    315316
     317  fLastPos3 = QPoint(-1,-1);   
     318  fLastPos2 = QPoint(-1,-1);   
     319  fLastPos1 = QPoint(-1,-1);   
     320 
    316321  initMovieParameters();
    317322
     
    15151520{
    15161521  fAutoMove = false; // stop automove
    1517   fLastPos = p;
     1522  fLastPos1 = p;
     1523  fLastPos2 = fLastPos1;
     1524  fLastPos3 = fLastPos2;
    15181525  fLastEventTime->start();
    15191526  if (fMouseAction == STYLE2){  // pick
     
    15261533void G4OpenGLQtViewer::G4MouseReleaseEvent()
    15271534{
     1535#ifdef GEANT4_QT_DEBUG
     1536  printf("G4OpenGLQtViewer::mouseRealease() %d,%d  %d,%d  %d,%d\n",fLastPos1.x(),fLastPos1.y(),fLastPos2.x(),fLastPos2.y(),fLastPos3.x(),fLastPos3.y());
     1537#endif
    15281538  fSpinningDelay = fLastEventTime->elapsed();
     1539  QPoint delta = (fLastPos3-fLastPos1);
     1540  if ((delta.x() == 0) && (delta.y() == 0)) {
    15291541#ifdef GEANT4_QT_DEBUG
    1530   printf("G4OpenGLQtViewer::G4MouseReleaseEvent delay %d\n",fSpinningDelay);
    1531 #endif
    1532   if ((fDeltaPosX == 0) && (fDeltaPosY == 0)) {
     1542  printf("G4OpenGLQtViewer::mouseRealease() EXIT 1 \n");
     1543#endif
    15331544    return;
    15341545  }
    1535   if (fSpinningDelay < 100 ) {
     1546  if (fSpinningDelay < fLaunchSpinDelay ) {
    15361547    fAutoMove = true;
    1537 
    15381548    QTime lastMoveTime;
    15391549    lastMoveTime.start();
     
    15411551    int cycles = 4;
    15421552    while (fAutoMove) {
    1543       if ( lastMoveTime.elapsed() > (100 / (cycles/2))) {
     1553      if ( lastMoveTime.elapsed() > (fLaunchSpinDelay / (cycles/2))) {
    15441554        if (fMouseAction == STYLE1) {  // rotate
    1545           rotateScene(fDeltaPosX,fDeltaPosY);
     1555          rotateQtScene(((float)delta.x())/cycles,((float)delta.y())/cycles);
    15461556        } else if (fMouseAction == STYLE2) {  // move
    1547           moveScene(-fDeltaPosX,-fDeltaPosY,0,true);
     1557          moveScene(-((float)delta.x())/cycles,-((float)delta.y())/cycles,0,true);
    15481558        }
    15491559        lastMoveTime.start();
     
    15531563      cycles ++ ;
    15541564    }
    1555     fDeltaPosX = 0;
    1556     fDeltaPosY = 0;
    1557    
    15581565  }
    15591566}
     
    15781585  }
    15791586
    1580   fDeltaPosX = fLastPos.x() - pos_x;
    1581   fDeltaPosY = fLastPos.y() - pos_y;
     1587  fLastPos3 = fLastPos2;
     1588  fLastPos2 = fLastPos1;
     1589  fLastPos1 = QPoint(pos_x, pos_y);
    15821590 
    15831591  if (fMouseAction == STYLE1) {  // rotate
    15841592    if (mButtons & Qt::LeftButton) {
    1585       rotateScene(fDeltaPosX,fDeltaPosY);
     1593      rotateQtScene(fLastPos2.x()-fLastPos1.x(),fLastPos2.y()-fLastPos1.y());
    15861594    }
    15871595  } else if (fMouseAction == STYLE2) {  // move
    15881596    if (mButtons & Qt::LeftButton) {
    1589       moveScene(-fDeltaPosX,-fDeltaPosY,0,true);
     1597      moveScene(fLastPos1.x()-fLastPos2.x(),fLastPos1.y()-fLastPos2.y(),0,true);
    15901598    }
    15911599  }
    1592   fLastPos = QPoint(pos_x, pos_y);
     1600
    15931601  fLastEventTime->start();
    15941602}
     
    15991607   @param dx delta mouse x position
    16001608   @param dy delta mouse y position
    1601    @param mouseMove : true if even comes froma mouse move, false if even comes from key action
    1602 */
    1603 
    1604 void G4OpenGLQtViewer::moveScene(int dx,int dy, int dz,bool mouseMove)
     1609   @param mouseMove : true if even comes from a mouse move, false if even comes from key action
     1610*/
     1611
     1612void G4OpenGLQtViewer::moveScene(float dx,float dy, float dz,bool mouseMove)
    16051613{
    16061614  if (fHoldMoveEvent)
     
    16341642*/
    16351643
    1636 void G4OpenGLQtViewer::rotateScene(int dx, int dy)
     1644void G4OpenGLQtViewer::rotateQtScene(float dx, float dy)
    16371645{
    1638 #ifdef GEANT4_QT_DEBUG
    1639   printf("G4OpenGLQtViewer::rotateScene %d %d\n",dx,dy);
    1640 #endif
    1641 
    16421646  if (fHoldRotateEvent)
    16431647    return;
    16441648  fHoldRotateEvent = true;
    16451649
    1646   G4Vector3D vp;
    1647   G4Vector3D up;
    1648  
    1649   G4Vector3D xprime;
    1650   G4Vector3D yprime;
    1651   G4Vector3D zprime;
    1652  
    1653   G4double delta_alpha;
    1654   G4double delta_theta;
    1655  
    1656   G4Vector3D new_vp;
    1657   G4Vector3D new_up;
    1658  
    1659   G4double cosalpha;
    1660   G4double sinalpha;
    1661  
    1662   G4Vector3D a1;
    1663   G4Vector3D a2;
    1664   G4Vector3D delta;
    1665   G4Vector3D viewPoint;
    1666 
    1667    
    1668   //phi spin stuff here
    1669  
    1670   vp = fVP.GetViewpointDirection ().unit ();
    1671   up = fVP.GetUpVector ().unit ();
    1672  
    1673   yprime = (up.cross(vp)).unit();
    1674   zprime = (vp.cross(yprime)).unit();
    1675  
    1676   if (fVP.GetLightsMoveWithCamera()) {
    1677     delta_alpha = dy * fDeltaRotation;
    1678     delta_theta = -dx * fDeltaRotation;
    1679   } else {
    1680     delta_alpha = -dy * fDeltaRotation;
    1681     delta_theta = dx * fDeltaRotation;
    1682   }   
    1683  
    1684   delta_alpha *= deg;
    1685   delta_theta *= deg;
    1686  
    1687   new_vp = std::cos(delta_alpha) * vp + std::sin(delta_alpha) * zprime;
    1688  
    1689   // to avoid z rotation flipping
    1690   // to allow more than 360° rotation
    1691   if (fVP.GetLightsMoveWithCamera()) {
    1692     new_up = (new_vp.cross(yprime)).unit();
    1693     if (new_vp.z()*vp.z() <0) {
    1694       new_up.set(new_up.x(),-new_up.y(),new_up.z());
    1695     }
    1696   } else {
    1697     new_up = up;
    1698     if (new_vp.z()*vp.z() <0) {
    1699       new_up.set(new_up.x(),-new_up.y(),new_up.z());
    1700     }
    1701   }
    1702   fVP.SetUpVector(new_up);
    1703   ////////////////
    1704   // Rotates by fixed azimuthal angle delta_theta.
    1705  
    1706   cosalpha = new_up.dot (new_vp.unit());
    1707   sinalpha = std::sqrt (1. - std::pow (cosalpha, 2));
    1708   yprime = (new_up.cross (new_vp.unit())).unit ();
    1709   xprime = yprime.cross (new_up);
    1710   // Projection of vp on plane perpendicular to up...
    1711   a1 = sinalpha * xprime;
    1712   // Required new projection...
    1713   a2 = sinalpha * (std::cos (delta_theta) * xprime + std::sin (delta_theta) * yprime);
    1714   // Required Increment vector...
    1715   delta = a2 - a1;
    1716   // So new viewpoint is...
    1717   viewPoint = new_vp.unit() + delta;
    1718  
    17191650#ifdef GEANT4_QT_DEBUG
    1720   //      printf("vp Vector : %f %f %f delta_alpha:%f delta_theta:%f cosalpha:%f sinalpha:%f\n",viewPoint.x(),viewPoint.y(),viewPoint.z(),delta_alpha,delta_theta,cosalpha,sinalpha);
    1721   //      printf("up : %f %f %f\n",up.x(),up.y(),up.z());
    1722   //      printf("new up : %f %f %f\n",new_up.x(),new_up.y(),new_up.z());
    1723   //      printf("vp : %f %f %f\n",vp.x(),vp.y(),vp.z());
    1724   //      printf("new_vp : %f %f %f\n",new_vp.x(),new_vp.y(),new_vp.z());
    1725 #endif
    1726   fVP.SetViewAndLights (viewPoint);
     1651  printf("G4OpenGLQtViewer::rotateQtScene %f %f\n",dx,dy);
     1652#endif
     1653  rotateScene(dx,dy,fDeltaRotation);
    17271654  updateQWidget();
    17281655 
    17291656  fHoldRotateEvent = false;
    1730 #ifdef GEANT4_QT_DEBUG
    1731   printf("G4OpenGLQtViewer::Rotate END\n");
    1732 #endif
     1657}
     1658
     1659/**
     1660   @param dx delta mouse x position
     1661   @param dy delta mouse y position
     1662*/
     1663
     1664void G4OpenGLQtViewer::rotateQtCamera(float dx, float dy)
     1665{
     1666  if (fHoldRotateEvent)
     1667    return;
     1668  fHoldRotateEvent = true;
     1669
     1670  rotateScene(dx,dy,fDeltaRotation);
     1671  updateQWidget();
     1672 
     1673  fHoldRotateEvent = false;
    17331674}
    17341675
     
    20511992  if ((event->key() == Qt::Key_Down) && (event->modifiers() & Qt::ShiftModifier)) { // rotate phi
    20521993#endif
    2053     rotateScene(0,-1);
     1994    rotateQtCamera(0,-1);
    20541995  }
    20551996#if QT_VERSION < 0x040000
     
    20581999  else if ((event->key() == Qt::Key_Up) && (event->modifiers() & Qt::ShiftModifier)) { // rotate phi
    20592000#endif
    2060     rotateScene(0,1);
     2001    rotateQtCamera(0,1);
    20612002  }
    20622003#if QT_VERSION < 0x040000
     
    20652006  if ((event->key() == Qt::Key_Left) && (event->modifiers() & Qt::ShiftModifier)) { // rotate theta
    20662007#endif
    2067     rotateScene(1,0);
     2008    rotateQtCamera(1,0);
    20682009  }
    20692010#if QT_VERSION < 0x040000
     
    20722013  else if ((event->key() == Qt::Key_Right) && (event->modifiers() & Qt::ShiftModifier)) { // rotate theta
    20732014#endif
    2074     rotateScene(-1,0);
     2015    rotateQtCamera(-1,0);
    20752016  }
    20762017
  • trunk/geant4/visualization/OpenGL/src/G4OpenGLViewer.cc

    r789 r798  
    877877}
    878878
     879void G4OpenGLViewer::rotateScene(G4double dx, G4double dy,G4double deltaRotation)
     880{
     881
     882  G4Vector3D vp;
     883  G4Vector3D up;
     884 
     885  G4Vector3D xprime;
     886  G4Vector3D yprime;
     887  G4Vector3D zprime;
     888 
     889  G4double delta_alpha;
     890  G4double delta_theta;
     891 
     892  G4Vector3D new_vp;
     893  G4Vector3D new_up;
     894 
     895  G4double cosalpha;
     896  G4double sinalpha;
     897 
     898  G4Vector3D a1;
     899  G4Vector3D a2;
     900  G4Vector3D delta;
     901  G4Vector3D viewPoint;
     902
     903   
     904  //phi spin stuff here
     905 
     906  vp = fVP.GetViewpointDirection ().unit ();
     907  up = fVP.GetUpVector ().unit ();
     908 
     909  yprime = (up.cross(vp)).unit();
     910  zprime = (vp.cross(yprime)).unit();
     911 
     912  if (fVP.GetLightsMoveWithCamera()) {
     913    delta_alpha = dy * deltaRotation;
     914    delta_theta = -dx * deltaRotation;
     915  } else {
     916    delta_alpha = -dy * deltaRotation;
     917    delta_theta = dx * deltaRotation;
     918  }   
     919 
     920  delta_alpha *= deg;
     921  delta_theta *= deg;
     922 
     923  new_vp = std::cos(delta_alpha) * vp + std::sin(delta_alpha) * zprime;
     924 
     925  // to avoid z rotation flipping
     926  // to allow more than 360° rotation
     927  if (fVP.GetLightsMoveWithCamera()) {
     928    new_up = (new_vp.cross(yprime)).unit();
     929    if (new_vp.z()*vp.z() <0) {
     930      new_up.set(new_up.x(),-new_up.y(),new_up.z());
     931    }
     932  } else {
     933    new_up = up;
     934    if (new_vp.z()*vp.z() <0) {
     935      new_up.set(new_up.x(),-new_up.y(),new_up.z());
     936    }
     937  }
     938  fVP.SetUpVector(new_up);
     939  ////////////////
     940  // Rotates by fixed azimuthal angle delta_theta.
     941 
     942  cosalpha = new_up.dot (new_vp.unit());
     943  sinalpha = std::sqrt (1. - std::pow (cosalpha, 2));
     944  yprime = (new_up.cross (new_vp.unit())).unit ();
     945  xprime = yprime.cross (new_up);
     946  // Projection of vp on plane perpendicular to up...
     947  a1 = sinalpha * xprime;
     948  // Required new projection...
     949  a2 = sinalpha * (std::cos (delta_theta) * xprime + std::sin (delta_theta) * yprime);
     950  // Required Increment vector...
     951  delta = a2 - a1;
     952  // So new viewpoint is...
     953  viewPoint = new_vp.unit() + delta;
     954 
     955  fVP.SetViewAndLights (viewPoint);
     956}
     957
    879958#endif
  • trunk/geant4/visualization/OpenGL/src/G4OpenGLXmRotationCallbacks.cc

    r631 r798  
    6464  //theta spin stuff here
    6565  G4OpenGLXmViewer* pView = (G4OpenGLXmViewer*) clientData;
     66
     67  pView->rotateScene((G4double)pView->rot_sens,0,1);
     68
     69  /*
    6670  G4double delta_theta;
    6771
     
    100104
    101105  pView->fVP.SetViewAndLights (viewPoint); 
     106  */
    102107
    103108  pView->SetView ();
     
    135140  G4OpenGLXmViewer* pView = (G4OpenGLXmViewer*) clientData;
    136141
     142  pView->rotateScene(0,(G4double)pView->rot_sens,1);
     143
     144  /*
    137145  if (pView->fVP.GetLightsMoveWithCamera()) {
    138146    if (pView -> rotate_up) {
     
    167175  }
    168176
     177  */
    169178  pView->SetView ();
    170179  pView->ClearView ();
Note: See TracChangeset for help on using the changeset viewer.