render_area.hpp 19.7 KB
Newer Older
1 2 3 4 5 6 7
/*!
 *\file render_area.hpp
 */

#ifndef RENDER_AREA_HPP
#define RENDER_AREA_HPP

8

9 10
class Render_area;

11

12 13
#include <QtGui>
#include <QGLWidget>/* for the OpenGL Widget */
14

15

16
#include "render.hpp"
17

18
#include "resource.hpp"
19

20 21 22
/*!
 * \brief Structure used to store event information.
 */
23 24 25 26 27
struct Event_{
    Element_pos time;
    Element_pos height;
    Element_pos container_height;
};
28

29 30 31
/*!
 * \brief Structure used to store arrow information.
 */
Olivier Lagrasse's avatar
Olivier Lagrasse committed
32 33 34 35 36 37 38 39
struct Arrow_{
    Element_pos start_time;
    Element_pos end_time;
    Element_pos start_height;
    Element_pos end_height;
};


40
/*!
41
 * \brief This class redefined the OpenGL widget - QGLWidget - to display the trace.
42
 */
43
class Render_area : public QGLWidget, public Render
44 45
 {
     Q_OBJECT
46 47


48

49
 protected:
50 51


52 53 54
     /*!
      * \brief Contains container text coordinates.
      */
55 56
     std::list<Element_pos> _text_pos;

57
     /*!
58
      * \brief Contains container strings.
59
      */
60
     std::list<std::string> _text_value;
61

62 63 64 65
     /*!
      * \brief Contains arrow informations.
      */
     std::vector<Arrow_> _arrows;
66

67 68 69 70
     /*!
      * \brief Contains event informations.
      */
     std::vector<Event_> _events;
71 72


73 74 75 76 77 78

     /***********************************
      *
      * Render area state attributes.
      *
      **********************************/
79

80
     /*!
81 82 83 84 85 86 87 88
      * \brief State when there is no file opened.
      */
     static const int DRAWING_STATE_WAINTING = 1;
     
     /*!
      * \brief State when the application is drawing traces.
      */
     static const int DRAWING_STATE_DRAWING = 2;
89

90
     /*!
91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116
      * \brief Contains the kind of state for the render area (drawing, waiting, etc.).
      */
     int _state;
 


     /***********************************
      *
      * Default QGLWidget functions.
      *
      **********************************/
     
     /*!
      * \brief Call by the system to initialize the OpenGL render area.
      */
     void initializeGL();
     
     /*!
      * \brief Call by the system when the render area was resized (occurs during a window resizement).
      * \arg width : the new width of the render area.
      *      height : the new height of the render area. 
      */
     void resizeGL(int width, int height);
     
     /*!
      * \brief Call by the system each time the render area need to be updated.
117 118
      */
     void paintGL();
119 120 121 122 123 124 125 126 127 128 129 130

     /***********************************
      *
      * The wait screen drawing.
      *
      **********************************/

     
     /***********************************
      * The wait list Attributes.
      **********************************/
     
131
     /*!
132 133
      * \brief The wait GLu list.
      */
134
     GLuint _wait_list;
135 136 137 138

     /*!
      * \brief The container GLu list.
      */
139
     GLuint _list_containers;
140 141 142 143

     /*!
      * \brief The state GLu list.
      */
144
     GLuint _list_states;
145 146 147 148

     /*!
      * \brief The counter GLu list.
      */
149
     GLuint _list_counters;
150

151
     /*!
152
      * \brief Rotation angle for the wait.
153 154 155 156
     */
     float _wait_angle;

     /*!
157 158 159 160
      * \brief Time in ms between two frames for the waiting screen.
      */
     static const int DRAWING_TIMER_DEFAULT = 10;
     
161
     /*!
162 163
      * \brief Wait animation seconds per frame.
      */
164
     int _wait_spf;
165 166 167 168 169
     
     /*!
      * \brief Timer to animate the wait. 
      */
     QTimer* _wait_timer;
170

171

172 173 174 175
     /***********************************
      * Drawing function for the wait screen.
      **********************************/
     
176
     /*!
177 178
     * \brief Display a wait on the screen if there is no file opened.
     * \return Asset value of the wait.
179
     */
180 181 182 183
     GLuint draw_wait();



184

185 186 187 188 189 190 191 192 193 194 195
     /***********************************
      *
      * The trace drawing.
      *
      **********************************/


     /***********************************
      * The drawing list Attributes.
      **********************************/
     
196
     /*!
197
      * \brief The trace Glu list.
198
     */
199
     GLuint _drawing_list;
200

201 202 203
     /*!
      * \brief The last x position of the point (for counter).
      */
Olivier Lagrasse's avatar
Olivier Lagrasse committed
204 205
     Element_pos _counter_last_x;

206 207 208 209
     /*!
      * \brief The last y position of the point (for counter).
     */
     Element_pos _counter_last_y;
Olivier Lagrasse's avatar
Olivier Lagrasse committed
210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230

     /*!
      * \brief The opengl render area width in pixels.
      */
     Element_pos _screen_width;

     /*!
      * \brief The opengl render area height in pixels.
      */
     Element_pos _screen_height;

     /*!
      * \brief The opengl visibled scene width in the OpenGL units.
      */
     Element_pos _render_width;

     /*!
      * \brief The opengl visibled scene height in the OpenGL units.
      */
     Element_pos _render_height;

231 232 233
     /*!
      * \brief The width of container area draw.
      */
234
     Element_pos _container_x_max;
Olivier Lagrasse's avatar
Olivier Lagrasse committed
235

236 237 238 239
     /*!
      * \brief The height of container area draw.
      */
     Element_pos _container_y_max;
240

241 242 243
     /*!
      * \brief The width of state area draw.
      */
Olivier Lagrasse's avatar
Olivier Lagrasse committed
244
     Element_pos _state_x_max;
245 246 247 248

     /*!
      * \brief The height of state area draw.
      */
Olivier Lagrasse's avatar
Olivier Lagrasse committed
249
     Element_pos _state_y_max;
250 251 252 253 254 255 256 257 258 259
     
     /*!
      * \brief z position for containers. 
      */
     Element_pos _z_container;

     /*!
      * z position for states.
      */
     Element_pos _z_state;
Olivier Lagrasse's avatar
Olivier Lagrasse committed
260

261 262 263 264
     /*!
      * z position for events.
      */
     Element_pos _z_event;
Olivier Lagrasse's avatar
Olivier Lagrasse committed
265

266 267 268 269
     /*!
      * z position for arrows.
      */
     Element_pos _z_arrow;
Olivier Lagrasse's avatar
Olivier Lagrasse committed
270

271 272 273 274 275
     /*!
      * z position for counters.
      */
     Element_pos _z_counter;

276 277 278 279

     /***********************************
      * Trace Drawing functions and attributes.
      **********************************/
280

281 282 283 284
     /*!
      * \brief The percentage taken by container display in the render area.
      */
     Element_pos _x_scale_container_state;/* temporary */
285

286 287 288
     /*!
      * \brief the scale of state drawing.
      */
Olivier Lagrasse's avatar
Olivier Lagrasse committed
289
     int _state_scale;/* temporary */
290 291 292 293

     /*!
      * \brief The x position of camera view for state drawing area.
     */
Olivier Lagrasse's avatar
Olivier Lagrasse committed
294
     int _state_translate;/* temporary */
295

296

297
 public:
298

299 300 301 302 303 304 305 306


     /***********************************
      *
      * Constructor and destructor.
      *
      **********************************/

307 308 309
     /*!
     * \brief The default constructor
     */
310
     Render_area(QWidget *parent);
311 312 313 314 315

     /*!
     * \brief The destructor
     */
     virtual ~Render_area();
316

317 318 319 320 321 322 323 324


     /***********************************
      *
      * Building functions.
      *
      **********************************/

325
     /*!
326
      * \brief This function draws the trace.
327
      * \arg trace the trace which be displayed. 
328
      */
329
     bool build();
330 331

     /*!
332 333
      * \brief This function releases the trace.
      */
334 335
     bool unbuild();

336 337 338 339
     /*!
     * \brief Change the scale of state drawing.
     * \param scale The new scale value.
     */
Olivier Lagrasse's avatar
Olivier Lagrasse committed
340
     void change_scale(int scale);/* temporary -> to change the scale to view states */
341 342 343 344 345

     /*!
     * \brief Change the x position of camera view for state drawing area.
     * \param translate The new position.
     */
Olivier Lagrasse's avatar
Olivier Lagrasse committed
346
     void change_translate(int translate);/* temporary -> to change the translate to view states */
347 348 349 350 351

     /*!
     * \brief Change the percentage taken by container display in the render area.
     * \param view_size The new percentage (between 0 to 100).
     */
Olivier Lagrasse's avatar
Olivier Lagrasse committed
352 353
     void change_scale_container_state(int view_size);/* temporary -> to change the size of container view */

354
     
355 356 357
     /*!
      * \brief Proceeds with the initialization of the OpenGL draw functions.
      */
358
     void start_draw();
359

360 361 362
     /*!
      * \brief Creates and opens the display list for container draws.
      */
363
     void start_draw_containers();
364 365 366 367 368 369 370 371

     /*!
     * \brief Draw a container according to the parameters
     * \param x the x position of the container
     * \param y the y position of the container
     * \param w the width of the container
     * \param h the height of the container
     */
372
     void draw_container(const Element_pos x, const Element_pos y, const Element_pos w, const Element_pos h);
373 374 375 376 377 378

     /*!
      * \brief Draw the text of a container.
      * \param x the x position of the text.
      * \param y the y position of the text.
      * \param value the string value of the text.
379 380
      *
      * This function stores text in a list. This list will be display each time the render area need to be updated.
381
      */
382
     void draw_container_text(const Element_pos x, const Element_pos y, const std::string value);
383

384 385 386
     /*!
      * \brief Closes the container display list.
      */
387
     void end_draw_containers();
Olivier Lagrasse's avatar
Olivier Lagrasse committed
388
     
389 390 391
     /*!
      * \brief Creates and opens the display list for stater draws.
      */
392
     void start_draw_states();
393 394 395 396 397 398 399 400 401 402 403

     /*!
      * \brief Draw a state of the trace.
      * \param start the beginning time of the state.
      * \param end the ending time of the state.
      * \param base vertical position of the state.
      * \param height the state height.
      * \param r the red color rate of the state.
      * \param g the green color rate of the state.
      * \param b the blue color rate of the state.
      */
404 405
     void draw_state(const Element_pos start , const Element_pos end, const Element_pos base, const Element_pos height, const Element_col r, const Element_col g, const Element_col b);

406 407 408
     /*!
      * \brief Closes the state display list.
      */
409
     void end_draw_states();
410

411 412 413 414 415 416 417 418 419
     /*!
      * \brief Draw an arrow.
      * \param start_time the beginning time of the arrow.
      * \param end_time the ending time of the arrow.
      * \param start_height vertical position of the begining time of the arrow.
      * \param end_height vertical position of the ending time of the arrow.
      *
      * This function stores all the information of the arrow to display it each time the render area need to be updated.
      */
420
     void draw_arrow(const Element_pos start_time, const Element_pos end_time, const Element_pos start_height, const Element_pos end_height);
421

422 423 424 425
     /*!
      * \brief Draw arrows contained in the Arrow_ vector
      * \param arrows An arrow vector.
      */
Olivier Lagrasse's avatar
Olivier Lagrasse committed
426 427
     void draw_stored_arrows(std::vector<Arrow_> &arrows);

428 429 430 431 432 433 434 435
     /*!
      * \brief Draw an event.
      * \param time time when the event occurs.
      * \param height vertical position of the event.
      * \param container_height information to draw event. It corresponds to the container height when they are drawn horizontally.
      *
      * This function stores all the information of the event to display it each time the render area need to be updated.
      */
436 437
     void draw_event(const Element_pos time, const Element_pos height,  const Element_pos container_height);

438 439 440 441
     /*!
      * \brief Draw events contained in the Event_ vector
      * \param events An event vector.
      */
442 443
     void draw_stored_events(std::vector<Event_> &events);

444 445 446
     /*!
      * \brief Creates and opens the display list for counter draws.
      */
447 448
     void start_draw_counter();
     
449 450 451 452 453 454 455
     /*!
      * \brief Draw a point of the counter.
      * \param x x position of the point.
      * \param y y position of the point.
      *
      * Each time counter is increased, this function is called with the coordinates of the new point.
      */
Olivier Lagrasse's avatar
Olivier Lagrasse committed
456 457
     void draw_counter(const Element_pos x, const Element_pos y);
     
458 459 460
     /*!
      * \brief Closes the counter display list.
      */
Olivier Lagrasse's avatar
Olivier Lagrasse committed
461
     void end_draw_counter();
462

463 464 465
     /*!
      * \brief Do nothing (it is present for compatibility of the Render class).
      */
466
     void end_draw();
467
    
468 469
  };

