4d93d15b66969aea13f3a51026352c58c9524a4a
[mussa.git] / alg / glsequence.hpp
1 #ifndef _GL_SEQUENCE_H_
2 #define _GL_SEQUENCE_H_
3
4 #include <boost/shared_ptr.hpp>
5
6 #include "alg/annotation_colors.hpp"
7 #include "alg/sequence.hpp"
8 #include "alg/color.hpp"
9 // isn't it lovely how the header file can live in different places?
10 #ifdef __APPLE__
11 #include <OpenGL/gl.h>
12 #else
13 #include <GL/gl.h>
14 #endif
15
16 class GlSequence;
17 typedef boost::shared_ptr<GlSequence> GlSequenceRef;
18
19 //! Manage rendering a mussa sequence track
20 /*! The idea is this will keep track of the location of where the sequence
21  *  is being rendered, and handle displaying annotations on that track
22  */
23 class GlSequence : public Sequence
24 {
25 public: 
26   GlSequence(const Sequence & s,
27              boost::shared_ptr<AnnotationColors> cm);
28   GlSequence(const GlSequence & s);
29   GlSequence(const GlSequence *);
30   //! Make a new GlSequence, using a copy of SeqSpan
31   GlSequence(const GlSequenceRef);
32   
33   GlSequence &operator=(const GlSequence &s);
34
35   static DrawableRef default_drawable();
36   static DrawableRef copy_drawable(DrawableRef s);
37   
38   //! set our starting x (horizontal) coordinate
39   void setX(float x);
40   //! get our starting x (horizontal) coordinate
41   float x() const;
42   //! set our current y (vertical) position
43   void setY(float y);
44   //! get our current y (vertical) position
45   float y() const;
46   //! get our current z (depth) position
47   float z() const;
48   //! how thick (high) the track we're drawing is
49   float height() const;
50
51   //! set our default draw color
52   void setColor(ColorRef &c );
53   //! return our draw color
54   const ColorRef color() const;
55   //! return our draw color
56   ColorRef color();
57   //! return our annotation color mapper
58   AnnotationColorsRef colorMapper() { return color_mapper; }
59
60   //! draw a track 
61   /*! left and right are the edges of the current viewport
62    */
63   void draw(GLfloat left, GLfloat right) const;
64
65   //! get our right (horizontal) coordinate (size-x)
66   float right() const;
67   //! how long is our sequence track? (computed from the sequence)
68   GLfloat size() const;
69  
70   //! return the left (lowest) base index that is fully visible
71   Sequence::size_type leftbase(GLfloat left) const;
72   //! return one past rightmost (highest ) base index that is fully visible
73   //! done mostly so all the iterator logic continues to work correctly.
74   Sequence::size_type rightbase(GLfloat right) const;
75
76   //! provide an iterator to the sequence starting at world coordinate left
77   Sequence::const_iterator region_begin(GLfloat left, GLfloat right) const;
78   //! provide an iterator to the sequence ending at world coordinate right
79   Sequence::const_iterator region_end(GLfloat left, GLfloat right) const;
80
81   //! return a subsequence as a GlSequence (instead of a Sequence subsequence)
82   GlSequence subseq(size_type start, size_type count) const;
83   
84   //! how big is a pixel in world coordinats
85   GLfloat pixelWidth(GLfloat, GLfloat) const;
86   //! how big is a pixel in world coordinats (specifying viewport size)
87   GLfloat pixelWidth(GLfloat, GLfloat, int) const;
88
89   //! are we close enough that it would make sense to view the base pairs?
90   bool is_sequence_renderable(GLfloat left, GLfloat right) const;
91   //! are we close enough that it would make sense to view the base pairs?
92   /*! though we don't actually check to see if there's sequence in our
93    *  view, just that there's enough pixels to render something if 
94    *  there were.
95    *  \param[in] left the left edge of the viewable region in world coordinates
96    *  \param[in] right the right edge of the viewable region in world 
97    *             coordinates
98    *  \param[in] pixel_width allow setting the current viewport pixel width
99    */
100   bool is_sequence_renderable(GLfloat, GLfloat, int) const;
101
102   friend bool operator==(const GlSequence &left, const GlSequence &right);
103
104 protected:
105   AnnotationColorsRef color_mapper;
106   const GLfloat char_pix_per_world_unit;
107
108   //! Return the pixel width of the opengl viewport.
109   static int get_viewport_width_in_pixels();
110   //! draw a from left to right +/- height/2
111   void draw_box(GLfloat world_left, GLfloat world_right, GLfloat left, GLfloat right, GLfloat height, GLfloat z) const;
112   //! draw sequence as a bar
113   void draw_track(GLfloat, GLfloat) const;
114   void draw_annotations(GLfloat, GLfloat) const;
115   //! render a sequence as ATGC
116   /*! left and right are the current edges of the viewable world
117    */
118   void draw_sequence(GLfloat, GLfloat) const;
119 };
120 #endif