Render_alternate.cpp 27.8 KB
Newer Older
1 2 3 4 5 6 7 8
/*
** This file is part of the ViTE project.
**
** This software is governed by the CeCILL-A license under French law
** and abiding by the rules of distribution of free software. You can
** use, modify and/or redistribute the software under the terms of the
** CeCILL-A license as circulated by CEA, CNRS and INRIA at the following
** URL: "http://www.cecill.info".
Thibault Soucarre's avatar
Thibault Soucarre committed
9
**
10 11 12 13 14
** As a counterpart to the access to the source code and rights to copy,
** modify and redistribute granted by the license, users are provided
** only with a limited warranty and the software's author, the holder of
** the economic rights, and the successive licensors have only limited
** liability.
Thibault Soucarre's avatar
Thibault Soucarre committed
15
**
16 17 18 19 20 21 22 23 24 25
** In this respect, the user's attention is drawn to the risks associated
** with loading, using, modifying and/or developing or reproducing the
** software by the user in light of its specific status of free software,
** that may mean that it is complicated to manipulate, and that also
** therefore means that it is reserved for developers and experienced
** professionals having in-depth computer knowledge. Users are therefore
** encouraged to load and test the software's suitability as regards
** their requirements in conditions enabling the security of their
** systems and/or data to be ensured and, more generally, to use and
** operate it in the same conditions as regards security.
Thibault Soucarre's avatar
Thibault Soucarre committed
26
**
27 28 29 30 31 32 33 34 35 36 37 38 39
** The fact that you are presently reading this means that you have had
** knowledge of the CeCILL-A license and that you accept its terms.
**
**
** ViTE developers are (for version 0.* to 1.0):
**
**        - COULOMB Kevin
**        - FAVERGE Mathieu
**        - JAZEIX Johnny
**        - LAGRASSE Olivier
**        - MARCOUEILLE Jule
**        - NOISETTE Pascal
**        - REDONDY Arthur
Thibault Soucarre's avatar
Thibault Soucarre committed
40
**        - VUCHENER Clément
41 42 43 44 45 46 47 48
**
*/
/*!
 *\file Render_alternate.cpp
 */


#include "common/common.hpp"
49
#include "common/Info.hpp"
50
#include "common/Message.hpp"
51
/* -- */
52
//#include "render/GanttDiagram.hpp"
53 54 55

#include <GL/glew.h>
/* -- */
56 57 58 59
#include <QFile> // For loading the wait image
#include <QDate>
#include <QTimer>
/* -- */
60
#include "interface/resource.hpp"
61 62 63 64 65 66 67 68
#include "interface/Interface.hpp"
/* -- */
#include "common/common.hpp"
#include "common/Info.hpp"
#include "common/Message.hpp"
/* -- */
#include "render/Ruler.hpp"
#include "render/Render_alternate.hpp"
69
#include "render/GanttDiagram.hpp"
70
/* -- */
71 72 73
#include "core/Core.hpp"
#include "render/vbo.hpp"
#include <iostream>
74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96

using namespace std;


#define message *Message::get_instance() << "(" << __FILE__ << " l." << __LINE__ << "): "

static bool _draw_container;
static bool _draw_ruler;
static bool _draw_arrow;
static bool _draw_event;
const int Render_alternate::DRAWING_TIMER_DEFAULT = 10;

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

Render_alternate::Render_alternate(Core* core, QWidget *parent, const QGLFormat& format)
97
    : Hook_event(this, core, parent, format){
98 99 100 101 102 103 104

    _arrows.clear();
    _circles.clear();
    _texts.clear();
    _vbos.clear();


Thibault Soucarre's avatar
Thibault Soucarre committed
105

106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128
    setAutoFillBackground(false);
}


Render_alternate::~Render_alternate(){
}

/***********************************
 *
 *
 *
 * Default QGLWidget functions.
 *
 *
 *
 **********************************/

void  Render_alternate::initializeGL() {
    glClearColor(0.5f, 0.5f, 0.55f, 1.0f);

    glEnable(GL_DEPTH_TEST);

    glClearStencil(0);
129 130 131 132 133
    std::cout << "init" << std::endl;
    if(_core == NULL)
        std::cout << "_core = NULL" << std::endl;
    _core->waitGUIInit->quit();
    std::cout << "init ok" << std::endl;
134 135 136 137
}

