4 #include "renderwindow.h" 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" 14 #include <QOpenGLPaintDevice> 16 RenderWindowBase::RenderWindowBase() {
18 class RenderWidget :
public QOpenGLWidget {
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();
30 bool ret = QWidget::event(e);
31 _parent->handleEvent(e);
34 void resizeGL(
int w,
int h)
override {
38 GlobalEvents::instance()->redraw();
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);
47 QPainter painter(
this);
48 painter.endNativePainting();
49 _parent->paintHUD(&painter);
50 painter.beginNativePainting();
54 auto *render_widget =
new RenderWidget(
this);
55 setContentWidget(render_widget);
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]() {
64 render_widget->makeCurrent();
66 QOpenGLFramebufferObject fbo(render_widget->width(),
67 render_widget->height());
68 composite(fbo.handle());
69 screenshot = fbo.toImage();
71 render_widget->doneCurrent();
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(
".")) {
82 if (screenshot.save(file_name)) {
83 LOG_SUCCESS(
"screenshot saved: " << file_name.toStdString());
85 LOG_ERROR(
"failed to save screenshot: " << file_name.toStdString());
89 addToolWidgetRight(button);
93 RenderWindowBase::~RenderWindowBase() {}
95 void RenderWindowBase::present() { contentWidget()->update(); }
97 void RenderWindowBase::renderWindowSync(
100 void RenderWindowBase::renderWindowAsync(