470

471 472


473 474 475
/* inline function area */


476 477 478 479 480 481 482 483 484 485
/***********************************
 *
 *
 *
 * Drawing function for the trace.
 *
 *
 *
 **********************************/

486 487 488 489 490

inline void Render_area::start_draw(){
    /* clear lists to store container texts */
    _text_pos.clear();
    _text_value.clear();
Olivier Lagrasse's avatar
Olivier Lagrasse committed
491 492 493 494 495 496

    /* clear the event vector */
    _events.clear();

    /* clear the arrow vector */
    _arrows.clear();
497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525
}


inline void Render_area::start_draw_containers(){

    _list_containers = glGenLists(1);/* create the list */
    if (_list_containers==0){
        
        //        _parent->warning("Error when creating list");
    }

    glNewList(_list_containers, GL_COMPILE);/* open the list */

}


inline void Render_area::draw_container(const Element_pos x, const Element_pos y, const Element_pos w, const Element_pos h) {

    float j=0.6;

    glBegin(GL_QUADS);/* create a quads */
    {
        glColor3d(0, 0, j);glVertex2d(x, y);
        glColor3d(0, 0, j-0.1);glVertex2d(x, y+h);
        glColor3d(0, 0, j-0.1);glVertex2d(x+w, y+h);
        glColor3d(0, 0, j);glVertex2d(x+w, y);
    }
    glEnd();

526 527
    if ((x+w)>_container_x_max)
        _container_x_max = x+w;
528
    
529 530
    if ((y+h)>_container_y_max)
        _container_y_max = y+h;
531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568

}

