Render_alternate.cpp 44.7 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
**
*/
/*!
 *\file Render_alternate.cpp
 */
#include "common/common.hpp"
47
#include "common/Info.hpp"
48
#include "common/Message.hpp"
49
/* -- */
50
//#include "render/GanttDiagram.hpp"
51 52 53

#include <GL/glew.h>
/* -- */
54 55 56 57
#include <QFile> // For loading the wait image
#include <QDate>
#include <QTimer>
/* -- */
58
#include "interface/resource.hpp"
59 60 61 62 63 64 65 66
#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"
67
#include "render/GanttDiagram.hpp"
68
#include "render/Shader.hpp"
Thibault Soucarre's avatar
Thibault Soucarre committed
69
#include "render/text2D.hpp"
70
/* -- */
71 72 73
#include "core/Core.hpp"
#include "render/vbo.hpp"
#include <iostream>
74
#define PI 3.14159265
Thibault Soucarre's avatar
Thibault Soucarre committed
75
#define NB_STEPS 20
76 77 78 79 80 81 82

using namespace std;


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

static bool _draw_container;
Thibault Soucarre's avatar
Thibault Soucarre committed
83
static bool _draw_states;
84 85 86
static bool _draw_ruler;
static bool _draw_arrow;
static bool _draw_event;
Thibault Soucarre's avatar
Thibault Soucarre committed
87
static bool _draw_counter;
88
//const int Render_alternate::DRAWING_TIMER_DEFAULT = 10;
89 90 91 92 93 94 95 96 97 98 99 100

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

Render_alternate::Render_alternate(Core* core, QWidget *parent, const QGLFormat& format)
Thibault Soucarre's avatar
Thibault Soucarre committed
101
    : Hook_event(this, core, parent, format), _containers(GL_QUADS), _states(GL_QUADS), _circles(GL_POLYGON), _arrows(GL_LINE), _counters(GL_LINE), _ruler(GL_QUADS), _shader("vertexshader.vertexshader", "fragmentshader.fragmentshader"), _modelview(glm::mat4(1.0)), _projection(glm::mat4(1.0)){
Thibault Soucarre's avatar
Thibault Soucarre committed
102

103
    setAutoFillBackground(false);
104

105 106 107 108
}


Render_alternate::~Render_alternate(){
109
    //cleanupText2D();
110 111 112 113 114 115 116 117 118 119 120 121 122
}

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

void  Render_alternate::initializeGL() {
123 124
    glewExperimental = GL_TRUE;
    GLenum err = glewInit();
125
    if(err!=GLEW_OK){
126
        std::cout << "ERROR : GlewInit failed" << std::endl;
127
    }
128 129
    _shader.charger();
    glClearColor(0.5f, 0.5f, 0.55f, 0.0f);
130

131
    //glEnable(GL_DEPTH_TEST);
132

133
    //glClearStencil(0);
134 135 136 137 138
    std::cout << "init" << std::endl;
    if(_core == NULL)
        std::cout << "_core = NULL" << std::endl;
    _core->waitGUIInit->quit();
    std::cout << "init ok" << std::endl;
139 140
    _modelview = glm::scale(_modelview, glm::vec3(1,-1,1));
    _modelview = glm::translate(_modelview, glm::vec3(0,-Info::Render::height, 0));
141
    //initText2D("Holstein.DDS");
142 143 144 145
}

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

147 148 149
    /* update informations about widget size */
    Info::Screen::width  = width;
    Info::Screen::height = height;
150 151 152
    if(_state == DRAWING_STATE_WAITING)
        _projection = glm::ortho(-50, 50, -50, 50);//, 0, 1);
    else if(_state == DRAWING_STATE_DRAWING)
Thibault Soucarre's avatar
Thibault Soucarre committed
153
        _projection = glm::ortho(0., Info::Render::width, 0., Info::Render::height, 0., 100.);
154 155 156 157 158
    else{
     message << tr("Undefined value for the drawing state attribute - Render area").toStdString() << Message::ende;
     }

        /*glMatrixMode(GL_PROJECTION);
159 160 161 162 163
    glLoadIdentity();


    if(DRAWING_STATE_WAITING == _state){// A wait is drawn
        glOrtho(-50, 50, -50, 50, 0, 1000);
Thibault Soucarre's avatar
Thibault Soucarre committed
164
    }else if (DRAWING_STATE_DRAWING == _state){// A trace is drawn
165 166 167 168
        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
169

170

171 172
     glMatrixMode(GL_MODELVIEW);*/

173 174
}

175

