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

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

using namespace std;


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

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

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

Render_alternate::Render_alternate(Core* core, QWidget *parent, const QGLFormat& format)
102
    : Hook_event(this, core, parent, format), _containers(GL_QUADS), /*_states(GL_QUADS),*/ _events(GL_POINTS), _events2(GL_LINES), _arrows(GL_LINE), _arrows2(GL_TRIANGLES), _counters(GL_LINE), _ruler(GL_QUADS), _modelview(glm::mat4(1.0)), _projection(glm::mat4(1.0)), _container_height(_DRAWING_CONTAINER_HEIGHT_DEFAULT){
103 104 105
    _texts.clear();
    _variable_texts.clear();
    _links.clear();
106 107 108 109
}


Render_alternate::~Render_alternate(){
110
    delete _shader;
111 112 113 114 115 116 117 118 119 120 121 122 123
}

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

void  Render_alternate::initializeGL() {
124 125
    glewExperimental = GL_TRUE;
    GLenum err = glewInit();
126
    if(err!=GLEW_OK){
127
        std::cout << "ERROR : GlewInit failed" << std::endl;
128
    }
129
    glClearColor(0.5f, 0.5f, 0.55f, 0.0f);
130 131
    glEnable(GL_DEPTH_TEST);
    glClearStencil(0);
132
    std::cout << "init" << std::endl;
133 134 135 136 137 138 139 140
    const GLubyte * version = glGetString(GL_SHADING_LANGUAGE_VERSION);
    if (version==NULL)
        std::cout << "ERROR : could not detect your GLSL version" << std::endl;
    else
        std::cout << "Version GLSL : " << version << std::endl;
    _glsl = (version[0]-'0')*100 + (version[2]-'0')*10 + version[3]-'0';
    std::cout << _glsl << std::endl;
    _shader = new Shader(_glsl);
Thibault Soucarre's avatar
Thibault Soucarre committed
141
    _wait_shader = new Shader(_glsl, 0);
142
    _shader->charger();
Thibault Soucarre's avatar
Thibault Soucarre committed
143 144
    _wait_shader->charger();
    draw_wait();
145
    setAutoFillBackground(false);
146 147 148 149
    if(_core == NULL)
        std::cout << "_core = NULL" << std::endl;
    _core->waitGUIInit->quit();
    std::cout << "init ok" << std::endl;
150 151
    _modelview = glm::scale(_modelview, glm::vec3(1,-1,1));
    _modelview = glm::translate(_modelview, glm::vec3(0,-Info::Render::height, 0));
152 153 154 155
}

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

157 158 159
    /* update informations about widget size */
    Info::Screen::width  = width;
    Info::Screen::height = height;
160 161 162
    if(_state == DRAWING_STATE_WAITING)
        _projection = glm::ortho(-50, 50, -50, 50);//, 0, 1);
    else if(_state == DRAWING_STATE_DRAWING)
163
        _projection = glm::ortho(0.f, Info::Render::width, 0.f, Info::Render::height, 0.f, 100.f);
164 165 166 167
    else{
     message << tr("Undefined value for the drawing state attribute - Render area").toStdString() << Message::ende;
     }

168 169
}

170