void  Render_alternate::resizeGL(int width, int height) {
    glViewport(0, 0, width, height);
Thibault Soucarre's avatar
Thibault Soucarre committed
138

139 140 141
    /* update informations about widget size */
    Info::Screen::width  = width;
    Info::Screen::height = height;
Thibault Soucarre's avatar
Thibault Soucarre committed
142

143 144 145 146
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();


Thibault Soucarre's avatar
Thibault Soucarre committed
147

148 149
    if(DRAWING_STATE_WAITING == _state){// A wait is drawn
        glOrtho(-50, 50, -50, 50, 0, 1000);
Thibault Soucarre's avatar
Thibault Soucarre committed
150
    }else if (DRAWING_STATE_DRAWING == _state){// A trace is drawn
151 152 153 154
        glOrtho(0, Info::Render::width, 0, Info::Render::height, 0, -1000);
    }else{
        message << tr("Undefined value for the drawing state attribute - Render area").toStdString() << Message::ende;
    }
Thibault Soucarre's avatar
Thibault Soucarre committed
155

156 157 158 159 160 161

    glMatrixMode(GL_MODELVIEW);
}


void  Render_alternate::paintGL(){
Thibault Soucarre's avatar
Thibault Soucarre committed
162

163 164 165
    resizeGL(Render_alternate::QGLWidget::width(), Render_alternate::QGLWidget::height());
    Render_alternate::QGLWidget::setFocus(Qt::ActiveWindowFocusReason);/* give the focus to the render area for mouse and keyboard events */

Thibault Soucarre's avatar
Thibault Soucarre committed
166

167 168 169 170 171
    glClearDepth(1.0);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glLoadIdentity();

Thibault Soucarre's avatar
Thibault Soucarre committed
172

173
    if(DRAWING_STATE_WAITING == _state){/* A wait is drawn */
Thibault Soucarre's avatar
Thibault Soucarre committed
174

175 176 177
        /* turn around y axis */
        _wait_angle+=0.1f;
        if (_wait_angle>=360) _wait_angle=0.0f;
Thibault Soucarre's avatar
Thibault Soucarre committed
178

179
        glPushMatrix();
Thibault Soucarre's avatar
Thibault Soucarre committed
180

181
        glScalef(15, 15, 0);
Thibault Soucarre's avatar
Thibault Soucarre committed
182

183 184
        glRotatef(-_wait_angle,0, 1, 0);
        glRotatef(_wait_angle_y, 1, 0, 0);
Thibault Soucarre's avatar
Thibault Soucarre committed
185

186 187

        glPopMatrix();
Thibault Soucarre's avatar
Thibault Soucarre committed
188 189


190 191 192 193 194
    }else if (DRAWING_STATE_DRAWING == _state){/* A trace is drawn */
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();

        glPushMatrix();
Thibault Soucarre's avatar
Thibault Soucarre committed
195
        {
196
            glTranslated(0.0, Info::Render::height, 100.0);
Thibault Soucarre's avatar
Thibault Soucarre committed
197 198
            glRotated(180.0, 1.0, 0.0, 0.0);

199 200 201

            glPushMatrix();
            {
Thibault Soucarre's avatar
Thibault Soucarre committed
202

203 204 205
                glTranslated(_default_entity_x_translate - _x_state_translate, _ruler_y + _ruler_height - _y_state_translate, 0.0);
                glScalef(_x_state_scale, _y_state_scale, 1.0);

Thibault Soucarre's avatar
Thibault Soucarre committed
206
                for (unsigned int i=0 ;
207 208 209 210 211
                     i<_vbos.size()   ;
                     i++){
                    _vbos[i]->display();
                }
            }
Thibault Soucarre's avatar
Thibault Soucarre committed
212
            glPopMatrix();
213 214 215 216 217 218

            call_ruler();


             if (false == Info::Render::_no_arrows)/* display arrows */
                 draw_stored_arrows();
Thibault Soucarre's avatar
Thibault Soucarre committed
219

220 221
             if (false == Info::Render::_no_events)/* display events */
                 draw_stored_circles();
Thibault Soucarre's avatar
Thibault Soucarre committed
222

223 224 225 226 227 228
        }
        glPopMatrix();

        glPushMatrix();
        {
            glTranslated(0.0,  0.0, 100.0);/* not accurate */
Thibault Soucarre's avatar
Thibault Soucarre committed
229

230
            if (_mouse_pressed){
Thibault Soucarre's avatar
Thibault Soucarre committed
231 232


233
                glTranslated(0.0, 0.0, _z_container_under);
Thibault Soucarre's avatar
Thibault Soucarre committed
234

235
                Element_pos old_x, old_y, new_x, new_y;
Thibault Soucarre's avatar
Thibault Soucarre committed
236 237


238 239 240 241 242 243 244

                old_x = _mouse_x*(Info::Render::width/Info::Screen::width);
                old_y =  Info::Render::height - _mouse_y*(Info::Render::height/Info::Screen::height);
                new_x = _new_mouse_x*(Info::Render::width/Info::Screen::width);
                new_y =  Info::Render::height - _new_mouse_y*(Info::Render::height/Info::Screen::height);

#ifdef DEBUG_MODE_RENDER_OPENGL
Thibault Soucarre's avatar
Thibault Soucarre committed
245 246 247

                cerr << __FILE__ << " l." << __LINE__ << ":" << endl;
                cerr << "Selection rectangle position: (" << old_x << ", " << old_y << ") - (" << new_x << ", " << new_y << ")" << endl;
248
#endif
Thibault Soucarre's avatar
Thibault Soucarre committed
249

250
                glEnable(GL_BLEND);
Thibault Soucarre's avatar
Thibault Soucarre committed
251 252
                glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

253 254 255 256 257 258 259 260 261
                /* Square for selection */
                glBegin(GL_QUADS);
                {
                    glColor4d(0.9, 1.0, 0.9, _selection_rectangle_alpha);glVertex2d(old_x, old_y);
                    glColor4d(0.9, 0.9, 0.9, _selection_rectangle_alpha);glVertex2d(old_x, new_y);
                    glColor4d(0.9, 0.9, 0.9, _selection_rectangle_alpha);glVertex2d(new_x, new_y);
                    glColor4d(0.9, 0.9, 0.9, _selection_rectangle_alpha);glVertex2d(new_x, old_y);
                }
                glEnd();
Thibault Soucarre's avatar
Thibault Soucarre committed
262

263
                glDisable(GL_BLEND);
Thibault Soucarre's avatar
Thibault Soucarre committed
264

265 266 267 268 269 270 271 272 273
            }/* end  if (true==_mouse_pressed) */
        }
        glPopMatrix();



    }else{
        message << tr("Undefined value for the drawing state attribute - Render area").toStdString() << Message::ende;
    }
Thibault Soucarre's avatar
Thibault Soucarre committed
274

275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335
    glFlush();


    /* Check the errors */
    GLenum glerror;
    glerror = glGetError();
    if(glerror != GL_NO_ERROR)
        message << tr("Render area : the following OpengGL error occured: ").toStdString() << (char *)gluErrorString(glerror) << Message::endw;



    if(DRAWING_STATE_WAITING == _state)/* A wait is drawn, do not take car about the ruler drawing */
        return;

    QFont arial_font = QFont("Arial", 10);
    qglColor(Qt::white);//QColor(0, 0, 0));


    /* Draw container text */
    const unsigned int texts_size = _texts.size();
    for (unsigned int i=0 ; i<texts_size ; i++){
        const QFontMetrics metric(arial_font);
        const QString text_elided = metric.elidedText(_texts[i].value.c_str(), Qt::ElideRight, _x_scale_container_state*Info::Screen::width/3.);
        renderText ( render_to_screen_x(_texts[i].x * _x_scale_container_state/0.20),
                     render_to_screen_y( trace_to_render_y(_texts[i].y) + 0.5),
                     text_elided,
                     arial_font);
    }

    /* Draw ruler text */
    std::ostringstream buf_txt;
    Element_pos graduation_diff;
    Element_pos coeff_prefix;
    graduation_diff = Ruler::get_graduation_diff(Info::Render::_x_min_visible, Info::Render::_x_max_visible);
    coeff_prefix    = Ruler::get_coeff_for_common_prefix(Info::Render::_x_min_visible, Info::Render::_x_max_visible);

    //    painter.setFont(QFont("Arial", 14));

    arial_font.setPointSize(14);

    buf_txt.str("");/* flush the buffer */
    buf_txt << "min: " << (double)Info::Render::_x_min_visible;

    renderText (render_to_screen_x(trace_to_render_x(Info::Render::_x_min_visible)),
                render_to_screen_y(3),
                buf_txt.str().c_str(),
                arial_font);

    buf_txt.str("");/* flush the buffer */
    buf_txt << "max: " << (double)Info::Render::_x_max_visible;

    renderText (render_to_screen_x(trace_to_render_x(Info::Render::_x_max_visible))-130,
                render_to_screen_y(3),
                buf_txt.str().c_str(),
                arial_font);

    buf_txt.str("");
    buf_txt << Ruler::get_common_part_string(Info::Render::_x_min_visible, coeff_prefix) << "--";

    renderText (render_to_screen_x(
                                   trace_to_render_x(
Thibault Soucarre's avatar
Thibault Soucarre committed
336 337
                                                     (Info::Render::_x_min_visible +
                                                      Info::Render::_x_max_visible) / 2)),
338 339 340 341 342 343
                render_to_screen_y(3),
                buf_txt.str().c_str(),
                arial_font);

    arial_font.setPointSize(10);

Thibault Soucarre's avatar
Thibault Soucarre committed
344 345
    for (Element_pos i = Info::Render::_x_min_visible ;
         i < Info::Render::_x_max_visible ;
346 347 348 349
         i+=graduation_diff){

        buf_txt.str("");/* flush the buffer */
        buf_txt << Ruler::get_variable_part(i, coeff_prefix, 2);
Thibault Soucarre's avatar
Thibault Soucarre committed
350

351 352 353 354
        renderText (render_to_screen_x(trace_to_render_x(i)+1),
                    render_to_screen_y(8),
                    buf_txt.str().c_str(),
                    arial_font);
Thibault Soucarre's avatar
Thibault Soucarre committed
355
    }
356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374
}





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



