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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: opengl_renderer.hpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/04/12 17:32:56  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [CATCHUP_003] Dev-tree R1.43
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: opengl_renderer.hpp,v 1000.2 2004/04/12 17:32:56 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:  Paul Thiessen
  35. *
  36. * File Description:
  37. *      Classes to hold the OpenGL rendering engine
  38. *
  39. * ===========================================================================
  40. */
  41. #ifndef CN3D_OPENGL_RENDERER__HPP
  42. #define CN3D_OPENGL_RENDERER__HPP
  43. // do not include GL headers here, so that other modules can more easily
  44. // access this without potential name conflicts
  45. #include <corelib/ncbistd.hpp>
  46. #include <corelib/ncbiobj.hpp>
  47. #include <list>
  48. #include <map>
  49. #include <vector>
  50. #include <string>
  51. #include <objects/cn3d/Cn3d_user_annotations.hpp>
  52. #include <objects/cn3d/Cn3d_view_settings.hpp>
  53. #include "vector_math.hpp"
  54. class wxFont;
  55. BEGIN_SCOPE(Cn3D)
  56. class StructureSet;
  57. class AtomStyle;
  58. class BondStyle;
  59. class HelixStyle;
  60. class StrandStyle;
  61. class Cn3DGLCanvas;
  62. class OpenGLRenderer
  63. {
  64. public:
  65.     OpenGLRenderer(Cn3DGLCanvas *parentGLCanvas);
  66.     // public data
  67.     static const unsigned int NO_NAME;
  68.     // public methods
  69.     // calls once-only OpenGL initialization stuff (should be called after
  70.     // the rendering context is established and the renderer made current)
  71.     void Init(void) const;
  72.     // tells the renderer that new camera settings need to be applied - should also
  73.     // be called after window resize
  74.     void NewView(double eyeTranslateToAngleDegrees = 0.0) const;
  75.     // get the name
  76.     bool GetSelected(int x, int y, unsigned int *name);
  77.     // reset camera to full-view state
  78.     void ResetCamera(void);
  79.     // called to change view (according to mouse movements)
  80.     enum eViewAdjust {
  81.         eXYRotateHV,        // rotate about X,Y axes according to horiz. & vert. movement
  82.         eZRotateH,          // rotate in plane (about Z) according to horiz. movement
  83.         eXYTranslateHV,     // translate in X,Y according to horiz. & vert. movement
  84.         eZoomH,             // zoom in/out with horiz. movement
  85.         eZoomHHVV,          // zoom according to (H1,V1),(H2,V2) box
  86.         eZoomIn,            // zoom in
  87.         eZoomOut,           // zoom out
  88.         eCenterCamera       // reset camera to look at origin
  89.     };
  90.     void ChangeView(eViewAdjust control, int dX = 0, int dY = 0, int X2 = 0, int Y2 = 0);
  91.     // center the view on the given viewCenter point, and zoom the view according to radius
  92.     void CenterView(const Vector& viewCenter, double radius);
  93.     // draws the display lists
  94.     void Display(void);
  95.     // tells the renderer what structure(s) it's to draw
  96.     void AttachStructureSet(StructureSet *targetStructureSet);
  97.     // constructs the structure display lists (but doesn't draw them)
  98.     void Construct(void);
  99.     // push the global view matrix, then apply transformation (e.g., for structure alignment)
  100.     void PushMatrix(const Matrix* xform);
  101.     // pop matrix
  102.     void PopMatrix(void);
  103.     // display list management
  104.     static const unsigned int NO_LIST, FIRST_LIST, FONT_BASE;
  105.     void StartDisplayList(unsigned int list);
  106.     void EndDisplayList(void);
  107.     // frame management
  108.     void ShowAllFrames(void);
  109.     void ShowFirstFrame(void);
  110.     void ShowLastFrame(void);
  111.     void ShowNextFrame(void);
  112.     void ShowPreviousFrame(void);
  113.     void ShowFrameNumber(int frame);
  114.     // drawing methods
  115.     void DrawAtom(const Vector& site, const AtomStyle& atomStyle);
  116.     void DrawBond(const Vector& site1, const Vector& site2, const BondStyle& style,
  117.         const Vector *site0, const Vector* site3);
  118.     void DrawHelix(const Vector& Nterm, const Vector& Cterm, const HelixStyle& helixStyle);
  119.     void DrawStrand(const Vector& Nterm, const Vector& Cterm,
  120.         const Vector& unitNormal, const StrandStyle& strandStyle);
  121.     void DrawLabel(const std::string& text, const Vector& center, const Vector& color);
  122.     // load/save camera angle from/to asn data
  123.     bool SaveToASNViewSettings(ncbi::objects::CCn3d_user_annotations *annotations);
  124.     bool LoadFromASNViewSettings(const ncbi::objects::CCn3d_user_annotations& annotations);
  125.     bool HasASNViewSettings(void) const { return !initialViewFromASN.Empty(); }
  126.     // restore to saved view settings
  127.     void RestoreSavedView(void);
  128.     // get current gl viewport - array of four int's: x, y, width, height
  129.     void GetViewport(int *viewport);
  130.     // set font used by OpenGL to the wxFont associated with the glCanvas
  131.     bool SetGLFont(int firstChar, int nChars, int fontBase);
  132.     const wxFont& GetGLFont(void) const;
  133.     // stereo
  134.     void EnableStereo(bool enableStereo);
  135.     double GetRotateSpeed(void) const { return rotateSpeed; }
  136.     void RecreateQuadric(void) const;
  137. private:
  138.     StructureSet *structureSet;
  139.     Cn3DGLCanvas *glCanvas;
  140.     void SetColor(int type, double red = 0.0, double green = 0.0, double blue = 0.0, double alpha = 1.0);
  141.     void ConstructLogo(void);
  142.     // camera data
  143.     double cameraDistance, cameraAngleRad,
  144.         cameraLookAtX, cameraLookAtY,
  145.         cameraClipNear, cameraClipFar,
  146.         viewMatrix[16];
  147.     ncbi::CRef < ncbi::objects::CCn3d_view_settings > initialViewFromASN;
  148.     // controls for view changes
  149.     double rotateSpeed;
  150.     // misc rendering stuff
  151.     bool selectMode;
  152.     int selectX, selectY;
  153.     unsigned int currentFrame;
  154.     std::vector < bool > displayListEmpty;
  155.     bool IsFrameEmpty(unsigned int frame) const;
  156.     unsigned int currentDisplayList;
  157.     // controls for stereo
  158.     bool stereoOn;
  159.     // stuff for rendering transparent spheres (done during Display())
  160. public:
  161.     typedef struct {
  162.         Vector site, color;
  163.         unsigned int name;
  164.         double radius, alpha;
  165.     } SphereInfo;
  166. private:
  167.     typedef std::list < SphereInfo > SphereList;
  168.     typedef std::map < unsigned int, SphereList > SphereMap;
  169.     SphereMap transparentSphereMap;
  170.     void AddTransparentSphere(const Vector& color, unsigned int name,
  171.         const Vector& site, double radius, double alpha);
  172.     void ClearTransparentSpheresForList(unsigned int list)
  173.     {
  174.         SphereMap::iterator i = transparentSphereMap.find(list);
  175.         if (i != transparentSphereMap.end())
  176.             transparentSphereMap.erase(i);
  177.     }
  178.     class SpherePtr
  179.     {
  180.     public:
  181.         Vector siteGL; // atom site in GL coordinates
  182.         double distanceFromCamera;
  183.         const SphereInfo *ptr;
  184.         friend bool operator < (const SpherePtr& a, const SpherePtr& b)
  185.             { return (a.distanceFromCamera < b.distanceFromCamera); }
  186.     };
  187.     typedef std::list < SpherePtr > SpherePtrList;
  188.     SpherePtrList transparentSpheresToRender;
  189.     void AddTransparentSpheresForList(unsigned int list);
  190.     void RenderTransparentSpheres(void);
  191. };
  192. END_SCOPE(Cn3D)
  193. #endif // CN3D_OPENGL_RENDERER__HPP
  194. /*
  195. * ---------------------------------------------------------------------------
  196. * $Log: opengl_renderer.hpp,v $
  197. * Revision 1000.2  2004/04/12 17:32:56  gouriano
  198. * PRODUCTION: UPGRADED [CATCHUP_003] Dev-tree R1.43
  199. *
  200. * Revision 1.43  2004/02/19 17:05:00  thiessen
  201. * remove cn3d/ from include paths; add pragma to disable annoying msvc warning
  202. *
  203. * Revision 1.42  2003/12/04 15:58:37  thiessen
  204. * fix const problem
  205. *
  206. * Revision 1.41  2003/12/04 15:49:41  thiessen
  207. * fix stereo and PNG export problems on Mac
  208. *
  209. * Revision 1.40  2003/12/03 15:46:36  thiessen
  210. * adjust so spin increment is accurate
  211. *
  212. * Revision 1.39  2003/11/15 16:08:36  thiessen
  213. * add stereo
  214. *
  215. * Revision 1.38  2003/02/03 19:20:04  thiessen
  216. * format changes: move CVS Log to bottom of file, remove std:: from .cpp files, and use new diagnostic macros
  217. *
  218. * Revision 1.37  2002/09/14 17:03:07  thiessen
  219. * center initial view on aligned residues
  220. *
  221. * Revision 1.36  2001/11/30 14:02:05  thiessen
  222. * progress on sequence imports to single structures
  223. *
  224. * Revision 1.35  2001/10/23 13:53:38  thiessen
  225. * add PNG export
  226. *
  227. * Revision 1.34  2001/10/17 17:46:27  thiessen
  228. * save camera setup and rotation center in files
  229. *
  230. * Revision 1.33  2001/09/06 18:17:01  thiessen
  231. * fix OpenGL window initialization/OnSize to work on Mac
  232. *
  233. * Revision 1.32  2001/08/24 00:40:57  thiessen
  234. * tweak conservation colors and opengl font handling
  235. *
  236. * Revision 1.31  2001/08/13 22:30:52  thiessen
  237. * add structure window mouse drag/zoom; add highlight option to render settings
  238. *
  239. * Revision 1.30  2001/08/09 19:07:19  thiessen
  240. * add temperature and hydrophobicity coloring
  241. *
  242. * Revision 1.29  2001/08/06 20:22:48  thiessen
  243. * add preferences dialog ; make sure OnCloseWindow get wxCloseEvent
  244. *
  245. * Revision 1.28  2001/06/15 14:52:30  thiessen
  246. * fix minor syntax errors
  247. *
  248. * Revision 1.27  2001/05/22 19:09:09  thiessen
  249. * many minor fixes to compile/run on Solaris/GTK
  250. *
  251. * Revision 1.26  2001/05/17 18:34:00  thiessen
  252. * spelling fixes; change dialogs to inherit from wxDialog
  253. *
  254. * Revision 1.25  2001/05/16 00:07:23  thiessen
  255. * one more minor fix
  256. *
  257. * Revision 1.24  2001/05/15 23:49:20  thiessen
  258. * minor adjustments to compile under Solaris/wxGTK
  259. *
  260. * Revision 1.23  2000/12/15 15:52:08  thiessen
  261. * show/hide system installed
  262. *
  263. * Revision 1.22  2000/11/02 16:48:22  thiessen
  264. * working editor undo; dynamic slave transforms
  265. *
  266. * Revision 1.21  2000/10/04 17:40:46  thiessen
  267. * rearrange STL #includes
  268. *
  269. * Revision 1.20  2000/08/30 19:49:03  thiessen
  270. * working sequence window
  271. *
  272. * Revision 1.19  2000/08/25 14:21:32  thiessen
  273. * minor tweaks
  274. *
  275. * Revision 1.18  2000/08/24 23:39:54  thiessen
  276. * add 'atomic ion' labels
  277. *
  278. * Revision 1.17  2000/08/21 17:22:45  thiessen
  279. * add primitive highlighting for testing
  280. *
  281. * Revision 1.16  2000/08/19 02:58:23  thiessen
  282. * fix transparent sphere bug
  283. *
  284. * Revision 1.15  2000/08/18 23:07:03  thiessen
  285. * minor efficiency tweaks
  286. *
  287. * Revision 1.14  2000/08/18 18:57:43  thiessen
  288. * added transparent spheres
  289. *
  290. * Revision 1.13  2000/08/17 14:22:00  thiessen
  291. * added working StyleManager
  292. *
  293. * Revision 1.12  2000/08/13 02:42:13  thiessen
  294. * added helix and strand objects
  295. *
  296. * Revision 1.11  2000/08/11 12:59:13  thiessen
  297. * added worm; get 3d-object coords from asn1
  298. *
  299. * Revision 1.10  2000/08/07 14:12:48  thiessen
  300. * added animation frames
  301. *
  302. * Revision 1.9  2000/08/07 00:20:18  thiessen
  303. * add display list mechanism
  304. *
  305. * Revision 1.8  2000/08/04 22:49:10  thiessen
  306. * add backbone atom classification and selection feedback mechanism
  307. *
  308. * Revision 1.7  2000/08/03 15:12:29  thiessen
  309. * add skeleton of style and show/hide managers
  310. *
  311. * Revision 1.6  2000/07/18 00:05:45  thiessen
  312. * allow arbitrary rotation center
  313. *
  314. * Revision 1.5  2000/07/17 22:36:46  thiessen
  315. * fix vector_math typo; correctly set initial view
  316. *
  317. * Revision 1.4  2000/07/17 04:21:09  thiessen
  318. * now does correct structure alignment transformation
  319. *
  320. * Revision 1.3  2000/07/16 23:18:34  thiessen
  321. * redo of drawing system
  322. *
  323. * Revision 1.2  2000/07/12 23:28:27  thiessen
  324. * now draws basic CPK model
  325. *
  326. * Revision 1.1  2000/07/12 14:10:45  thiessen
  327. * added initial OpenGL rendering engine
  328. *
  329. */