171
void  Render_alternate::paintGL(){
Thibault Soucarre's avatar
Thibault Soucarre committed
172 173
    glClearDepth(1.0);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
174
    /*Draw the home screen*/
Thibault Soucarre's avatar
Thibault Soucarre committed
175 176 177 178 179 180 181 182 183 184 185
    if(DRAWING_STATE_WAITING == _state){
        glUseProgram(_wait_shader->getProgramID());
        glEnable(GL_BLEND);
        glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
        _wait.lock();
        glBindTexture(GL_TEXTURE_2D, _textureID);
        std::cout << "draw wait\n";
        glDrawArrays(GL_QUADS, 0, _wait.getNbVertex());
        glBindTexture(GL_TEXTURE_2D, 0);
        _wait.unlock();
        glUseProgram(0);
186
        return;
Thibault Soucarre's avatar
Thibault Soucarre committed
187
    }
188
    /*Else, draw the trace*/
Thibault Soucarre's avatar
Thibault Soucarre committed
189

190
    resizeGL(Render_alternate::QGLWidget::width(), Render_alternate::QGLWidget::height());
191 192
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    //select shader program
193
    glUseProgram(_shader->getProgramID());
194
    std::cout << "paintGL" << std::endl;
195
    glm::mat4 tmp = _modelview;
196 197
    glm::mat4 tmp2 = _modelview;
    glm::mat4 mvp;
198 199 200
    start_ruler();
    call_ruler();
    end_ruler();
201
    _ruler.config(_glsl);
Thibault Soucarre's avatar
Thibault Soucarre committed
202
    _ruler.lock();
Thibault Soucarre's avatar
Thibault Soucarre committed
203
    _modelview = glm::translate(_modelview, glm::vec3(0.0, 0.0, _z_ruler));
204
    mvp = _projection * _modelview;
205
    glUniformMatrix4fv(glGetUniformLocation(_shader->getProgramID(), "MVP"), 1, GL_FALSE, glm::value_ptr(mvp));
206
    glDrawArrays(GL_QUADS, 0, 8);
Thibault Soucarre's avatar
Thibault Soucarre committed
207 208
    _modelview = tmp;
    _modelview = glm::translate(_modelview, glm::vec3(0.0, 0.0, _z_ruler_over));
209
    mvp = _projection * _modelview;
210
    glUniformMatrix4fv(glGetUniformLocation(_shader->getProgramID(), "MVP"), 1, GL_FALSE, glm::value_ptr(mvp));
211
    glDrawArrays(GL_LINES, 8, _ruler.getNbVertex());
Thibault Soucarre's avatar
Thibault Soucarre committed
212
    _ruler.unlock();
Thibault Soucarre's avatar
Thibault Soucarre committed
213 214
    _modelview = tmp;

215
    /* drawing containers*/
216
    _containers.lock();
Thibault Soucarre's avatar
Thibault Soucarre committed
217
    _modelview = glm::translate(_modelview, glm::vec3(0.0, _ruler_y + _ruler_height - _y_state_translate, _z_container));
Thibault Soucarre's avatar
Thibault Soucarre committed
218
    _modelview = glm::scale(_modelview, glm::vec3(_x_scale_container_state/0.20, _y_state_scale, 1.0));
219
    mvp = _projection * _modelview;
220
    glUniformMatrix4fv(glGetUniformLocation(_shader->getProgramID(), "MVP"), 1, GL_FALSE, glm::value_ptr(mvp));
221 222
    glDrawArrays(GL_QUADS, 0, _containers.getNbVertex());
    _containers.unlock();
223
    _modelview = tmp;
224
    glUseProgram(0);
225
    /*drawing states*/
Thibault Soucarre's avatar
Thibault Soucarre committed
226
    _modelview = glm::translate(_modelview, glm::vec3(_default_entity_x_translate - _x_state_translate, _ruler_y + _ruler_height - _y_state_translate, _z_state));
227
    _modelview = glm::scale(_modelview, glm::vec3(_x_state_scale, _y_state_scale, 1));
228
    mvp = _projection * _modelview;
229
    std::map<const EntityValue*, Vbo*>::iterator it_state;
230 231
    it_state = _states.begin();
    while(it_state!=_states.end()){
232
        Shader *s = _states_shaders[it_state->first];
233
        glUseProgram(s->getProgramID());
234
        it_state->second->lock();
235
        glUniformMatrix4fv(glGetUniformLocation(s->getProgramID(), "MVP"), 1, GL_FALSE, glm::value_ptr(mvp));
236 237
        glDrawArrays(GL_QUADS, 0, it_state->second->getNbVertex());
        it_state->second->unlock();
238 239
        it_state++;
    }
240 241
    glUseProgram(_shader->getProgramID());
    glUniformMatrix4fv(glGetUniformLocation(_shader->getProgramID(), "MVP"), 1, GL_FALSE, glm::value_ptr(mvp));
242

Thibault Soucarre's avatar
Thibault Soucarre committed
243 244 245 246
    /*drawing counters*/
    _counters.lock();
    glDrawArrays(GL_LINES, 0, _counters.getNbVertex());
    _counters.unlock();
247
    _modelview = tmp;
248

249
    /*drawing links*/
Thibault Soucarre's avatar
Thibault Soucarre committed
250
    if(false == Info::Render::_no_arrows){
251
        //matrix change that are necessary for each link
252 253
        _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));
