From fbb51563c9bc39a12425a7e6b285087231b927cf Mon Sep 17 00:00:00 2001 From: Anakin Date: Mon, 30 Jan 2017 00:02:32 +0100 Subject: [PATCH] fixed backface culling bug, todo: connect headligh --- QtMeshViewer/Form Files/SettingsWindow.ui | 3 --- QtMeshViewer/Header/GeometryEngine.h | 2 +- QtMeshViewer/Header/OglViewerWidget.h | 1 + QtMeshViewer/Source/GeometryEngine.cpp | 6 +----- QtMeshViewer/Source/OglViewerWidget.cpp | 19 ++++++++++++------- 5 files changed, 15 insertions(+), 16 deletions(-) diff --git a/QtMeshViewer/Form Files/SettingsWindow.ui b/QtMeshViewer/Form Files/SettingsWindow.ui index 4dd2cf2..454d889 100644 --- a/QtMeshViewer/Form Files/SettingsWindow.ui +++ b/QtMeshViewer/Form Files/SettingsWindow.ui @@ -530,9 +530,6 @@ Backface Culling - - true - diff --git a/QtMeshViewer/Header/GeometryEngine.h b/QtMeshViewer/Header/GeometryEngine.h index b2556b2..7464662 100644 --- a/QtMeshViewer/Header/GeometryEngine.h +++ b/QtMeshViewer/Header/GeometryEngine.h @@ -36,7 +36,7 @@ private: void clearData(); public: - void drawGeometry(QOpenGLShaderProgram *program, bool wireframe); + void drawGeometry(QOpenGLShaderProgram *program); void loadFile(QString filePath); // signals diff --git a/QtMeshViewer/Header/OglViewerWidget.h b/QtMeshViewer/Header/OglViewerWidget.h index 0eb3398..0a61d1a 100644 --- a/QtMeshViewer/Header/OglViewerWidget.h +++ b/QtMeshViewer/Header/OglViewerWidget.h @@ -27,6 +27,7 @@ private: bool m_wireframe = false; bool m_lightOn = false; + bool m_backfaceCulling = false; struct { QVector4D position = { 1,1,1,0 }; diff --git a/QtMeshViewer/Source/GeometryEngine.cpp b/QtMeshViewer/Source/GeometryEngine.cpp index b8c41f6..331eaae 100644 --- a/QtMeshViewer/Source/GeometryEngine.cpp +++ b/QtMeshViewer/Source/GeometryEngine.cpp @@ -51,7 +51,7 @@ void GeometryEngine::clearData() m_drawList.clear(); } -void GeometryEngine::drawGeometry(QOpenGLShaderProgram *program, bool wireframe) +void GeometryEngine::drawGeometry(QOpenGLShaderProgram *program) { if (!m_arrayBuf.isCreated() || !m_indexBuf.isCreated()) return; @@ -133,12 +133,8 @@ void GeometryEngine::drawGeometry(QOpenGLShaderProgram *program, bool wireframe) program->setUniformValue("materialSpecularColor", specularColor); // Draw cube geometry using indices from VBO 1 - if (wireframe) - glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); - glDrawElements(GL_TRIANGLES, it.size, GL_UNSIGNED_INT, (void*)(it.offset * sizeof(GLuint))); - glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); } } diff --git a/QtMeshViewer/Source/OglViewerWidget.cpp b/QtMeshViewer/Source/OglViewerWidget.cpp index 85bf2f6..7e2f3d7 100644 --- a/QtMeshViewer/Source/OglViewerWidget.cpp +++ b/QtMeshViewer/Source/OglViewerWidget.cpp @@ -94,7 +94,7 @@ void OglViewerWidget::initializeGL() //TODO: does not work // Enable back face culling - glEnable(GL_CULL_FACE); + //glEnable(GL_CULL_FACE); // Enable transparency glEnable(GL_BLEND); @@ -164,7 +164,16 @@ void OglViewerWidget::paintGL() m_program.setUniformValue("cameraPosition", rotateBack * (-m_translation)); // Draw cube geometry - m_dataEngine->drawGeometry(&m_program, m_wireframe); + if (m_backfaceCulling) + glEnable(GL_CULL_FACE); + + if (m_wireframe) + glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); + + m_dataEngine->drawGeometry(&m_program); + + glDisable(GL_CULL_FACE); + glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); } // Inputs /////////////////////////////////////////////////////////////// @@ -410,11 +419,7 @@ void OglViewerWidget::setAmbCoef(double value) void OglViewerWidget::setBackfaceCulling(bool value) { - if (value) - glCullFace(GL_FRONT_AND_BACK); - else if(!value) - glCullFace(GL_FRONT); - + m_backfaceCulling = value; update(); }