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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: spline_window.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 20:52:43  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.3
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: spline_window.cpp,v 1000.1 2004/06/01 20:52:43 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
  35.  *
  36.  * File Description:
  37.  *
  38.  */
  39. #include <ncbi_pch.hpp>
  40. #include "spline_window.hpp"
  41. #include <gui/opengl/gldlist.hpp>
  42. #include <gui/opengl/glutils.hpp>
  43. #include <gui/opengl/geometry.hpp>
  44. #include <FL/glut.H>
  45. BEGIN_NCBI_SCOPE
  46. CSplineWindow::CSplineWindow(int x, int y, int w, int h, const char* label)
  47.     : CGlCanvas3d(x, y, w, h)
  48.     , m_State(eNormal)
  49.     , m_Flags(fRenderLines | fRenderControlPoints)
  50.     , m_Arcball(CVect3<float>(0.0f, 0.0f, 0.0f), 2.0f)
  51.     , m_TargetDistance(10.0f)
  52.     , m_LastMouseX(0)
  53.     , m_LastMouseY(0)
  54. {
  55.     m_Arcball.Resolution(w, h);
  56.     m_Curve.SetPoint(0, CVect3<float>(0.0f, 0.0f, 0.0f));
  57.     m_Curve.SetPoint(1, CVect3<float>(1.0f, 0.0f, 0.0f));
  58.     m_Curve.SetPoint(2, CVect3<float>(1.0f, 1.0f, 0.0f));
  59.     m_Curve.SetPoint(3, CVect3<float>(2.0f, 1.0f, 0.0f));
  60.     m_Curve.Recalc();
  61. }
  62. void CSplineWindow::draw()
  63. {
  64.     x_DrawBackground(0.2f, 0.2f, 0.4f);
  65.     x_SetupView();
  66.     // apply our arcball and view transforms
  67.     glTranslatef(0.0f, 0.0f, -m_TargetDistance);
  68.     m_Arcball.ApplyGL();
  69.     //
  70.     // draw something interesting
  71.     //
  72.     glColor3f(1.0f, 1.0f, 1.0f);
  73.     if (m_Flags & fRenderLines) {
  74.         m_Curve.Draw(CGlCurve<CCurveBezier>::eRender_Lines);
  75.     }
  76.     if (m_Flags & fRenderPoints) {
  77.         m_Curve.Draw(CGlCurve<CCurveBezier>::eRender_Points);
  78.     }
  79.     if (m_Flags & fRenderControlPoints) {
  80.         glColor3f(1.0f, 0.0f, 0.0f);
  81.         glBegin(GL_LINE_STRIP);
  82.         glVertex3fv(m_Curve.GetPoint(0).GetData());
  83.         glVertex3fv(m_Curve.GetPoint(1).GetData());
  84.         glVertex3fv(m_Curve.GetPoint(2).GetData());
  85.         glVertex3fv(m_Curve.GetPoint(3).GetData());
  86.         glEnd();
  87.         glColor3f(0.3f, 0.3f, 1.0f);
  88.         glPointSize(3.0f);
  89.         glBegin(GL_POINTS);
  90.         glVertex3fv(m_Curve.GetPoint(0).GetData());
  91.         glVertex3fv(m_Curve.GetPoint(1).GetData());
  92.         glVertex3fv(m_Curve.GetPoint(2).GetData());
  93.         glVertex3fv(m_Curve.GetPoint(3).GetData());
  94.         glEnd();
  95.     }
  96.     //
  97.     // draw an axis set
  98.     //
  99.     glBegin(GL_LINES);
  100.     glColor3f (1.0f, 0.0f, 0.0f);
  101.     glVertex3f(0.0f, 0.0f, 0.0f);
  102.     glVertex3f(1.0f, 0.0f, 0.0f);
  103.     glColor3f (0.0f, 1.0f, 0.0f);
  104.     glVertex3f(0.0f, 0.0f, 0.0f);
  105.     glVertex3f(0.0f, 1.0f, 0.0f);
  106.     glColor3f (0.0f, 0.0f, 1.0f);
  107.     glVertex3f(0.0f, 0.0f, 0.0f);
  108.     glVertex3f(0.0f, 0.0f, 1.0f);
  109.     glEnd();
  110.     CGlUtils::DumpState();
  111.     CGlUtils::CheckGlError();
  112. }
  113. void CSplineWindow::resize(int x, int y, int w, int h)
  114. {
  115.     m_Arcball.Resolution(w, h);
  116.     CGlCanvas3d::resize(x, y, w, h);
  117. }
  118. int CSplineWindow::handle(int event)
  119. {
  120.     int curr_x = Fl::event_x();
  121.     int curr_y = Fl::event_y();
  122.     int dx = curr_x - m_LastMouseX;
  123.     int dy = curr_y - m_LastMouseY;
  124.     m_LastMouseX = curr_x;
  125.     m_LastMouseY = curr_y;
  126.     switch (event) {
  127.     case FL_PUSH:
  128.         // always return 1 here - this insures that the FL_MOVE and FL_RELEASE
  129.         // events are registered
  130.         if (Fl::event_button() == 1) {
  131.             return 1;
  132.         }
  133.         break;
  134.     case FL_DRAG:
  135.         if (Fl::event_button() == 1) {
  136.             switch (m_State) {
  137.             case eNormal:
  138.                 if (Fl::event_shift()) {
  139.                     // zoom
  140.                     m_State = eZoom;
  141.                     x_Zoom(dy);
  142.                 } else if (Fl::event_ctrl()) {
  143.                     // pan
  144.                     m_State = ePan;
  145.                     x_Pan(dx, dy);
  146.                 } else {
  147.                     // rotate
  148.                     m_State = eRotate;
  149.                     x_Rotate();
  150.                 }
  151.                 break;
  152.             case eRotate:
  153.                 //
  154.                 // rotate - activated on left click-drag
  155.                 //
  156.                 if ( !Fl::event_shift()  &&  !Fl::event_ctrl()) {
  157.                     x_Rotate();
  158.                 } else {
  159.                     // end rotate
  160.                     m_Arcball.EndDrag();
  161.                     m_State = eNormal;
  162.                 }
  163.                 break;
  164.             case ePan:
  165.                 //
  166.                 // pan - activated on ctrl-left-click-drag
  167.                 //
  168.                 if (Fl::event_ctrl()) {
  169.                     x_Pan(dx, dy);
  170.                 } else {
  171.                     // end pan
  172.                     m_State = eNormal;
  173.                 }
  174.                 break;
  175.             case eZoom:
  176.                 //
  177.                 // zoom - activated on shift-left-click-drag
  178.                 //
  179.                 if (Fl::event_shift()) {
  180.                     x_Zoom(dy);
  181.                 } else {
  182.                     // end pan
  183.                     m_State = eNormal;
  184.                 }
  185.                 break;
  186.             default:
  187.                 break;
  188.             }
  189.             redraw();
  190.             return 1;
  191.         }
  192.         break;
  193.     case FL_RELEASE:
  194.         if (Fl::event_button() == 1) {
  195.             switch (m_State) {
  196.             case eRotate:
  197.                 m_Arcball.Update(Fl::event_x(), Fl::event_y());
  198.                 m_Arcball.EndDrag();
  199.                 break;
  200.             case eZoom:
  201.             case ePan:
  202.             case eNormal:
  203.                 break;
  204.             default:
  205.                 break;
  206.             }
  207.             return 1;
  208.         }
  209.         break;
  210.     }
  211.     return CGlCanvas3d::handle(event);
  212. }
  213. void CSplineWindow::TogglePoints()
  214. {
  215.     m_Flags ^= fRenderPoints;
  216. }
  217. void CSplineWindow::ToggleLines()
  218. {
  219.     m_Flags ^= fRenderLines;
  220. }
  221. void CSplineWindow::ToggleControlPoints()
  222. {
  223.     m_Flags ^= fRenderControlPoints;
  224. }
  225. void CSplineWindow::x_Rotate()
  226. {
  227.     redraw();
  228.     m_Arcball.Update(Fl::event_x(), Fl::event_y());
  229.     if ( !m_Arcball.IsDragging() ) {
  230.         m_Arcball.BeginDrag();
  231.     }
  232. }
  233. void CSplineWindow::x_Pan(int dx, int dy)
  234. {
  235. }
  236. void CSplineWindow::x_Zoom(int dy)
  237. {
  238.     m_TargetDistance += m_TargetDistance * (float(dy) / float(y()));
  239.     redraw();
  240. }
  241. END_NCBI_SCOPE
  242. /*
  243.  * ===========================================================================
  244.  * $Log: spline_window.cpp,v $
  245.  * Revision 1000.1  2004/06/01 20:52:43  gouriano
  246.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.3
  247.  *
  248.  * Revision 1.3  2004/05/21 22:27:45  gorelenk
  249.  * Added PCH ncbi_pch.hpp
  250.  *
  251.  * Revision 1.2  2004/03/11 20:58:11  ucko
  252.  * Fix calls to Draw.
  253.  *
  254.  * Revision 1.1  2004/03/11 17:39:24  dicuccio
  255.  * Added spline demo project
  256.  *
  257.  * ===========================================================================
  258.  */