inline void Render_area::draw_container_text(const Element_pos x, const Element_pos y, const std::string value){

    _text_pos.push_back(x); 
    _text_pos.push_back(y);
    _text_value.push_back(value);

}



inline void Render_area::end_draw_containers(){
    glEndList();/* close the list */
}




inline void Render_area::start_draw_states(){

    _list_states = glGenLists(1);/* create the list */
    if (_list_states==0){
        
        //      _parent->warning("Error when creating list");
    }
    
    glNewList(_list_states, GL_COMPILE);/* open the list */
}


inline void Render_area::draw_state(const Element_pos start, const Element_pos end, const Element_pos base, const Element_pos height, const Element_col r, const Element_col g, const Element_col b){

    

#ifdef DEBUG_MODE_RENDER_AREA
    
569 570
    std::cerr << __FILE__ << " l." << __LINE__ << ":" << std::endl;  
    std::cerr << "States position (for drawing): (x = " <<  start << ", y = " << base << ", w = " << end-start << ", h = " << height << ")" << std::endl << std::endl;  
571 572 573

#endif

574 575 576 577
    /** DEBUG **/
    //  if (start==end)
    /* std::cout << std::setprecision(15) << std::endl;
       std::cerr << "Start "<< start << " end " << end << std::endl;*/
578 579 580 581 582
  
    glBegin(GL_QUADS);/* create a quads */
    {
        glColor3d(r, g, b);glVertex2d(start, base);
        glColor3d(r, g, b);glVertex2d(start, base + height);
583 584
        glColor3d(r/1.5, g/1.5, b/1.5);glVertex2d(end, base + height);
        glColor3d(r/1.5, g/1.5, b/1.5);glVertex2d(end, base);
585 586
    }
    glEnd();
Olivier Lagrasse's avatar
Olivier Lagrasse committed
587 588 589 590 591 592

    if (end>_state_x_max)
        _state_x_max = end;
    
    if ((base+height)>_state_y_max)
        _state_y_max = base+height;
593 594 595 596 597 598 599 600 601 602
}