bool Render_alternate::build(){
Thibault Soucarre's avatar
Thibault Soucarre committed
375

376 377 378 379 380 381 382 383 384 385 386 387
    _state = DRAWING_STATE_DRAWING;/* change the drawing state */

    /* disable some OpenGL features to enhance the rendering */
    glDisable(GL_TEXTURE_2D);
    glDisable(GL_BLEND);

    replace_scale(1);/* for states scaling */
    _x_state_translate = 0;/* for states translation */
    _y_state_scale = 1;/* for states scaling */
    _y_state_translate = 0;/* for states translation */
    _x_scroll_pos = 0;/* horizontal bar placed on 0 */
    _y_scroll_pos = 0;/* vertical bar placed on 0 */
Thibault Soucarre's avatar
Thibault Soucarre committed
388

389 390 391 392 393 394 395 396 397
    if (NULL == _render_instance)
        return true;

    return true;
}



bool Render_alternate::unbuild(){
Thibault Soucarre's avatar
Thibault Soucarre committed
398

399 400 401 402 403 404 405 406 407
    /**********************
     *
     * Init OpenGL features
     *
     **********************/

    /* enable some OpenGL features*/
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
Thibault Soucarre's avatar
Thibault Soucarre committed
408

409 410
    glEnable(GL_TEXTURE_2D);

Thibault Soucarre's avatar
Thibault Soucarre committed
411
    glEnable(GL_BLEND);/* enable blending for the alpha color */
412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

    glColor3d(1.0, 1.0, 1.0);/* init color to white */


    /*****************************
     *
     * Init render area attributes
     *
     *****************************/

    _state = DRAWING_STATE_WAITING;/* change the drawing state */

    _wait_angle=0.0f;/* begin with 0 rad angle */
    _wait_angle_y=0.0f;/* begin with 0 rad angle */

Thibault Soucarre's avatar
Thibault Soucarre committed
428
    /* init measurement attributes */
429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451
    Info::Container::x_max = 0;
    Info::Container::y_max = 0;
    Info::Container::x_min = 0;
    Info::Container::y_min = 0;

    //    Info::Render::_ui_render_min_value->setText("");
    // Info::Render::_ui_render_max_value->setText("");

    Info::Entity::x_max = 0;
    Info::Entity::x_min = 0;
    //    _state_x_max = 0;
    _state_y_max = 0;
    //    _state_x_min = 0;
    _state_y_min = 0;

    /* clear lists to store container texts */
    _text_pos.clear();
    _text_value.clear();

    _arrows.clear();
    _circles.clear();
    _texts.clear();

Thibault Soucarre's avatar
Thibault Soucarre committed
452
    for (unsigned int i=0 ;
453 454 455 456 457 458 459 460 461 462 463
         i<_vbos.size()   ;
         i++){
        delete _vbos[i];
    }
    _vbos.clear();

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

    /* clear the arrow vector */
    // _arrows.clear();
Thibault Soucarre's avatar
Thibault Soucarre committed
464

465 466 467 468 469 470 471 472 473 474
    /* empty the selection stack */
    while(false == _previous_selection.empty())
        _previous_selection.pop();

    if (NULL == _render_instance)
        return true;

    /* Now, timer is set */
    if (_wait_timer == NULL){
        _wait_angle = 0.0f;
Thibault Soucarre's avatar
Thibault Soucarre committed
475

476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504
        /*  _wait_timer = new QTimer(this);
        connect(_wait_timer, SIGNAL(timeout()), _render_instance, SLOT(updateGL()));
        _wait_timer->start(_wait_spf);*/
    }


    return true;//_render_instance->display_unbuild();
}