176
void  Render_alternate::paintGL(){
177 178 179
    /*Do not call paintGL before rendering the trace*/
    if(DRAWING_STATE_WAITING == _state)
        return;
Thibault Soucarre's avatar
Thibault Soucarre committed
180

181
    //glClearColor(0.0, 1.0, 0.0, 1.0);
182
    resizeGL(Render_alternate::QGLWidget::width(), Render_alternate::QGLWidget::height());
183
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
Thibault Soucarre's avatar
Thibault Soucarre committed
184
    glEnable(GL_DEPTH_TEST);
185 186 187
    //select shader program
    glUseProgram(_shader.getProgramID());
    std::cout << "paintGL" << std::endl;
188
    glm::mat4 tmp = _modelview;
189 190 191 192
    start_ruler();
    call_ruler();
    end_ruler();
    _ruler.config();
Thibault Soucarre's avatar
Thibault Soucarre committed
193
    //_modelview = glm::translate(_modelview, glm::vec3(0.0, 0.0, -1));
194
    //_modelview = glm::rotate(_modelview, (float)180.0, glm::vec3(1.0, 0.0, 0.0));
Thibault Soucarre's avatar
Thibault Soucarre committed
195
    _ruler.lock();
Thibault Soucarre's avatar
Thibault Soucarre committed
196
    _modelview = glm::translate(_modelview, glm::vec3(0.0, 0.0, _z_ruler));
Thibault Soucarre's avatar
Thibault Soucarre committed
197 198
     glUniformMatrix4fv(glGetUniformLocation(_shader.getProgramID(), "modelview"), 1, GL_FALSE, glm::value_ptr(_modelview));
    glUniformMatrix4fv(glGetUniformLocation(_shader.getProgramID(), "projection"), 1, GL_FALSE, glm::value_ptr(_projection));
199
    glDrawArrays(GL_QUADS, 0, 8);
Thibault Soucarre's avatar
Thibault Soucarre committed
200 201 202
    _modelview = tmp;
    _modelview = glm::translate(_modelview, glm::vec3(0.0, 0.0, _z_ruler_over));
    glUniformMatrix4fv(glGetUniformLocation(_shader.getProgramID(), "modelview"), 1, GL_FALSE, glm::value_ptr(_modelview));
203
    glDrawArrays(GL_LINES, 8, _ruler.getNbVertex());
Thibault Soucarre's avatar
Thibault Soucarre committed
204
    _ruler.unlock();
Thibault Soucarre's avatar
Thibault Soucarre committed
205 206
    _modelview = tmp;

207
    /* drawing containers*/
208 209
    _containers.lock();
    //_modelview = glm::translate(_modelview, glm::vec3(0.0f, _ruler_y + _ruler_height -_y_state_translate,  _z_container));
Thibault Soucarre's avatar
Thibault Soucarre committed
210
    _modelview = glm::translate(_modelview, glm::vec3(0.0, _ruler_y + _ruler_height - _y_state_translate, _z_container));
Thibault Soucarre's avatar
Thibault Soucarre committed
211
    _modelview = glm::scale(_modelview, glm::vec3(_x_scale_container_state/0.20, _y_state_scale, 1.0));
212
    glUniformMatrix4fv(glGetUniformLocation(_shader.getProgramID(), "modelview"), 1, GL_FALSE, glm::value_ptr(_modelview));
213
    glUniformMatrix4fv(glGetUniformLocation(_shader.getProgramID(), "projection"), 1, GL_FALSE, glm::value_ptr(_projection));
214 215
    glDrawArrays(GL_QUADS, 0, _containers.getNbVertex());
    _containers.unlock();
216
    _modelview = tmp;
217 218 219

    /*drawing states*/
    _states.lock();
Thibault Soucarre's avatar
Thibault Soucarre committed
220
    _modelview = glm::translate(_modelview, glm::vec3(_default_entity_x_translate - _x_state_translate, _ruler_y + _ruler_height - _y_state_translate, _z_state));
221
    _modelview = glm::scale(_modelview, glm::vec3(_x_state_scale, _y_state_scale, 1));
222
    glUniformMatrix4fv(glGetUniformLocation(_shader.getProgramID(), "modelview"), 1, GL_FALSE, glm::value_ptr(_modelview));
223
    glUniformMatrix4fv(glGetUniformLocation(_shader.getProgramID(), "projection"), 1, GL_FALSE, glm::value_ptr(_projection));
224 225 226 227 228 229 230 231 232 233 234 235 236
    glDrawArrays(GL_QUADS, 0, _states.getNbVertex());
    _states.unlock();
    _modelview = tmp;

    /*drawing links*/
    /*_arrows.lock();
    tmp = _modelview;
    _modelview = glm::translate(_modelview, glm::vec3(_default_entity_x_translate - _x_state_translate, 0 , 0));
    glUniformMatrix4fv(glGetUniformLocation(_shader.getProgramID(), "modelview"), 1, GL_FALSE, glm::value_ptr(_modelview));
    glDrawArrays(GL_LINES, 0, _arrows.getNbVertex());
    _arrows.unlock();
     _modelview = tmp;*/
    int n = _links.size()/4;
Thibault Soucarre's avatar
Thibault Soucarre committed
237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277
    if(false == Info::Render::_no_arrows){
        for(int i=0; i<n ; i++){
            _arrows.lock();
            //save current modelview
            tmp = _modelview;
            //change matrix
            _modelview = glm::translate(_modelview, glm::vec3(_default_entity_x_translate - _x_state_translate, _ruler_y + _ruler_height - _y_state_translate , _z_arrow));
            _modelview = glm::scale(_modelview, glm::vec3(_x_state_scale, _y_state_scale, 1.0));
            _modelview = glm::translate(_modelview, glm::vec3(_links[4*i+2], _links[4*i+3], 0));
            _modelview = glm::rotate(_modelview, (float) _links[4*i], glm::vec3(0,0,1));
            _modelview = glm::scale(_modelview, glm::vec3(_links[4*i+1], _links[4*i+1/10], 1));

            //draw the arrow
            glUniformMatrix4fv(glGetUniformLocation(_shader.getProgramID(), "modelview"), 1, GL_FALSE, glm::value_ptr(_modelview));
            glUniformMatrix4fv(glGetUniformLocation(_shader.getProgramID(), "projection"), 1, GL_FALSE, glm::value_ptr(_projection));
            glDrawArrays(GL_LINES, 0,6);
            _arrows.unlock();
            //restore matrix
            _modelview = tmp;
        }
    }
    /*drawing events*/
    if(false == Info::Render::_no_events){
        n = _events.size()/3;
        for(int i=0; i<n ; i++){
            _modelview = glm::translate(_modelview, glm::vec3(_default_entity_x_translate - _x_state_translate, _ruler_y + _ruler_height - _y_state_translate , _z_event));
            _modelview = glm::scale(_modelview, glm::vec3(_x_state_scale, _y_state_scale, 1.0));
            _modelview = glm::translate(_modelview, glm::vec3(_events[3*i], _events[3*i+1], _z_event));
            _modelview = glm::scale(_modelview, glm::vec3(1/_x_state_scale, Info::Screen::width/(_y_state_scale*Info::Screen::height), 1.0));
            _circles.lock();
            glUniformMatrix4fv(glGetUniformLocation(_shader.getProgramID(), "modelview"), 1, GL_FALSE, glm::value_ptr(_modelview));
            glUniformMatrix4fv(glGetUniformLocation(_shader.getProgramID(), "projection"), 1, GL_FALSE, glm::value_ptr(_projection));
            glDrawArrays(GL_POLYGON, 0, NB_STEPS);
            _modelview = glm::scale(_modelview, glm::vec3(1.0, _events[3*i+2]*_y_state_scale*Info::Screen::height/Info::Screen::width, 1.0));
            glUniformMatrix4fv(glGetUniformLocation(_shader.getProgramID(), "modelview"), 1, GL_FALSE, glm::value_ptr(_modelview));
            glLineWidth(3.0);
            glDrawArrays(GL_LINES, NB_STEPS, 2);
            glLineWidth(1.0);
            _circles.unlock();
            _modelview = tmp;
        }
278
    }
279

280 281
    /*draw selection if necessary*/
    if (_mouse_pressed && (Info::Render::_key_ctrl == false) && !_mouse_pressed_inside_container){
Thibault Soucarre's avatar
Thibault Soucarre committed
282 283 284
        //allow transparency
        glEnable(GL_BLEND);
        glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
285 286 287 288 289
        Element_pos x0, x1, y0, y1;
        x0 = screen_to_render_x(_mouse_x);
        y0 = /*Info::Render::height -*/ screen_to_render_y(_mouse_y);
        x1 = screen_to_render_x(_new_mouse_x);
        y1 = /*Info::Render::height -*/ screen_to_render_y(_new_mouse_y);
Thibault Soucarre's avatar
Thibault Soucarre committed
290 291
        float selection[12] = {x0, y0, x0, y1, x1, y1, x1, y0};
        float selection_colors[16] = {1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0};
292 293 294 295 296 297 298 299 300 301 302 303 304
        /*_modelview = glm::translate(_modelview, glm::vec3(_default_entity_x_translate - _x_state_translate,
                                                          _ruler_y + _ruler_height - _y_state_translate,
         0));*/
        //_modelview = glm::scale(_modelview, glm::vec3(_x_state_scale, _y_state_scale, 1));
        glUniformMatrix4fv(glGetUniformLocation(_shader.getProgramID(), "modelview"), 1, GL_FALSE, glm::value_ptr(_modelview));
        glUniformMatrix4fv(glGetUniformLocation(_shader.getProgramID(), "projection"), 1, GL_FALSE, glm::value_ptr(_projection));
        glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, selection);
        glEnableVertexAttribArray(0);
        glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, selection_colors);
        glEnableVertexAttribArray(1);
        glDrawArrays(GL_QUADS, 0, 4);
        glDisableVertexAttribArray(0);
        glDisableVertexAttribArray(1);
