lightpreview: add "Draw Translucency as Opaque" checkbox

This commit is contained in:
Eric Wasylishen 2023-08-27 14:58:08 -06:00
parent 44dadd87b2
commit 6c6bed2597
3 changed files with 29 additions and 2 deletions

View File

@ -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

View File

@ -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);

View File

@ -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