Merge branch 'master' into vegetation

Conflicts:
	src/render/opengl/OpenGLRenderer.cpp
	src/render/opengl/OpenGLRenderer.h
	src/render/opengl/OpenGLShaderProgram.cpp
	src/render/opengl/OpenGLShaderProgram.h
	src/render/opengl/OpenGLSharedState.cpp
This commit is contained in:
Michaël Lemaire 2015-12-04 00:04:07 +01:00
commit e346f07c22
17 changed files with 130 additions and 82 deletions

1
.gitignore vendored
View file

@ -8,6 +8,7 @@
/output/ /output/
/perf.* /perf.*
/pic*.png /pic*.png
core
*.pro.user *.pro.user
*.pro.user.* *.pro.user.*
qrc_*.cpp qrc_*.cpp

View file

@ -110,8 +110,8 @@ bool DefinitionNode::applyDiff(const DefinitionDiff *diff, bool) {
if (diff->getTypeName() == type_name) { if (diff->getTypeName() == type_name) {
return true; return true;
} else { } else {
Logs::error() << "Can't apply " << diff->getTypeName() << " diff to " << getName() << " " << type_name Logs::error() << "[Definition] Can't apply " << diff->getTypeName() << " diff to " << getName() << " "
<< " node" << std::endl; << type_name << " node" << std::endl;
return false; return false;
} }
} }
@ -155,8 +155,8 @@ void DefinitionNode::save(PackStream *stream) const {
child->save(stream); child->save(stream);
} else { } else {
// Child size not known, write it to a temporary stream to know it // 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" Logs::debug() << "[Definition] Unknown size for child " << child->name
<< std::endl; << ", unefficient writing to temporary stream" << std::endl;
PackStream substream; PackStream substream;
child->save(&substream); child->save(&substream);
stream->writeFromBuffer(substream, true); stream->writeFromBuffer(substream, true);
@ -183,7 +183,7 @@ void DefinitionNode::load(PackStream *stream) {
// TODO Ask subclass if it can instanciate a child // TODO Ask subclass if it can instanciate a child
// Else skip length of unknown child // Else skip length of unknown child
stream->skipBytes(child_size); 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) { if (dest_child) {
child->copy(dest_child); child->copy(dest_child);
} else { } else {
Logs::warning() << "Can't copy to child " << child->name << " of " << destination->getTypeName() Logs::warning() << "[Definition] Can't copy to child " << child->name << " of "
<< std::endl; << destination->getTypeName() << std::endl;
} }
} }
} else { } 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; child->parent = NULL;
children.erase(it); children.erase(it);
} else { } 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; << std::endl;
} }
} }

View file