Thibault Soucarre's avatar
Thibault Soucarre committed
305
        glDisable(GL_BLEND);
306
        _modelview = tmp;
307
 }
Thibault Soucarre's avatar
Thibault Soucarre committed
308
    draw_vertical_line();
Thibault Soucarre's avatar
Thibault Soucarre committed
309

310
    //    _containers.display(_modelview);
Thibault Soucarre's avatar
Thibault Soucarre committed
311
    glDisable(GL_DEPTH_TEST);
312 313
    //deselect shader
    glUseProgram(0);
Thibault Soucarre's avatar
Thibault Soucarre committed
314 315
    //_modelview = glm::translate(_modelview, glm::vec3(0.0, -100*Info::Render::height, 0.0));
    //_modelview = glm::scale(_modelview, glm::vec3(1000,100,1));
Thibault Soucarre's avatar
Thibault Soucarre committed
316
    /*for(int i=0; i<_texts.size(); i++){
Thibault Soucarre's avatar
Thibault Soucarre committed
317 318 319 320 321 322 323 324
        glm::vec4 current(_texts[i].x, _texts[i].y, 0.0, 1.0);
        //we get coordinates beetween (-1 ; 1)
        current = _projection * _modelview * current;
        //conversion to (0,800) and (0,600) corresponding to the size of the texture used
        current[0] = current[0] * 400 + 400;
        current[1] = current[1] * 300 + 300;
        printText2D(_texts[i].value.c_str(), current[0], current[1], _texts[i].size, _projection, _modelview);
    }
Thibault Soucarre's avatar
Thibault Soucarre committed
325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353
     _modelview = tmp;*/

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

    const QFontMetrics metric(arial_font);

    //we calculate the height of the interline we want : max height of the font + 1 pixel to avoid overlapping (metric.height() returns a bigger value, a bit too much)
    int height = metric.tightBoundingRect("fg").height()+1;

    /* Draw container text */
    const unsigned int texts_size = _texts.size();
    std::map<Element_pos,Element_pos> previous_by_column;


    //int skipped,displayed=0;
        for (unsigned int i=0 ; i<texts_size ; i++){



            if (trace_to_render_y(_texts[i].y) + 0.5 < 9) continue;/* Do not display text if it is on the ruler area */

            //check if ye are not too close to another container to properly display the text
            std::map<Element_pos,Element_pos>::const_iterator it = previous_by_column.find(_texts[i].x);
            const std::map<Element_pos,Element_pos>::const_iterator it_end = previous_by_column.end();

            if (it==it_end || render_to_screen_y(trace_to_render_y(_texts[i].y)) - render_to_screen_y(trace_to_render_y((*it).second))> height ){
                const QString text_elided = metric.elidedText(_texts[i].value.c_str(), Qt::ElideRight, _x_scale_container_state*Info::Screen::width/(Info::Trace::depth+1.));
                renderText ( render_to_screen_x(_texts[i].x * _x_scale_container_state/0.20),
354 355 356
                             render_to_screen_y( trace_to_render_y(_texts[i].y) + 0.5),
                             text_elided,
                             arial_font);
Thibault Soucarre's avatar
Thibault Soucarre committed
357

358
                //push only displayed values in the map
Thibault Soucarre's avatar
Thibault Soucarre committed
359 360 361 362
                previous_by_column[_texts[i].x]=_texts[i].y;
                //displayed++;
            }//else{skipped++;}
        }
