diff --git a/src/interface/render_area.cpp b/src/interface/render_area.cpp index 2463c2d6aa9ee5533257bcbe075203692dfd3889..75ff0058258a48eea2d3f582f3893d49e352bc98 100644 --- a/src/interface/render_area.cpp +++ b/src/interface/render_area.cpp @@ -72,8 +72,10 @@ Render_area::Render_area(QWidget *parent) _state_translate = 0;/* temporary, for states translation */ //_container_view_size = 50;/* temporary, for container view */ - _z_arrow = 1;/* closer to camera than containers or states */ - + _z_container = -1.0f; + _z_arrow = -2.0f;/* closer to camera than containers or states (MUST be negative)*/ + _z_state= -3.0f; + setAutoFillBackground(false); } @@ -157,6 +159,7 @@ void Render_area::paintGL(){ resizeGL(width(), height()); + glClearDepth(1.0); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); @@ -197,7 +200,7 @@ void Render_area::paintGL(){ glScalef(10.0f/_container_x_max, 50.0f/_container_y_max, 0.0f); */ - glTranslatef(0.0f, 0.0f, -1.0f); + glTranslatef(0.0f, 0.0f, _z_container); glScalef( (_render_width/_container_x_max)*_x_scale_container_state, _render_height/_container_y_max, 0.0f); @@ -256,10 +259,7 @@ void Render_area::paintGL(){ /* Draw states */ glPushMatrix(); - /* glTranslated(20.0f-_state_translate, 40.0f, -2.0f); - glScalef(_state_scale, 50.0f/_container_y_max, 0.0f);*/ - - glTranslated( _render_width*_x_scale_container_state-_state_translate , 0.0f, -2.0f); + glTranslated( _render_width*_x_scale_container_state-_state_translate , 0.0f, _z_state); glScalef( _state_scale*(_render_width/_state_x_max), _render_height/_state_y_max, 0.0f); @@ -268,11 +268,10 @@ void Render_area::paintGL(){ else glCallList(_list_states); - glPopMatrix(); - //glCallList(_list_counters); + draw_stored_events(_events);/* draw events without display lists */ break; default: diff --git a/src/interface/render_area.hpp b/src/interface/render_area.hpp index ccb920616c61488f3fd7e63581998360bd7179d6..ae4118609bcd549effb676fa342c1f7480a69b8d 100644 --- a/src/interface/render_area.hpp +++ b/src/interface/render_area.hpp @@ -20,6 +20,11 @@ typedef double Level; #include "resource.hpp" +struct Event_{ + Element_pos time; + Element_pos height; + Element_pos container_height; +}; /*! @@ -37,6 +42,7 @@ class Render_area : public QGLWidget, public Render std::list<Element_pos> _text_pos; std::list<std::string> _text_value; + std::vector<Event_> _events; /*********************************** @@ -210,14 +216,17 @@ class Render_area : public QGLWidget, public Render Element_pos _container_x_max; Element_pos _container_y_max; + Element_pos _event_x_max; + Element_pos _event_y_max; + Element_pos _state_x_max; Element_pos _state_y_max; Element_pos _x_scale_container_state; - - + Element_pos _z_container;/* z position for containers */ + Element_pos _z_state;/* z position for states */ Element_pos _z_arrow;/* z position for arrows */ /*********************************** @@ -322,6 +331,8 @@ class Render_area : public QGLWidget, public Render void draw_event(const Element_pos time, const Element_pos height, const Element_pos container_height); + void draw_stored_events(std::vector<Event_> &events); + void start_draw_counter(); void draw_counter(const Element_pos x, const Element_pos y); @@ -329,6 +340,8 @@ class Render_area : public QGLWidget, public Render void end_draw_counter(); void end_draw(); + + }; @@ -457,6 +470,9 @@ inline void Render_area::draw_arrow(const Element_pos start_time, const Element_ Element_pos angle; + /* DEBUG */ + // std::cerr << "Arrow draw: (" << start_time << ", " << start_height << ") to (" << end_time << ", " << end_height << ")" << std::endl; + glPushMatrix(); @@ -476,13 +492,13 @@ inline void Render_area::draw_arrow(const Element_pos start_time, const Element_ - glBegin(GL_TRIANGLES);/* create an arrow */ - { + // glBegin(GL_TRIANGLES);/* create an arrow */ + /* { glColor3d(1.0, 0.7, 0.7);glVertex2d(0.5, 0.0); glColor3d(0.9, 0.6, 0.6);glVertex2d(-0.5, -0.5); glColor3d(0.9, 0.6, 0.6);glVertex2d(-0.5, 0.5); } - glEnd(); + glEnd();*/ glPopMatrix(); @@ -490,12 +506,12 @@ inline void Render_area::draw_arrow(const Element_pos start_time, const Element_ glTranslated(0, 0, _z_arrow); glLineWidth(2.5f); - glBegin(GL_LINES); + /*glBegin(GL_LINES); { glColor3d(1.0, 0.7, 0.7);glVertex3d(start_time, start_height, _z_arrow); glColor3d(0.9, 0.6, 0.6);glVertex3d(end_time, end_height, _z_arrow); - } - glEnd(); + } + glEnd();*/ glLineWidth(1.0f);/* 1 is the default value */ glPopMatrix(); @@ -506,43 +522,81 @@ inline void Render_area::draw_arrow(const Element_pos start_time, const Element_ inline void Render_area::draw_event(const Element_pos time, const Element_pos height, const Element_pos container_height){ + Event_ buf; + + buf.time = time; + buf.height = height; + buf.container_height = container_height; + + _events.push_back(buf); + + if (time>_event_x_max) + _event_x_max = time; + + if ((height+container_height)>_event_y_max) + _event_y_max = (height+container_height); +} + + +inline void Render_area::draw_stored_events(std::vector<Event_> &events){ + + Element_pos time, height, container_height; + + /* Manage the event drawing size from state size and render area dimensions */ + Element_pos event_scale_x = _state_scale*(_render_width/_state_x_max); + Element_pos event_scale_y = _render_height/_state_y_max; + Element_pos radius;/* the circle radius */ Element_pos angle; Element_pos delta_angle; int step; - - /* IMPROVEMENT: put the circle into a display list */ + for (long i=0 ; i<(long)events.size() ; i++){ - /* draw a circle */ - radius = (container_height - height)/2.0f; - angle = PI/2.0f; - step = 20;/* 20 polygons for the circle */ + time = events[i].time*event_scale_x + _render_width*_x_scale_container_state-_state_translate; + height = events[i].height*event_scale_y; + container_height = events[i].container_height*event_scale_y; - if (step!=0) - delta_angle = 2*PI/step; + /* DEBUG */ + // std::cerr << "Event draw: (" << time << ", " << height << ") with height of:" << container_height << " - " << _render_width << " : " << _render_height << std::endl; + - glColor3d(0.5, 0.8, 0.5); - glBegin(GL_POLYGON); - { - for(int i =0 ; i<step ; i++){ - glVertex3d(time + cos(angle+delta_angle*i)*radius , height + sin(angle+delta_angle*i)*radius , _z_arrow); + /* IMPROVEMENT: put the circle into a display list */ + + + + /* draw a circle */ + radius = 2.0f; + angle = PI/2.0f; + step = 20;/* 20 polygons for the circle */ + + if (step!=0) + delta_angle = 2*PI/step; + + + glColor3d(0.5, 0.8, 0.5); + glBegin(GL_POLYGON); + { + for(int i =0 ; i<step ; i++){ + glVertex3d(time + cos(angle+delta_angle*i)*radius , height + sin(angle+delta_angle*i)*radius , _z_arrow); + } } - } - glEnd(); + glEnd(); + + /* draw line */ + glLineWidth(2.5f); - /* draw line */ - glLineWidth(2.5f); - glBegin(GL_LINES); - { - glColor3d(0.5, 0.8, 0.5);glVertex3d(time, height, _z_arrow); - glColor3d(0.4, 0.7, 0.4);glVertex3d(time, height+container_height, _z_arrow); - } - glEnd(); - glLineWidth(1.0f); + glBegin(GL_LINES); + { + glColor3d(0.5, 0.8, 0.5);glVertex3d(time, height, _z_arrow); + glColor3d(0.4, 0.7, 0.4);glVertex3d(time, height+container_height, _z_arrow); + } + glEnd(); + glLineWidth(1.0f); + }/* and loop */ }