254
        //draw the line
255
        _arrows.lock();
256
        mvp = _projection * _modelview;
257
        glUniformMatrix4fv(glGetUniformLocation(_shader->getProgramID(), "MVP"), 1, GL_FALSE, glm::value_ptr(mvp));
258
        glDrawArrays(GL_LINES, 0, _arrows.getNbVertex());
259
        _arrows.unlock();
260
        //draw the head of the arrow according to the parameter arrows_shape
261 262 263 264 265 266 267 268 269 270
        int n = _links.size()/4;
        switch(Info::Render::_arrows_shape){
        case 0: //triangles
            _arrows3.lock();
            _modelview = glm::scale(_modelview, glm::vec3(1/_x_state_scale, 1/_y_state_scale, 1));
            tmp2 = _modelview;
            for(int i=0; i<n ; i++) {
                _modelview = glm::translate(_modelview, glm::vec3(_x_state_scale*_links[4*i+2], _y_state_scale*_links[4*i+3], 0));
                _modelview = glm::rotate(_modelview, (float) _links[4*i], glm::vec3(0,0,1));
                mvp = _projection * _modelview;
271
                glUniformMatrix4fv(glGetUniformLocation(_shader->getProgramID(), "MVP"), 1, GL_FALSE, glm::value_ptr(mvp));
272 273 274 275 276 277 278 279 280 281 282 283 284
                glDrawArrays(GL_TRIANGLES, 0, _arrows3.getNbVertex());
                _modelview = tmp2;
        }
            _arrows3.unlock();
            break;
        case 1: //points
            _arrows2.lock();
            glDrawArrays(GL_POINTS, 0, _arrows2.getNbVertex());
            _arrows2.unlock();
            break;
        default: //no head
            break;
        }
285
        _modelview = tmp;
286 287 288

    }

Thibault Soucarre's avatar
Thibault Soucarre committed
289 290
    /*drawing events*/
    if(false == Info::Render::_no_events){
291 292
        _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));
293 294
        _events.lock();
        mvp = _projection * _modelview;
295
        glUniformMatrix4fv(glGetUniformLocation(_shader->getProgramID(), "MVP"), 1, GL_FALSE, glm::value_ptr(mvp));
296
        /*draw points as circles instead of squares*/
297 298 299 300 301 302 303 304
        glEnable(GL_PROGRAM_POINT_SIZE);
        glEnable(GL_POINT_SMOOTH);
        glPointSize(5);
        glDrawArrays(GL_POINTS, 0, _events.getNbVertex());
        _events.unlock();
        _events2.lock();
        glDrawArrays(GL_LINES, 0, _events2.getNbVertex());
        _events2.unlock();
305
    }
306

307 308 309 310
    //restore basic matrix
    _modelview = tmp;


311 312
    /*draw selection if necessary*/
    if (_mouse_pressed && (Info::Render::_key_ctrl == false) && !_mouse_pressed_inside_container){
Thibault Soucarre's avatar
Thibault Soucarre committed
313 314 315
        //allow transparency
        glEnable(GL_BLEND);
        glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
316 317
        Element_pos x0, x1, y0, y1;
        x0 = screen_to_render_x(_mouse_x);
318
        y0 = screen_to_render_y(_mouse_y);
319
        x1 = screen_to_render_x(_new_mouse_x);
320
        y1 = screen_to_render_y(_new_mouse_y);
Thibault Soucarre's avatar
Thibault Soucarre committed
321 322
        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};
323
        mvp = _projection * _modelview;
324
        glUniformMatrix4fv(glGetUniformLocation(_shader->getProgramID(), "MVP"), 1, GL_FALSE, glm::value_ptr(mvp));