363

364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410
        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);

        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((Info::Render::_x_min_visible +
                                                          Info::Render::_x_max_visible) / 2)),
                    render_to_screen_y(3),
                    buf_txt.str().c_str(),
                    arial_font);

        arial_font.setPointSize(10);

        for (Element_pos i = Info::Render::_x_min_visible ;
             i < Info::Render::_x_max_visible ;
             i+=graduation_diff){

            buf_txt.str("");/* flush the buffer */
            buf_txt << Ruler::get_variable_part(i, coeff_prefix, 2);

            renderText (render_to_screen_x(trace_to_render_x(i)+1),
                        render_to_screen_y(8),
                        buf_txt.str().c_str(),
                        arial_font);

411
    }
412

413

414
//     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
415

416

417 418
//     glClearDepth(1.0);
//     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
419

420
//     glLoadIdentity();
Thibault Soucarre's avatar
Thibault Soucarre committed
421 422


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

425 426 427
//         /* turn around y axis */
//         _wait_angle+=0.1f;
//         if (_wait_angle>=360) _wait_angle=0.0f;
Thibault Soucarre's avatar
Thibault Soucarre committed
428

429
//         glPushMatrix();
Thibault Soucarre's avatar
Thibault Soucarre committed
430

431
//         glScalef(15, 15, 0);
Thibault Soucarre's avatar
Thibault Soucarre committed
432

433 434
//         glRotatef(-_wait_angle,0, 1, 0);
//         glRotatef(_wait_angle_y, 1, 0, 0);
435

Thibault Soucarre's avatar
Thibault Soucarre committed
436

437
//         glPopMatrix();
Thibault Soucarre's avatar
Thibault Soucarre committed
438

439

440 441 442
//     }else if (DRAWING_STATE_DRAWING == _state){/* A trace is drawn */
//         glMatrixMode(GL_MODELVIEW);
//         glLoadIdentity();
Thibault Soucarre's avatar
Thibault Soucarre committed
443

444 445 446 447
//         glPushMatrix();
//         {
//             glTranslated(0.0, Info::Render::height, 100.0);
//             glRotated(180.0, 1.0, 0.0, 0.0);
448

Thibault Soucarre's avatar
Thibault Soucarre committed
449

450 451
//             glPushMatrix();
//             {
452

453 454
//                 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);
455