inline void Render_area::end_draw_states(){
    glEndList();/* close the list */
}


inline void Render_area::draw_arrow(const Element_pos start_time, const Element_pos end_time, const Element_pos start_height, const Element_pos end_height){

Olivier Lagrasse's avatar
Olivier Lagrasse committed
603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622
    Arrow_ buf;

    buf.start_time = start_time;
    buf.end_time = end_time;
    buf.start_height = start_height;
    buf.end_height = end_height;

    _arrows.push_back(buf);
}



inline void Render_area::draw_stored_arrows(std::vector<Arrow_> &arrows){

    Element_pos start_time, end_time, start_height, end_height;

    /* Manage the event drawing size from state size and render area dimensions */
    Element_pos arrow_scale_x = _state_scale*(_render_width/_state_x_max);
    Element_pos arrow_scale_y = _render_height/_state_y_max;

623 624
    Element_pos angle;

625

Olivier Lagrasse's avatar
Olivier Lagrasse committed
626 627 628 629 630 631 632
    for (long i=0 ; i<(long)arrows.size() ; i++){
        
        
        start_time = arrows[i].start_time*arrow_scale_x + _render_width*_x_scale_container_state-_state_translate; 
        end_time = arrows[i].end_time*arrow_scale_x + _render_width*_x_scale_container_state-_state_translate; 
        start_height = arrows[i].start_height*arrow_scale_y;
        end_height = arrows[i].end_height*arrow_scale_y;
633

Olivier Lagrasse's avatar
Olivier Lagrasse committed
634 635 636 637 638
        /* DEBUG */
        // std::cerr << "Arrow draw: (" << start_time << ", " << start_height << ") to (" << end_time << ", " << end_height << ")" << std::endl;


        glPushMatrix();
639
    
Olivier Lagrasse's avatar
Olivier Lagrasse committed
640 641
        glTranslated(end_time, end_height, _z_arrow);
        glScalef(2, 2, 0);/* should be set */
642
    
643

Olivier Lagrasse's avatar
Olivier Lagrasse committed
644
        if (start_time != end_time){
645

Olivier Lagrasse's avatar
Olivier Lagrasse committed
646
            angle = atan2((end_height - start_height), (end_time - start_time))*180.0f/PI;/* arc tangent */
647

Olivier Lagrasse's avatar
Olivier Lagrasse committed
648
            glRotatef(angle, 0, 0, 1);
649
 
Olivier Lagrasse's avatar
Olivier Lagrasse committed
650 651
        }/* end if (start_time != end_time) */
        else
Olivier Lagrasse's avatar
Olivier Lagrasse committed
652
            glRotatef(90, 0, 0, 1);/* vertical alignment */
653
   
654
    
655

Olivier Lagrasse's avatar
Olivier Lagrasse committed
656 657
        glBegin(GL_TRIANGLES);/* create an arrow */
        {
Olivier Lagrasse's avatar
Olivier Lagrasse committed
658 659 660
            glColor3d(1.0, 1.0, 1.0);glVertex2d(0.0, 0.0);
            glColor3d(0.9, 0.9, 0.9);glVertex2d(-0.6, -0.2);
            glColor3d(0.9, 0.9, 0.9);glVertex2d(-0.6, 0.2);
Olivier Lagrasse's avatar
Olivier Lagrasse committed
661 662
        }
        glEnd();
663
    
Olivier Lagrasse's avatar
Olivier Lagrasse committed
664
        glPopMatrix();
665

Olivier Lagrasse's avatar
Olivier Lagrasse committed
666
        glPushMatrix();
667

Olivier Lagrasse's avatar
Olivier Lagrasse committed
668
        glTranslated(0, 0, _z_arrow);
Olivier Lagrasse's avatar
Olivier Lagrasse committed
669
        // glLineWidth(1.5f);
Olivier Lagrasse's avatar
Olivier Lagrasse committed
670 671
        glBegin(GL_LINES);
        {
Olivier Lagrasse's avatar
Olivier Lagrasse committed
672 673
            glColor3d(0.8, 0.8, 0.8);glVertex2d(start_time, start_height);
            glColor3d(1.0, 1.0, 1.0);glVertex2d(end_time, end_height);
674
        }
Olivier Lagrasse's avatar
Olivier Lagrasse committed
675
        glEnd();
Olivier Lagrasse's avatar
Olivier Lagrasse committed
676
        // glLineWidth(1.0f);/* 1 is the default value */
677

Olivier Lagrasse's avatar
Olivier Lagrasse committed
678 679
        glPopMatrix();
    }
680 681 682
}