325 326 327 328 329 330 331
        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
332
        glDisable(GL_BLEND);
333
        _modelview = tmp;
334
 }
Thibault Soucarre's avatar
Thibault Soucarre committed
335
    draw_vertical_line();
Thibault Soucarre's avatar
Thibault Soucarre committed
336

337 338
    //deselect shader
    glUseProgram(0);
Thibault Soucarre's avatar
Thibault Soucarre committed
339 340
    QFont arial_font = QFont("Arial", 10);
    const QFontMetrics metric(arial_font);
341 342 343 344 345 346 347
    QString t =QString().setNum(vertical_line);
    // draw time corresponding to the vertical line position
    qglColor(Qt::red);
    renderText ( render_to_screen_x(trace_to_render_x(vertical_line))-metric.size(Qt::TextSingleLine,t).width() -5,
              metric.height()-1,
               t,
               arial_font);
Thibault Soucarre's avatar
Thibault Soucarre committed
348

Thibault Soucarre's avatar
Thibault Soucarre committed
349 350 351 352 353
    //draw texts for variables
    std::map<long int, Variable_text_>::const_iterator it=_variable_texts.begin();
    const std::map<long int, Variable_text_>::const_iterator it_end=_variable_texts.end();

    for(;it!=it_end;it++){
354
        renderText ( render_to_screen_x(trace_to_render_x(vertical_line))+3,
Thibault Soucarre's avatar
Thibault Soucarre committed
355 356
                         render_to_screen_y( trace_to_render_y((*it).second.y) + 0.5),
                         QString().setNum((*it).second.value),
357
         arial_font);
Thibault Soucarre's avatar
Thibault Soucarre committed
358 359
    }

360 361

    qglColor(Qt::white);
Thibault Soucarre's avatar
Thibault Soucarre committed
362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383
    //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),
384 385 386
                             render_to_screen_y( trace_to_render_y(_texts[i].y) + 0.5),
                             text_elided,
                             arial_font);
Thibault Soucarre's avatar
Thibault Soucarre committed
387

388
                //push only displayed values in the map
Thibault Soucarre's avatar
Thibault Soucarre committed
389 390 391 392
                previous_by_column[_texts[i].x]=_texts[i].y;
                //displayed++;
            }//else{skipped++;}
        }
Thibault Soucarre's avatar
Thibault Soucarre committed
393
        /*Draw ruler text*/
394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440
        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);

441
    }
442

443 444 445 446 447 448 449 450 451 452 453 454 455 456
}
/***********************************
 *
 *
 *
 * Building functions.
 *
 *
 *
 **********************************/



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

458 459 460 461 462 463 464 465 466 467 468 469
    _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
470

471 472 473 474 475 476 477 478 479
    if (NULL == _render_instance)
        return true;

    return true;
}



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

481

482 483 484 485 486 487
    /**********************
     *
     * Init OpenGL features
     *
     **********************/

488 489 490
    /*enable some OpenGL features*/
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
491

492
    glEnable(GL_TEXTURE_2D);
493

494 495
    glEnable(GL_BLEND);/* enable blending for the alpha color */
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
496

497
    glColor3d(1.0, 1.0, 1.0);/* init color to white */
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 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541
    /*****************************
     *
     * 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 */

    /* init measurement attributes */
    /*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();
    clear_text();

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

    /*for (unsigned int i=0 ;
         i<_vbos.size()   ;
         i++){
        delete _vbos[i];
    }
     _vbos.clear();*/
542

543 544
    /* clear the event vector */
    // _events.clear();
545

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

549 550 551
    /* empty the selection stack */
    while(false == _previous_selection.empty())
        _previous_selection.pop();
552

553 554
    if (NULL == _render_instance)
        return true;
555

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

560 561 562 563
        /*  _wait_timer = new QTimer(this);
        connect(_wait_timer, SIGNAL(timeout()), _render_instance, SLOT(updateGL()));
        _wait_timer->start(_wait_spf);*/
    //}
564 565


566
    return true;//_render_instance->display_unbuild();
567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585
}





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