456 457 458 459 460 461 462
//                 for (unsigned int i=0 ;
//                      i<_vbos.size()   ;
//                      i++){
//                     _vbos[i]->display();
//                 }
//             }
//             glPopMatrix();
463

464
//             call_ruler();
465

Thibault Soucarre's avatar
Thibault Soucarre committed
466

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

470 471
//              if (false == Info::Render::_no_events)/* display events */
//                  draw_stored_circles();
472

473 474
//         }
//         glPopMatrix();
Thibault Soucarre's avatar
Thibault Soucarre committed
475

476 477 478
//         glPushMatrix();
//         {
//             glTranslated(0.0,  0.0, 100.0);/* not accurate */
Thibault Soucarre's avatar
Thibault Soucarre committed
479

480
//             if (_mouse_pressed){
Thibault Soucarre's avatar
Thibault Soucarre committed
481 482


483
//                 glTranslated(0.0, 0.0, _z_container_under);
Thibault Soucarre's avatar
Thibault Soucarre committed
484

485
//                 Element_pos old_x, old_y, new_x, new_y;
Thibault Soucarre's avatar
Thibault Soucarre committed
486

487 488


489 490 491 492
//                 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);
Thibault Soucarre's avatar
Thibault Soucarre committed
493

494
// #ifdef DEBUG_MODE_RENDER_OPENGL
Thibault Soucarre's avatar
Thibault Soucarre committed
495

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

500 501
//                 glEnable(GL_BLEND);
//                 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
Thibault Soucarre's avatar
Thibault Soucarre committed
502

503 504 505 506 507 508 509 510 511
//                 /* 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
512

513
//                 glDisable(GL_BLEND);
514

515 516 517
//             }/* end  if (true==_mouse_pressed) */
//         }
//         glPopMatrix();
518 519


Thibault Soucarre's avatar
Thibault Soucarre committed
520

521 522 523
//     }else{
//         message << tr("Undefined value for the drawing state attribute - Render area").toStdString() << Message::ende;
//     }
524

525
//     glFlush();
526 527


528 529 530 531 532
//     /* 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;
533 534 535



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

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


543 544 545 546 547 548 549 550 551 552
//     /* 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);
//     }
553

554 555 556 557 558 559
//     /* 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);
560

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

563
//     arial_font.setPointSize(14);
564

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

568 569 570 571
//     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);
572

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

576 577 578 579
//     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);
580

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

584 585 586 587 588 589 590
//     renderText (render_to_screen_x(
//                                    trace_to_render_x(
//                                                      (Info::Render::_x_min_visible +
//                                                       Info::Render::_x_max_visible) / 2)),
//                 render_to_screen_y(3),
//                 buf_txt.str().c_str(),
//                 arial_font);
591

592
//     arial_font.setPointSize(10);
593

594 595 596
//     for (Element_pos i = Info::Render::_x_min_visible ;
//          i < Info::Render::_x_max_visible ;
//          i+=graduation_diff){
Thibault Soucarre's avatar
Thibault Soucarre committed
597

598 599 600 601 602 603 604 605
//         buf_txt.str("");/* flush the buffer */
//         buf_txt << Ruler::get_variable_part(i, coeff_prefix, 2);

//         renderText (render_to_screen_x(trace_to_render_x(i)+1),
//                     render_to_screen_y(8),
//                     buf_txt.str().c_str(),
//                     arial_font);
//     }
606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624
}





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



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

626 627 628 629 630 631 632 633 634 635 636 637
    _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
638

639 640 641 642 643 644 645 646 647
    if (NULL == _render_instance)
        return true;

    return true;
}



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

649 650 651 652 653 654 655
    /**********************
     *
     * Init OpenGL features
     *
     **********************/

    /* enable some OpenGL features*/
656 657
    // 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
658

659
    // glEnable(GL_TEXTURE_2D);
660

661 662
    // glEnable(GL_BLEND);/* enable blending for the alpha color */
    // glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
663

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


667 668 669 670 671
    // /*****************************
    //  *
    //  * Init render area attributes
    //  *
    //  *****************************/
672

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

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

678 679 680 681 682
    // /* init measurement attributes */
    // Info::Container::x_max = 0;
    // Info::Container::y_max = 0;
    // Info::Container::x_min = 0;
    // Info::Container::y_min = 0;
683

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

687 688 689 690 691 692
    // 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;
693

694 695 696
    // /* clear lists to store container texts */
    // _text_pos.clear();
    // _text_value.clear();
697

698 699 700
    // _arrows.clear();
    // _circles.clear();
    // _texts.clear();
701

702 703 704 705 706 707
    // for (unsigned int i=0 ;
    //      i<_vbos.size()   ;
    //      i++){
    //     delete _vbos[i];
    // }
    // _vbos.clear();
708

709 710
    // /* clear the event vector */
    // // _events.clear();
711

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

715 716 717
    // /* empty the selection stack */
    // while(false == _previous_selection.empty())
    //     _previous_selection.pop();
718

719 720
    // if (NULL == _render_instance)
    //     return true;
721

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

726 727 728 729
    //     /*  _wait_timer = new QTimer(this);
    //     connect(_wait_timer, SIGNAL(timeout()), _render_instance, SLOT(updateGL()));
    //     _wait_timer->start(_wait_spf);*/
    // }
