diff options
author | Ludovic Pouzenc <ludovic@pouzenc.fr> | 2013-03-31 12:52:30 +0000 |
---|---|---|
committer | Ludovic Pouzenc <ludovic@pouzenc.fr> | 2013-03-31 12:52:30 +0000 |
commit | fd619ebcd1b38c39eb53453fe41d206d907749ff (patch) | |
tree | 0bbb6114f7c2992ce0cd5cf44b41e6f7af4dcc22 | |
parent | be749b6ed55e8f31b438ebeae97e76ae223290db (diff) | |
download | 2013-gpudataviz-fd619ebcd1b38c39eb53453fe41d206d907749ff.tar.gz 2013-gpudataviz-fd619ebcd1b38c39eb53453fe41d206d907749ff.tar.bz2 2013-gpudataviz-fd619ebcd1b38c39eb53453fe41d206d907749ff.zip |
Cosmetrics + debugs pour suivre les events. Il y a un cas qui ramme : mouse2 drag + camera très loin. Car beaucoup d'alpha ? (mettre mesh à 2048 pour voir)
git-svn-id: file:///var/svn/2013-gpudataviz/trunk@27 371a6b4a-a258-45f8-9dcc-bdd82ce0ac9d
-rw-r--r-- | src/gpudataviz.cpp | 89 |
1 files changed, 45 insertions, 44 deletions
diff --git a/src/gpudataviz.cpp b/src/gpudataviz.cpp index 1f59768..89adf40 100644 --- a/src/gpudataviz.cpp +++ b/src/gpudataviz.cpp @@ -47,9 +47,8 @@ int main(int argc, char* argv[]) { return 0; } -/* MyGTKGLSceneWidget implementation (extends a Gtk::DrawingArea with Gtk::GL::Widget) - I want to keep all interesting code parts in this file, in natural reading order -*/ +// MyGTKGLSceneWidget implementation (extends a Gtk::DrawingArea with Gtk::GL::Widget) +// I want to keep all interesting code parts in this file, in natural reading order MyGTKGLSceneWidget::MyGTKGLSceneWidget(Glib::RefPtr<Gdk::GL::Config> &glconfig) { CALL_TRACE; set_gl_capability(glconfig); @@ -57,8 +56,10 @@ MyGTKGLSceneWidget::MyGTKGLSceneWidget(Glib::RefPtr<Gdk::GL::Config> &glconfig) | Gdk::BUTTON_PRESS_MASK | Gdk::BUTTON_RELEASE_MASK \ | Gdk::SCROLL_MASK; set_events(mask); // The containing window should have those attributes too + + // Some starting default values this->camera.rx = -64.0f; this->camera.ry = -16.0f; this->camera.tz = -2.0f; - need_recompute=false; time=0.0f; continuous_play=false; + need_recompute=false; continuous_play=false; time=0.0f; } MyGTKGLSceneWidget::~MyGTKGLSceneWidget() { } @@ -78,21 +79,22 @@ void MyGTKGLSceneWidget::on_realize() { // *** OpenGL BEGIN *** GLenum gl_res; if (!glwindow->gl_begin(get_gl_context())) { - std::cerr << "Oups : glwindow->gl_begin(get_gl_context())" << std::endl; + std::cerr << "Oops : glwindow->gl_begin(get_gl_context())" << std::endl; return; } EXIT_IF_FAIL(3, Gdk::GL::query_gl_extension("GL_ARB_vertex_buffer_object") ); EXIT_IF_FAIL(4, glewInit() == 0 ); - //size_t mesh_width=256, mesh_height=256, group_size=256; // TODO : not here - //size_t mesh_width=512, mesh_height=512, group_size=256; // TODO : not here - //size_t mesh_width=1024, mesh_height=1024, group_size=256; // TODO : not here - size_t mesh_width=2048, mesh_height=2048, group_size=256; // TODO : not here + // TODO : mesh size should not be fixed here + //size_t mesh_width=256, mesh_height=256, group_size=256; + //size_t mesh_width=512, mesh_height=512, group_size=256; + size_t mesh_width=1024, mesh_height=1024, group_size=256; + //size_t mesh_width=2048, mesh_height=2048, group_size=256; GLuint gl_vbo=0; GLsizeiptr gl_vbo_data_size = mesh_width * mesh_height * sizeof(cl_float4); - std::cout << "gl_vbo_data_size==" << gl_vbo_data_size << std::endl; + //std::cout << "gl_vbo_data_size==" << gl_vbo_data_size << std::endl; glGenBuffers(1, &gl_vbo); glBindBuffer(GL_ARRAY_BUFFER, gl_vbo); @@ -108,12 +110,12 @@ void MyGTKGLSceneWidget::on_realize() { intptr_t gl_context = (intptr_t)glXGetCurrentContext(); intptr_t gl_display = (intptr_t)glXGetCurrentDisplay(); //#else -// #error initOpenCL works only for X11 systems for now +// #error This code works only for X11 systems for now //#endif int cl_res = this->clKit.initCL(gl_display, gl_context, gl_vbo, mesh_width, mesh_height, group_size); EXIT_IF_FAIL(cl_res, cl_res==0); - this->clKit.resetVBO(); // XXX Just for displaying a flat mesh at start + this->clKit.resetVBO(); // Just for displaying a flat mesh at start const char source[]=STRINGIFY( /* This is OpenCL kernel code (Syntax like C but it's a different language) */ @@ -128,7 +130,7 @@ void MyGTKGLSceneWidget::on_realize() { float y = v*2.0-1.0; /* Calculate the desirated value of the mesh point */ float freq = 8.0 * 3.14; - float amp = 1.0 / 10.0; /* 0.1 does NOT works ! WTF !!! */ + float amp = 1.0 / 10.0; /* 0.1 does NOT works for me ! WTF !!! */ float speed = 1.0; float dist = sqrt(x*x+y*y); float z; @@ -142,17 +144,17 @@ void MyGTKGLSceneWidget::on_realize() { } ); + // TODO : change API, use only one string and split it at each blanks std::list<std::string> knames; knames.push_back("water1"); cl_res = this->clKit.compileKernels(knames, source, sizeof(source)); - - EXIT_IF_FAIL(6, cl_res==0); knames.clear(); + EXIT_IF_FAIL(6, cl_res==0); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // Projection setup is done at on_configure_event - // Camera setup (ie initial MODELVIEW matrix) is done at on_expose_event + // Camera setup (ie MODELVIEW matrix) is done at on_expose_event glwindow->gl_end(); // *** OpenGL END *** @@ -168,7 +170,7 @@ bool MyGTKGLSceneWidget::on_configure_event(GdkEventConfigure* event) { // *** OpenGL BEGIN *** //FIXME could segfault if get_gl_window() has failed if (!glwindow->gl_begin(get_gl_context())) { - std::cerr << "Oups : glwindow->gl_begin(get_gl_context())" << std::endl; + std::cerr << "Oops : glwindow->gl_begin(get_gl_context())" << std::endl; return false; } @@ -184,12 +186,12 @@ bool MyGTKGLSceneWidget::on_configure_event(GdkEventConfigure* event) { } bool MyGTKGLSceneWidget::on_expose_event(GdkEventExpose* event) { - std::cout << "e" << std::flush; // CALL_TRACE ; // This one runs mainly when GTK GL Widget have to be redrawn + std::cout << "e" << std::flush; Glib::RefPtr<Gdk::GL::Window> glwindow = get_gl_window(); - // *** OpenCL BEGIN + // *** OpenCL BEGIN *** if (this->need_recompute) { this->need_recompute=false; //std::cout << "execKernel(\"water1\", " << this->time << ");" << std::endl; @@ -198,11 +200,11 @@ bool MyGTKGLSceneWidget::on_expose_event(GdkEventExpose* event) { if ( res !=0 ) std::cerr << "execKernel() has returned " << res << std::endl; //std::cout << " -> " << res << std::endl; } - // *** OpenCL END + // *** OpenCL END *** // *** OpenGL BEGIN *** if (!glwindow->gl_begin(get_gl_context())) { - std::cerr << "Oups : glwindow->gl_begin(get_gl_context())" << std::endl; + std::cerr << "Oops : glwindow->gl_begin(get_gl_context())" << std::endl; return false; } @@ -224,23 +226,21 @@ bool MyGTKGLSceneWidget::on_expose_event(GdkEventExpose* event) { float t_z=this->camera.tz; // Vertex alpha blending automatic tuning (if big density then high transparency) - /* The comprehensible one - float c1=(1024*1024)/(m_w*m_h); - float c2=(s_h*s_h)/(1024*1024); - float c3=(-2*-2)/(t_z*t_z); - float alpha=0.5*c1*c2*c3; - if (alpha < 0.01f) alpha = 0.01f; - if (alpha > 1.0f) alpha = 1.0f; - */ - //std::cout << "c1 == " << c1 << " c2 == " << c2 << " c3 == " << c3 << " alpha == " << alpha << std::endl;; - - /* The optimized one */ + // The comprehensible one + //float c1=(1024*1024)/(m_w*m_h); // coef 1 decreases with mesh point quantity + //float c2=(s_h*s_h)/(1024*1024); // coef 2 increases with viewport pixel quantity + //float c3=(-2*-2)/(t_z*t_z); // coef 3 decreases with mesh-camera distance + //float alpha=0.5*c1*c2*c3; // Combine it all + //if (alpha < 0.01f) alpha = 0.01f; // Prevent values outside acceptable range + //if (alpha > 1.0f) alpha = 1.0f; + //std::cout <<"c1="<<c1<<" c2="<<c2<<" c3="<<c3<<" alpha="<<alpha<<std::endl; + + // The compacted one float alpha=2.0f*(s_h*s_h)/(m_w*m_h)/(t_z*t_z); if (alpha < 0.01f) alpha = 0.01f; if (alpha > 1.0f) alpha = 1.0f; - //std::cout << "c1 == " << c1 << " c2 == " << c2 << " c3 == " << c3 << " alpha == " << alpha << std::endl;; - glColor4f(0.40f,0.78f,0.97f,alpha); + glColor4f(0.40f,0.78f,0.97f,alpha); // XXX Blue is great but it's fixed here and shouldn't glBindBuffer(GL_ARRAY_BUFFER, this->clKit.getGLVBO()); glVertexPointer(4, GL_FLOAT, 0, (GLvoid *) 0); glEnableClientState(GL_VERTEX_ARRAY); @@ -256,27 +256,27 @@ bool MyGTKGLSceneWidget::on_expose_event(GdkEventExpose* event) { return true; } +// Update time (and flags) for continuous_play mode void MyGTKGLSceneWidget::step() { - this->time += 0.05f; + this->time += 0.01f; this->need_recompute = true; } +// Combine all kind of mouse event and redirect them to a unique method : do_mouse_logic() bool MyGTKGLSceneWidget::on_motion_notify_event (GdkEventMotion *event) { return do_mouse_logic(event->type, event->state, event->x, event->y); } - bool MyGTKGLSceneWidget::on_button_press_event(GdkEventButton *event) { return do_mouse_logic(event->type, event->state | 1<<(7+event->button) , event->x, event->y); } - bool MyGTKGLSceneWidget::on_button_release_event(GdkEventButton *event) { return do_mouse_logic(event->type, event->state, event->x, event->y); } - bool MyGTKGLSceneWidget::on_scroll_event(GdkEventScroll *event) { return do_mouse_logic(event->type, event->state | 1<<(7+event->direction) , event->x, event->y); } +// Define helper macros to filter mouse events in do_mouse_logic() #define ALL_KEYBOARD_MODIFIERS ( GDK_SHIFT_MASK | GDK_CONTROL_MASK \ | GDK_SUPER_MASK | GDK_HYPER_MASK | GDK_META_MASK ) @@ -307,7 +307,6 @@ bool MyGTKGLSceneWidget::on_scroll_event(GdkEventScroll *event) { ( type == GDK_MOTION_NOTIFY ) \ && ( state & state_mask ) == state_mask \ ) - //FIXME find bug with multiple mouse button release #define MOUSE_DRAG_END(state_mask) if ( \ type == GDK_BUTTON_RELEASE \ @@ -315,8 +314,8 @@ bool MyGTKGLSceneWidget::on_scroll_event(GdkEventScroll *event) { ) bool MyGTKGLSceneWidget::do_mouse_logic(GdkEventType type, guint state, guint x, guint y) { - std::cout << "m" << std::flush; //CALL_TRACE ; // This one runs when a mouse event is catched by the GTK GL Widget + std::cout << "m" << std::flush; /* * type : the type of the event. * Simple motion : GDK_MOTION_NOTIFY (3) @@ -382,12 +381,14 @@ bool MyGTKGLSceneWidget::do_mouse_logic(GdkEventType type, guint state, guint x, redraw=true; }*/ + // Enabling continous_play mode MOUSE_DRAG_START(GDK_BUTTON1_MASK) { this->continuous_play=true; - // The trick to have a perpetual redraw : generate a draw event in the idle signal + // The trick to have a perpetual redraw : generate a draw event in the idle signal handler Glib::signal_idle().connect( sigc::mem_fun(*this, &MyGTKGLSceneWidget::on_gtk_idle) ); } + // Disabling continous_play mode MOUSE_DRAG_END(GDK_BUTTON1_MASK) { this->continuous_play=false; } @@ -408,9 +409,8 @@ bool MyGTKGLSceneWidget::do_mouse_logic(GdkEventType type, guint state, guint x, prev_type=type; } - if ( redraw ) std::cout << "q" << std::flush; - if ( redraw ) queue_draw(); - if ( recompute ) this->need_recompute=true; + if ( redraw ) { queue_draw(); std::cout << "q" << std::flush; } + if ( recompute ) { this->need_recompute=true; } return true; } @@ -422,6 +422,7 @@ bool MyGTKGLSceneWidget::on_gtk_idle() { // Disconnected automatically the first time it returns false if ( ! continuous_play ) return false; + //TODO : compute and display FPS when in continuous_play mode this->step(); this->queue_draw(); return true; |