GLuint Render_alternate::draw_wait() {
Thibault Soucarre's avatar
Thibault Soucarre committed
586 587 588 589 590 591 592 593 594 595 596 597
    glGenTextures(1, &_textureID);
    QFile texture_file(QString(":/img/img/logo") +  QDate::currentDate().toString("MMdd") + QString(".png"));
    glBindTexture(GL_TEXTURE_2D, _textureID);
    if (true == texture_file.exists())/* The texture exists */
        _textureID = bindTexture(QPixmap(texture_file.fileName()), GL_TEXTURE_2D);
    else/* use the default picture */
        _textureID = bindTexture(QPixmap(":/img/img/logo.png"), GL_TEXTURE_2D);
    _wait.add(-0.25, -0.25, 0, 0);
    _wait.add( 0.25, -0.25, 1, 0);
    _wait.add( 0.25,  0.25, 1, 1);
    _wait.add(-0.25,  0.25, 0, 1);
    _wait.config(_glsl);
598 599 600 601 602
}



void Render_alternate::call_ruler(){
603
    _ruler.setNbVertex(0);
604
    Element_pos graduation_diff;
605
    //Element_pos coeff_prefix;
606 607 608 609
    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
610

611
    graduation_diff = Ruler::get_graduation_diff(Info::Render::_x_min_visible, Info::Render::_x_max_visible);
612
    //coeff_prefix    = Ruler::get_coeff_for_common_prefix(Info::Render::_x_min_visible, Info::Render::_x_max_visible);
613 614
    //draw quads
    set_color(0.0, 0.0, 1.0);
Thibault Soucarre's avatar
Thibault Soucarre committed
615
    _ruler.add(trace_to_render_x(Info::Render::_x_min_visible), 3, _r, _g, _b);
616 617
    _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
618
    _ruler.add(trace_to_render_x(Info::Render::_x_max_visible), 3, _r, _g, _b);
619 620 621 622 623 624 625
    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
626
    set_color(1.0, 1.0, 1.0);
Thibault Soucarre's avatar
Thibault Soucarre committed
627

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

639
     return;
Thibault Soucarre's avatar
Thibault Soucarre committed
640
}
641 642 643 644



void Render_alternate::set_color(float r, float g, float b){
645 646 647
    _r = r;
    _g = g;
    _b = b;
648 649
}

Thibault Soucarre's avatar
Thibault Soucarre committed
650
void Render_alternate::draw_text(const Element_pos x, const Element_pos y, const Element_pos size, const std::string s){
651
    if (_draw_ruler) return;/* do not draw text for ruler */
Thibault Soucarre's avatar
Thibault Soucarre committed
652 653
    Container_text_ buf;
    buf.x     = x;
654
    buf.y     = render_to_trace_y(y);/* Cancel previous transformation. */
Thibault Soucarre's avatar
Thibault Soucarre committed
655 656 657
    buf.value = s;
    buf.size = size;
    _texts.push_back(buf);
658 659 660 661 662 663 664
}

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;
665 666 667 668 669 670 671 672
    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){
673
        offset_x = -_default_entity_x_translate;
674
        if(_glsl<330) {
675 676 677 678
            _current->add(x+offset_x  , y+offset_y, 2.0f);
            _current->add(x+offset_x+w, y+offset_y, 1.0f);
            _current->add(x+offset_x+w, y+offset_y+h, 1.0f);
            _current->add(x+offset_x  , y+offset_y+h, 2.0f);
679 680 681 682
        }
        else{
            char c1 = 1;
            char c2 = 2;
683 684 685 686
            _current->add(x+offset_x  , y+offset_y, c2);
            _current->add(x+offset_x+w, y+offset_y, c1);
            _current->add(x+offset_x+w, y+offset_y+h, c1);
            _current->add(x+offset_x  , y+offset_y+h, c2);
687
        }
Thibault Soucarre's avatar
Thibault Soucarre committed
688 689 690
    }
    else if(_draw_ruler){
    }
691 692 693 694 695 696 697 698 699 700 701 702

}

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

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

703 704 705 706
    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);
    }
707 708 709 710
    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);
    }
