diff --git a/lightpreview/glview.cpp b/lightpreview/glview.cpp index 71f29d72..54ca76a9 100644 --- a/lightpreview/glview.cpp +++ b/lightpreview/glview.cpp @@ -581,9 +581,17 @@ void GLView::paintGL() m_skybox_program->setUniformValue(m_skybox_program_drawnormals_location, m_drawNormals); m_skybox_program->setUniformValue(m_skybox_program_drawflat_location, m_drawFlat); + // resolves whether to render a particular drawcall as opaque + auto draw_as_opaque = [&](const drawcall_t &draw) -> bool { + if (m_drawTranslucencyAsOpaque) + return true; + + return draw.key.opacity == 1.0f; + }; + // opaque draws for (auto &draw : m_drawcalls) { - if (draw.key.opacity != 1.0f) + if (!draw_as_opaque(draw)) continue; if (active_program != draw.key.program) { @@ -603,6 +611,12 @@ void GLView::paintGL() face_visibility_texture->bind(2 /* texture unit */); } + if (active_program == m_program) { + m_program->setUniformValue(m_program_opacity_location, 1.0f); + } else { + m_skybox_program->setUniformValue(m_skybox_program_opacity_location, 1.0f); + } + QOpenGLVertexArrayObject::Binder vaoBinder(&m_vao); glDrawElements(GL_TRIANGLES, draw.index_count, GL_UNSIGNED_INT, @@ -615,7 +629,7 @@ void GLView::paintGL() glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); for (auto &draw : m_drawcalls) { - if (draw.key.opacity == 1.0f) + if (draw_as_opaque(draw)) continue; if (active_program != draw.key.program) { @@ -823,6 +837,12 @@ void GLView::setMagFilter(QOpenGLTexture::Filter filter) update(); } +void GLView::setDrawTranslucencyAsOpaque(bool drawopaque) +{ + m_drawTranslucencyAsOpaque = drawopaque; + update(); +} + void GLView::takeScreenshot(QString destPath, int w, int h) { // update aspect ratio diff --git a/lightpreview/glview.h b/lightpreview/glview.h index a2b6d98a..a22ec477 100644 --- a/lightpreview/glview.h +++ b/lightpreview/glview.h @@ -96,6 +96,7 @@ private: bool m_drawPortals = false; bool m_drawLeak = false; QOpenGLTexture::Filter m_filter = QOpenGLTexture::Linear; + bool m_drawTranslucencyAsOpaque = false; QOpenGLVertexArrayObject m_vao; QOpenGLBuffer m_vbo; @@ -207,6 +208,7 @@ public: void setLightStyleIntensity(int style_id, int intensity); void setMagFilter(QOpenGLTexture::Filter filter); const bool &getKeepOrigin() const { return m_keepOrigin; } + void setDrawTranslucencyAsOpaque(bool drawopaque); void takeScreenshot(QString destPath, int w, int h); diff --git a/lightpreview/mainwindow.cpp b/lightpreview/mainwindow.cpp index 9ebee03b..8c17ed9c 100644 --- a/lightpreview/mainwindow.cpp +++ b/lightpreview/mainwindow.cpp @@ -187,6 +187,8 @@ void MainWindow::createPropertiesSidebar() bspx_normals = new QCheckBox(tr("BSPX: Face Normals")); bspx_normals->setChecked(true); + auto *draw_opaque = new QCheckBox(tr("Draw Translucency as Opaque")); + formLayout->addRow(tr("common"), common_options); formLayout->addRow(tr("qbsp"), qbsp_options); formLayout->addRow(vis_checkbox, vis_options); @@ -202,6 +204,7 @@ void MainWindow::createPropertiesSidebar() formLayout->addRow(nearest); formLayout->addRow(bspx_decoupled_lm); formLayout->addRow(bspx_normals); + formLayout->addRow(draw_opaque); lightstyles = new QVBoxLayout(); @@ -253,6 +256,8 @@ void MainWindow::createPropertiesSidebar() connect(keepposition, &QAbstractButton::toggled, this, [=](bool checked) { glView->setKeepOrigin(checked); }); connect(nearest, &QAbstractButton::toggled, this, [=](bool checked) { glView->setMagFilter(checked ? QOpenGLTexture::Nearest : QOpenGLTexture::Linear); }); + connect(draw_opaque, &QAbstractButton::toggled, this, + [=](bool checked) { glView->setDrawTranslucencyAsOpaque(checked); }); connect(glView, &GLView::cameraMoved, this, &MainWindow::displayCameraPositionInfo); // set up load timer