diff --git a/.gitignore b/.gitignore index 178eef5..c7d78ba 100644 --- a/.gitignore +++ b/.gitignore @@ -8,6 +8,7 @@ /output/ /perf.* /pic*.png +core *.pro.user *.pro.user.* qrc_*.cpp diff --git a/src/definition/DefinitionNode.cpp b/src/definition/DefinitionNode.cpp index bdccf73..ac8eb7e 100644 --- a/src/definition/DefinitionNode.cpp +++ b/src/definition/DefinitionNode.cpp @@ -110,8 +110,8 @@ bool DefinitionNode::applyDiff(const DefinitionDiff *diff, bool) { if (diff->getTypeName() == type_name) { return true; } else { - Logs::error() << "Can't apply " << diff->getTypeName() << " diff to " << getName() << " " << type_name - << " node" << std::endl; + Logs::error() << "[Definition] Can't apply " << diff->getTypeName() << " diff to " << getName() << " " + << type_name << " node" << std::endl; return false; } } @@ -155,8 +155,8 @@ void DefinitionNode::save(PackStream *stream) const { child->save(stream); } else { // Child size not known, write it to a temporary stream to know it - Logs::debug() << "Unknown size for child " << child->name << ", unefficient writing to temporary stream" - << std::endl; + Logs::debug() << "[Definition] Unknown size for child " << child->name + << ", unefficient writing to temporary stream" << std::endl; PackStream substream; child->save(&substream); stream->writeFromBuffer(substream, true); @@ -183,7 +183,7 @@ void DefinitionNode::load(PackStream *stream) { // TODO Ask subclass if it can instanciate a child // Else skip length of unknown child stream->skipBytes(child_size); - Logs::warning() << "Skipped unknown child '" << child_name << "'" << std::endl; + Logs::warning() << "[Definition] Skipped unknown child '" << child_name << "'" << std::endl; } } } @@ -196,12 +196,13 @@ void DefinitionNode::copy(DefinitionNode *destination) const { if (dest_child) { child->copy(dest_child); } else { - Logs::warning() << "Can't copy to child " << child->name << " of " << destination->getTypeName() - << std::endl; + Logs::warning() << "[Definition] Can't copy to child " << child->name << " of " + << destination->getTypeName() << std::endl; } } } else { - Logs::error() << "Can't copy from " << getTypeName() << " to " << destination->getTypeName() << std::endl; + Logs::error() << "[Definition] Can't copy from " << getTypeName() << " to " << destination->getTypeName() + << std::endl; } } @@ -225,7 +226,7 @@ void DefinitionNode::removeChild(DefinitionNode *child) { child->parent = NULL; children.erase(it); } else { - Logs::warning() << "Trying to remove not found child '" << child->name << "' from '" << name << "'" + Logs::warning() << "[Definition] Trying to remove not found child '" << child->name << "' from '" << name << "'" << std::endl; } } diff --git a/src/definition/Scenery.cpp b/src/definition/Scenery.cpp index 26096b5..23236e1 100644 --- a/src/definition/Scenery.cpp +++ b/src/definition/Scenery.cpp @@ -49,7 +49,7 @@ Scenery::FileOperationResult Scenery::saveGlobal(const std::string &filepath) co stream.write(&version_header); stream.write(&app_header); - Logs::debug() << "Scenery saved to file: " << filepath << std::endl; + Logs::debug() << "[Definition] Scenery saved to file: " << filepath << std::endl; return FILE_OPERATION_OK; } @@ -87,7 +87,7 @@ Scenery::FileOperationResult Scenery::loadGlobal(const std::string &filepath) { return FILE_OPERATION_APP_MISMATCH; } - Logs::debug() << "Scenery loaded from file: " << filepath << std::endl; + Logs::debug() << "[Definition] Scenery loaded from file: " << filepath << std::endl; return FILE_OPERATION_OK; } @@ -113,7 +113,7 @@ void Scenery::autoPreset(int seed) { validate(); - Logs::debug() << "New scenery generated from seed " << seed << std::endl; + Logs::debug() << "[Definition] New scenery generated from seed " << seed << std::endl; } void Scenery::setAtmosphere(AtmosphereDefinition *atmosphere) { diff --git a/src/interface/modeler/quickapp/MainModelerWindow.cpp b/src/interface/modeler/quickapp/MainModelerWindow.cpp index 1d70530..80b64be 100644 --- a/src/interface/modeler/quickapp/MainModelerWindow.cpp +++ b/src/interface/modeler/quickapp/MainModelerWindow.cpp @@ -16,6 +16,11 @@ #include MainModelerWindow::MainModelerWindow() { + /*QSurfaceFormat new_format = format(); + new_format.setVersion(3, 3); + new_format.setProfile(QSurfaceFormat::CoreProfile); + setFormat(new_format);*/ + scenery = new Scenery(); scenery->autoPreset(); diff --git a/src/interface/modeler/quickapp/OpenGLView.cpp b/src/interface/modeler/quickapp/OpenGLView.cpp index 66cc116..39a47e0 100644 --- a/src/interface/modeler/quickapp/OpenGLView.cpp +++ b/src/interface/modeler/quickapp/OpenGLView.cpp @@ -20,7 +20,6 @@ OpenGLView::OpenGLView(QQuickItem *parent) : QQuickItem(parent) { connect(this, SIGNAL(windowChanged(QQuickWindow *)), this, SLOT(handleWindowChanged(QQuickWindow *))); connect(this, SIGNAL(widthChanged()), this, SLOT(handleResize())); connect(this, SIGNAL(heightChanged()), this, SLOT(handleResize())); - startTimer(50); } void OpenGLView::handleWindowChanged(QQuickWindow *win) { @@ -28,12 +27,11 @@ void OpenGLView::handleWindowChanged(QQuickWindow *win) { window = qobject_cast(win); if (window) { renderer = window->getRenderer(); - - connect(win, SIGNAL(beforeRendering()), this, SLOT(paint()), Qt::DirectConnection); + initialized = false; win->setClearBeforeRendering(false); - initialized = false; + connect(win, SIGNAL(sceneGraphInitialized()), this, SLOT(handleSceneGraphReady())); } } } @@ -66,6 +64,11 @@ void OpenGLView::handleResize() { resized = true; } +void OpenGLView::handleSceneGraphReady() { + connect(window, SIGNAL(beforeRendering()), this, SLOT(paint()), Qt::DirectConnection); + startTimer(50); +} + void OpenGLView::wheelEvent(QWheelEvent *event) { if (not acceptInputs()) { return; diff --git a/src/interface/modeler/quickapp/OpenGLView.h b/src/interface/modeler/quickapp/OpenGLView.h index 51a2dc8..d62fd14 100644 --- a/src/interface/modeler/quickapp/OpenGLView.h +++ b/src/interface/modeler/quickapp/OpenGLView.h @@ -17,6 +17,7 @@ class OpenGLView : public QQuickItem { void handleWindowChanged(QQuickWindow *win); void paint(); void handleResize(); + void handleSceneGraphReady(); protected: virtual void wheelEvent(QWheelEvent *event) override; diff --git a/src/render/opengl/ExplorerChunkTerrain.cpp b/src/render/opengl/ExplorerChunkTerrain.cpp index 0e9f86a..c1578ba 100644 --- a/src/render/opengl/ExplorerChunkTerrain.cpp +++ b/src/render/opengl/ExplorerChunkTerrain.cpp @@ -1,8 +1,8 @@ #include "ExplorerChunkTerrain.h" -#include OPENGL_FUNCTIONS_INCLUDE #include #include +#include "OpenGLFunctions.h" #include "ColorProfile.h" #include "CameraDefinition.h" #include "OpenGLRenderer.h" diff --git a/src/render/opengl/OpenGLFunctions.h b/src/render/opengl/OpenGLFunctions.h new file mode 100644 index 0000000..fba4f67 --- /dev/null +++ b/src/render/opengl/OpenGLFunctions.h @@ -0,0 +1,9 @@ +#ifndef OPENGLFUNCTIONS +#define OPENGLFUNCTIONS + +#include "opengl_global.h" + +#define _OPENGL_FUNCTIONS_INCLUDE +#include _OPENGL_FUNCTIONS_INCLUDE + +#endif // OPENGLFUNCTIONS diff --git a/src/render/opengl/OpenGLRenderer.cpp b/src/render/opengl/OpenGLRenderer.cpp index 085afab..b2ad554 100644 --- a/src/render/opengl/OpenGLRenderer.cpp +++ b/src/render/opengl/OpenGLRenderer.cpp @@ -1,6 +1,6 @@ #include "OpenGLRenderer.h" -#include OPENGL_FUNCTIONS_INCLUDE +#include "OpenGLFunctions.h" #include "CameraDefinition.h" #include "OpenGLSharedState.h" #include "OpenGLSkybox.h" @@ -72,10 +72,20 @@ void OpenGLRenderer::prepare() { getVegetationRenderer()->setEnabled(false); } +void OpenGLRenderer::checkForErrors(const std::string &domain) { + int error_code; + while ((error_code = functions->glGetError()) != GL_NO_ERROR) { + Logs::warning() << "[OpenGL] Error in " << domain << " : " << error_code << std::endl; + } +} + void OpenGLRenderer::initialize() { bool init = functions->initializeOpenGLFunctions(); if (init) { + Logs::debug() << "[OpenGL] renderer started (version " << functions->glGetString(GL_VERSION) + << ", glsl version " << functions->glGetString(GL_SHADING_LANGUAGE_VERSION) << ")" << std::endl; + prepareOpenGLState(); prepare(); @@ -94,9 +104,10 @@ void OpenGLRenderer::initialize() { cameraChangeEvent(render_camera); + checkForErrors("initialize"); ready = true; } else { - Logs::error() << "Failed to initialize OpenGL bindings" << std::endl; + Logs::error() << "[OpenGL] Failed to initialize api bindings" << std::endl; } } @@ -144,25 +155,31 @@ void OpenGLRenderer::resize(int width, int height) { cameraChangeEvent(render_camera); prepareOpenGLState(); + + checkForErrors("resize"); } } void OpenGLRenderer::paint() { if (ready and not paused) { + checkForErrors("before_paint"); functions->glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); skybox->render(); + checkForErrors("skybox"); + terrain->render(); + checkForErrors("terrain"); + water->render(); + checkForErrors("water"); + vegetation->render(); + checkForErrors("vegetation"); if (mouse_tracking) { updateMouseProjection(); - } - - int error_code; - while ((error_code = functions->glGetError()) != GL_NO_ERROR) { - Logs::warning() << "[OpenGL] ERROR : " << error_code << std::endl; + checkForErrors("mouse_tracking"); } displayed = true; diff --git a/src/render/opengl/OpenGLRenderer.h b/src/render/opengl/OpenGLRenderer.h index e367cf1..448cd1e 100644 --- a/src/render/opengl/OpenGLRenderer.h +++ b/src/render/opengl/OpenGLRenderer.h @@ -36,6 +36,13 @@ class OPENGLSHARED_EXPORT OpenGLRenderer : public SoftwareRenderer { virtual void prepare() override; + /** + * Check for errors in OpenGL context. + * + * Will write the error on standard error output, with the *domain* specified. + */ + void checkForErrors(const std::string &domain); + void initialize(); void prepareOpenGLState(); void resize(int width, int height); diff --git a/src/render/opengl/OpenGLShaderProgram.cpp b/src/render/opengl/OpenGLShaderProgram.cpp index 185f0c4..228f074 100644 --- a/src/render/opengl/OpenGLShaderProgram.cpp +++ b/src/render/opengl/OpenGLShaderProgram.cpp @@ -1,8 +1,8 @@ #include "OpenGLShaderProgram.h" -#include OPENGL_FUNCTIONS_INCLUDE #include #include +#include "OpenGLFunctions.h" #include "OpenGLRenderer.h" #include "OpenGLSharedState.h" #include "Texture2D.h" @@ -29,7 +29,7 @@ void OpenGLShaderProgram::addVertexSource(QString path) { if (file.open(QIODevice::ReadOnly | QIODevice::Text)) { source_vertex += QString(file.readAll()).toStdString(); } else { - Logs::error() << "Can't open vertex file " << file.fileName().toStdString() << std::endl; + Logs::error() << "[OpenGL] Can't open vertex file " << file.fileName().toStdString() << std::endl; } } @@ -38,7 +38,7 @@ void OpenGLShaderProgram::addFragmentSource(QString path) { if (file.open(QIODevice::ReadOnly | QIODevice::Text)) { source_fragment += QString(file.readAll()).toStdString(); } else { - Logs::error() << "Can't open fragment file " << file.fileName().toStdString() << std::endl; + Logs::error() << "[OpenGL] Can't open fragment file " << file.fileName().toStdString() << std::endl; } } @@ -47,25 +47,30 @@ void OpenGLShaderProgram::compile() { program->addShaderFromSourceCode(QOpenGLShader::Fragment, QString::fromStdString(source_fragment)); if (not program->link()) { - Logs::warning() << "Error while compiling shader " << name << std::endl + Logs::warning() << "[OpenGL] Error while compiling shader " << name << std::endl << program->log().toStdString() << std::endl; } else if (program->log().length() > 0) { - Logs::debug() << "Shader " << name << " compilation output:" << std::endl + Logs::debug() << "[OpenGL] Shader " << name << " compilation output:" << std::endl << program->log().toStdString() << std::endl; + } else { + Logs::debug() << "[OpenGL] Shader " << name << " compiled" << std::endl; } } -void OpenGLShaderProgram::bind() { +bool OpenGLShaderProgram::bind() { if (not compiled) { compile(); compiled = true; } - program->bind(); - - int texture_unit = 0; - renderer->getSharedState()->apply(this, texture_unit); - state->apply(this, texture_unit); + if (program->bind()) { + int texture_unit = 0; + renderer->getSharedState()->apply(this, texture_unit); + state->apply(this, texture_unit); + return true; + } else { + return false; + } } void OpenGLShaderProgram::release() { @@ -73,67 +78,67 @@ void OpenGLShaderProgram::release() { } void OpenGLShaderProgram::drawTriangles(float *vertices, int triangle_count) { - bind(); + if (bind()) { + GLuint array_vertex = program->attributeLocation("vertex"); + program->setAttributeArray(array_vertex, GL_FLOAT, vertices, 3); + program->enableAttributeArray(array_vertex); - GLuint array_vertex = program->attributeLocation("vertex"); - program->setAttributeArray(array_vertex, GL_FLOAT, vertices, 3); - program->enableAttributeArray(array_vertex); + functions->glDrawArrays(GL_TRIANGLES, 0, triangle_count * 3); - functions->glDrawArrays(GL_TRIANGLES, 0, triangle_count * 3); + program->disableAttributeArray(array_vertex); - program->disableAttributeArray(array_vertex); - - release(); + release(); + } } void OpenGLShaderProgram::drawTriangleStrip(float *vertices, int vertex_count) { - bind(); + if (bind()) { + GLuint array_vertex = program->attributeLocation("vertex"); + program->setAttributeArray(array_vertex, GL_FLOAT, vertices, 3); + program->enableAttributeArray(array_vertex); - GLuint array_vertex = program->attributeLocation("vertex"); - program->setAttributeArray(array_vertex, GL_FLOAT, vertices, 3); - program->enableAttributeArray(array_vertex); + functions->glDrawArrays(GL_TRIANGLE_STRIP, 0, vertex_count); - functions->glDrawArrays(GL_TRIANGLE_STRIP, 0, vertex_count); + program->disableAttributeArray(array_vertex); - program->disableAttributeArray(array_vertex); - - release(); + release(); + } } void OpenGLShaderProgram::drawTrianglesUV(float *vertices, float *uv, int triangle_count) { - bind(); + if (bind()) { + GLuint array_vertex = program->attributeLocation("vertex"); + program->setAttributeArray(array_vertex, GL_FLOAT, vertices, 3); + program->enableAttributeArray(array_vertex); - GLuint array_vertex = program->attributeLocation("vertex"); - program->setAttributeArray(array_vertex, GL_FLOAT, vertices, 3); - program->enableAttributeArray(array_vertex); + GLuint array_uv = program->attributeLocation("uv"); + program->setAttributeArray(array_uv, GL_FLOAT, uv, 2); + program->enableAttributeArray(array_uv); - GLuint array_uv = program->attributeLocation("uv"); - program->setAttributeArray(array_uv, GL_FLOAT, uv, 2); - program->enableAttributeArray(array_uv); + functions->glDrawArrays(GL_TRIANGLES, 0, triangle_count * 3); - functions->glDrawArrays(GL_TRIANGLES, 0, triangle_count * 3); + program->disableAttributeArray(array_vertex); + program->disableAttributeArray(array_uv); - program->disableAttributeArray(array_vertex); - program->disableAttributeArray(array_uv); - - release(); + release(); + } } void OpenGLShaderProgram::drawTriangleStripUV(float *vertices, float *uv, int vertex_count) { - bind(); + if (bind()) { + GLuint array_vertex = program->attributeLocation("vertex"); + program->setAttributeArray(array_vertex, GL_FLOAT, vertices, 3); + program->enableAttributeArray(array_vertex); - GLuint array_vertex = program->attributeLocation("vertex"); - program->setAttributeArray(array_vertex, GL_FLOAT, vertices, 3); - program->enableAttributeArray(array_vertex); + GLuint array_uv = program->attributeLocation("uv"); + program->setAttributeArray(array_uv, GL_FLOAT, uv, 2); + program->enableAttributeArray(array_uv); - GLuint array_uv = program->attributeLocation("uv"); - program->setAttributeArray(array_uv, GL_FLOAT, uv, 2); - program->enableAttributeArray(array_uv); + functions->glDrawArrays(GL_TRIANGLE_STRIP, 0, vertex_count); - functions->glDrawArrays(GL_TRIANGLE_STRIP, 0, vertex_count); + program->disableAttributeArray(array_vertex); + program->disableAttributeArray(array_uv); - program->disableAttributeArray(array_vertex); - program->disableAttributeArray(array_uv); - - release(); + release(); + } } diff --git a/src/render/opengl/OpenGLShaderProgram.h b/src/render/opengl/OpenGLShaderProgram.h index 8a85e73..bdcdd9a 100644 --- a/src/render/opengl/OpenGLShaderProgram.h +++ b/src/render/opengl/OpenGLShaderProgram.h @@ -24,7 +24,7 @@ class OPENGLSHARED_EXPORT OpenGLShaderProgram { void drawTrianglesUV(float *vertices, float *uv, int triangle_count); void drawTriangleStripUV(float *vertices, float *uv, int vertex_count); - void bind(); + bool bind(); void release(); inline QOpenGLShaderProgram *getProgram() const { diff --git a/src/render/opengl/OpenGLTerrain.cpp b/src/render/opengl/OpenGLTerrain.cpp index b0cf055..98cc06b 100644 --- a/src/render/opengl/OpenGLTerrain.cpp +++ b/src/render/opengl/OpenGLTerrain.cpp @@ -1,6 +1,6 @@ #include "OpenGLTerrain.h" -#include OPENGL_FUNCTIONS_INCLUDE +#include "OpenGLFunctions.h" #include "OpenGLRenderer.h" #include "OpenGLShaderProgram.h" #include "ParallelPool.h" diff --git a/src/render/opengl/OpenGLVariable.cpp b/src/render/opengl/OpenGLVariable.cpp index db8f39d..c1a39b7 100644 --- a/src/render/opengl/OpenGLVariable.cpp +++ b/src/render/opengl/OpenGLVariable.cpp @@ -1,8 +1,8 @@ #include "OpenGLVariable.h" -#include OPENGL_FUNCTIONS_INCLUDE #include #include +#include "OpenGLFunctions.h" #include "OpenGLRenderer.h" #include "OpenGLShaderProgram.h" #include "Vector3.h" diff --git a/src/render/opengl/OpenGLVegetationLayer.cpp b/src/render/opengl/OpenGLVegetationLayer.cpp index c298a77..865b05f 100644 --- a/src/render/opengl/OpenGLVegetationLayer.cpp +++ b/src/render/opengl/OpenGLVegetationLayer.cpp @@ -1,10 +1,10 @@ #include "OpenGLVegetationLayer.h" -#include OPENGL_FUNCTIONS_INCLUDE #include #include "Vector3.h" #include "CameraDefinition.h" #include "Mutex.h" +#include "OpenGLFunctions.h" #include "OpenGLVegetation.h" #include "OpenGLVegetationInstance.h" #include "OpenGLVegetationImpostor.h" diff --git a/src/render/opengl/VertexArray.h b/src/render/opengl/VertexArray.h index 5c3a91d..cecd713 100644 --- a/src/render/opengl/VertexArray.h +++ b/src/render/opengl/VertexArray.h @@ -3,9 +3,9 @@ #include "opengl_global.h" -#include OPENGL_FUNCTIONS_INCLUDE #include #include +#include "OpenGLFunctions.h" namespace paysages { namespace opengl { diff --git a/src/render/opengl/opengl_global.h b/src/render/opengl/opengl_global.h index b0a7223..b673163 100644 --- a/src/render/opengl/opengl_global.h +++ b/src/render/opengl/opengl_global.h @@ -29,9 +29,8 @@ template class VertexArray; } using namespace paysages::opengl; -//#define OpenGLFunctions QOpenGLFunctions_3_2_Core #define OpenGLFunctions QOpenGLFunctions_3_0 -#define OPENGL_FUNCTIONS_INCLUDE +//#define OpenGLFunctions QOpenGLFunctions_3_3_Core class OpenGLFunctions; #endif // OPENGL_GLOBAL_H