711 712 713 714 715 716 717 718 719
    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();
720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745
    }
}

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


void Render_alternate::start_draw(){
    _draw_ruler = false;
    _draw_container = false;
    _draw_arrow = false;
    _draw_event = false;
}

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;
746
    _containers.config(_glsl);
747
    cout << "end_draw_containers" << endl;
748 749 750
}

void Render_alternate::start_draw_states(){
751
    _draw_states = true;
752 753
}

754 755
void Render_alternate::draw_state(const Element_pos x, const Element_pos y, const Element_pos z, const Element_pos w, const Element_pos h, const EntityValue* value){
    if(_states.count(value)==0){
756
        Shader *s = new Shader(_glsl, _r, _g, _b);
757
        s->charger();
758
        //assert(value); // TODO: check why busy state exists and uncomment this assert
759
        std::pair<const EntityValue*, Shader*> p(value, s);
760
        _states_shaders.insert(p);
761
        Vbo *v = new Vbo(GL_QUADS);
762
        std::pair<const EntityValue*, Vbo*> p2(value, v);
763 764
        _states.insert(p2);
    }
765
    _current = _states[value];
766
    draw_quad(x, y, z, w, h);
767 768 769 770
}

void Render_alternate::end_draw_states(){

771
    _draw_states = false;
772
    std::map<const EntityValue*, Vbo*>::iterator it;
773 774
    it = _states.begin();
    while(it!=_states.end()){
775
        it->second->config(_glsl);
776 777
        it++;
    }
778
    cout << "end_draw_states" << endl;
779 780 781 782 783 784 785 786 787 788 789
}

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;
790
    Element_pos x0, x1, y0, y1, l, alpha, cosa, sina;
791 792 793 794 795 796 797
    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
798
    cosa = (x1-x0)/l;
799
    sina = (y1-y0)/l;
800 801
    alpha = acos(cosa);
    if(sina<0) alpha*= -1;
802 803 804
    _arrows.add(x0, y0, 1, 1, 1);
    _arrows.add(x1, y1, 1, 1, 1);
    _arrows2.add(x1, y1, 1, 1, 1);
805 806 807 808
    _links.push_back(alpha);
    _links.push_back(l);
    _links.push_back(x1);
    _links.push_back(y1);
809 810 811
}

void Render_alternate::end_draw_arrows(){
812
    //coordinates that we use for draw the head all arrows when parameter arrows_shape is triangle, we will change the angle and scale of using the modelview matrix
813 814 815
    _arrows3.add(0,0,1,1,1);
    _arrows3.add(-1.2, -0.4, 1, 1, 1);
    _arrows3.add(-1.2, 0.4, 1, 1, 1);
816
    //send datas to vbo
817 818 819
    _arrows.config(_glsl);
    _arrows2.config(_glsl);
    _arrows3.config(_glsl);
820
    _draw_arrow = false;
821
    cout << "end_draw_arrows " << _links.size() << endl;
822 823 824 825 826 827 828 829 830
}

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;
831 832 833
    _events.add(time+offset_x, height + offset_y, 1, 1, 1);
    _events2.add(time+offset_x, height + offset_y, 1, 1, 1);
    _events2.add(time+offset_x, height+offset_y+container_height/2, 1, 1, 1);
834 835 836 837
}


void Render_alternate::end_draw_events(){
Thibault Soucarre's avatar
Thibault Soucarre committed
838
    set_color(1.0, 1.0, 1.0);
839 840
    _events.config(_glsl);
    _events2.config(_glsl);
841
    _draw_event = false;
842
    cout << "end_draw_events" << endl;
843 844 845
}

void Render_alternate::start_draw_counter(){
846
    _draw_counter = true;
847 848 849 850 851 852
}

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

void Render_alternate::end_draw_counter(){
853
    _draw_counter = false;
854
    _counters.config(_glsl);
855
    cout << "end_draw_counters" << endl;
856 857 858 859 860 861 862 863 864 865 866
}

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

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

void Render_alternate::end_draw(){
867
    cout << "end_draw" << endl;
868 869 870 871 872 873 874 875 876 877 878
}


