glarcball.hpp
上传用户:yhdzpy8989
上传日期:2007-06-13
资源大小:13604k
文件大小:5k
源码类别:

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: glarcball.hpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/06/01 19:49:16  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.4
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef GUI_OPENGL___ARC_BALL___HPP
  10. #define GUI_OPENGL___ARC_BALL___HPP
  11. /*  $Id: glarcball.hpp,v 1000.2 2004/06/01 19:49:16 gouriano Exp $
  12.  * ===========================================================================
  13.  *
  14.  *                            PUBLIC DOMAIN NOTICE
  15.  *               National Center for Biotechnology Information
  16.  *
  17.  *  This software / database is a "United States Government Work" under the
  18.  *  terms of the United States Copyright Act.  It was written as part of
  19.  *  the author's official duties as a United States Government employee and
  20.  *  thus cannot be copyrighted.  This software / database is freely available
  21.  *  to the public for use. The National Library of Medicine and the U.S.
  22.  *  Government have not placed any restriction on its use or reproduction.
  23.  *
  24.  *  Although all reasonable efforts have been taken to ensure the accuracy
  25.  *  and reliability of the software and data, the NLM and the U.S.
  26.  *  Government do not and cannot warrant the performance or results that
  27.  *  may be obtained by using this software or data. The NLM and the U.S.
  28.  *  Government disclaim all warranties, express or implied, including
  29.  *  warranties of performance, merchantability or fitness for any particular
  30.  *  purpose.
  31.  *
  32.  *  Please cite the author in any work or product based on this material.
  33.  *
  34.  * ===========================================================================
  35.  *
  36.  * Authors:  Mike DiCuccio
  37.  *
  38.  * File Description:
  39.  *
  40.  */
  41. #include <corelib/ncbistd.hpp>
  42. #include <gui/gui.hpp>
  43. #include <gui/math/quat.hpp>
  44. #include <gui/math/vect3.hpp>
  45. #include <gui/math/matrix4.hpp>
  46. /** @addtogroup GUI_OPENGL
  47.  *
  48.  * @{
  49.  */
  50. BEGIN_NCBI_SCOPE
  51. //
  52. // class CGlArcBall implements an arbitrary rotation arc ball.
  53. //
  54. // This class interprets mouse drags as drags of a virtual globe centered at a
  55. // position of the user's choice.  The requirements to using this are:
  56. //   -- call BeginDrag() when the mouse drag starts
  57. //   -- call EndDrag() when the mouse drag ends
  58. //   -- call Update() on mouse movement in a drag as well as before calling
  59. //      both BeginDrag() and EndDrag()
  60. //   -- set the resolution of the window on resize
  61. //
  62. class NCBI_GUIOPENGL_EXPORT CGlArcBall
  63. {
  64. public:
  65.     typedef CVect3<float> TVect;
  66.     typedef CQuat<float>  TQuat;
  67.     // ctor
  68.     CGlArcBall(void);
  69.     // construct at a center and radius
  70.     CGlArcBall(const TVect& center, float radius);
  71.     // dtor
  72.     ~CGlArcBall(void);
  73.     // set the screen resolution
  74.     void        Resolution(int x, int y);
  75.     // place the world at a center and radius
  76.     void        Place(const TVect& center, float radius);
  77.     // place a world at a center, keeping the current radius
  78.     void        Place(const TVect& center);
  79.     // update the arc ball for a given mouse position
  80.     void        Update(int x, int y);
  81.     // begin a drag event
  82.     void        BeginDrag(void);
  83.     // end a drag event
  84.     void        EndDrag(void);
  85.     // determine if the arc ball is in a drag state
  86.     bool        IsDragging(void) const;
  87.     // apply the arcball using OpenGL
  88.     void        ApplyGL() const;
  89.     // access the current matrix
  90.     const CMatrix4<float>&   GetMatrix() const      { return m_MatNow; }
  91. private:
  92.     // boolean flag: are we dragging?
  93.     bool         m_IsDragging;
  94.     // screen resolution
  95.     int          m_ScreenX;
  96.     int          m_ScreenY;
  97.     // current mouse position(in scaled coordinates)
  98.     float        m_MouseX;
  99.     float        m_MouseY;
  100.     // mouse position at the start of the drag cycle
  101.     CVect4 < float> m_DragFrom;
  102.     // center of the arcball world
  103.     CVect4 < float> m_Center;
  104.     // radius of the arcball world
  105.     float        m_Radius;
  106.     // quaternions for rotation
  107.     TQuat m_QuatNow;
  108.     TQuat m_QuatDown;
  109.     TQuat m_QuatDrag;
  110.     // current rotation matrix
  111.     CMatrix4<float> m_MatNow;
  112.     // hidden and unimplemented
  113.     CGlArcBall(const CGlArcBall&);
  114.     CGlArcBall&    operator= (const CGlArcBall&);
  115.     // convert screen coordinates to sphere coordinates
  116.     CVect4<float>    x_ToSphere(float x, float y);
  117. };
  118. // 
  119. // set the screen resolution
  120. inline
  121. void CGlArcBall::Resolution(int x, int y)
  122. {
  123.     m_ScreenX = x;
  124.     m_ScreenY = y;
  125. }
  126. //
  127. // determine if the arc ballis being dragged
  128. //
  129. inline
  130. bool CGlArcBall::IsDragging(void) const
  131. {
  132.     return m_IsDragging;
  133. }
  134. END_NCBI_SCOPE
  135. /* @} */
  136. /*
  137.  * ===========================================================================
  138.  * $Log: glarcball.hpp,v $
  139.  * Revision 1000.2  2004/06/01 19:49:16  gouriano
  140.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.4
  141.  *
  142.  * Revision 1.4  2004/05/11 18:54:22  dicuccio
  143.  * Added doxygne modules info
  144.  *
  145.  * Revision 1.3  2004/05/03 12:43:59  dicuccio
  146.  * Added #include for gui/gui.hpp
  147.  *
  148.  * Revision 1.2  2004/03/24 20:33:43  gorelenk
  149.  * Added missed export prefixes.
  150.  *
  151.  * Revision 1.1  2003/06/09 19:31:40  dicuccio
  152.  * Initial revision
  153.  *
  154.  * ===========================================================================
  155.  */
  156. #endif  // GUI_OPENGL___ARC_BALL___HPP