730 731


732
    // return true;//_render_instance->display_unbuild();
733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751
}





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



GLuint Render_alternate::draw_wait() {
752 753
    // GLuint object;
    // GLuint texture;
754

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

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

759 760 761 762
    // 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);
763

Thibault Soucarre's avatar
Thibault Soucarre committed
764

765 766 767
    // /* 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
768

769
    // glEnable(GL_TEXTURE_2D);
770

771 772
    // glEnable(GL_BLEND);/* enable blending for the alpha color */
    // glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
773

Thibault Soucarre's avatar
Thibault Soucarre committed
774

775 776 777 778 779 780 781 782
    // /* 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);*/
    // }
783

784
    // return object;
785 786 787 788 789
}



void Render_alternate::call_ruler(){
790
    _ruler.setNbVertex(0);
791
    Element_pos graduation_diff;
792
    //Element_pos coeff_prefix;
793 794 795 796
    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
797

798
    graduation_diff = Ruler::get_graduation_diff(Info::Render::_x_min_visible, Info::Render::_x_max_visible);
799
    //coeff_prefix    = Ruler::get_coeff_for_common_prefix(Info::Render::_x_min_visible, Info::Render::_x_max_visible);
800 801
    //draw quads
    set_color(0.0, 0.0, 1.0);
Thibault Soucarre's avatar
Thibault Soucarre committed
802
    _ruler.add(trace_to_render_x(Info::Render::_x_min_visible), 3, _r, _g, _b);
803 804
    _ruler.add(trace_to_render_x(Info::Render::_x_min_visible), 8, _r, _g, _b);
    _ruler.add(trace_to_render_x(Info::Render::_x_max_visible), 8, _r, _g, _b);
Thibault Soucarre's avatar
Thibault Soucarre committed
805
    _ruler.add(trace_to_render_x(Info::Render::_x_max_visible), 3, _r, _g, _b);
806 807 808 809 810 811 812
    set_color(0.0, 0.0, 0.0);
    _ruler.add(trace_to_render_x(Info::Render::_x_min_visible), 0, _r, _g, _b);
    _ruler.add(trace_to_render_x(Info::Render::_x_min_visible), 3, _r, _g, _b);
    _ruler.add(trace_to_render_x(Info::Render::_x_max_visible), 3, _r, _g, _b);
    _ruler.add(trace_to_render_x(Info::Render::_x_max_visible), 0, _r, _g, _b);

    //draw graduations
813
    set_color(1.0, 1.0, 1.0);
Thibault Soucarre's avatar
Thibault Soucarre committed
814

815 816 817 818 819 820 821 822 823 824
    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
825

826
     return;
Thibault Soucarre's avatar
Thibault Soucarre committed
827
}
828 829 830 831



void Render_alternate::set_color(float r, float g, float b){
832 833 834
    _r = r;
    _g = g;
    _b = b;
835 836
}

Thibault Soucarre's avatar
Thibault Soucarre committed
837
void Render_alternate::draw_text(const Element_pos x, const Element_pos y, const Element_pos size, const std::string s){
838
    if (_draw_ruler) return;/* do not draw text for ruler */
Thibault Soucarre's avatar
Thibault Soucarre committed
839 840
    Container_text_ buf;
    buf.x     = x;
Thibault Soucarre's avatar
Thibault Soucarre committed
841
    buf.y     = render_to_trace_y(y);// + offset_y; //render_to_trace_y(y);/* Cancel previous transformation. */
Thibault Soucarre's avatar
Thibault Soucarre committed
842 843 844
    buf.value = s;
    buf.size = size;
    _texts.push_back(buf);
845 846 847 848 849 850 851
}

