TAMSVIZ
Visualization and annotation tool for ROS
All Classes Pages
renderwindow.cpp
1 // TAMSVIZ
2 // (c) 2020 Philipp Ruppel
3 
4 #include "renderwindow.h"
5 
6 #include "../core/workspace.h"
7 #include "../render/framebuffer.h"
8 #include "../render/renderer.h"
9 #include "../render/resource.h"
10 #include "../render/shader.h"
11 #include "../render/texture.h"
12 #include "../render/uniformbuffer.h"
13 
14 #include <QOpenGLPaintDevice>
15 
16 RenderWindowBase::RenderWindowBase() {
17  LockScope ws;
18  class RenderWidget : public QOpenGLWidget {
19  RenderWindowBase *_parent = nullptr;
20 
21  public:
22  RenderWidget(RenderWindowBase *parent)
23  : QOpenGLWidget(parent), _parent(parent) {}
24  void initializeGL() override {}
25  virtual bool event(QEvent *e) override {
26  if (e->type() == QEvent::Show) {
27  LOG_DEBUG("show event");
28  GlobalEvents::instance()->redraw();
29  }
30  bool ret = QWidget::event(e);
31  _parent->handleEvent(e);
32  return ret;
33  }
34  void resizeGL(int w, int h) override {
35  LOG_DEBUG("resize");
36  _parent->_width = w;
37  _parent->_height = h;
38  GlobalEvents::instance()->redraw();
39  }
40  void paintGL() override {
41  V_GL(glClearColor(0, 0, 0, 1));
42  V_GL(glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT));
43  if (int target = defaultFramebufferObject()) {
44  _parent->composite(target);
45  }
46  {
47  QPainter painter(this);
48  painter.endNativePainting();
49  _parent->paintHUD(&painter);
50  painter.beginNativePainting();
51  }
52  }
53  };
54  auto *render_widget = new RenderWidget(this);
55  setContentWidget(render_widget);
56 
57  {
58  auto *button = new FlatButton();
59  button->setIcon(MATERIAL_ICON("photo_camera", 0.0));
60  button->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Fixed);
61  connect(button, &QPushButton::clicked, this, [this, render_widget]() {
62  QImage screenshot;
63  {
64  render_widget->makeCurrent();
65  {
66  QOpenGLFramebufferObject fbo(render_widget->width(),
67  render_widget->height());
68  composite(fbo.handle());
69  screenshot = fbo.toImage();
70  }
71  render_widget->doneCurrent();
72  }
73  QString file_name = QFileDialog::getSaveFileName(
74  this, tr("Save Screenshot"), "", tr("Images (*.png *.jpg)"));
75  if (!file_name.isEmpty()) {
76  if (QFileInfo(file_name).suffix().isEmpty()) {
77  if (!file_name.endsWith(".")) {
78  file_name += ".";
79  }
80  file_name += "png";
81  }
82  if (screenshot.save(file_name)) {
83  LOG_SUCCESS("screenshot saved: " << file_name.toStdString());
84  } else {
85  LOG_ERROR("failed to save screenshot: " << file_name.toStdString());
86  }
87  }
88  });
89  addToolWidgetRight(button);
90  }
91 }
92 
93 RenderWindowBase::~RenderWindowBase() {}
94 
95 void RenderWindowBase::present() { contentWidget()->update(); }
96 
97 void RenderWindowBase::renderWindowSync(
98  const RenderWindowSyncContext &context) {}
99 
100 void RenderWindowBase::renderWindowAsync(
101  const RenderWindowAsyncContext &context) {}