683 684
inline void Render_area::draw_event(const Element_pos time, const Element_pos height,  const Element_pos container_height){

685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702
    Event_ buf;

    buf.time = time;
    buf.height = height;
    buf.container_height = container_height;

    _events.push_back(buf);
}


inline void Render_area::draw_stored_events(std::vector<Event_> &events){

    Element_pos time, height, container_height;

    /* Manage the event drawing size from state size and render area dimensions */
    Element_pos event_scale_x = _state_scale*(_render_width/_state_x_max);
    Element_pos event_scale_y = _render_height/_state_y_max;

703 704 705 706 707 708
    Element_pos radius;/* the circle radius */
    Element_pos angle;
    Element_pos delta_angle;
    int step;


709
    for (long i=0 ; i<(long)events.size() ; i++){
710

711 712 713
        time = events[i].time*event_scale_x + _render_width*_x_scale_container_state-_state_translate; 
        height = events[i].height*event_scale_y;
        container_height = events[i].container_height*event_scale_y;
714 715


716 717 718
        /* DEBUG */
        //  std::cerr << "Event draw: (" << time << ", " << height << ") with height of:" << container_height << " - " << _render_width << " : " << _render_height << std::endl;
    
719

720 721 722 723 724
        /* IMPROVEMENT: put the circle into a display list */
        


        /* draw a circle */
725
        radius = 1.0f;
726 727 728 729 730 731 732 733 734 735 736
        angle = PI/2.0f;
        step = 20;/* 20 polygons for the circle */
        
        if (step!=0)
            delta_angle = 2*PI/step;
        
        
        glColor3d(0.5, 0.8, 0.5);
        glBegin(GL_POLYGON);
        {
            for(int i =0 ; i<step ; i++){
Olivier Lagrasse's avatar
Olivier Lagrasse committed
737
                glVertex3d(time + cos(angle+delta_angle*i)*radius , height + sin(angle+delta_angle*i)*radius , _z_event);
738
            }
739
        }
740 741 742
        glEnd();
        
        /* draw line */
Olivier Lagrasse's avatar
Olivier Lagrasse committed
743
        // glLineWidth(1.5f);
744

745 746
        glBegin(GL_LINES);
        {
Olivier Lagrasse's avatar
Olivier Lagrasse committed
747 748
            glColor3d(0.5, 0.8, 0.5);glVertex3d(time, height, _z_event);
            glColor3d(0.4, 0.7, 0.4);glVertex3d(time, height+container_height, _z_event);
749 750
        }
        glEnd();
Olivier Lagrasse's avatar
Olivier Lagrasse committed
751
        // glLineWidth(1.0f);
752

753
    }/* and loop */
754 755 756
}


