From 2f793bd15fd98eec30b59ce5eda58c4cecf5638f Mon Sep 17 00:00:00 2001 From: Anselme Date: Wed, 8 Jul 2015 20:36:02 +0200 Subject: [PATCH] added render pipeline panel --- basicmodule.cpp | 2 +- entity.cpp | 16 +---- entity.h | 8 +-- mainwindow.cpp | 31 +++++++++ mainwindow.h | 7 ++ mainwindow.ui | 153 ++++++++++++++++++++++++++++++++++++++++++-- modules.todo | 15 +++++ myglwidget.cpp | 13 +++- myglwidget.h | 5 ++ sparrowRenderer.pro | 5 +- sparrowrenderer.cpp | 129 +++++++++++++++++++++++++++++++++---- sparrowrenderer.h | 38 +++++++++-- 12 files changed, 375 insertions(+), 47 deletions(-) create mode 100644 modules.todo diff --git a/basicmodule.cpp b/basicmodule.cpp index b747751..098efbc 100644 --- a/basicmodule.cpp +++ b/basicmodule.cpp @@ -13,7 +13,7 @@ void BasicModule::render(Camera* myCamera) shader->bind(); bindModule(); for(Entity* e : entities) - e->draw(myCamera->getViewMatrix(), myCamera->getProjectionMatrix(), NULL); + e->draw(myCamera->getViewMatrix(), myCamera->getProjectionMatrix()); } diff --git a/entity.cpp b/entity.cpp index 6b94ac0..9e8cf3e 100644 --- a/entity.cpp +++ b/entity.cpp @@ -6,15 +6,9 @@ Entity::Entity(Mesh* myMesh, Material* myMat) : mesh(myMesh), mat(myMat) {} -Entity::Entity(Entity* myParent, Mesh* myMesh, Material* myMat) : mesh(myMesh), mat(myMat) +void Entity::draw(const glm::mat4 viewMatrix, const glm::mat4 projectionMatrix) { - myParent->addChild(this); -} - -void Entity::draw(const glm::mat4 viewMatrix, const glm::mat4 projectionMatrix, const glm::mat4* parentMatrix) -{ - glm::mat4 worldMatrix = parentMatrix == NULL ? modelMatrix : modelMatrix * *parentMatrix; - glm::mat4 modelViewMatrix = viewMatrix * worldMatrix; + glm::mat4 modelViewMatrix = viewMatrix * modelMatrix; glm::mat4 mvp = projectionMatrix * modelViewMatrix; glm::mat4 normalMatrix = glm::transpose(glm::inverse(modelViewMatrix)); mat->bindAttributes(); @@ -24,8 +18,6 @@ void Entity::draw(const glm::mat4 viewMatrix, const glm::mat4 projectionMatrix, shader->bindMatrix(shader->getLocation("normalMatrix"), normalMatrix); shader->bindMatrix(shader->getLocation("MVP"), mvp); mesh->draw(); - for(Entity* e : children) - e->draw(viewMatrix, projectionMatrix, &worldMatrix); } glm::mat4* Entity::getTransform() @@ -43,7 +35,3 @@ Material* Entity::getMaterial() return mat; } -void Entity::addChild(Entity* child) -{ - children.push_back(child); -} diff --git a/entity.h b/entity.h index a48994a..5c580b9 100644 --- a/entity.h +++ b/entity.h @@ -11,21 +11,15 @@ class Shader; class Entity { protected: - std::vector children; Mesh* mesh; Material* mat; glm::mat4 modelMatrix; public: Entity(Mesh* myMesh, Material* myMat); - /** - * NULL Material is acceptable for this constructor - */ - Entity(Entity* myParent, Mesh* myMesh, Material* myMat); - virtual void draw(const glm::mat4 viewMatrix, const glm::mat4 projectionMatrix, const glm::mat4* parentMatrix); + virtual void draw(const glm::mat4 viewMatrix, const glm::mat4 projectionMatrix); glm::mat4* getTransform(); Shader* getShader(); Material* getMaterial(); - void addChild(Entity* child); }; #endif // ENTITY_H diff --git a/mainwindow.cpp b/mainwindow.cpp index 49d64fc..b804dd9 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -1,5 +1,6 @@ #include "mainwindow.h" #include "ui_mainwindow.h" +#include "sparrowrenderer.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), @@ -12,3 +13,33 @@ MainWindow::~MainWindow() { delete ui; } + +void MainWindow::dockWidgetClosed() +{ + emit(ui->dockWidget->setVisible(true)); +} + +void MainWindow::updateTree() +{ + QTreeWidget* tree = ui->treeWidget; + SparrowRenderer* renderer = ui->openGLWidget->getRenderer(); + tree->clear(); + for(int i=0; igetNbModules(); ++i) + { + std::string moduleName = renderer->getModuleName(i); + QTreeWidgetItem* item = new QTreeWidgetItem(); + item->setText(0, QString(moduleName.c_str())); + tree->addTopLevelItem(item); + } +} + +void MainWindow::moduleSetEnabled(QTreeWidgetItem* item, int button) +{ + SparrowRenderer* renderer = ui->openGLWidget->getRenderer(); + std::string name = item->text(0).toStdString(); + if(renderer->isModuleEnabled(name)) + renderer->disableModule(name); + else + renderer->enableModule(name); + ui->openGLWidget->updateGL(); +} diff --git a/mainwindow.h b/mainwindow.h index a3948a9..c494f43 100644 --- a/mainwindow.h +++ b/mainwindow.h @@ -3,6 +3,8 @@ #include +class QTreeWidgetItem; + namespace Ui { class MainWindow; } @@ -17,6 +19,11 @@ public: private: Ui::MainWindow *ui; + +public slots: + void dockWidgetClosed(); + void updateTree(); + void moduleSetEnabled(QTreeWidgetItem* item, int button); }; #endif // MAINWINDOW_H diff --git a/mainwindow.ui b/mainwindow.ui index 8cb16b2..634380d 100644 --- a/mainwindow.ui +++ b/mainwindow.ui @@ -6,8 +6,8 @@ 0 0 - 400 - 300 + 854 + 510 @@ -40,11 +40,65 @@ 0 0 - 400 - 20 + 854 + 21 + + + menu + + + + + + + + 1 + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + rendering pipeline + + + + + + + + + + exit + + + + + false + + + show control panel + + @@ -52,8 +106,97 @@ MyGLWidget QOpenGLWidget
myglwidget.h
+ + modulesChanged() +
- + + + actionExit + triggered() + MainWindow + close() + + + -1 + -1 + + + 426 + 254 + + + + + dockWidget + visibilityChanged(bool) + actionShow_control_panel + setDisabled(bool) + + + 127 + 265 + + + -1 + -1 + + + + + actionShow_control_panel + triggered() + MainWindow + dockWidgetClosed() + + + -1 + -1 + + + 426 + 254 + + + + + openGLWidget + modulesChanged() + MainWindow + updateTree() + + + 555 + 265 + + + 426 + 254 + + + + + treeWidget + itemClicked(QTreeWidgetItem*,int) + MainWindow + moduleSetEnabled(QTreeWidgetItem*,int) + + + 127 + 276 + + + 426 + 254 + + + + + + dockWidgetClosed() + updateTree() + moduleSetEnabled(QTreeWidgetItem*,int) + diff --git a/modules.todo b/modules.todo new file mode 100644 index 0000000..0d4c24e --- /dev/null +++ b/modules.todo @@ -0,0 +1,15 @@ +Modules : + +- bump mapping module + +- particles module + +- text/gui module + +- shadowmap module + +- heat wave module +- mirror module +- wave + mirror = water module + +- ssao module diff --git a/myglwidget.cpp b/myglwidget.cpp index 346a437..f573c14 100644 --- a/myglwidget.cpp +++ b/myglwidget.cpp @@ -34,6 +34,11 @@ MyGLWidget::~MyGLWidget() delete(controller); } +SparrowRenderer* MyGLWidget::getRenderer() +{ + return renderer; +} + void MyGLWidget::loadResources() { std::string filenames[6] = { @@ -63,7 +68,7 @@ void MyGLWidget::buildScene() // create skybox module SkyboxModule* skybox = new SkyboxModule(ResourceBase::getTexture("skybox")); - renderer->addModule(skybox); + renderer->addModule(skybox, "skybox"); // create phong module Lights* directionnalLights = new Lights(); @@ -71,7 +76,7 @@ void MyGLWidget::buildScene() directionnalLights->addLight(glm::vec3(6, 4, -4), glm::vec3(0.7f, 0.6f, 0.4f)); // sun PhongModule* myPhongModule = new PhongModule(directionnalLights, pointLights, ResourceBase::getShader("phong")); - renderer->addModule(myPhongModule); + renderer->addModule(myPhongModule, "phong"); // create a material PhongMaterial* mat = new PhongMaterial(glm::vec3(1), glm::vec3(1), 20.0f); @@ -83,8 +88,10 @@ void MyGLWidget::buildScene() myMesh->initGL(); Entity* myEntity = new Entity(myMesh, ResourceBase::getMaterial("basicMat")); glm::mat4* transform = myEntity->getTransform(); - *transform = glm::rotate(*transform, 100.0f, glm::vec3(0, 1, 0)); + *transform = glm::rotate(*transform, 3.14f, glm::vec3(0, 1, 0)); myPhongModule->addEntity(myEntity); + + emit modulesChanged(); } void MyGLWidget::initializeGL() diff --git a/myglwidget.h b/myglwidget.h index e778139..b929319 100644 --- a/myglwidget.h +++ b/myglwidget.h @@ -22,6 +22,8 @@ public: explicit MyGLWidget(QWidget *parent = 0); ~MyGLWidget(); + SparrowRenderer* getRenderer(); + protected: void initializeGL(); void loadResources(); @@ -37,6 +39,9 @@ private: void wheelEvent(QWheelEvent *e); void keyPressEvent(QKeyEvent *e); void keyReleaseEvent(QKeyEvent *e); + +signals: + void modulesChanged(); }; #endif // MYGLWIDGET_H diff --git a/sparrowRenderer.pro b/sparrowRenderer.pro index dd1474c..05e79e1 100644 --- a/sparrowRenderer.pro +++ b/sparrowRenderer.pro @@ -68,4 +68,7 @@ HEADERS += mainwindow.h \ FORMS += mainwindow.ui -OTHER_FILES += *.frag *.vert *.glsl +OTHER_FILES += *.frag *.vert *.glsl *.todo + +DISTFILES += \ + modules.todo diff --git a/sparrowrenderer.cpp b/sparrowrenderer.cpp index 676dbf6..83b4555 100644 --- a/sparrowrenderer.cpp +++ b/sparrowrenderer.cpp @@ -5,6 +5,8 @@ #include "camera.h" #include "basicmodule.h" +// main methods + SparrowRenderer::SparrowRenderer(int width, int height) : camera(width, height) { glewExperimental = GL_TRUE; @@ -31,16 +33,6 @@ SparrowRenderer::SparrowRenderer(int width, int height) : camera(width, height) glAssert(glViewport(0, 0, width, height)); } -void SparrowRenderer::addModule(Module* myModule) -{ - modules.push_back(myModule); -} - -Camera* SparrowRenderer::getCamera() -{ - return &camera; -} - void SparrowRenderer::resize(int width, int height) { glAssert(glViewport(0, 0, width, height)); @@ -51,6 +43,119 @@ void SparrowRenderer::render() { glAssert(glClearColor(0.60, 0.65, 0.75, 1.0)); glAssert(glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)); - for(Module* m : modules) - m->render(getCamera()); + for(ModuleNode &m : modules) + { + if(m.isEnabled) + m.module->render(getCamera()); + } } + +// module methods + +void SparrowRenderer::addModule(Module* myModule, std::string name) +{ + modules.push_back(ModuleNode(myModule, name)); +} + +void SparrowRenderer::addModule(Module* myModule, std::string name, int index) +{ + if(index < 0) + index = 0; + if(index > modules.size()) + modules.push_back(ModuleNode(myModule, name)); + else + { + auto it = modules.begin(); + std::advance(it, index); + modules.insert(it, ModuleNode(myModule, name)); + } +} + +void SparrowRenderer::removeModule(int index) +{ + auto it = modules.begin(); + std::advance(it, index); + modules.erase(it); +} + +void SparrowRenderer::removeModule(std::string name) +{ + modules.erase(getModuleNode(name)); +} + +Module* SparrowRenderer::getModule(int index) +{ + auto it = modules.begin(); + std::advance(it, index); + return (*it).module; +} + +Module* SparrowRenderer::getModule(std::string name) +{ + return (*getModuleNode(name)).module; +} + +std::list::iterator SparrowRenderer::getModuleNode(std::string name) +{ + for(auto iterator = modules.begin(); iterator != modules.end(); ++iterator) + { + if(iterator->name == name) + return iterator; + } +} + +int SparrowRenderer::getNbModules() +{ + return modules.size(); +} + +std::string SparrowRenderer::getModuleName(int index) +{ + auto it = modules.begin(); + std::advance(it, index); + return (*it).name; +} + +void SparrowRenderer::enableModule(std::string name) +{ + (*getModuleNode(name)).isEnabled = true; +} + +void SparrowRenderer::enableModule(int index) +{ + auto it = modules.begin(); + std::advance(it, index); + (*it).isEnabled = true; +} + +void SparrowRenderer::disableModule(std::string name) +{ + (*getModuleNode(name)).isEnabled = false; +} + +void SparrowRenderer::disableModule(int index) +{ + auto it = modules.begin(); + std::advance(it, index); + (*it).isEnabled = false; +} + +bool SparrowRenderer::isModuleEnabled(std::string name) +{ + return (*getModuleNode(name)).isEnabled; +} + +bool SparrowRenderer::isModuleEnabled(int index) +{ + auto it = modules.begin(); + std::advance(it, index); + return (*it).isEnabled; +} + +// camera methods + +Camera* SparrowRenderer::getCamera() +{ + return &camera; +} + diff --git a/sparrowrenderer.h b/sparrowrenderer.h index e5e9f5f..fe7c823 100644 --- a/sparrowrenderer.h +++ b/sparrowrenderer.h @@ -1,21 +1,51 @@ #ifndef SPARROWRENDERER_H #define SPARROWRENDERER_H -#include +#include +#include #include "camera.h" class Module; class SparrowRenderer { + typedef struct s_moduleNode{ + Module* module; + std::string name; + bool isEnabled; + + s_moduleNode(Module* myModule, const std::string &myName) : module(myModule), name(myName), isEnabled(true) {} + } ModuleNode; + + std::list::iterator getModuleNode(std::string name); + Camera camera; - std::vector modules; + std::list modules; public: + + // main methods SparrowRenderer(int width, int height); - void addModule(Module* myModule); - Camera* getCamera(); void resize(int width, int height); void render(); + + // modules methods + void addModule(Module* myModule, std::string name); + void addModule(Module* myModule, std::string name, int index); + void removeModule(std::string name); + void removeModule(int index); + Module* getModule(std::string name); + Module* getModule(int index); + int getNbModules(); + std::string getModuleName(int index); + void enableModule(std::string name); + void enableModule(int index); + void disableModule(std::string name); + void disableModule(int index); + bool isModuleEnabled(std::string name); + bool isModuleEnabled(int index); + + // camera methods + Camera* getCamera(); }; #endif // SPARROWRENDERER_H