/***********************************
 *
 *
 *
 * Drawing function for the wait screen.
 *
 *
 *
 **********************************/



GLuint Render_alternate::draw_wait() {
    GLuint object;
    GLuint texture;

Thibault Soucarre's avatar
Thibault Soucarre committed
505 506
    glGenTextures(1, &texture);/* create the texture and link it with the list previously created */

507
    QFile texture_file(QString(":/img/img/logo") +  QDate::currentDate().toString("MMdd") + QString(".png"));
Thibault Soucarre's avatar
Thibault Soucarre committed
508

509 510 511 512 513
    if (true == texture_file.exists())/* The texture exists */
        texture = bindTexture(QPixmap(texture_file.fileName()), GL_TEXTURE_2D);
    else/* use the default picture */
        texture = bindTexture(QPixmap(":/img/img/logo.png"), GL_TEXTURE_2D);

Thibault Soucarre's avatar
Thibault Soucarre committed
514

515 516 517
    /* apply some parameters on the texture */
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
Thibault Soucarre's avatar
Thibault Soucarre committed
518

519 520
    glEnable(GL_TEXTURE_2D);

Thibault Soucarre's avatar
Thibault Soucarre committed
521
    glEnable(GL_BLEND);/* enable blending for the alpha color */
522 523
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

Thibault Soucarre's avatar
Thibault Soucarre committed
524

525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547
    /* Now, timer is set */
    if (_wait_timer == NULL){
        _wait_angle = 0.0f;
        /*
        _wait_timer = new QTimer(this);
        connect(_wait_timer, SIGNAL(timeout()), _render_instance, SLOT(updateGL()));
        _wait_timer->start(_wait_spf);*/
    }

    return object;
}





