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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: glmtransform.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 21:13:41  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.3
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: glmtransform.cpp,v 1000.1 2004/06/01 21:13:41 gouriano Exp $
  10.  * ===========================================================================
  11.  *
  12.  *                            PUBLIC DOMAIN NOTICE
  13.  *               National Center for Biotechnology Information
  14.  *
  15.  *  This software/database is a "United States Government Work" under the
  16.  *  terms of the United States Copyright Act.  It was written as part of
  17.  *  the author's official duties as a United States Government employee and
  18.  *  thus cannot be copyrighted.  This software/database is freely available
  19.  *  to the public for use. The National Library of Medicine and the U.S.
  20.  *  Government have not placed any restriction on its use or reproduction.
  21.  *
  22.  *  Although all reasonable efforts have been taken to ensure the accuracy
  23.  *  and reliability of the software and data, the NLM and the U.S.
  24.  *  Government do not and cannot warrant the performance or results that
  25.  *  may be obtained by using this software or data. The NLM and the U.S.
  26.  *  Government disclaim all warranties, express or implied, including
  27.  *  warranties of performance, merchantability or fitness for any particular
  28.  *  purpose.
  29.  *
  30.  *  Please cite the author in any work or product based on this material.
  31.  *
  32.  * ===========================================================================
  33.  *
  34.  * Authors:  Mike DiCuccio, Vladimir Tereshkov
  35.  *
  36.  * File Description:
  37.  *    Arbitrary OpenGL Mouse transformations class based on CGlArcBall with addition of pan and zoom      
  38.  */
  39. #include <ncbi_pch.hpp>
  40. #include "glmtransform.hpp"
  41. #include <gui/opengl.h>
  42. #include <math.h>
  43. BEGIN_NCBI_SCOPE
  44. //
  45. // default ctor
  46. CGlMTransform::CGlMTransform()
  47.     : m_IsDragging(false),
  48.       m_ScreenX(100),
  49.       m_ScreenY(100),
  50.       m_MouseX(0),
  51.       m_MouseY(0),
  52.       m_Center(0.0, 0.0, 0.0, 0.0),
  53.       m_Radius(5.0),
  54.       m_QuatNow(0.0, 0.0, 0.0, 1.0),
  55.       m_QuatDown(0.0, 0.0, 0.0, 1.0),
  56.       m_QuatDrag(0.0, 0.0, 0.0, 1.0),
  57.       m_Translate(0, 0, 0),
  58.       m_TranslateDown(0, 0, 0)
  59. {    
  60. }
  61. //
  62. // conversion ctor
  63. CGlMTransform::CGlMTransform(const TVect& center, float radius)
  64.     : m_IsDragging(false),
  65.       m_ScreenX(100),
  66.       m_ScreenY(100),
  67.       m_MouseX(0),
  68.       m_MouseY(0),
  69.       m_Center(0.0, 0.0, 0.0, 0.0),
  70.       m_Radius(1.0),
  71.       m_QuatNow(0.0, 0.0, 0.0, 1.0),
  72.       m_QuatDown(0.0, 0.0, 0.0, 1.0),
  73.       m_QuatDrag(0.0, 0.0, 0.0, 1.0),
  74.       m_Translate(0, 0, 0),
  75.       m_TranslateDown(0, 0, 0)
  76. {
  77.     m_MatNow.Identity();
  78.     Place(center, radius);
  79. }
  80. //
  81. // dtor
  82. CGlMTransform::~CGlMTransform()
  83. {
  84. }
  85. //
  86. // place the arc world with a point of rotation and a radius
  87. void CGlMTransform::Place(const TVect& center, float radius)
  88. {
  89.     m_Center = center;
  90.     m_Radius = radius;
  91. }
  92. //
  93. // place the arc world with a point of rotation, keeping the current radius
  94. void CGlMTransform::Place(const TVect& center)
  95. {
  96.     m_Center = center;
  97. }
  98. //
  99. // begin a drag
  100. void CGlMTransform::BeginDrag()
  101. {
  102.     m_IsDragging = true;
  103.     m_DragFrom = x_ToSphere(m_MouseX, m_MouseY);
  104. }
  105. //
  106. // end a drag
  107. void CGlMTransform::EndDrag()
  108. {
  109.     m_IsDragging  = false;
  110.     m_QuatDown    = m_QuatNow;
  111.     m_TranslateDown = m_Translate;
  112. }
  113. //
  114. //update the arc ball with a given position
  115. void CGlMTransform::Update(int x, int y)
  116. {
  117.     m_MouseX =  2.0 * (float(x) / float(m_ScreenX)) - 1.0;
  118.     m_MouseY = -2.0 * (float(y) / float(m_ScreenY)) + 1.0;
  119.     if (m_IsDragging)
  120.     {
  121.         CVect4<float> to = x_ToSphere(m_MouseX, m_MouseY);      
  122. switch (m_Mode){
  123. case ePan:
  124.                 m_Translate[0] = to.X() - m_DragFrom.X();
  125.                 m_Translate[1] = to.Y() - m_DragFrom.Y();
  126.                 m_Translate[2] = 0;
  127.                 m_Translate+=m_TranslateDown;
  128. break;
  129. case eZoom:
  130.                 m_Translate[0]=0;
  131.                 m_Translate[1]=0;  
  132.                 m_Translate[2] = 2 * (to.Y() - m_DragFrom.Y());
  133.                 m_Translate+=m_TranslateDown;
  134. break;
  135. case eRotate:
  136.         // set the dragging quat
  137. m_QuatDrag.X() = m_DragFrom.Y() * to.Z() - m_DragFrom.Z() * to.Y();
  138. m_QuatDrag.Y() = m_DragFrom.Z() * to.X() - m_DragFrom.X() * to.Z();
  139. m_QuatDrag.Z() = m_DragFrom.X() * to.Y() - m_DragFrom.Y() * to.X();
  140. m_QuatDrag.W() = m_DragFrom.X() * to.X() +
  141. m_DragFrom.Y() * to.Y() +
  142. m_DragFrom.Z() * to.Z();
  143.         
  144. // set the current quat
  145. m_QuatNow = m_QuatDrag * m_QuatDown;
  146. // convert to a matrix for OpenGL
  147. m_QuatNow.Conjugate().ToMatrix(m_MatNow);
  148. break;
  149. }
  150.     }
  151. }
  152. //
  153. // convert 2d screen coordinates to 3d sphere coordinates
  154. CVect4<float> CGlMTransform::x_ToSphere(float x, float y)
  155. {
  156.     CVect4<float> result;
  157.     result.X() = (x - m_Center.X())/ m_Radius;
  158.     result.Y() = (y - m_Center.Y())/ m_Radius;
  159. if (m_Mode == eRotate){
  160. float mag = result.X() * result.X() + result.Y() * result.Y();
  161. if (mag > 1.0)
  162. {
  163. float scale = 1.0 / ::sqrt(mag);
  164. result.X() *= scale;
  165. result.Y() *= scale;
  166. result.Z() = 0.0;
  167. }
  168. else
  169. {
  170. result.Z() = ::sqrt(1.0 - mag);
  171. }
  172. result.W() = 0.0;
  173. }
  174.     return result;
  175. }
  176. //
  177. // apply the matrix using OpenGL
  178. void CGlMTransform::ApplyGL(EMode mode) const
  179.   switch (mode){
  180.     case eRotate:
  181.       glMultMatrixf(m_MatNow.GetData());
  182.       break;
  183.     case eTranslate:
  184.       glTranslatef(m_Translate[0], m_Translate[1], m_Translate[2]);
  185.       break;
  186.     case eAll:
  187.       glTranslatef(m_Translate[0], m_Translate[1], m_Translate[2]);
  188.       glMultMatrixf(m_MatNow.GetData());
  189.       break;
  190.     case ePan:
  191.       glTranslatef(m_Translate[0], m_Translate[1], 0);
  192.       break;
  193.     case eZoom:
  194.       glTranslatef(0, 0, m_Translate[2]);
  195.       break;  
  196.   }  
  197. }
  198. CGlMTransform::CGlMTransform(const CGlMTransform&src)
  199. {
  200.     m_MatNow    = src.GetMatrix();
  201.     m_Translate = src.GetTranslation();    
  202. }
  203. CGlMTransform& CGlMTransform::operator= (const CGlMTransform & src)
  204. {
  205.     m_MatNow    = src.GetMatrix();
  206.     m_Translate = src.GetTranslation();
  207.     return *this;
  208. }
  209. END_NCBI_SCOPE
  210. /*
  211.  * ===========================================================================
  212.  * $Log: glmtransform.cpp,v $
  213.  * Revision 1000.1  2004/06/01 21:13:41  gouriano
  214.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.3
  215.  *
  216.  * Revision 1.3  2004/05/21 22:27:55  gorelenk
  217.  * Added PCH ncbi_pch.hpp
  218.  *
  219.  * Revision 1.2  2004/01/28 15:51:10  tereshko
  220.  * Code clean-up
  221.  *
  222.  * Revision 1.1  2004/01/05 16:20:48  tereshko
  223.  * Initial revision
  224.  *
  225.  * ===========================================================================
  226.  */