@ -49,7 +49,7 @@ Scenery::FileOperationResult Scenery::saveGlobal(const std::string &filepath) co
stream.write(&version_header); stream.write(&version_header);
stream.write(&app_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; return FILE_OPERATION_OK;
} }
@ -87,7 +87,7 @@ Scenery::FileOperationResult Scenery::loadGlobal(const std::string &filepath) {
return FILE_OPERATION_APP_MISMATCH; 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; return FILE_OPERATION_OK;
} }
@ -113,7 +113,7 @@ void Scenery::autoPreset(int seed) {
validate(); 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) { void Scenery::setAtmosphere(AtmosphereDefinition *atmosphere) {

View file

@ -16,6 +16,11 @@
#include <QGuiApplication> #include <QGuiApplication>
MainModelerWindow::MainModelerWindow() { MainModelerWindow::MainModelerWindow() {
/*QSurfaceFormat new_format = format();
new_format.setVersion(3, 3);
new_format.setProfile(QSurfaceFormat::CoreProfile);
setFormat(new_format);*/
scenery = new Scenery(); scenery = new Scenery();
scenery->autoPreset(); scenery->autoPreset();

View file

@ -20,7 +20,6 @@ OpenGLView::OpenGLView(QQuickItem *parent) : QQuickItem(parent) {
connect(this, SIGNAL(windowChanged(QQuickWindow *)), this, SLOT(handleWindowChanged(QQuickWindow *))); connect(this, SIGNAL(windowChanged(QQuickWindow *)), this, SLOT(handleWindowChanged(QQuickWindow *)));
connect(this, SIGNAL(widthChanged()), this, SLOT(handleResize())); connect(this, SIGNAL(widthChanged()), this, SLOT(handleResize()));
connect(this, SIGNAL(heightChanged()), this, SLOT(handleResize())); connect(this, SIGNAL(heightChanged()), this, SLOT(handleResize()));
startTimer(50);
} }
void OpenGLView::handleWindowChanged(QQuickWindow *win) { void OpenGLView::handleWindowChanged(QQuickWindow *win) {
@ -28,12 +27,11 @@ void OpenGLView::handleWindowChanged(QQuickWindow *win) {
window = qobject_cast<MainModelerWindow *>(win); window = qobject_cast<MainModelerWindow *>(win);
if (window) { if (window) {
renderer = window->getRenderer(); renderer = window->getRenderer();
initialized = false;
connect(win, SIGNAL(beforeRendering()), this, SLOT(paint()), Qt::DirectConnection);
win->setClearBeforeRendering(false); win->setClearBeforeRendering(false);
initialized = false; connect(win, SIGNAL(sceneGraphInitialized()), this, SLOT(handleSceneGraphReady()));
} }
} }
} }
@ -66,6 +64,11 @@ void OpenGLView::handleResize() {
resized = true; resized = true;
} }
void OpenGLView::handleSceneGraphReady() {
connect(window, SIGNAL(beforeRendering()), this, SLOT(paint()), Qt::DirectConnection);
startTimer(50);
}
void OpenGLView::wheelEvent(QWheelEvent *event) { void OpenGLView::wheelEvent(QWheelEvent *event) {
if (not acceptInputs()) { if (not acceptInputs()) {
return; return;

View file

@ -17,6 +17,7 @@ class OpenGLView : public QQuickItem {
void handleWindowChanged(QQuickWindow *win); void handleWindowChanged(QQuickWindow *win);
void paint(); void paint();
void handleResize(); void handleResize();
void handleSceneGraphReady();
protected: protected:
virtual void wheelEvent(QWheelEvent *event) override; virtual void wheelEvent(QWheelEvent *event) override;

View file

@ -1,8 +1,8 @@
#include "ExplorerChunkTerrain.h" #include "ExplorerChunkTerrain.h"
#include OPENGL_FUNCTIONS_INCLUDE
#include <cmath> #include <cmath>
#include <QImage> #include <QImage>
#include "OpenGLFunctions.h"
#include "ColorProfile.h" #include "ColorProfile.h"
#include "CameraDefinition.h" #include "CameraDefinition.h"
#include "OpenGLRenderer.h" #include "OpenGLRenderer.h"

View file

@ -0,0 +1,9 @@
#ifndef OPENGLFUNCTIONS
#define OPENGLFUNCTIONS
#include "opengl_global.h"
#define _OPENGL_FUNCTIONS_INCLUDE <OpenGLFunctions>
#include _OPENGL_FUNCTIONS_INCLUDE
#endif // OPENGLFUNCTIONS

View file

@ -1,6 +1,6 @@
#include "OpenGLRenderer.h" #include "OpenGLRenderer.h"
#include OPENGL_FUNCTIONS_INCLUDE #include "OpenGLFunctions.h"
#include "CameraDefinition.h" #include "CameraDefinition.h"
#include "OpenGLSharedState.h" #include "OpenGLSharedState.h"
#include "OpenGLSkybox.h" #include "OpenGLSkybox.h"
@ -72,10 +72,20 @@ void OpenGLRenderer::prepare() {
getVegetationRenderer()->setEnabled(false); 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() { void OpenGLRenderer::initialize() {
bool init = functions->initializeOpenGLFunctions(); bool init = functions->initializeOpenGLFunctions();
if (init) { if (init) {
Logs::debug() << "[OpenGL] renderer started (version " << functions->glGetString(GL_VERSION)
<< ", glsl version " << functions->glGetString(GL_SHADING_LANGUAGE_VERSION) << ")" << std::endl;
prepareOpenGLState(); prepareOpenGLState();
prepare(); prepare();
@ -94,9 +104,10 @@ void OpenGLRenderer::initialize() {
cameraChangeEvent(render_camera); cameraChangeEvent(render_camera);
checkForErrors("initialize");
ready = true; ready = true;
} else { } 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); cameraChangeEvent(render_camera);
prepareOpenGLState(); prepareOpenGLState();
checkForErrors("resize");
} }
} }
void OpenGLRenderer::paint() { void OpenGLRenderer::paint() {
if (ready and not paused) { if (ready and not paused) {
checkForErrors("before_paint");
functions->glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); functions->glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
skybox->render(); skybox->render();
checkForErrors("skybox");
terrain->render(); terrain->render();
checkForErrors("terrain");
water->render(); water->render();
checkForErrors("water");
vegetation->render(); vegetation->render();
checkForErrors("vegetation");
if (mouse_tracking) { if (mouse_tracking) {
updateMouseProjection(); updateMouseProjection();
} checkForErrors("mouse_tracking");
int error_code;
while ((error_code = functions->glGetError()) != GL_NO_ERROR) {
Logs::warning() << "[OpenGL] ERROR : " << error_code << std::endl;
} }
displayed = true; displayed = true;

View file

@ -36,6 +36,13 @@ class OPENGLSHARED_EXPORT OpenGLRenderer : public SoftwareRenderer {
virtual void prepare() override; 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 initialize();
void prepareOpenGLState(); void prepareOpenGLState();
void resize(int width, int height); void resize(int width, int height);

View file

@ -1,8 +1,8 @@
#include "OpenGLShaderProgram.h" #include "OpenGLShaderProgram.h"
#include OPENGL_FUNCTIONS_INCLUDE
#include <QOpenGLShaderProgram> #include <QOpenGLShaderProgram>
#include <QDir> #include <QDir>
#include "OpenGLFunctions.h"
#include "OpenGLRenderer.h" #include "OpenGLRenderer.h"
#include "OpenGLSharedState.h" #include "OpenGLSharedState.h"
#include "Texture2D.h" #include "Texture2D.h"
@ -29,7 +29,7 @@ void OpenGLShaderProgram::addVertexSource(QString path) {
if (file.open(QIODevice::ReadOnly | QIODevice::Text)) { if (file.open(QIODevice::ReadOnly | QIODevice::Text)) {
source_vertex += QString(file.readAll()).toStdString(); source_vertex += QString(file.readAll()).toStdString();
} else { } 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)) { if (file.open(QIODevice::ReadOnly | QIODevice::Text)) {
source_fragment += QString(file.readAll()).toStdString(); source_fragment += QString(file.readAll()).toStdString();
} else { } 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)); program->addShaderFromSourceCode(QOpenGLShader::Fragment, QString::fromStdString(source_fragment));
if (not program->link()) { 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; << program->log().toStdString() << std::endl;
} else if (program->log().length() > 0) { } 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; << program->log().toStdString() << std::endl;
} else {
Logs::debug() << "[OpenGL] Shader " << name << " compiled" << std::endl;
} }
} }
void OpenGLShaderProgram::bind() { bool OpenGLShaderProgram::bind() {
if (not compiled) { if (not compiled) {
compile(); compile();
compiled = true; compiled = true;
} }
program->bind(); if (program->bind()) {
int texture_unit = 0; int texture_unit = 0;
renderer->getSharedState()->apply(this, texture_unit); renderer->getSharedState()->apply(this, texture_unit);
state->apply(this, texture_unit); state->apply(this, texture_unit);
return true;
} else {
return false;
}
} }
void OpenGLShaderProgram::release() { void OpenGLShaderProgram::release() {
@ -73,8 +78,7 @@ void OpenGLShaderProgram::release() {
} }
void OpenGLShaderProgram::drawTriangles(float *vertices, int triangle_count) { void OpenGLShaderProgram::drawTriangles(float *vertices, int triangle_count) {
bind(); if (bind()) {
GLuint array_vertex = program->attributeLocation("vertex"); GLuint array_vertex = program->attributeLocation("vertex");
program->setAttributeArray(array_vertex, GL_FLOAT, vertices, 3); program->setAttributeArray(array_vertex, GL_FLOAT, vertices, 3);
program->enableAttributeArray(array_vertex); program->enableAttributeArray(array_vertex);
@ -85,10 +89,10 @@ void OpenGLShaderProgram::drawTriangles(float *vertices, int triangle_count) {
release(); release();
} }
}
void OpenGLShaderProgram::drawTriangleStrip(float *vertices, int vertex_count) { void OpenGLShaderProgram::drawTriangleStrip(float *vertices, int vertex_count) {
bind(); if (bind()) {
GLuint array_vertex = program->attributeLocation("vertex"); GLuint array_vertex = program->attributeLocation("vertex");
program->setAttributeArray(array_vertex, GL_FLOAT, vertices, 3); program->setAttributeArray(array_vertex, GL_FLOAT, vertices, 3);
program->enableAttributeArray(array_vertex); program->enableAttributeArray(array_vertex);
@ -99,10 +103,10 @@ void OpenGLShaderProgram::drawTriangleStrip(float *vertices, int vertex_count) {
release(); release();
} }
}
void OpenGLShaderProgram::drawTrianglesUV(float *vertices, float *uv, int triangle_count) { void OpenGLShaderProgram::drawTrianglesUV(float *vertices, float *uv, int triangle_count) {
bind(); if (bind()) {
GLuint array_vertex = program->attributeLocation("vertex"); GLuint array_vertex = program->attributeLocation("vertex");
program->setAttributeArray(array_vertex, GL_FLOAT, vertices, 3); program->setAttributeArray(array_vertex, GL_FLOAT, vertices, 3);
program->enableAttributeArray(array_vertex); program->enableAttributeArray(array_vertex);
@ -118,10 +122,10 @@ void OpenGLShaderProgram::drawTrianglesUV(float *vertices, float *uv, int triang
release(); release();
} }
}
void OpenGLShaderProgram::drawTriangleStripUV(float *vertices, float *uv, int vertex_count) { void OpenGLShaderProgram::drawTriangleStripUV(float *vertices, float *uv, int vertex_count) {
bind(); if (bind()) {
GLuint array_vertex = program->attributeLocation("vertex"); GLuint array_vertex = program->attributeLocation("vertex");
program->setAttributeArray(array_vertex, GL_FLOAT, vertices, 3); program->setAttributeArray(array_vertex, GL_FLOAT, vertices, 3);
program->enableAttributeArray(array_vertex); program->enableAttributeArray(array_vertex);
@ -137,3 +141,4 @@ void OpenGLShaderProgram::drawTriangleStripUV(float *vertices, float *uv, int ve
release(); release();
} }
}

View file

@ -24,7 +24,7 @@ class OPENGLSHARED_EXPORT OpenGLShaderProgram {
void drawTrianglesUV(float *vertices, float *uv, int triangle_count); void drawTrianglesUV(float *vertices, float *uv, int triangle_count);
void drawTriangleStripUV(float *vertices, float *uv, int vertex_count); void drawTriangleStripUV(float *vertices, float *uv, int vertex_count);
void bind(); bool bind();
void release(); void release();
inline QOpenGLShaderProgram *getProgram() const { inline QOpenGLShaderProgram *getProgram() const {

View file

@ -1,6 +1,6 @@
#include "OpenGLTerrain.h" #include "OpenGLTerrain.h"
#include OPENGL_FUNCTIONS_INCLUDE #include "OpenGLFunctions.h"
#include "OpenGLRenderer.h" #include "OpenGLRenderer.h"
#include "OpenGLShaderProgram.h" #include "OpenGLShaderProgram.h"
#include "ParallelPool.h" #include "ParallelPool.h"

View file

@ -1,8 +1,8 @@
#include "OpenGLVariable.h" #include "OpenGLVariable.h"
#include OPENGL_FUNCTIONS_INCLUDE
#include <QOpenGLShaderProgram> #include <QOpenGLShaderProgram>
#include <cassert> #include <cassert>
#include "OpenGLFunctions.h"
#include "OpenGLRenderer.h" #include "OpenGLRenderer.h"
#include "OpenGLShaderProgram.h" #include "OpenGLShaderProgram.h"
#include "Vector3.h" #include "Vector3.h"

View file

@ -1,10 +1,10 @@
#include "OpenGLVegetationLayer.h" #include "OpenGLVegetationLayer.h"
#include OPENGL_FUNCTIONS_INCLUDE
#include <algorithm> #include <algorithm>
#include "Vector3.h" #include "Vector3.h"
#include "CameraDefinition.h" #include "CameraDefinition.h"
#include "Mutex.h" #include "Mutex.h"
#include "OpenGLFunctions.h"
#include "OpenGLVegetation.h" #include "OpenGLVegetation.h"
#include "OpenGLVegetationInstance.h" #include "OpenGLVegetationInstance.h"
#include "OpenGLVegetationImpostor.h" #include "OpenGLVegetationImpostor.h"

View file

@ -3,9 +3,9 @@
#include "opengl_global.h" #include "opengl_global.h"
#include OPENGL_FUNCTIONS_INCLUDE
#include <cassert> #include <cassert>
#include <QOpenGLShaderProgram> #include <QOpenGLShaderProgram>
#include "OpenGLFunctions.h"
namespace paysages { namespace paysages {
namespace opengl { namespace opengl {

View file

@ -29,9 +29,8 @@ template <typename Vertex> class VertexArray;
} }
using namespace paysages::opengl; using namespace paysages::opengl;
//#define OpenGLFunctions QOpenGLFunctions_3_2_Core
#define OpenGLFunctions QOpenGLFunctions_3_0 #define OpenGLFunctions QOpenGLFunctions_3_0
#define OPENGL_FUNCTIONS_INCLUDE <OpenGLFunctions> //#define OpenGLFunctions QOpenGLFunctions_3_3_Core
class OpenGLFunctions; class OpenGLFunctions;
#endif // OPENGL_GLOBAL_H #endif // OPENGL_GLOBAL_H