128 |
128 |
129 gl::Compiler::~Compiler() |
129 gl::Compiler::~Compiler() |
130 { |
130 { |
131 } |
131 } |
132 |
132 |
|
133 void gl::buildShaders( |
|
134 QOpenGLShaderProgram* shaderProgram, |
|
135 const char* vertexShaderSource, |
|
136 const char* fragmentShaderSource) |
|
137 { |
|
138 shaderProgram->create(); |
|
139 const bool vertexShaderCompiled = shaderProgram->addShaderFromSourceCode(QOpenGLShader::Vertex, vertexShaderSource); |
|
140 QString log; |
|
141 if (not vertexShaderCompiled) |
|
142 { |
|
143 log += "\n" + QObject::tr("Vertex shader:") + "\n" + shaderProgram->log(); |
|
144 } |
|
145 const bool fragmentShaderCompiled = shaderProgram->addShaderFromSourceCode(QOpenGLShader::Fragment, fragmentShaderSource); |
|
146 if (not fragmentShaderCompiled) |
|
147 { |
|
148 log += "\n" + QObject::tr("Fragment shader:") + "\n" + shaderProgram->log(); |
|
149 } |
|
150 if (not vertexShaderCompiled or not fragmentShaderCompiled) |
|
151 { |
|
152 QMessageBox::critical( |
|
153 nullptr, |
|
154 QObject::tr("Shader compile error"), |
|
155 QObject::tr("Could not compile shaders.") + "\n" + log); |
|
156 std::exit(-1); |
|
157 } |
|
158 const bool linkSuccessful = shaderProgram->link(); |
|
159 if (not linkSuccessful) |
|
160 { |
|
161 QMessageBox::critical( |
|
162 nullptr, |
|
163 QObject::tr("Shader link error"), |
|
164 QObject::tr("Could not link shaders: %1").arg(shaderProgram->log()) |
|
165 ); |
|
166 } |
|
167 } |
|
168 |
133 void gl::Compiler::initialize() |
169 void gl::Compiler::initialize() |
134 { |
170 { |
135 if (not this->initialized) |
171 if (not this->initialized) |
136 { |
172 { |
137 this->initializeOpenGLFunctions(); |
173 this->initializeOpenGLFunctions(); |
138 for (int i = 0; i < gl::NUM_ARRAY_CLASSES; i += 1) |
174 for (int i = 0; i < gl::NUM_ARRAY_CLASSES; i += 1) |
139 { |
175 { |
140 auto& object = this->glObjects[i]; |
176 auto& object = this->glObjects[i]; |
141 object.program = new QOpenGLShaderProgram; |
177 object.program = new QOpenGLShaderProgram; |
142 object.program->create(); |
178 gl::buildShaders(object.program, ::vertexShaderSource, ::fragmentShaderSource); |
143 const bool vertexShaderCompiled = object.program->addShaderFromSourceCode(QOpenGLShader::Vertex, ::vertexShaderSource); |
|
144 QString log; |
|
145 if (not vertexShaderCompiled) |
|
146 { |
|
147 log += "\n" + tr("Vertex shader:") + "\n" + object.program->log(); |
|
148 } |
|
149 const bool fragmentShaderCompiled = object.program->addShaderFromSourceCode(QOpenGLShader::Fragment, ::fragmentShaderSource); |
|
150 if (not fragmentShaderCompiled) |
|
151 { |
|
152 log += "\n" + tr("Fragment shader:") + "\n" + object.program->log(); |
|
153 } |
|
154 if (not vertexShaderCompiled or not fragmentShaderCompiled) |
|
155 { |
|
156 QMessageBox::critical(nullptr, tr("Shader compile error"), tr("Could not compile shaders.") + "\n" + log); |
|
157 std::exit(-1); |
|
158 } |
|
159 object.program->link(); |
|
160 object.program->bind(); |
179 object.program->bind(); |
161 object.buffer.create(); |
180 object.buffer.create(); |
162 object.buffer.bind(); |
181 object.buffer.bind(); |
163 object.buffer.setUsagePattern(QOpenGLBuffer::DynamicDraw); |
182 object.buffer.setUsagePattern(QOpenGLBuffer::DynamicDraw); |
164 object.vertexArray.create(); |
183 object.vertexArray.create(); |