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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: gl3d_window.cpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/06/01 20:52:29  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.7
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: gl3d_window.cpp,v 1000.2 2004/06/01 20:52:29 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 "gl3d_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. CGl3dWindow::CGl3dWindow(int x, int y, int w, int h, const char* label)
  47.     : CGlCanvas3d(x, y, w, h)
  48.     , m_Arcball(CVect3<float>(0.0f, 0.0f, 0.0f), 2.0f)
  49.     , m_State(eNormal)
  50. {
  51.     m_Arcball.Resolution(w, h);
  52. }
  53. void CGl3dWindow::draw()
  54. {
  55.     x_DrawBackground(0.2f, 0.2f, 0.4f);
  56.     x_SetupView();
  57.     // misc enables
  58.     glEnable(GL_DEPTH_TEST);
  59.     glEnable(GL_CULL_FACE);
  60.     glEnable(GL_COLOR_MATERIAL);
  61.     // lights
  62.     static GLfloat light_pos[]   = { 20.0f, 20.0f, 5.0f, 1.0f };
  63.     static GLfloat white_light[] = { 1.0f, 1.0f, 1.0f, 1.0f };
  64.     glEnable(GL_LIGHTING);
  65.     glEnable(GL_LIGHT0);
  66.     glLightModelf(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE);
  67.     glLightfv(GL_LIGHT0, GL_POSITION, light_pos);
  68.     glLightfv(GL_LIGHT0, GL_DIFFUSE,  white_light);
  69.     glLightfv(GL_LIGHT0, GL_SPECULAR, white_light);
  70.     // apply our arcball and view transforms
  71.     glTranslatef(0.0f, 0.0f, -40.0f);
  72.     m_Arcball.ApplyGL();
  73.     //
  74.     // draw something interesting
  75.     //
  76.     if (m_Dlist.IsValid()) {
  77.         m_Dlist.Call();
  78.     } else {
  79.         CGlDisplayListCompile COMPILE(m_Dlist,
  80.                                       CGlDisplayList::eCompileAndExecute);
  81.         glPushMatrix();
  82.         glColor3f(1.0f, 0.5f, 0.0f);
  83.         glTranslatef(5.0f, 0.0f, 0.0f);
  84.         CGlGeometry::DrawCylinder(CVect3<float>(0.0f, 0.0f, 0.0f),
  85.                                   CVect3<float>(10.0f, 0.0f, 0.0f),
  86.                                   1.0f, 3, 10);
  87.         //glutSolidTorus(2.0f, 7.0f, 30, 50);
  88.         glPopMatrix();
  89.         glPushMatrix();
  90.         glColor3f(0.0f, 1.0f, 0.0f);
  91.         glTranslatef(-5.0f, 0.0f, 0.0f);
  92.         //glRotatef(90, 1.0f, 0.0f, 0.0f);
  93.         CGlGeometry::DrawCylinder(CVect3<float>(0.0f, 0.0f, 0.0f),
  94.                                   CVect3<float>(0.0f, 10.0f, 0.0f),
  95.                                   1.0f, 3, 10);
  96.         //glutSolidTorus(2.0f, 7.0f, 30, 50);
  97.         glPopMatrix();
  98.     }
  99.     CGlUtils::CheckGlError();
  100. }
  101. void CGl3dWindow::resize(int x, int y, int w, int h)
  102. {
  103.     m_Arcball.Resolution(w, h);
  104.     CGlCanvas3d::resize(x, y, w, h);
  105. }
  106. int CGl3dWindow::handle(int event)
  107. {
  108.     switch (event) {
  109.     case FL_PUSH:
  110.         // always return 1 here - this insures that the FL_MOVE and FL_RELEASE
  111.         // events are registered
  112.         if (Fl::event_button() == 1) {
  113.             return 1;
  114.         }
  115.         break;
  116.     case FL_DRAG:
  117.         if (Fl::event_button() == 1) {
  118.             switch (m_State) {
  119.             case eNormal:
  120.                 if (Fl::event_shift()) {
  121.                     // zoom
  122.                     m_State = eZoom;
  123.                     x_Zoom();
  124.                 } else if (Fl::event_ctrl()) {
  125.                     // pan
  126.                     m_State = ePan;
  127.                     x_Pan();
  128.                 } else {
  129.                     // rotate
  130.                     m_State = eRotate;
  131.                     x_Rotate();
  132.                 }
  133.                 break;
  134.             case eRotate:
  135.                 //
  136.                 // rotate - activated on left click-drag
  137.                 //
  138.                 if ( !Fl::event_shift()  &&  !Fl::event_ctrl()) {
  139.                     x_Rotate();
  140.                 } else {
  141.                     // end rotate
  142.                     m_Arcball.EndDrag();
  143.                     m_State = eNormal;
  144.                 }
  145.                 break;
  146.             case ePan:
  147.                 //
  148.                 // pan - activated on ctrl-left-click-drag
  149.                 //
  150.                 if (Fl::event_ctrl()) {
  151.                     x_Pan();
  152.                 } else {
  153.                     // end pan
  154.                     m_State = eNormal;
  155.                 }
  156.                 break;
  157.             case eZoom:
  158.                 //
  159.                 // zoom - activated on shift-left-click-drag
  160.                 //
  161.                 if (Fl::event_shift()) {
  162.                     x_Zoom();
  163.                 } else {
  164.                     // end pan
  165.                     m_State = eNormal;
  166.                 }
  167.                 break;
  168.             }
  169.             redraw();
  170.             return 1;
  171.         }
  172.         break;
  173.     case FL_RELEASE:
  174.         if (Fl::event_button() == 1) {
  175.             switch (m_State) {
  176.             case eRotate:
  177.                 m_Arcball.Update(Fl::event_x(), Fl::event_y());
  178.                 m_Arcball.EndDrag();
  179.                 break;
  180.             case eZoom:
  181.             case ePan:
  182.             case eNormal:
  183.                 break;
  184.             }
  185.             return 1;
  186.         }
  187.         break;
  188.     }
  189.     return CGlCanvas3d::handle(event);
  190. }
  191. void CGl3dWindow::x_Rotate()
  192. {
  193.     redraw();
  194.     m_Arcball.Update(Fl::event_x(), Fl::event_y());
  195.     if ( !m_Arcball.IsDragging() ) {
  196.         m_Arcball.BeginDrag();
  197.     }
  198. }
  199. void CGl3dWindow::x_Pan()
  200. {
  201. }
  202. void CGl3dWindow::x_Zoom()
  203. {
  204. }
  205. END_NCBI_SCOPE
  206. /*
  207.  * ===========================================================================
  208.  * $Log: gl3d_window.cpp,v $
  209.  * Revision 1000.2  2004/06/01 20:52:29  gouriano
  210.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.7
  211.  *
  212.  * Revision 1.7  2004/05/21 22:27:45  gorelenk
  213.  * Added PCH ncbi_pch.hpp
  214.  *
  215.  * Revision 1.6  2004/01/27 18:32:51  dicuccio
  216.  * Don't cull front faces
  217.  *
  218.  * Revision 1.5  2003/12/22 19:23:22  dicuccio
  219.  * Inherit from CDialog.  Added calls to interla geometry processing functions
  220.  *
  221.  * Revision 1.4  2003/09/29 15:44:41  dicuccio
  222.  * Deprecated gui/scope.hpp.  Merged gui/core/types.hpp into gui/types.hpp
  223.  *
  224.  * Revision 1.3  2003/06/10 19:03:09  dicuccio
  225.  * Canonicalize the FL/ headers
  226.  *
  227.  * Revision 1.2  2003/06/09 19:24:19  dicuccio
  228.  * Temporarily deisable code which requires glut
  229.  *
  230.  * Revision 1.1  2003/06/09 19:22:29  dicuccio
  231.  * Initial revision
  232.  *
  233.  * Revision 1.1  2003/06/03 17:41:05  dicuccio
  234.  * Initial revision
  235.  *
  236.  * ===========================================================================
  237.  */