void Render_alternate::call_ruler(){
    Element_pos graduation_diff;
    Element_pos coeff_prefix;
    const Element_pos offset_x = _default_entity_x_translate;
    const Element_pos offset_y = _ruler_y + _ruler_height+3.5;

    update_visible_interval_value();
Thibault Soucarre's avatar
Thibault Soucarre committed
548

549 550
    graduation_diff = Ruler::get_graduation_diff(Info::Render::_x_min_visible, Info::Render::_x_max_visible);
    coeff_prefix    = Ruler::get_coeff_for_common_prefix(Info::Render::_x_min_visible, Info::Render::_x_max_visible);
Thibault Soucarre's avatar
Thibault Soucarre committed
551

552
    set_color(1.0, 1.0, 1.0);
Thibault Soucarre's avatar
Thibault Soucarre committed
553

554 555 556 557 558 559 560 561 562 563
    for (Element_pos i = Info::Render::_x_min_visible ; i < Info::Render::_x_max_visible ; i+=graduation_diff){
        const Element_pos grad_div_by_5 = graduation_diff/5;
        for (Element_pos j = (i+grad_div_by_5) ; j<(i+graduation_diff) ; j+= grad_div_by_5){
            draw_line( trace_to_render_x(j) + offset_x, offset_y  ,
                       trace_to_render_x(j) + offset_x, 2+offset_y, _z_ruler);
        }

        draw_line( trace_to_render_x(i) + offset_x, offset_y-1  ,
                   trace_to_render_x(i) + offset_x, 4+offset_y, _z_ruler);
    }
Thibault Soucarre's avatar
Thibault Soucarre committed
564

565 566 567 568 569 570 571 572 573
    glBegin(GL_QUADS);
    {
        glColor4d(0.0, 0.0, 1.0, 0.8);
        glVertex3d(trace_to_render_x(Info::Render::_x_min_visible) , 0, _z_ruler_under );
        glVertex3d(trace_to_render_x(Info::Render::_x_min_visible) , 8, _z_ruler_under );
        glVertex3d(trace_to_render_x(Info::Render::_x_max_visible) , 8, _z_ruler_under );
        glVertex3d(trace_to_render_x(Info::Render::_x_max_visible) , 0, _z_ruler_under );
    }
    glEnd();
Thibault Soucarre's avatar
Thibault Soucarre committed
574

575 576 577 578 579 580 581 582 583
    glBegin(GL_QUADS);
    {
        glColor4d(0.0, 0.0, 0.0, 1.0);
        glVertex3d(trace_to_render_x(Info::Render::_x_min_visible) , 0, _z_ruler_over );
        glVertex3d(trace_to_render_x(Info::Render::_x_min_visible) , 3, _z_ruler_over );
        glVertex3d(trace_to_render_x(Info::Render::_x_max_visible) , 3, _z_ruler_over );
        glVertex3d(trace_to_render_x(Info::Render::_x_max_visible) , 0, _z_ruler_over );
    }
    glEnd();
Thibault Soucarre's avatar
Thibault Soucarre committed
584

585
    return;
Thibault Soucarre's avatar
Thibault Soucarre committed
586
}
587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622



void Render_alternate::set_color(float r, float g, float b){
    _red = r;
    _green = g;
    _blue = b;
}