void Render_alternate::draw_stored_texts(){
}

void Render_alternate::draw_stored_arrows(){
}

void Render_alternate::draw_stored_circles(){
}
879 880 881 882 883 884

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

void Render_alternate::draw_text_value(long int id,double text, double y){
Thibault Soucarre's avatar
Thibault Soucarre committed
885 886 887 888 889 890 891 892 893 894 895 896 897
    if(y!=-1){
        Variable_text_ buf;
        buf.y=y;
        buf.value=text;
       // printf("adding %f at %f for %p\n", text, y, (void*)id);
        _variable_texts[id]=buf;
    }else{
        //it's an update
        Variable_text_ buf=_variable_texts[id];
        buf.value=text;
        //printf("updating %f at %f for %p\n", text, y, (void*)id);
        _variable_texts[id]=buf;
    }
898 899
}

Thibault Soucarre's avatar
Thibault Soucarre committed
900

901 902 903 904 905 906 907 908
void Render_alternate::show_minimap(){
}

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

void Render_alternate::draw_vertical_line(){
909
    glm::mat4 mvp;
Thibault Soucarre's avatar
Thibault Soucarre committed
910 911 912 913 914 915 916
    if(vertical_line==0)
        return;
    double vertex[4] = {trace_to_render_x(vertical_line),
                        0.0,
                        trace_to_render_x(vertical_line),
                        Info::Render::height};
    double colors[6] = {1.0, 0.0, 0.0, 1.0, 0.0, 0.0};
917
    mvp = _projection * _modelview;
918
    glUniformMatrix4fv(glGetUniformLocation(_shader->getProgramID(), "MVP"), 1, GL_FALSE, glm::value_ptr(mvp));
Thibault Soucarre's avatar
Thibault Soucarre committed
919 920 921 922 923 924 925
    glVertexAttribPointer(0, 2, GL_DOUBLE, GL_FALSE, 0, vertex);
    glEnableVertexAttribArray(0);
    glVertexAttribPointer(1, 3, GL_DOUBLE, GL_FALSE, 0, colors);
    glEnableVertexAttribArray(1);
    glDrawArrays(GL_LINES, 0, 2);
    glDisableVertexAttribArray(0);
    glDisableVertexAttribArray(1);
926

927 928 929 930 931 932
}

/*!
 * \brief slot connected to the simple click event
 */
void Render_alternate::update_vertical_line(){
Thibault Soucarre's avatar
Thibault Soucarre committed
933 934 935 936 937
    if (_mouse_pressed_inside_container)
            set_vertical_line(0);
    else
        set_vertical_line(render_to_trace_x( screen_to_render_x(_mouse_x)));
    updateGL();
938 939 940
}

/*!
941 942 943
 * \brief set the vertical line offset
 * \param l the line offset.
 */
Thibault Soucarre's avatar
Thibault Soucarre committed
944 945 946
void Render_alternate::set_vertical_line(Element_pos new_coord){
    if(new_coord==vertical_line)vertical_line=0;
    else vertical_line=new_coord;
947
}
Thibault Soucarre's avatar
Thibault Soucarre committed
948 949 950 951 952

Element_pos Render_alternate::get_vertical_line(){
        return vertical_line;
}

953 954 955 956
void Render_alternate::clear_text (){
    _texts.clear();
    _variable_texts.clear();
}
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::change_color(std::string entity, Element_col r, Element_col g, Element_col b){
    std::cout << "changement shader" << std::endl;
    std::map<const EntityValue*, Shader*>::iterator it;
    it = _states_shaders.begin();
    while(it != _states_shaders.end()){
        std::cout << "salut" << std::endl;
        //std::cout << it->first->get_name().get_name() << std::endl;

        //assert(it->first); // TODO: check why busy state exists and uncomment this assert
        if(it->first && (it->first->get_name() == entity)){
            std::cout << "rentré dans le if" << std::endl;
            Shader* s = it->second;
            delete s;
            s = new Shader(_glsl, r, g, b);
            s->charger();
            break;
        }
        std::cout << "iteration" << std::endl;
        it++;
    }
}