diff --git a/lightpreview/glview.cpp b/lightpreview/glview.cpp index 7697ea83..d3eb150b 100644 --- a/lightpreview/glview.cpp +++ b/lightpreview/glview.cpp @@ -34,6 +34,7 @@ See file, 'COPYING', for details. #include #include #include +#include #include #include @@ -515,6 +516,28 @@ void GLView::handleLoggedMessage(const QOpenGLDebugMessage &debugMessage) #endif } +void GLView::error(const QString &context, const QString &context2, const QString &log) +{ + QMessageBox errorMessage( + QMessageBox::Critical, + tr("GLSL Error"), tr("%1: %2:\n\n%3").arg(context).arg(context2).arg(log), QMessageBox::Ok, this); + + errorMessage.exec(); +} + +void GLView::setupProgram(const QString &context, QOpenGLShaderProgram *dest, const char *vert, const char *frag) +{ + if (!dest->addShaderFromSourceCode(QOpenGLShader::Vertex, vert)) { + error(context, "vertex shader",dest->log()); + } + if (!dest->addShaderFromSourceCode(QOpenGLShader::Fragment, frag)) { + error(context, "fragment shader",dest->log()); + } + if (!dest->link()) { + error(context, "link",dest->log()); + } +} + void GLView::initializeGL() { initializeOpenGLFunctions(); @@ -529,24 +552,16 @@ void GLView::initializeGL() // set up shader m_program = new QOpenGLShaderProgram(); - m_program->addShaderFromSourceCode(QOpenGLShader::Vertex, s_vertShader); - m_program->addShaderFromSourceCode(QOpenGLShader::Fragment, s_fragShader); - assert(m_program->link()); + setupProgram("m_program", m_program, s_vertShader, s_fragShader); m_skybox_program = new QOpenGLShaderProgram(); - m_skybox_program->addShaderFromSourceCode(QOpenGLShader::Vertex, s_skyboxVertShader); - m_skybox_program->addShaderFromSourceCode(QOpenGLShader::Fragment, s_skyboxFragShader); - assert(m_skybox_program->link()); + setupProgram("m_skybox_program", m_skybox_program, s_skyboxVertShader,s_skyboxFragShader); m_program_simple = new QOpenGLShaderProgram(); - m_program_simple->addShaderFromSourceCode(QOpenGLShader::Vertex, s_vertShader_Simple); - m_program_simple->addShaderFromSourceCode(QOpenGLShader::Fragment, s_fragShader_Simple); - assert(m_program_simple->link()); + setupProgram("m_program_simple", m_program_simple, s_vertShader_Simple, s_fragShader_Simple); m_program_wireframe = new QOpenGLShaderProgram(); - m_program_wireframe->addShaderFromSourceCode(QOpenGLShader::Vertex, s_vertShader_Wireframe); - m_program_wireframe->addShaderFromSourceCode(QOpenGLShader::Fragment, s_fragShader_Wireframe); - assert(m_program_wireframe->link()); + setupProgram("m_program_wireframe", m_program_wireframe, s_vertShader_Wireframe, s_fragShader_Wireframe); m_program->bind(); m_program_mvp_location = m_program->uniformLocation("MVP"); diff --git a/lightpreview/glview.h b/lightpreview/glview.h index 0ad69bc3..6c0003d6 100644 --- a/lightpreview/glview.h +++ b/lightpreview/glview.h @@ -260,6 +260,9 @@ public: void takeScreenshot(QString destPath, int w, int h); +private: + void error(const QString &context, const QString &context2, const QString &log); + void setupProgram(const QString &context, QOpenGLShaderProgram *dest, const char *vert, const char *frag); protected: void initializeGL() override; void paintGL() override;