void Render_alternate::draw_quad(Element_pos x, Element_pos y, Element_pos z, Element_pos w, Element_pos h){
    Element_pos offset_x;
    const Element_pos offset_y = -_ruler_y - _ruler_height;

    offset_x = 0;
852 853 854 855 856 857 858 859
    if(_draw_container){
        std::cout << "container : " << x << " " << y << " " << w << " " << h <<std::endl;
        _containers.add(x+offset_x  , y+offset_y  , _r,_g,_b);
        _containers.add(x+offset_x+w, y+offset_y  , _r,_g,_b);
        _containers.add(x+offset_x+w, y+offset_y+h, _r,_g,_b);
        _containers.add(x+offset_x  , y+offset_y+h, _r,_g,_b);
    }
    else if(_draw_states){
860
        offset_x = -_default_entity_x_translate;
861
        _states.add(x+offset_x  , y+offset_y  , _r, _g, _b);
Thibault Soucarre's avatar
Thibault Soucarre committed
862 863
        _states.add(x+offset_x+w, y+offset_y  , _r/2, _g/2, _b/2);
        _states.add(x+offset_x+w, y+offset_y+h, _r/2, _g/2, _b/2);
864
        _states.add(x+offset_x  , y+offset_y+h, _r, _g, _b);
Thibault Soucarre's avatar
Thibault Soucarre committed
865 866 867 868 869 870 871 872
    }
    else if(_draw_ruler){
        std::cout << "coucou" << std::endl;
        _ruler.add(x  , y  , _r, _g, _b);
        _ruler.add(x  , y+h, _r, _g, _b);
        _ruler.add(x+w, y+h, _r, _g, _b);
        _ruler.add(x+w, y  , _r, _g, _b);
    }
873 874


875
        /*state = Vbo::VBO_OK;
876

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

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

884 885 886 887 888 889
            /* 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;*/
890

Thibault Soucarre's avatar
Thibault Soucarre committed
891

892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910

    /*
    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){
911
    //    if (_draw_ruler || _draw_arrow || _draw_event) return;/* do not draw line for ruler or for arrow or for event */
912 913 914 915 916


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

917 918 919 920
    if(_draw_counter){
        _counters.add(x1+offset_x,y1+offset_y,_r,_g,_b);
        _counters.add(x2+offset_x,y2+offset_y,_r,_g,_b);
    }
921 922 923 924
    else if(_draw_ruler){
        _ruler.add(x1+offset_x, y1+offset_y, _r, _g, _b);
        _ruler.add(x2+offset_x, y2+offset_y, _r, _g, _b);
    }
925 926 927 928 929 930 931 932 933
    else{

        glBegin(GL_LINES);
        {
            glColor3d(_r, _g, _b);
            glVertex3d(x1 + offset_x, y1 + offset_y, z);
            glVertex3d(x2 + offset_x, y2 + offset_y, z);
        }
        glEnd();
934 935 936 937 938 939 940 941 942
    }
}

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


void Render_alternate::start_draw(){
    /* Init GLEW */
943
    //glewInit();
944 945 946 947 948
    _draw_ruler = false;
    _draw_container = false;
    _draw_arrow = false;
    _draw_event = false;

949
    //_current_vbo = NULL;
Thibault Soucarre's avatar
Thibault Soucarre committed
950

951 952 953 954 955 956 957 958 959 960 961 962 963 964
}

void Render_alternate::start_draw_containers(){
    _draw_container = true;
}

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

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

void Render_alternate::end_draw_containers(){
    _draw_container = false;
965
    _containers.config();
966
    cout << "end_draw_containers" << endl;
967 968 969
}

void Render_alternate::start_draw_states(){
970
    _draw_states = true;
971 972 973 974 975 976 977
}

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(){

978 979
    _draw_states = false;
    _states.config();
980
    cout << "end_draw_states" << endl;
981 982 983 984 985 986 987 988 989 990 991
}

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){

    const Element_pos offset_x = -_default_entity_x_translate;
    const Element_pos offset_y = -_ruler_y - _ruler_height;
992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010
    /*_arrows.add(start_time+ offset_x, start_height + offset_y, _r, _g, _b);
     _arrows.add(end_time  + offset_x, end_height   + offset_y, _r, _g, _b);*/
    //triangles ?
    Element_pos x0, x1, y0, y1, l, alpha, cos, sin;
    x0 = start_time   + offset_x;
    x1 = end_time     + offset_x;
    y0 = start_height + offset_y;
    y1 = end_height   + offset_y;
    //size of the arrow
    l = sqrt(pow(x1-x0,2)+pow(y1-y0,2));
    //calculate angle beetween arrow and horizontal axe
    cos = (x1-x0)/l;
    sin = (y1-y0)/l;
    alpha = acos(cos);
    if(sin<0) alpha*= -1;
    _links.push_back(alpha);
    _links.push_back(l);
    _links.push_back(x0);
    _links.push_back(y0);
1011 1012 1013
}

void Render_alternate::end_draw_arrows(){
1014 1015 1016 1017 1018 1019 1020 1021 1022 1023
    //coordinates that we use for all arrows, we will change the angle and scale of using the modelview matrix
    _arrows.add(1,0,1,1,1);
    _arrows.add(0,0,1,1,1);
    _arrows.add(1,0,1,1,1);
    //_arrows.add(0,0,1,1,1);
    _arrows.add(cos(PI/8), -sin(PI/8), 1, 1, 1);
    _arrows.add(1,0,1,1,1);
    //_arrows.add(0,0,1,1,1);
    _arrows.add(cos(PI/8), sin(PI/8), 1, 1, 1);
    _arrows.config();
1024
    _draw_arrow = false;
1025
    cout << "end_draw_arrows " << _links.size() << endl;
1026 1027 1028 1029 1030 1031 1032 1033 1034 1035
}

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){
    const Element_pos offset_x = -_default_entity_x_translate;
    const Element_pos offset_y = -_ruler_y - _ruler_height;

Thibault Soucarre's avatar
Thibault Soucarre committed
1036 1037 1038
    _events.push_back(time + offset_x);
    _events.push_back(height + offset_y);
    _events.push_back(container_height);
1039 1040 1041 1042
}