757 758 759 760 761 762 763 764
/********************
 * Counter
 *******************/

inline void Render_area::start_draw_counter(){

    _list_counters = glGenLists(1);/* create the list */
    if (_list_counters==0){
Olivier Lagrasse's avatar
Olivier Lagrasse committed
765
        //message_ns::message << "Error when creating list" << message_ns::ende;
766 767 768 769
    }
    
    glNewList(_list_counters, GL_COMPILE);/* open the list */

Olivier Lagrasse's avatar
Olivier Lagrasse committed
770
   
771 772 773 774
}


inline void Render_area::draw_counter(const Element_pos x, const Element_pos y){
Olivier Lagrasse's avatar
Olivier Lagrasse committed
775
    
Olivier Lagrasse's avatar
Olivier Lagrasse committed
776 777
    static bool line_already_begun = false;

778
    if (x <= 0.0 ){
Olivier Lagrasse's avatar
Olivier Lagrasse committed
779 780 781 782 783 784 785
        
        if (line_already_begun==true){/* it is not the first call */
            glEnd();
        }else
            line_already_begun = true;

        glBegin(GL_LINE_STRIP);/* set of connected verteces */
786
        glColor3d(1.0, 1.0, 1.0);glVertex2d(0.0, y);/* draw the init point */
Olivier Lagrasse's avatar
Olivier Lagrasse committed
787

788
        _counter_last_x = 0.0;
Olivier Lagrasse's avatar
Olivier Lagrasse committed
789 790 791 792 793 794

    }else{

        glColor3d(1.0, 1.0, 1.0);glVertex2d(x, y);

        _counter_last_x = x;
Olivier Lagrasse's avatar
Olivier Lagrasse committed
795
    }
Olivier Lagrasse's avatar
Olivier Lagrasse committed
796

Olivier Lagrasse's avatar
Olivier Lagrasse committed
797
    _counter_last_y = y;
798 799 800 801
}


inline void Render_area::end_draw_counter(){
Olivier Lagrasse's avatar
Olivier Lagrasse committed
802
   
Olivier Lagrasse's avatar
Olivier Lagrasse committed
803 804
    glEnd();/* suppose that line is not ended */

805 806 807 808
    glEndList();/* close the list */
}


809

810 811 812 813 814
inline void Render_area::end_draw(){

}


815
 #endif