void Render_alternate::draw_text(const Element_pos x, const Element_pos y, const Element_pos, const std::string s){
    if (_draw_ruler) return;/* do not draw text for ruler */

        Container_text_ buf;

        buf.x     = x;
        buf.y     = render_to_trace_y(y);/* Cancel previous transformation. */
        buf.value = s;

        _texts.push_back(buf);
}


void Render_alternate::draw_quad(Element_pos x, Element_pos y, Element_pos z, Element_pos w, Element_pos h){
    int state;
    Element_pos data[8];

    Element_pos offset_x;
    const Element_pos offset_y = -_ruler_y - _ruler_height;

    offset_x = 0;

    if (!_draw_container)
        offset_x = -_default_entity_x_translate;

    data[0] = x + offset_x;
    data[1] = y + offset_y;
Thibault Soucarre's avatar
Thibault Soucarre committed
623
    data[2] = x + offset_x;
624 625 626 627 628 629 630 631 632 633 634 635 636
    data[3] = y + h + offset_y;
    data[4] = x + w + offset_x;
    data[5] = y + h + offset_y;
    data[6] = x + w + offset_x;
    data[7] = y + offset_y;

    state = Vbo::VBO_OK;

    if(NULL != _current_vbo)
        state = _current_vbo->add(8, data);

    if (Vbo::VBO_OUT_OF_MEMORY == state){
        /* Store the current vbo */
Thibault Soucarre's avatar
Thibault Soucarre committed
637 638
        _vbos.push_back(_current_vbo);

639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692
        /* Create a new vbo */
        _current_vbo = NULL;/* DO NOT DEALLOCATE BEFORE! */
        _current_vbo = new Vbo(100000, _current_vbo->QUADS);

        if (NULL == _current_vbo)
            message << tr("Cannot create a Vbo for states.").toStdString() << Message::ende;
    }

    /*
    glBegin(GL_QUADS);
    {
        glColor3d(_red, _green, _blue);
        glVertex3d(x + offset_x    , y + offset_y    , z        );
        glVertex3d(x + offset_x    , y + h + offset_y, z        );
        glColor3d(_red/1.5         , _green/1.5      , _blue/1.5);
        glVertex3d(x + w + offset_x, y + h + offset_y, z        );
        glVertex3d(x + w + offset_x, y + offset_y    , z        );
    }
    glEnd();*/
}

void Render_alternate::draw_triangle(Element_pos , Element_pos ,
                                  Element_pos , Element_pos ){
}

void Render_alternate::draw_line(Element_pos x1, Element_pos y1, Element_pos x2, Element_pos y2, Element_pos z){
    if (_draw_ruler || _draw_arrow || _draw_event) return;/* do not draw line for ruler or for arrow or for event */


    const Element_pos offset_x = -_default_entity_x_translate;
    const Element_pos offset_y = -_ruler_y - _ruler_height;

    glBegin(GL_LINES);
    {
        glColor3d(_red, _green, _blue);
        glVertex3d(x1 + offset_x, y1 + offset_y, z);
        glVertex3d(x2 + offset_x, y2 + offset_y, z);
    }
    glEnd();
}

void Render_alternate::draw_circle(Element_pos /*x*/, Element_pos /*y*/, Element_pos /*z*/, Element_pos /*r*/){
}


void Render_alternate::start_draw(){
    /* Init GLEW */
    glewInit();
    _draw_ruler = false;
    _draw_container = false;
    _draw_arrow = false;
    _draw_event = false;

    _current_vbo = NULL;
Thibault Soucarre's avatar
Thibault Soucarre committed
693

694 695 696 697 698 699 700
}

void Render_alternate::start_draw_containers(){
    _list_containers = glGenLists(1);/* create the list */
    if (_list_containers == 0) {
        *Message::get_instance() << tr("Error when creating list.").toStdString() << Message::endw;
    }
Thibault Soucarre's avatar
Thibault Soucarre committed
701

702 703 704 705 706
    glNewList(_list_containers, GL_COMPILE);/* open the list */
    _draw_container = true;
}

void Render_alternate::draw_container(const Element_pos , const Element_pos , const Element_pos , const Element_pos ){
Thibault Soucarre's avatar
Thibault Soucarre committed
707

708 709 710 711 712 713 714 715
}

void Render_alternate::draw_container_text(const Element_pos , const Element_pos , const std::string ){
}

void Render_alternate::end_draw_containers(){
    _draw_container = false;
    glEndList();/* close the list */
716
    cout << "end_draw_containers" << endl;
717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732
}

