glVertex  5.5.2
glvertex_qt_glui.h
Go to the documentation of this file.
1 // (c) by Stefan Roettger, licensed under MIT license
2 
5 #ifndef QT_GLUI_H
6 #define QT_GLUI_H
7 
8 #include <ctype.h>
9 
10 #include "glvertex_qt_glwidgetui.h"
11 #include "glvertex_qt_shadereditor.h"
12 
13 #include "glvertex_scene.h"
14 #include "glvertex_pnmformat.h"
15 
18 {
19 public:
20 
22  lgl_Qt_GLUI(QWidget *parent = NULL, bool core = true)
23  : lgl_Qt_GLWidgetUI(parent, core)
24  {
25  capture_ = "";
26  export_ = "";
27  print_ = false;
28  startup_ = 10;
29 
30  // get argument list
31  QStringList args = qApp->arguments();
32 
33  // scan for arguments and options
34  for (int i=1; i<args.size(); i++)
35  if (args[i].startsWith("--")) opt_.push_back(args[i].mid(2));
36  else if (args[i].startsWith("-")) opt_.push_back(args[i].mid(1));
37  else arg_.push_back(args[i]);
38  }
39 
40  virtual ~lgl_Qt_GLUI()
41  {}
42 
44  int args() const
45  {
46  return(arg_.size());
47  }
48 
50  QString getArg(int i) const
51  {
52  return(arg_[i]);
53  }
54 
56  int opts() const
57  {
58  return(opt_.size());
59  }
60 
62  QString getOption(int i) const
63  {
64  return(opt_[i]);
65  }
66 
68  bool hasOption(QString opt) const
69  {
70  for (int i=0; i<opts(); i++)
71  {
72  if (opt_[i] == opt)
73  return(true);
74 
75  if (opt_[i].startsWith(opt+"="))
76  return(true);
77  }
78 
79  return(false);
80  }
81 
83  QString getOptionString(QString opt) const
84  {
85  for (int i=0; i<opts(); i++)
86  if (opt_[i].startsWith(opt))
87  return(opt_[i].mid(opt_[i].indexOf("=")+1));
88 
89  return("");
90  }
91 
93  double getOptionValue(QString opt) const
94  {
95  return(getOptionString(opt).toDouble());
96  }
97 
98 protected:
99 
100  QStringList arg_, opt_;
101 
102  void initialize()
103  {
104  lgl_Qt_GLWidgetUI::initialize();
105 
106  printKeyInfo();
107  qDebug() << "";
108 
109  QString compatibility = QString("OpenGL compatibility: ") + QString::number(0.1*lglGetGLVersion());
110  QString renderer = QString("OpenGL renderer: ") + lglGetRenderer().c_str();
111  QString glsl = QString("GLSL version: ") + lglGetGLSLVersionString().c_str();
112 
113  qDebug("%s", compatibility.toStdString().c_str());
114  qDebug("%s", renderer.toStdString().c_str());
115  qDebug("%s", glsl.toStdString().c_str());
116 
117  // check for help option
118  if (hasOption("help"))
119  {
120  std::cout << std::endl << getUsageInfo();
121  exit(0);
122  }
123 
124  // check for fullscreen option
125  if (hasOption("fullscreen"))
127 
128  // check for wireframe option
129  if (hasOption("wireframe"))
131 
132  // check for pause option
133  if (hasOption("pause"))
135  }
136 
137  void keyPressEvent(QKeyEvent *event)
138  {
139  char k = '\0';
140 
141  QString key = event->text();
142 
143  if (key != "")
144  k = key[0].toLatin1();
145 
146  Qt::KeyboardModifier shift = Qt::ShiftModifier;
147 
148 #ifndef __APPLE__
149  Qt::KeyboardModifier ctrl = Qt::ControlModifier;
150 #else
151  Qt::KeyboardModifier ctrl = Qt::MetaModifier;
152 #endif
153 
154  if (k != '\0')
155  if (k!=0x11 && k!=0x1b && k!=' ')
156  {
157  if (event->modifiers() & ctrl)
158  {
159  if (event->key() == Qt::Key_S)
160  capture("screen");
161  else if (event->key() == Qt::Key_T)
162  toggleCapture("screen");
163  else if (event->key() == Qt::Key_E)
164  triggerExport("scene");
165  else if (event->key() == Qt::Key_P)
166  toggleFPS();
167  else if (event->key() == Qt::Key_K)
168  {
169  qDebug();
170  printKeyInfo();
171  }
172  }
173  else
174  {
175  if (event->modifiers() & shift)
176  k = toupper(k);
177 
178  makeCurrent();
179  keyPressed(k);
180  update();
181  }
182  }
183 
184  lgl_Qt_GLWidgetUI::keyPressEvent(event);
185  }
186 
187  void keyReleaseEvent(QKeyEvent *event)
188  {
189  char k = '\0';
190 
191  QString key = event->text();
192 
193  if (key != "")
194  k = key[0].toLatin1();
195 
196  if (k != '\0')
197  if (k!=0x11 && k!=0x1b && k!=' ')
198  {
199  makeCurrent();
200  keyReleased(k);
201  }
202 
203  lgl_Qt_GLWidgetUI::keyReleaseEvent(event);
204  }
205 
206  virtual void keyPressed(char key)
207  {
208  QString msg;
209 
210  if (isprint(key))
211  msg = QString("key '")+key+"' pressed";
212  else
213  msg = QString("key 0x")+QString("%1").arg(key, 2, 16, QChar('0'))+" pressed";
214 
215  qDebug("%s", msg.toStdString().c_str());
216  }
217 
218  virtual void keyReleased(char key)
219  {}
220 
221 public:
222 
224  bool capture(std::string filename)
225  {
226  unsigned char *pixels = lglReadRGBPixels(0,0, width(), height());
227  if (!pixels) return(false);
228 
229  bool ok = lglWritePnmImage(filename+".ppm", pixels, width(), height(), 3);
230  free(pixels);
231  return(ok);
232  }
233 
235  void toggleCapture(std::string filename)
236  {
237  if (capture_ == "")
238  capture_ = filename;
239  else
240  capture_ = "";
241  }
242 
244  void triggerExport(std::string filename, mat4 m = mat4(1))
245  {
246  export_ = filename;
247  export_matrix_ = m;
248  }
249 
251  void toggleFPS()
252  {
253  print_ = !print_;
254  }
255 
256 protected:
257 
258  void prepareOpenGL(double dt)
259  {
261 
262  if (export_ != "")
263  beginExport();
264  }
265 
266  void updateOpenGL(double dt)
267  {
269 
270  if (export_ != "")
271  endExport();
272 
273  if (print_)
274  printFPS(dt);
275  }
276 
277  void finishOpenGL(double t)
278  {
280 
281  if (capture_ != "")
282  {
283  QDateTime t = QDateTime::currentDateTime();
284  QString time = t.toString("yyyyMMdd_HHmmsszzz");
285  capture(capture_+"_"+time.toStdString());
286  }
287  }
288 
289  std::string capture_;
290 
291  std::string export_;
292  FILE *export_file_;
293  int export_index_;
294  int export_nindex_;
295  int export_tindex_;
296  mat4 export_matrix_;
297 
298  bool print_;
299  int startup_;
300 
302  virtual std::string getUsageInfo()
303  {
304  const char usage[] =
305  "Usage:\n"
306  " --help -> this message\n"
307  " --fullscreen -> toggle fullscreen mode\n"
308  " --wireframe -> toggle wireframe mode\n"
309  " --pause -> pause animations\n";
310 
311  return(usage);
312  }
313 
315  virtual std::string getKeyInfo()
316  {
317  const char keys[] =
318  "ESC: quit\n"
319  "Ctrl-q: quit\n"
320  "Ctrl-z: toggle Z-test\n"
321  "Ctrl-c: toggle back-face culling\n"
322  "Ctrl-b: toggle alpha blending\n"
323  "Ctrl-a: toggle A-test\n"
324  "Ctrl-w: toggle wire frame mode\n"
325  "Ctrl-0: black background\n"
326  "Ctrl-1: white background\n"
327  "Ctrl-2: gray background\n"
328  "Ctrl-o: toggle override\n"
329  "Ctrl-f: toggle full-screen\n"
330  "Ctrl-r: reset manipulator\n"
331  "Space: toggle animation\n"
332  "\n"
333  "Ctrl-s: capture screen\n"
334  "Ctrl-t: toggle continuous screen capture\n"
335  "Ctrl-e: trigger OBJ scene export\n"
336  "Ctrl-p: toggle frame rate info\n"
337  "Ctrl-k: print key info\n";
338 
339  return(keys);
340  }
341 
342  void printKeyInfo()
343  {
344  QString info = QString("Available key commands:\n\n") + getKeyInfo().c_str();
345  if (info.endsWith("\n")) info.chop(1);
346 
347  qDebug("%s", info.toStdString().c_str());
348  }
349 
350  void beginExport()
351  {
352  std::string filename = export_+".obj";
353  export_file_ = fopen(filename.c_str(), "wb");
354 
355  if (export_file_)
356  {
357  fprintf(export_file_, "# glVertex OBJ File\n\n");
358 
359  export_index_ = 1;
360  export_nindex_ = 1;
361  export_tindex_ = 1;
362 
363  lglBeginExport(callback, this, export_matrix_);
364  }
365  }
366 
367  static void callback(LGL_VBO_TYPE *vbo, void *data)
368  {
369  lgl_Qt_GLUI *glui = (lgl_Qt_GLUI *)data;
370  FILE *file = glui->export_file_;
371  int *index = &glui->export_index_;
372  int *nindex = &glui->export_nindex_;
373  int *tindex = &glui->export_tindex_;
374 
375  fprintf(file, "#");
376  if (vbo->getName() != "") fprintf(file, " name=%s", vbo->getName().c_str());
377  fprintf(file, " vertices=%d", vbo->lglGetVertexCount());
378  fprintf(file, " primitives=%d\n", vbo->lglGetPrimitiveCount());
379  lglSaveObjInto((lglVBO *)vbo, file, *index, *nindex, *tindex);
380  }
381 
382  void endExport()
383  {
384  if (export_file_)
385  {
386  lglEndExport();
387  fclose(export_file_);
388  }
389 
390  export_ = "";
391  }
392 
393  void printFPS(double dt)
394  {
395  if (startup_ > 0)
396  {
397  startup_--;
398  return;
399  }
400 
401  dt /= speedup_;
402 
403  static const double interval = 3;
404 
405  static double t = 0;
406  static int c = 0;
407  static double f = 0;
408 
409  if (dt > 0)
410  {
411  t += dt;
412  f += 1/dt;
413  c++;
414  }
415 
416  if (t > interval)
417  {
418  if (c > 0)
419  {
420  double fps = f/c;
421  fps = floor(10*fps+0.5)/10;
422  qDebug("fps = %g", fps);
423  }
424 
425  t = 0;
426  c = 0;
427  f = 0;
428  }
429  }
430 
431 };
432 
435 {
436 public:
437 
438  lgl_Scene_GLUI(QWidget *parent = NULL, bool core = true)
439  : lgl_Qt_GLUI(parent, core),
440  lgl_Renderer()
441  {}
442 
443  virtual ~lgl_Scene_GLUI()
444  {}
445 
446  virtual void initializeOpenGL()
447  {
448  lgl_Renderer::initializeOpenGL();
449  }
450 
451  virtual void renderOpenGL(double dt)
452  {
453  lgl_Renderer::renderOpenGL(dt);
454  }
455 
456  virtual void updateOpenGL(double dt)
457  {
459 
460  if (lgl_Cam *cam = getScene()->getCam())
461  cam->halt(isSpinning());
462  }
463 
464  virtual void keyPressed(char key)
465  {
466  lgl_Renderer::keyPressed(key);
467  }
468 
469  virtual void keyReleased(char key)
470  {
471  lgl_Renderer::keyReleased(key);
472  }
473 
474  virtual std::string getUsageInfo()
475  {
476  bool enabled = false;
477 
478  if (lgl_Scene *scene=getScene())
479  if (scene->supportsStereo())
480  enabled = true;
481 
482  if (enabled)
483  {
484  const char usage[] =
485  " --stereo -> enable interlaced stereo rendering\n"
486  " --stereo=left -> enable horizontal left stereo interlacing mode\n"
487  " --stereo=right -> enable horizontal right stereo interlacing mode\n"
488  " --stereo=top -> enable vertical top stereo interlacing mode\n"
489  " --stereo=bottom -> enable vertical top stereo interlacing mode\n"
490  " --stereobase=... -> specify distance of eye points in stereo mode\n";
491 
492  return(lgl_Qt_GLUI::getUsageInfo() + usage);
493  }
494 
495  return(lgl_Qt_GLUI::getUsageInfo());
496  }
497 
498  virtual std::string getKeyInfo()
499  {
500  std::string info1 = lgl_Qt_GLUI::getKeyInfo();
501  std::string info2 = lgl_Renderer::getKeyInfo();
502 
503  std::string info = info1;
504  if (info2 != "") info += "\n" + info2;
505 
506  return(info);
507  }
508 
509  virtual void mouseClick(double x, double y)
510  {
511  lgl_Renderer::mouseClick(x, y);
512  printPickInfo(x, y);
513  }
514 
515  virtual void doubleClick(double x, double y)
516  {
517  lgl_Renderer::doubleClick(x, y);
518  }
519 
520  void printDoubleClickInfo()
521  {
522  QString info = QString("Available interactions:\n\n") + getDoubleClickInfo().c_str();
523  if (info.endsWith("\n")) info.chop(1);
524 
525  qDebug("%s", info.toStdString().c_str());
526  }
527 
528  void printPickInfo(double x=0.5, double y=0.5)
529  {
530  vec3 o = vec3(0,0,0);
531  vec3 d = vec3(0,0,-1);
532 
533  if (lgl_Cam *cam = getScene()->getCam())
534  {
535  d = cam->unprojectViewport(x, y);
536 
537  if (lglVBO *vbo = pickScene(o, d))
538  {
539  std::string name = vbo->getName();
540 
541  if (name != "")
542  glslmath::print("picked object \"" + name + "\"");
543  else
544  glslmath::print("picked unnamed object");
545  }
546  }
547  }
548 
549  virtual void interaction()
550  {
551  lgl_Renderer::interaction();
552  }
553 
554  virtual void config()
555  {
556  double sbase = 0;
557  lgl_interlacing_enum smode = LGL_INTERLACE_VERTICAL_TOP;
558 
559  if (hasOption("stereo"))
560  {
561  sbase = 0.1;
562 
563  QString mode = getOptionString("stereo");
564 
565  if (mode == "left") smode = LGL_INTERLACE_HORIZONTAL_LEFT;
566  else if (mode == "right") smode = LGL_INTERLACE_HORIZONTAL_RIGHT;
567  else if (mode == "top") smode = LGL_INTERLACE_VERTICAL_TOP;
568  else if (mode == "bottom") smode = LGL_INTERLACE_VERTICAL_BOTTOM;
569  }
570 
571  if (hasOption("stereobase"))
572  sbase = getOptionValue("stereobase");
573 
574  if (sbase != 0)
575  if (scene_)
576  if (lgl_Cam *cam = scene_->getCam())
577  {
578  setStereoMode(smode);
579  cam->setStereoBase(sbase);
580  fullscreen(true);
581  }
582  }
583 
584  virtual int getViewportWidth() {return(width());}
585  virtual int getViewportHeight() {return(height());}
586  virtual void update() {lgl_Qt_GLUI::update();}
587 
588 protected:
589 
590  void initialize()
591  {
592  printDoubleClickInfo();
593  qDebug() << "";
594 
595  lgl_Qt_GLUI::initialize();
596  }
597 
598 };
599 
600 #endif
lglSaveObjInto
bool lglSaveObjInto(lglVBO *vbo, FILE *file, int &index, int &nindex, int &tindex, bool flip_v=true)
save vbo to file descriptor
Definition: glvertex_objformat.h:661
lgl_Qt_GLUI::hasOption
bool hasOption(QString opt) const
check for option
Definition: glvertex_qt_glui.h:68
lglReadRGBPixels
unsigned char * lglReadRGBPixels(int x, int y, int width, int height)
read frame buffer
Definition: glvertex_api.h:856
lgl_Qt_GLUI::getKeyInfo
virtual std::string getKeyInfo()
reimplement to show key info
Definition: glvertex_qt_glui.h:315
lgl_Qt_GLUI::getOption
QString getOption(int i) const
get option
Definition: glvertex_qt_glui.h:62
lglBeginExport
void lglBeginExport(void(*callback)(LGL_VBO_TYPE *vbo, void *data), void *data, mat4 m=mat4(1))
begin scene export
Definition: glvertex_api.h:884
lgl::lglGetPrimitiveCount
int lglGetPrimitiveCount() const
get the number of primitives contained in vbo
Definition: glvertex_core.h:1796
lglGetGLVersion
int lglGetGLVersion()
get OpenGL version
Definition: glvertex_api.h:892
lgl_Qt_GLUI::getOptionValue
double getOptionValue(QString opt) const
get option value
Definition: glvertex_qt_glui.h:93
lgl_Qt_GLWidgetUI::isSpinning
bool isSpinning()
check for manipulator spin
Definition: glvertex_qt_glwidgetui.h:183
lglGetRenderer
std::string lglGetRenderer()
get OpenGL renderer
Definition: glvertex_api.h:904
lgl_Qt_GLWidgetUI::updateOpenGL
virtual void updateOpenGL(double dt)
implement this method to update state after rendering
Definition: glvertex_qt_glwidgetui.h:173
glslmath::print
void print(quat q, std::string name="", std::string prefix="", std::ostream &out=std::cout)
pretty print
Definition: glslmath.h:3266
lgl_Qt_GLUI::prepareOpenGL
void prepareOpenGL(double dt)
implement this method to prepare state before rendering
Definition: glvertex_qt_glui.h:258
lgl_Qt_GLWidget::toggle_fullscreen
void toggle_fullscreen()
toggle fullscreen mode
Definition: glvertex_qt_glwidget.h:296
lgl_Renderer::lgl_Renderer
lgl_Renderer()
ctor
Definition: glvertex_scene.h:675
lgl_Qt_GLUI::triggerExport
void triggerExport(std::string filename, mat4 m=mat4(1))
trigger OBJ scene export on next frame
Definition: glvertex_qt_glui.h:244
lgl_Qt_GLUI::toggleFPS
void toggleFPS()
toggle fps printing
Definition: glvertex_qt_glui.h:251
lgl_Qt_GLUI::args
int args() const
get number of arguments
Definition: glvertex_qt_glui.h:44
glvertex_pnmformat.h
lgl_interlacing_enum
lgl_interlacing_enum
interlacing mode enum
Definition: glvertex_core.h:90
lglEndExport
void lglEndExport()
end scene export
Definition: glvertex_api.h:888
lgl_Qt_GLUI::toggleCapture
void toggleCapture(std::string filename)
toggle capturing a screen shot series
Definition: glvertex_qt_glui.h:235
lgl_Scene
scene class
Definition: glvertex_scene.h:17
lgl_Qt_GLUI::getArg
QString getArg(int i) const
get argument
Definition: glvertex_qt_glui.h:50
lgl_Scene_GLUI::getUsageInfo
virtual std::string getUsageInfo()
reimplement to show usage info
Definition: glvertex_qt_glui.h:474
vec3
3D double vector
Definition: glslmath.h:372
lgl_Scene_GLUI
Qt convenience class for multi-pass rendering.
Definition: glvertex_qt_glui.h:434
glvertex_scene.h
mat4
4x4 double matrix
Definition: glslmath.h:2116
lgl_Qt_GLUI::finishOpenGL
void finishOpenGL(double t)
implement this method to finish OpenGL state
Definition: glvertex_qt_glui.h:277
lgl::getName
std::string getName() const
get the vbo name
Definition: glvertex_core.h:203
lgl
LGL core.
Definition: glvertex_core.h:156
lgl_Qt_GLUI::getUsageInfo
virtual std::string getUsageInfo()
reimplement to show usage info
Definition: glvertex_qt_glui.h:302
lgl_Qt_GLUI::lgl_Qt_GLUI
lgl_Qt_GLUI(QWidget *parent=NULL, bool core=true)
ctor
Definition: glvertex_qt_glui.h:22
lgl_Qt_GLWidget::fullscreen
void fullscreen(bool on)
enable fullscreen mode
Definition: glvertex_qt_glwidget.h:283
lgl_Scene_GLUI::updateOpenGL
virtual void updateOpenGL(double dt)
implement this method to update state after rendering
Definition: glvertex_qt_glui.h:456
lgl_Qt_GLWidget::toggle_animation
void toggle_animation()
toggle animation
Definition: glvertex_qt_glwidget.h:184
lgl_Qt_GLUI::capture
bool capture(std::string filename)
capture a screen shot
Definition: glvertex_qt_glui.h:224
lgl_Qt_GLUI::updateOpenGL
void updateOpenGL(double dt)
implement this method to update state after rendering
Definition: glvertex_qt_glui.h:266
lglVBO
LGL API: vbo class definition.
Definition: glvertex_core.h:5827
lgl_Qt_GLUI
Qt OpenGL widget convenience class.
Definition: glvertex_qt_glui.h:17
lgl_Cam
camera convenience class
Definition: glvertex_cam.h:11
lgl_Renderer::pickScene
lglVBO * pickScene(vec3 o, vec3 d)
pick the actual scene
Definition: glvertex_scene.h:702
lgl_Qt_GLWidget::toggle_wireframe
void toggle_wireframe()
toggle wireframe mode
Definition: glvertex_qt_glwidget.h:269
lgl_Qt_GLUI::opts
int opts() const
get number of options
Definition: glvertex_qt_glui.h:56
lgl_Qt_GLWidget::prepareOpenGL
virtual void prepareOpenGL(double dt)
implement this method to prepare state before rendering
Definition: glvertex_qt_glwidget.h:459
lgl_Renderer::setStereoMode
void setStereoMode(lgl_interlacing_enum interlacing=LGL_INTERLACE_VERTICAL_TOP)
set the stereo interlacing mode
Definition: glvertex_scene.h:711
lgl::lglGetVertexCount
int lglGetVertexCount() const
get the number of vertices contained in vbo
Definition: glvertex_core.h:1790
lgl_Renderer::getScene
lgl_Scene * getScene()
get the actual scene
Definition: glvertex_scene.h:696
glvertex_qt_glwidgetui.h
lgl_Renderer
multi-pass renderer
Definition: glvertex_scene.h:670
lglGetGLSLVersionString
std::string lglGetGLSLVersionString()
get GLSL version string
Definition: glvertex_api.h:488
lgl_Qt_GLUI::getOptionString
QString getOptionString(QString opt) const
get option string
Definition: glvertex_qt_glui.h:83
lgl_Qt_GLWidgetUI
Qt OpenGL widget class /w event handling.
Definition: glvertex_qt_glwidgetui.h:15
lgl_Qt_GLWidget::finishOpenGL
virtual void finishOpenGL(double t)
implement this method to finish OpenGL state
Definition: glvertex_qt_glwidget.h:465