From dcf9a4b1218a334868dfc81f8463a42c41c2f4ba Mon Sep 17 00:00:00 2001 From: Thibault Soucarre <thibault.soucarre@inria.fr> Date: Fri, 5 Sep 2014 14:48:31 +0000 Subject: [PATCH] Delete shaders map in render_alternate. Shader is now an attribute of class Vbo --- src/common/Palette.cpp | 5 +- src/interface/Settings_window.cpp | 13 ++- src/render/Render_alternate.cpp | 181 ++++++++++++++++-------------- src/render/Render_alternate.hpp | 8 +- src/render/vbo.cpp | 16 ++- src/render/vbo.hpp | 16 ++- 6 files changed, 135 insertions(+), 104 deletions(-) diff --git a/src/common/Palette.cpp b/src/common/Palette.cpp index b5ca9831..856c2c93 100644 --- a/src/common/Palette.cpp +++ b/src/common/Palette.cpp @@ -1,5 +1,6 @@ #include <string> #include <map> +#include <iostream> /* -- */ #include "trace/values/Value.hpp" #include "trace/values/Color.hpp" @@ -25,8 +26,10 @@ Palette::~Palette() { Color *Palette::get_color(const std::string &state_name) { if(_pairs.find(state_name) != _pairs.end() /*&& is_visible(state_name)*/) return _pairs[state_name]; - else + else{ + std::cout << state_name << " non trouvé" << std::endl; return NULL; + } } bool Palette::is_visible(const std::string &state_name){ diff --git a/src/interface/Settings_window.cpp b/src/interface/Settings_window.cpp index fa09c5ed..30085d87 100644 --- a/src/interface/Settings_window.cpp +++ b/src/interface/Settings_window.cpp @@ -300,6 +300,7 @@ void Settings_window::add_table_line(QTableWidget *table, table->setCellWidget(row, 1, color_widget); table->setCellWidget(row, 2, cb); row ++; + } void Settings_window::fill_table( QTableWidget *table, @@ -331,7 +332,17 @@ void Settings_window::fill_table( QTableWidget *table, } map<string, Color *>::const_iterator it; - + for(it = colors_trace.begin(); + it!= colors_trace.end(); + it++){ + if(p->get_color(it->first) == NULL){ + std::cout << " Coucou " << pname << it->first << std::endl; + p->add_state(it->first, *(it->second), true); + Session::getSession().add_state_to_palette(pname, palette_list->currentText().toStdString(), it->first, *(it->second), true); + } + if(it->second == NULL) + std::cout << "Problème" << std::endl; + } colors_settings.insert( colors_trace.begin(), colors_trace.end() ); for(it = colors_settings.begin(); diff --git a/src/render/Render_alternate.cpp b/src/render/Render_alternate.cpp index 02d0ce6e..d0e20a19 100644 --- a/src/render/Render_alternate.cpp +++ b/src/render/Render_alternate.cpp @@ -101,13 +101,13 @@ static bool _draw_counter; Render_alternate::Render_alternate(Core* core, QWidget *parent, const QGLFormat& format) : Hook_event(this, core, parent, format), _glsl(0), - _containers(GL_QUADS), + _containers(NULL), /*_states(GL_QUADS),*/ //_arrows(GL_LINE), //_arrows2(GL_TRIANGLES), - _counters(GL_LINE), - _ruler(GL_QUADS), - _wait(GL_QUADS), + _counters(NULL), + _ruler(NULL), + _wait(NULL), _modelview(glm::mat4(1.0)), _projection(glm::mat4(1.0)), _container_height(_DRAWING_CONTAINER_HEIGHT_DEFAULT) { @@ -152,9 +152,8 @@ void Render_alternate::initializeGL() { std::cout << _glsl << std::endl; _shader = new Shader(_glsl); - _wait_shader = new Shader(_glsl, 0); + //_wait_shader = new Shader(_glsl, 0); _shader->charger(); - _wait_shader->charger(); draw_wait(); setAutoFillBackground(false); if(_core == NULL) @@ -187,7 +186,7 @@ void Render_alternate::paintGL(){ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); /*Draw the home screen*/ if(DRAWING_STATE_WAITING == _state){ - glUseProgram(_wait_shader->getProgramID()); + glUseProgram(_wait.get_shader()->getProgramID()); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); _wait.lock(); @@ -206,7 +205,7 @@ void Render_alternate::paintGL(){ //select shader program glUseProgram(_shader->getProgramID()); std::cout << "paintGL" << std::endl; - glm::mat4 tmp = _modelview; + glm::mat4 tmp = _modelview; glm::mat4 tmp2 = _modelview; glm::mat4 mvp; start_ruler(); @@ -228,6 +227,8 @@ void Render_alternate::paintGL(){ _modelview = tmp; /* drawing containers*/ + Shader*s = _containers.get_shader(); + glUseProgram(s->getProgramID()); _containers.lock(); _modelview = glm::translate(_modelview, glm::vec3(0.0, _ruler_y + _ruler_height - _y_state_translate, _z_container)); _modelview = glm::scale(_modelview, glm::vec3(_x_scale_container_state/0.20, _y_state_scale, 1.0)); @@ -244,7 +245,7 @@ void Render_alternate::paintGL(){ std::map<EntityValue*, Vbo*>::iterator it_state; it_state = _states.begin(); while(it_state!=_states.end()){ - Shader *s = _states_shaders[it_state->first]; + Shader *s = it_state->second->get_shader(); glUseProgram(s->getProgramID()); it_state->second->lock(); glUniformMatrix4fv(glGetUniformLocation(s->getProgramID(), "MVP"), 1, GL_FALSE, glm::value_ptr(mvp)); @@ -253,10 +254,11 @@ void Render_alternate::paintGL(){ it_state->second->unlock(); it_state++; } - glUseProgram(_shader->getProgramID()); - glUniformMatrix4fv(glGetUniformLocation(_shader->getProgramID(), "MVP"), 1, GL_FALSE, glm::value_ptr(mvp)); /*drawing counters*/ + glUseProgram(_counters.get_shader()->getProgramID()); + glUniformMatrix4fv(glGetUniformLocation(_counters.get_shader()->getProgramID(), "MVP"), 1, GL_FALSE, glm::value_ptr(mvp)); + _counters.lock(); glDrawArrays(GL_LINES, 0, _counters.getNbVertex()); _counters.unlock(); @@ -271,10 +273,10 @@ void Render_alternate::paintGL(){ //draw the lines std::map<EntityValue*, std::pair<Vbo *, Vbo*> >::iterator it_arrow = _arrows.begin(); while(it_arrow != _arrows.end()){ - Shader*s = _arrows_shaders[it_arrow->first]; + Shader *s = it_arrow->second.first->get_shader(); glUseProgram(s->getProgramID()); it_arrow->second.first->lock(); - glUniformMatrix4fv(glGetUniformLocation(_shader->getProgramID(), "MVP"), 1, GL_FALSE, glm::value_ptr(mvp)); + glUniformMatrix4fv(glGetUniformLocation(s->getProgramID(), "MVP"), 1, GL_FALSE, glm::value_ptr(mvp)); if(it_arrow->first == NULL || it_arrow->first->get_visible()) glDrawArrays(GL_LINES, 0, it_arrow->second.first->getNbVertex()); it_arrow->second.first->unlock(); @@ -296,7 +298,7 @@ void Render_alternate::paintGL(){ tmp2 = _modelview; _arrows3.lock(); while(it_link != _links.end()){ - Shader *s = _arrows_shaders[it_link->first]; + Shader *s = _arrows[it_link->first].first->get_shader(); glUseProgram(s->getProgramID()); std::vector<Element_pos> v = it_link->second; int n = v.size()/3; @@ -307,18 +309,18 @@ void Render_alternate::paintGL(){ } for(int i=0 ; i<n ; i++){ _modelview = glm::translate(_modelview, glm::vec3(_x_state_scale * v[3*i], _y_state_scale * v[3*i+1], 0)); - _modelview = glm::rotate(_modelview, v[3*i+2], glm::vec3(0, 0, 1)); - mvp = _projection * _modelview; - glUniformMatrix4fv(glGetUniformLocation(_shader->getProgramID(), "MVP"), 1, GL_FALSE, glm::value_ptr(mvp)); + _modelview = glm::rotate(_modelview, v[3*i+2], glm::vec3(0, 0, 1)); + mvp = _projection * _modelview; + glUniformMatrix4fv(glGetUniformLocation(s->getProgramID(), "MVP"), 1, GL_FALSE, glm::value_ptr(mvp)); - glDrawArrays(GL_TRIANGLES, 0, _arrows3.getNbVertex()); - _modelview = tmp2; + glDrawArrays(GL_TRIANGLES, 0, _arrows3.getNbVertex()); + _modelview = tmp2; } it_link++; } _arrows3.unlock(); } - _modelview = tmp; + _modelview = tmp; } /*drawing events*/ @@ -328,10 +330,10 @@ void Render_alternate::paintGL(){ mvp = _projection * _modelview; std::map<EntityValue*, std::pair<Vbo*, Vbo*> >::iterator it_event = _events.begin(); while(it_event != _events.end()){ - Shader *s = _events_shaders[it_event->first]; + Shader *s = it_event->second.first->get_shader(); glUseProgram(s->getProgramID()); it_event->second.first->lock(); - glUniformMatrix4fv(glGetUniformLocation(_shader->getProgramID(), "MVP"), 1, GL_FALSE, glm::value_ptr(mvp)); + glUniformMatrix4fv(glGetUniformLocation(s->getProgramID(), "MVP"), 1, GL_FALSE, glm::value_ptr(mvp)); if(it_event->first==NULL || it_event->first->get_visible()){ glEnable(GL_PROGRAM_POINT_SIZE); glEnable(GL_POINT_SMOOTH); @@ -641,6 +643,9 @@ bool Render_alternate::unbuild(){ GLuint Render_alternate::draw_wait() { + Shader *s = new Shader(_glsl, 0); + s->charger(); + _wait.set_shader(s); glGenTextures(1, &_textureID); QFile texture_file(QString(":/img/img/logo") + QDate::currentDate().toString("MMdd") + QString(".png")); glBindTexture(GL_TEXTURE_2D, _textureID); @@ -759,8 +764,8 @@ void Render_alternate::draw_line(Element_pos x1, Element_pos y1, Element_pos x2, const Element_pos offset_y = -_ruler_y - _ruler_height; 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); + _counters.add(x1+offset_x,y1+offset_y);//,_r,_g,_b); + _counters.add(x2+offset_x,y2+offset_y);//,_r,_g,_b); } else if(_draw_ruler){ _ruler.add(x1+offset_x, y1, _r, _g, _b); @@ -781,6 +786,9 @@ void Render_alternate::start_draw(){ void Render_alternate::start_draw_containers(){ _draw_container = true; + Shader *s = new Shader(_glsl); + s->charger(); + _containers.set_shader(s); } void Render_alternate::draw_container(const Element_pos , const Element_pos , const Element_pos , const Element_pos ){ @@ -804,9 +812,7 @@ void Render_alternate::draw_state(const Element_pos x, const Element_pos y, cons Shader *s = new Shader(_glsl, _r, _g, _b, true); s->charger(); //assert(value); // TODO: check why busy state exists and uncomment this assert - std::pair<EntityValue*, Shader*> p(value, s); - _states_shaders.insert(p); - Vbo *v = new Vbo(GL_QUADS); + Vbo *v = new Vbo(s); std::pair<EntityValue*, Vbo*> p2(value, v); _states.insert(p2); } @@ -836,16 +842,14 @@ void Render_alternate::start_draw_arrows(){ if(_arrows.count(value) == 0){ Shader *s = new Shader(_glsl, _r, _g, _b, false); s->charger(); - std::pair<EntityValue*, Shader*> p(value, s); - _arrows_shaders.insert(p); - Vbo* v1 = new Vbo(GL_LINES); - Vbo* v2 = new Vbo(GL_POINTS); - std::pair<Vbo*, Vbo*> p2(v1, v2); - std::pair<EntityValue*, std::pair<Vbo*, Vbo*> > p3(value, p2); - _arrows.insert(p3); + Vbo* v1 = new Vbo(s); + Vbo* v2 = new Vbo(s); + std::pair<Vbo*, Vbo*> p1(v1, v2); + std::pair<EntityValue*, std::pair<Vbo*, Vbo*> > p2(value, p1); + _arrows.insert(p2); std::vector<Element_pos> v; - std::pair<EntityValue*, std::vector<Element_pos> > p4(value, v); - _links.insert(p4); + std::pair<EntityValue*, std::vector<Element_pos> > p3(value, v); + _links.insert(p3); } const Element_pos offset_x = -_default_entity_x_translate; const Element_pos offset_y = -_ruler_y - _ruler_height; @@ -904,13 +908,11 @@ void Render_alternate::draw_event(const Element_pos time, const Element_pos heig if(_events.count(value) == 0){ Shader *s = new Shader(_glsl, _r, _g, _b, false); s->charger(); - std::pair<EntityValue*, Shader*> p(value, s); - _events_shaders.insert(p); - Vbo* v1 = new Vbo(GL_POINTS); - Vbo* v2 = new Vbo(GL_LINES); - std::pair<Vbo*, Vbo*> p2(v1, v2); - std::pair<EntityValue*, std::pair<Vbo*, Vbo*> > p3(value, p2); - _events.insert(p3); + Vbo* v1 = new Vbo(s); + Vbo* v2 = new Vbo(s); + std::pair<Vbo*, Vbo*> p1(v1, v2); + std::pair<EntityValue*, std::pair<Vbo*, Vbo*> > p2(value, p1); + _events.insert(p2); } const Element_pos offset_x = -_default_entity_x_translate; const Element_pos offset_y = -_ruler_y - _ruler_height; @@ -943,6 +945,9 @@ void Render_alternate::end_draw_events(){ void Render_alternate::start_draw_counter(){ _draw_counter = true; + Shader *s = new Shader(_glsl, 1, 1, 1, false); + s->charger(); + _counters.set_shader(s); } void Render_alternate::draw_counter(const Element_pos , const Element_pos ){ @@ -1055,19 +1060,19 @@ void Render_alternate::clear_text (){ } void Render_alternate::change_color(std::string entity, Element_col r, Element_col g, Element_col b){ - std::map<EntityValue*, Shader*>::iterator it; - it = _states_shaders.begin(); - while(it != _states_shaders.end()){ + std::map<EntityValue*, Vbo*>::iterator it; + it = _states.begin(); + while(it != _states.end()){ //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)){ Color *c = new Color(r, g, b); it->first->set_used_color(c); - Shader* s = it->second; - delete s; - s = new Shader(_glsl, r, g, b, true); + it->second->delete_shader(); + Shader *s = new Shader(_glsl, r, g, b, true); s->charger(); + it->second->set_shader(s); break; } it++; @@ -1075,19 +1080,20 @@ void Render_alternate::change_color(std::string entity, Element_col r, Element_c } void Render_alternate::change_event_color(std::string event, Element_col r, Element_col g, Element_col b){ - std::map<EntityValue*, Shader*>::iterator it; - it = _events_shaders.begin(); - while(it != _events_shaders.end()){ + std::map<EntityValue*, std::pair<Vbo*, Vbo*> >::iterator it; + it = _events.begin(); + while(it != _events.end()){ //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() == event)){ Color *c = new Color(r, g, b); it->first->set_used_color(c); - Shader* s = it->second; - delete s; - s = new Shader(_glsl, r, g, b, false); + it->second.first->delete_shader(); + Shader *s = new Shader(_glsl, r, g, b, false); s->charger(); + it->second.first->set_shader(s); + it->second.second->set_shader(s); break; } it++; @@ -1096,9 +1102,9 @@ void Render_alternate::change_event_color(std::string event, Element_col r, Elem void Render_alternate::change_link_color(std::string link, Element_col r, Element_col g, Element_col b){ std::cout << "change_link_color" << " " << link << std::endl; - std::map<EntityValue*, Shader*>::iterator it; - it = _arrows_shaders.begin(); - while(it != _arrows_shaders.end()){ + std::map<EntityValue*, std::pair<Vbo*, Vbo*> >::iterator it; + it = _arrows.begin(); + while(it != _arrows.end()){ //std::cout << it->first->get_name().get_name() << std::endl; //assert(it->first); // TODO: check why busy state exists and uncomment this assert @@ -1106,22 +1112,21 @@ void Render_alternate::change_link_color(std::string link, Element_col r, Elemen std::cout << "xd lol" << std::endl; Color *c = new Color(r, g, b); it->first->set_used_color(c); - Shader* s = it->second; - delete s; - s = new Shader(_glsl, r, g, b, false); + it->second.first->delete_shader(); + Shader *s = new Shader(_glsl, r, g, b, false); s->charger(); + it->second.first->set_shader(s); + it->second.second->set_shader(s); break; } - else if(it->first) - std::cout << it->first->get_name().get_name() << std::endl; it++; } } void Render_alternate::change_visible(std::string entity, bool visible){ - std::map<EntityValue*, Shader*>::iterator it; - it = _states_shaders.begin(); - while(it != _states_shaders.end()){ + std::map<EntityValue*, Vbo*>::iterator it; + it = _states.begin(); + while(it != _states.end()){ //std::cout << it->first->get_name().get_name() << std::endl; //assert(it->first); // TODO: check why busy state exists and uncomment this assert @@ -1134,9 +1139,9 @@ void Render_alternate::change_visible(std::string entity, bool visible){ } void Render_alternate::change_event_visible(std::string event, bool visible){ -std::map<EntityValue*, Shader*>::iterator it; - it = _events_shaders.begin(); - while(it != _states_shaders.end()){ + std::map<EntityValue*, std::pair<Vbo*, Vbo*> >::iterator it; + it = _events.begin(); + while(it != _events.end()){ //std::cout << it->first->get_name().get_name() << std::endl; //assert(it->first); // TODO: check why busy state exists and uncomment this assert @@ -1149,9 +1154,9 @@ std::map<EntityValue*, Shader*>::iterator it; } void Render_alternate::change_link_visible(std::string link, bool visible){ -std::map<EntityValue*, Shader*>::iterator it; - it = _arrows_shaders.begin(); - while(it != _arrows_shaders.end()){ + std::map<EntityValue*, std::pair<Vbo*, Vbo*> >::iterator it; + it = _arrows.begin(); + while(it != _arrows.end()){ //std::cout << it->first->get_name().get_name() << std::endl; //assert(it->first); // TODO: check why busy state exists and uncomment this assert @@ -1165,53 +1170,55 @@ std::map<EntityValue*, Shader*>::iterator it; void Render_alternate::reload_states(){ - std::map<EntityValue*, Shader*>::iterator it = _states_shaders.begin(); - while(it != _states_shaders.end()){ + std::map<EntityValue*, Vbo*>::iterator it = _states.begin(); + while(it != _states.end()){ if(it->first){ it->first->reload_file_color(); it->first->set_visible(true); - Shader* s = it->second; - delete s; - s = new Shader(_glsl, it->first->get_used_color()->get_red(), + it->second->delete_shader(); + Shader* s = new Shader(_glsl, it->first->get_used_color()->get_red(), it->first->get_used_color()->get_green(), it->first->get_used_color()->get_blue(), true); s->charger(); + it->second->set_shader(s); } it++; } } void Render_alternate::reload_links(){ - std::map<EntityValue*, Shader*>::iterator it = _arrows_shaders.begin(); - while(it != _arrows_shaders.end()){ + std::map<EntityValue*, std::pair<Vbo*, Vbo*> >::iterator it = _arrows.begin(); + while(it != _arrows.end()){ if(it->first){ it->first->reload_file_color(); it->first->set_visible(true); - Shader* s = it->second; - delete s; - s = new Shader(_glsl, it->first->get_used_color()->get_red(), + it->second.first->delete_shader(); + Shader* s = s = new Shader(_glsl, it->first->get_used_color()->get_red(), it->first->get_used_color()->get_green(), it->first->get_used_color()->get_blue(), false); s->charger(); + it->second.first->set_shader(s); + it->second.second->set_shader(s); } it++; } } void Render_alternate::reload_events(){ - std::map<EntityValue*, Shader*>::iterator it = _events_shaders.begin(); - while(it != _events_shaders.end()){ + std::map<EntityValue*, std::pair<Vbo*, Vbo*> >::iterator it = _events.begin(); + while(it != _events.end()){ if(it->first){ it->first->reload_file_color(); it->first->set_visible(true); - Shader* s = it->second; - delete s; - s = new Shader(_glsl, it->first->get_used_color()->get_red(), + it->second.first->delete_shader(); + Shader* s = s = new Shader(_glsl, it->first->get_used_color()->get_red(), it->first->get_used_color()->get_green(), it->first->get_used_color()->get_blue(), false); s->charger(); + it->second.first->set_shader(s); + it->second.second->set_shader(s); } it++; } diff --git a/src/render/Render_alternate.hpp b/src/render/Render_alternate.hpp index 256b8ae9..8fa3fb7a 100644 --- a/src/render/Render_alternate.hpp +++ b/src/render/Render_alternate.hpp @@ -101,7 +101,7 @@ class Render_alternate : /*public QGLWidget,*/ public Hook_event, public Render private: int _glsl; //version of OpenGL Shading Language Shader* _shader; - Shader* _wait_shader; + //Shader* _wait_shader; Element_pos _container_height; Element_col _r; Element_col _g; @@ -125,13 +125,13 @@ private: Vbo *_current; GLuint _textureID; std::map<EntityValue*, Vbo*> _states; - std::map<EntityValue*, Shader*> _states_shaders; + //std::map<EntityValue*, Shader*> _states_shaders; //first element of the pair contains the points, second contains the lines std::map<EntityValue*, std::pair<Vbo*, Vbo*> > _events; - std::map<EntityValue*, Shader*> _events_shaders; + //std::map<EntityValue*, Shader*> _events_shaders; //first element of the pair contains the line of the arrow, second contains the position of the head std::map<EntityValue*, std::pair<Vbo*, Vbo*> > _arrows; - std::map<EntityValue*, Shader*> _arrows_shaders; + //std::map<EntityValue*, Shader*> _arrows_shaders; std::map<EntityValue*, std::vector<Element_pos> > _links; /*! * \brief Offset of the vertical helper line diff --git a/src/render/vbo.cpp b/src/render/vbo.cpp index b96e2f47..1cdcefe0 100644 --- a/src/render/vbo.cpp +++ b/src/render/vbo.cpp @@ -51,6 +51,7 @@ #include <glm/gtx/transform.hpp> #include <glm/gtc/type_ptr.hpp> #include "vbo.hpp" +#include "Shader.hpp" #define ERROR(m) printf("%s", m); @@ -72,8 +73,8 @@ Vbo::Vbo(){ _nbVertex=0; } -Vbo::Vbo(GLenum mode){ - _mode = mode; +Vbo::Vbo(Shader *s){ + _shader = s; _nbVertex = 0; } @@ -246,4 +247,15 @@ void Vbo::setNbVertex(int n){ _nbVertex = n; } +Shader * Vbo::get_shader(){ + return _shader; +} + +void Vbo::delete_shader(){ + delete _shader; + _shader = NULL; +} +void Vbo::set_shader(Shader *s){ + _shader = s; +} diff --git a/src/render/vbo.hpp b/src/render/vbo.hpp index aeaedc38..b03cb5ee 100644 --- a/src/render/vbo.hpp +++ b/src/render/vbo.hpp @@ -52,7 +52,7 @@ using namespace std; //macro used by OpenGL #define BUFFER_OFFSET(a) ((char*)NULL + (a)) - +class Shader; /*! * \brief Manage the Vertex Buffer Object. */ @@ -61,12 +61,13 @@ class Vbo{ private: GLuint _vboID; GLuint _vaoID; + Shader *_shader; vector<Element_pos> _vertex; vector<Element_col> _colors; vector<char> _shaded; vector<float> _shaded2; vector<Element_pos> _texture_coord; - GLenum _mode; + //GLenum _mode; int _nbVertex; /*! @@ -75,12 +76,6 @@ private: public: - enum Type{ - TRIANGLES, - QUADS, - LINES - }; - /*********************************** * @@ -92,7 +87,7 @@ public: * \brief Constructor. */ Vbo(); - Vbo(GLenum mode); + Vbo(Shader *s); /*! * \brief The destructor. @@ -119,6 +114,9 @@ public: int getNbVertex(); void setNbVertex(int); void config(int glsl); + Shader * get_shader(); + void delete_shader(); + void set_shader(Shader *s); }; -- GitLab