void Render_alternate::start_draw_states(){
    _current_vbo = NULL;
    _current_vbo = new Vbo((1<<20), _current_vbo->QUADS);/* Allocate 1 MiB */

    if (NULL == _current_vbo)
        message << tr("Cannot create a Vbo for states.").toStdString() << Message::ende;
}

void Render_alternate::draw_state(const Element_pos , const Element_pos , const Element_pos , const Element_pos , const Element_col , const Element_col , const Element_col ){
}

void Render_alternate::end_draw_states(){

    _vbos.push_back(_current_vbo);
733
    cout << "end_draw_states" << endl;
734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759
}

void Render_alternate::start_draw_arrows(){
    _draw_arrow = true;

}

void Render_alternate::draw_arrow(const Element_pos start_time, const Element_pos end_time, const Element_pos start_height, const Element_pos end_height, const Element_col red, const Element_col green, const Element_col blue){

    Arrow_ buf;
    const Element_pos offset_x = -_default_entity_x_translate;
    const Element_pos offset_y = -_ruler_y - _ruler_height;

    buf.start_time   = start_time   + offset_x;
    buf.end_time     = end_time     + offset_x;
    buf.start_height = start_height + offset_y;
    buf.end_height   = end_height   + offset_y;
    buf.red          = red;
    buf.green        = green;
    buf.blue         = blue;

    _arrows.push_back(buf);
}

void Render_alternate::end_draw_arrows(){
    _draw_arrow = false;
760
    cout << "end_draw_arrows" << endl;
761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784
}

void Render_alternate::start_draw_events(){
    _draw_event = true;
}

void Render_alternate::draw_event(const Element_pos time, const Element_pos height,  const Element_pos container_height){
    Event_ buf;
    const Element_pos offset_x = -_default_entity_x_translate;
    const Element_pos offset_y = -_ruler_y - _ruler_height;

    buf.time             = time   + offset_x;
    buf.height           = height + offset_y;
    buf.container_height = container_height   + offset_y;
    buf.red              = _red;
    buf.green            = _green;
    buf.blue             = _blue;

    _circles.push_back(buf);
}


void Render_alternate::end_draw_events(){
    _draw_event = false;
785
    cout << "end_draw_events" << endl;
786 787 788 789 790 791 792 793 794
}

void Render_alternate::start_draw_counter(){
}

void Render_alternate::draw_counter(const Element_pos , const Element_pos ){
}

void Render_alternate::end_draw_counter(){
795
    cout << "end_draw_counters" << endl;
796 797 798 799 800 801 802 803 804 805 806
}

void Render_alternate::start_ruler(){
    _draw_ruler = true;
}

void Render_alternate::end_ruler(){
    _draw_ruler = false;
}

void Render_alternate::end_draw(){
807
    cout << "end_draw" << endl;
808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825
}


void Render_alternate::draw_stored_texts(){
}

void Render_alternate::draw_stored_arrows(){

    /* Only draw triangle. Lines are already in a display list */
    const Element_pos coeff = 180.0f/M_PI;
    Element_pos angle;
    Element_pos start_time, end_time, start_height, end_height;
    Element_pos scaled_start_time, scaled_end_time, scaled_start_height, scaled_end_height;



    const unsigned int arrow_size = _arrows.size();
    for (unsigned int i=0 ; i<arrow_size ; i++){
Thibault Soucarre's avatar
Thibault Soucarre committed
826

827 828 829 830 831 832
        start_time   = _arrows[i].start_time;// + _x_state_scale*_x_state_translate;
        end_time     = _arrows[i].end_time;// + _x_state_scale*_x_state_translate;
        start_height = _arrows[i].start_height;
        end_height   = _arrows[i].end_height;

        set_color(_arrows[i].red, _arrows[i].green, _arrows[i].blue);
Thibault Soucarre's avatar
Thibault Soucarre committed
833

834 835 836 837 838 839 840
        scaled_start_time   = start_time   * _x_state_scale;
        scaled_end_time     = end_time     * _x_state_scale;
        scaled_start_height = start_height * _y_state_scale;
        scaled_end_height   = end_height   * _y_state_scale;

        glPushMatrix();
        {
Thibault Soucarre's avatar
Thibault Soucarre committed
841 842

            glTranslated(_default_entity_x_translate + _x_state_scale*end_time - _x_state_translate,
843 844 845 846 847 848 849 850 851
                         _ruler_y + _ruler_height + _y_state_scale*end_height - _y_state_translate,
                         _z_arrow);

            if (start_time != end_time){
                angle = atan2((scaled_end_height - scaled_start_height), (scaled_end_time - scaled_start_time))*coeff;/* arc tangent */
                glRotatef(angle, 0, 0, 1);
            }
            else
                glRotatef(90, 0, 0, 1);/* vertical alignment */
Thibault Soucarre's avatar
Thibault Soucarre committed
852

853 854 855 856 857 858 859 860
            glBegin(GL_TRIANGLES);
            {
                // glColor3d(_red, _green, _blue);
                glVertex2d(0.0, 0.0);
                glVertex2d(-1.2, -0.4);
                glVertex2d(-1.2, 0.4);
            }
            glEnd();
Thibault Soucarre's avatar
Thibault Soucarre committed
861

862 863 864 865 866
        }
        glPopMatrix();

        glPushMatrix();
        {
Thibault Soucarre's avatar
Thibault Soucarre committed
867

868 869 870 871
            glTranslated(_default_entity_x_translate - _x_state_translate,
                         _ruler_y + _ruler_height - _y_state_translate,
                         _z_arrow);
            glScalef(_x_state_scale, _y_state_scale, 1.0);
Thibault Soucarre's avatar
Thibault Soucarre committed
872

873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892
            glBegin(GL_LINES);
            {
                glVertex2d(start_time, start_height);
                glVertex2d(end_time  , end_height  );
            }
            glEnd();
        }
        glPopMatrix();
    }
}

