From f50448005031c7e5c6c9fbb8b9bb6bd2be143f44 Mon Sep 17 00:00:00 2001 From: wuyize Date: Thu, 9 Mar 2023 21:39:32 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E8=A7=A3=E5=86=B3=E7=BA=BF=E7=A8=8B?= =?UTF-8?q?=E6=97=A0=E6=B3=95=E6=9E=90=E6=9E=84=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ArchitectureColoredPainting/MainWindow.ui | 83 ++++++++----------- .../src/MainWindow.cpp | 8 +- ArchitectureColoredPainting/src/MainWindow.h | 2 +- .../src/Renderer/Preview/ElementRenderer.cpp | 4 +- .../src/Renderer/VirtualTextureManager.cpp | 5 +- 5 files changed, 46 insertions(+), 56 deletions(-) diff --git a/ArchitectureColoredPainting/MainWindow.ui b/ArchitectureColoredPainting/MainWindow.ui index 101be92..21072b3 100644 --- a/ArchitectureColoredPainting/MainWindow.ui +++ b/ArchitectureColoredPainting/MainWindow.ui @@ -1,7 +1,7 @@ MainWindowClass - + 0 @@ -10,56 +10,45 @@ 722 - - MainWindow - font: 10pt "Segoe UI, Microsoft YaHei UI"; - - - - 0 - 0 - + + + 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - QLayout::SetDefaultConstraint - - - 0 - - - 0 - - - - - - - - - - - + + 0 + + + 0 + + + 0 + + + 0 + + + + + QLayout::SetDefaultConstraint + + + 0 + + + 0 + + + + + + + + + + diff --git a/ArchitectureColoredPainting/src/MainWindow.cpp b/ArchitectureColoredPainting/src/MainWindow.cpp index 485a39f..8cf932c 100644 --- a/ArchitectureColoredPainting/src/MainWindow.cpp +++ b/ArchitectureColoredPainting/src/MainWindow.cpp @@ -12,14 +12,13 @@ FRAMELESSHELPER_USE_NAMESPACE -CentralWidget::CentralWidget(QWidget* parent) : QMainWindow(parent) +CentralWidget::CentralWidget(QWidget* parent) : QWidget(parent) { ui.setupUi(this); NavigationBarWidget* navigationBarWidget = new NavigationBarWidget(this); ui.gridLayout->addWidget(navigationBarWidget, 0, 0, 1, 1, Qt::AlignTop | Qt::AlignHCenter); QObject::connect(navigationBarWidget->tabs, &QtMaterialTabs::currentChanged, ui.stackedWidget, &QStackedWidget::setCurrentIndex); - QObject::connect(ui.stackedWidget, &QStackedWidget::currentChanged, - ui.rendererWidget, &Renderer::RendererWidget::currentTabChanged); + QObject::connect(ui.stackedWidget, &QStackedWidget::currentChanged, ui.rendererWidget, &Renderer::RendererWidget::currentTabChanged); } CentralWidget::~CentralWidget() @@ -40,7 +39,7 @@ MainWindow::MainWindow(QWidget* parent, const Qt::WindowFlags flags) m_titleBar->chromePalette()->setTitleBarActiveBackgroundColor(QColor(0, 0, 0, 0)); m_titleBar->chromePalette()->setTitleBarInactiveBackgroundColor(QColor(0, 0, 0, 0)); - m_central_widget = new CentralWidget(); + m_central_widget = new CentralWidget(this); setMenuWidget(m_titleBar); setCentralWidget(m_central_widget); @@ -73,4 +72,5 @@ void MainWindow::closeEvent(QCloseEvent* event) if (result != QMessageBox::Yes) event->ignore();*/ + qDebug() << "closeEvent"; } diff --git a/ArchitectureColoredPainting/src/MainWindow.h b/ArchitectureColoredPainting/src/MainWindow.h index 6d8bd54..7d135d0 100644 --- a/ArchitectureColoredPainting/src/MainWindow.h +++ b/ArchitectureColoredPainting/src/MainWindow.h @@ -9,7 +9,7 @@ FRAMELESSHELPER_BEGIN_NAMESPACE class StandardTitleBar; FRAMELESSHELPER_END_NAMESPACE -class CentralWidget : public QMainWindow +class CentralWidget : public QWidget { Q_OBJECT public: diff --git a/ArchitectureColoredPainting/src/Renderer/Preview/ElementRenderer.cpp b/ArchitectureColoredPainting/src/Renderer/Preview/ElementRenderer.cpp index 60a3b81..1cb69c9 100644 --- a/ArchitectureColoredPainting/src/Renderer/Preview/ElementRenderer.cpp +++ b/ArchitectureColoredPainting/src/Renderer/Preview/ElementRenderer.cpp @@ -117,7 +117,7 @@ QRectF calcBoundingRect(const QPainterPath& path, const std::vector& Renderer::ElementRenderer::ElementRenderer() { surface.create(); - thread = std::jthread([&] { + thread = std::jthread([&](std::stop_token stop) { QOpenGLContext context; context.create(); context.makeCurrent(&surface); @@ -131,7 +131,7 @@ Renderer::ElementRenderer::ElementRenderer() initialized = true; - while (true) + while (!stop.stop_requested()) { std::unique_lock lock(drawMutex); draw.wait(lock, [&] {return needDraw; }); diff --git a/ArchitectureColoredPainting/src/Renderer/VirtualTextureManager.cpp b/ArchitectureColoredPainting/src/Renderer/VirtualTextureManager.cpp index 0dc53c4..eeba398 100644 --- a/ArchitectureColoredPainting/src/Renderer/VirtualTextureManager.cpp +++ b/ArchitectureColoredPainting/src/Renderer/VirtualTextureManager.cpp @@ -18,7 +18,7 @@ Renderer::VirtualTextureManager::VirtualTextureManager(GladGLContext* glMain) surface.create(); mainContext->doneCurrent(); - thread = std::jthread([&] { + thread = std::jthread([&](std::stop_token stop) { QOpenGLContext context; context.setFormat(mainContext->format()); context.setShareContext(mainContext); @@ -67,7 +67,7 @@ Renderer::VirtualTextureManager::VirtualTextureManager(GladGLContext* glMain) GLuint pageLoadTimeQuery; gl->GenQueries(1, &pageLoadTimeQuery); - while (true) + while (!stop.stop_requested()) { if (needUpdate) { @@ -85,6 +85,7 @@ Renderer::VirtualTextureManager::VirtualTextureManager(GladGLContext* glMain) //qDebug() << duration; pageLoadDuration += duration; } + std::this_thread::yield(); } }); From d0cbdd65ecb2c053c71cdf5d8e0a2f9786c6d061 Mon Sep 17 00:00:00 2001 From: wuyize Date: Thu, 9 Mar 2023 22:54:33 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E8=A7=A3=E5=86=B3ElementRenderer=E7=BA=BF?= =?UTF-8?q?=E7=A8=8B=E6=97=A0=E6=B3=95=E9=80=80=E5=87=BA=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/Renderer/Preview/ElementRenderer.cpp | 30 +++++++++++-------- .../src/Renderer/Preview/ElementRenderer.h | 2 +- 2 files changed, 19 insertions(+), 13 deletions(-) diff --git a/ArchitectureColoredPainting/src/Renderer/Preview/ElementRenderer.cpp b/ArchitectureColoredPainting/src/Renderer/Preview/ElementRenderer.cpp index 1cb69c9..756222b 100644 --- a/ArchitectureColoredPainting/src/Renderer/Preview/ElementRenderer.cpp +++ b/ArchitectureColoredPainting/src/Renderer/Preview/ElementRenderer.cpp @@ -118,11 +118,15 @@ Renderer::ElementRenderer::ElementRenderer() { surface.create(); thread = std::jthread([&](std::stop_token stop) { + std::stop_callback cb(stop, [&] { + draw.notify_all(); + }); + QOpenGLContext context; context.create(); context.makeCurrent(&surface); - initializeOpenGLFunctions(); + auto gl = context.versionFunctions(); shader = std::make_unique(); if (!shader->addShaderFromSourceFile(QOpenGLShader::Compute, ":/Shaders/element.comp")) qDebug() << "ERROR: " << shader->log(); @@ -134,7 +138,8 @@ Renderer::ElementRenderer::ElementRenderer() while (!stop.stop_requested()) { std::unique_lock lock(drawMutex); - draw.wait(lock, [&] {return needDraw; }); + draw.wait(lock, [&] {return needDraw || stop.stop_requested(); }); + if (needDraw) { needDraw = false; auto baseStyles = style->toBaseStyles(); @@ -146,14 +151,14 @@ Renderer::ElementRenderer::ElementRenderer() auto styleBuffer = generateStyleBuffer(baseStyles); GLuint ssbo[2]; - glCreateBuffers(2, ssbo); - glNamedBufferData(ssbo[0], pathBuffer.size() * sizeof(glm::vec2), pathBuffer.data(), GL_STATIC_READ); - glNamedBufferData(ssbo[1], styleBuffer.size() * sizeof(GLfloat), styleBuffer.data(), GL_STATIC_READ); + gl->glCreateBuffers(2, ssbo); + gl->glNamedBufferData(ssbo[0], pathBuffer.size() * sizeof(glm::vec2), pathBuffer.data(), GL_STATIC_READ); + gl->glNamedBufferData(ssbo[1], styleBuffer.size() * sizeof(GLfloat), styleBuffer.data(), GL_STATIC_READ); auto fbo = QOpenGLFramebufferObject(size, QOpenGLFramebufferObject::NoAttachment, GL_TEXTURE_2D); fbo.bind(); - glClearColor(0, 0, 0, 0); - glClear(GL_COLOR_BUFFER_BIT); + gl->glClearColor(0, 0, 0, 0); + gl->glClear(GL_COLOR_BUFFER_BIT); fbo.release(); shader->bind(); @@ -161,19 +166,20 @@ Renderer::ElementRenderer::ElementRenderer() shader->setUniformValue("styleSize", (GLint)styleBuffer.size()); shader->setUniformValue("leftTop", leftTop); shader->setUniformValue("pixelRatio", pixelRatio); - glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 10, ssbo[0]); - glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 11, ssbo[1]); - glBindImageTexture(0, fbo.texture(), 0, GL_FALSE, 0, GL_READ_WRITE, GL_RGBA8); - glDispatchCompute(ceil(size.width() / 8.), ceil(size.height() / 8.), 1); + gl->glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 10, ssbo[0]); + gl->glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 11, ssbo[1]); + gl->glBindImageTexture(0, fbo.texture(), 0, GL_FALSE, 0, GL_READ_WRITE, GL_RGBA8); + gl->glDispatchCompute(ceil(size.width() / 8.), ceil(size.height() / 8.), 1); shader->release(); auto image = fbo.toImage(false); - glDeleteBuffers(2, ssbo); + gl->glDeleteBuffers(2, ssbo); result = { image, leftTop }; drawFinished = true; } draw.notify_all(); } + context.doneCurrent(); }); while (!initialized) diff --git a/ArchitectureColoredPainting/src/Renderer/Preview/ElementRenderer.h b/ArchitectureColoredPainting/src/Renderer/Preview/ElementRenderer.h index 9c59db5..bed57f6 100644 --- a/ArchitectureColoredPainting/src/Renderer/Preview/ElementRenderer.h +++ b/ArchitectureColoredPainting/src/Renderer/Preview/ElementRenderer.h @@ -7,7 +7,7 @@ namespace Renderer { - class ElementRenderer : protected QOpenGLFunctions_4_5_Core + class ElementRenderer { public: static ElementRenderer* instance(); From fedb147dd30e7f643e15101d92475c3e32cebb38 Mon Sep 17 00:00:00 2001 From: karlis <2995621482@qq.com> Date: Thu, 9 Mar 2023 23:31:55 +0800 Subject: [PATCH 3/3] FIX: Crash U --- ArchitectureColoredPainting/src/Editor/LayerWrapper.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ArchitectureColoredPainting/src/Editor/LayerWrapper.cpp b/ArchitectureColoredPainting/src/Editor/LayerWrapper.cpp index 9135744..cc186a8 100644 --- a/ArchitectureColoredPainting/src/Editor/LayerWrapper.cpp +++ b/ArchitectureColoredPainting/src/Editor/LayerWrapper.cpp @@ -168,7 +168,7 @@ QTreeWidgetItem* LayerWrapper::getQTreeItem() { this->qTreeWidgetItem.setText(0, this->property.name); this->qTreeWidgetItem.setData(0, Qt::UserRole, QVariant::fromValue(this)); - return &this->qTreeWidgetItem; + return new QTreeWidgetItem(this->qTreeWidgetItem); } QTreeWidgetItem* FolderLayerWrapper::getQTreeItem()