void Render_alternate::end_draw_events(){
Thibault Soucarre's avatar
Thibault Soucarre committed
1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057
    //As for arrows, we use the same coordinates for every events we draw. Position is changed using modelview matrix
    set_color(1.0, 1.0, 1.0);
    const float angle = 0;
    const float delta_angle = 2 * PI / NB_STEPS;
    const float radius = 0.5;
    for(int j = 0 ; j < NB_STEPS ; j ++){
        _circles.add(radius*cos(angle + j*delta_angle), radius*sin(angle + j*delta_angle), _r, _g, _b);
    }
    _circles.add(0, 0, _r, _g, _b);
    _circles.add(0, 0.5, _r, _g, _b);
        //_circles.add(cos_table[j]/_x_state_scale, (sin_table[j]*Info::Screen::width)/(_y_state_scale*Info::Screen::height), _r, _g, _b);

    //        cos_table2[2*j]=  cos_table[j]/_x_state_scale;
    //       sin_table2[2*j+1]= (sin_table[j]*Info::Screen::width)/(_y_state_scale*Info::Screen::height);
    _circles.config();
1058
    _draw_event = false;
1059
    cout << "end_draw_events" << endl;
1060 1061 1062
}

void Render_alternate::start_draw_counter(){
1063
    _draw_counter = true;
1064 1065 1066 1067 1068 1069
}

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

void Render_alternate::end_draw_counter(){
1070 1071
    _draw_counter = false;
    _counters.config();
1072
    cout << "end_draw_counters" << endl;
1073 1074 1075 1076 1077 1078 1079 1080
}

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

void Render_alternate::end_ruler(){
    _draw_ruler = false;
1081
    //std::cout << "end_ruler" << std::endl;
1082 1083 1084
}

void Render_alternate::end_draw(){
1085
    cout << "end_draw" << endl;
1086 1087 1088 1089 1090 1091 1092 1093
}


void Render_alternate::draw_stored_texts(){
}

void Render_alternate::draw_stored_arrows(){

1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159
    // /* 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++){

    //     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);

    //     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();
    //     {

    //         glTranslated(_default_entity_x_translate + _x_state_scale*end_time - _x_state_translate,
    //                      _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 */

    //         glBegin(GL_TRIANGLES);
    //         {
    //             // glColor3d(_red, _green, _blue);
    //             glVertex2d(0.0, 0.0);
    //             glVertex2d(-1.2, -0.4);
    //             glVertex2d(-1.2, 0.4);
    //         }
    //         glEnd();

    //     }
    //     glPopMatrix();

    //     glPushMatrix();
    //     {

    //         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);

    //         glBegin(GL_LINES);
    //         {
    //             glVertex2d(start_time, start_height);
    //             glVertex2d(end_time  , end_height  );
    //         }
    //         glEnd();
    //     }
    //     glPopMatrix();
    // }
1160 1161 1162
}

void Render_alternate::draw_stored_circles(){
1163 1164 1165 1166
    // 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;
1167

1168
    // const unsigned int size = _circles.size();
1169

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

1172 1173
    //     glPushMatrix();
    //     {
1174

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

1177 1178 1179
    //         glTranslated(_default_entity_x_translate - _x_state_translate,
    //                      _ruler_y + _ruler_height - _y_state_translate,
    //                      _z_arrow);
Thibault Soucarre's avatar
Thibault Soucarre committed
1180

1181
    //          glScalef(_x_state_scale, _y_state_scale, 1.0);
Thibault Soucarre's avatar
Thibault Soucarre committed
1182

1183
    //          /* Draw the circle */
Thibault Soucarre's avatar
Thibault Soucarre committed
1184

1185 1186 1187 1188 1189 1190 1191 1192
    //          glBegin(GL_POLYGON);
    //          {
    //              for(int j = 0 ; j < step ; j ++){
    //                  glVertex2d(_circles[i].time + cos(angle+delta_angle*j)*radius/_x_state_scale,
    //                             _circles[i].height + sin(angle+delta_angle*j)*(radius/_y_state_scale)*Info::Screen::width/Info::Screen::height);
    //              }
    //          }
    //          glEnd();
1193

Thibault Soucarre's avatar
Thibault Soucarre committed
1194

1195
    //          set_color(_circles[i].red, _circles[i].green, _circles[i].blue);
Thibault Soucarre's avatar
Thibault Soucarre committed
1196

1197 1198 1199 1200 1201 1202 1203 1204 1205 1206
    //          /* 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) ,
    //                             _circles[i].height + sin(angle+delta_angle*j)*radius/(1.2*_y_state_scale)*Info::Screen::width/Info::Screen::height ,
    //                             0.1);
    //              }
    //          }
    //          glEnd();
Thibault Soucarre's avatar
Thibault Soucarre committed
1207 1208


1209 1210 1211 1212 1213 1214 1215 1216
    //          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();
1217

1218
    //         glLineWidth( 1.0 );
1219 1220


1221 1222 1223
    //     }
    //     glPopMatrix();
    // }
1224

1225
    // set_color(1.0, 1.0, 1.0);
Thibault Soucarre's avatar
Thibault Soucarre committed
1226

1227
}
1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243

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(){
Thibault Soucarre's avatar
Thibault Soucarre committed
1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262
    std::cout << "salut" << vertical_line  << std::endl;
    if(vertical_line==0)
        return;
    std::cout