void Render_alternate::draw_stored_circles(){
    const int step          = 20;/* 20 polygons for the circle */
    const float angle       = M_PI/2.0f;
    const float delta_angle = 2*M_PI/step;
    const float radius = .5f;

    const unsigned int size = _circles.size();

    for (unsigned int i=0 ; i<size ; i++){
Thibault Soucarre's avatar
Thibault Soucarre committed
893

894 895 896
        glPushMatrix();
        {

Thibault Soucarre's avatar
Thibault Soucarre committed
897 898
            set_color(1.0 - _circles[i].red, 1.0 - _circles[i].green, 1.0 - _circles[i].blue);

899 900 901
            glTranslated(_default_entity_x_translate - _x_state_translate,
                         _ruler_y + _ruler_height - _y_state_translate,
                         _z_arrow);
Thibault Soucarre's avatar
Thibault Soucarre committed
902 903 904

             glScalef(_x_state_scale, _y_state_scale, 1.0);

905
             /* Draw the circle */
Thibault Soucarre's avatar
Thibault Soucarre committed
906

907 908 909 910
             glBegin(GL_POLYGON);
             {
                 for(int j = 0 ; j < step ; j ++){
                     glVertex2d(_circles[i].time + cos(angle+delta_angle*j)*radius/_x_state_scale,
Thibault Soucarre's avatar
Thibault Soucarre committed
911
                                _circles[i].height + sin(angle+delta_angle*j)*(radius/_y_state_scale)*Info::Screen::width/Info::Screen::height);
912 913 914 915
                 }
             }
             glEnd();

Thibault Soucarre's avatar
Thibault Soucarre committed
916 917 918

             set_color(_circles[i].red, _circles[i].green, _circles[i].blue);

919 920 921 922 923
             /* Draw the sub-circle */
             glBegin(GL_POLYGON);
             {
                 for(int j = 0 ; j < step ; j ++){
                     glVertex3d(_circles[i].time + cos(angle+delta_angle*j)*radius/(1.2*_x_state_scale) ,
Thibault Soucarre's avatar
Thibault Soucarre committed
924
                                _circles[i].height + sin(angle+delta_angle*j)*radius/(1.2*_y_state_scale)*Info::Screen::width/Info::Screen::height ,
925 926 927 928
                                0.1);
                 }
             }
             glEnd();
Thibault Soucarre's avatar
Thibault Soucarre committed
929 930


931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947
             glLineWidth( 3.0 );
            /* Draw the line */
             glBegin(GL_LINES);
            {
                glVertex2d(_circles[i].time, _circles[i].height);
                glVertex2d(_circles[i].time, _circles[i].height+_circles[i].container_height);
            }
            glEnd();

            glLineWidth( 1.0 );


        }
        glPopMatrix();
    }

    set_color(1.0, 1.0, 1.0);
Thibault Soucarre's avatar
Thibault Soucarre committed
948

949
}
950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979

void Render_alternate::release(){
    std::cout << "release" << std::endl;
}

void Render_alternate::draw_text_value(long int id,double text, double y){
}

void Render_alternate::show_minimap(){
}

/*!
 * \brief draws the vertical helper line
 */

void Render_alternate::draw_vertical_line(){
}

/*!
 * \brief slot connected to the simple click event
 */
void Render_alternate::update_vertical_line(){
}

/*!
     * \brief set the vertical line offset
     * \param l the line offset.
     */
void Render_alternate::set_vertical_line(Element_pos l){
}