added pipeline class, the renderer now takes a pipeline instead of modules, the camera is now held in the scene

This commit is contained in:
Anselme 2016-03-10 22:49:44 +01:00
parent 1304562344
commit 8ceca758e9
7 changed files with 158 additions and 161 deletions

View File

@ -1,18 +0,0 @@
basic features :
mipmaps
pipeline class
configurable bloom
billboards
2D rendering
cubemap framebuffer
point light shadows
dynamic HDR
deferred shading
advanced features :
water shader
ssao
mesh animation

40
src/pipeline.cpp Normal file
View File

@ -0,0 +1,40 @@
#include "pipeline.h"
#include "forwardmodule.h"
#include "crappymodule.h"
#include "shadersource.h"
#include "sparrowrenderer.h"
#include "scene.h"
Pipeline::~Pipeline()
{
for(Module *m : modules)
delete m;
}
SimplePipeline::SimplePipeline(ShaderSource *forwardSource)
{
isCrappy = forwardSource != NULL && SparrowRenderer::isModernOpenGLAvailable();
if(!isCrappy)
{
ForwardModule *forward = new ForwardModule();
forward->setShaderSource(forwardSource);
forward->setClearBeforeDrawing(false);
modules.push_back(forward);
}
else
modules.push_back(new CrappyModule());
}
void SimplePipeline::refreshScene(Scene *scene)
{
if(!isCrappy)
{
ForwardModule *forward = (ForwardModule*)(modules[0]);
forward->compileShaders(scene);
}
}
DefaultPipeline::DefaultPipeline(const Settings &mySettings, const SourcePack &mySourcePack)
{
}

79
src/pipeline.h Normal file
View File

@ -0,0 +1,79 @@
#ifndef PIPELINE_H
#define PIPELINE_H
#include <vector>
#include <cstddef>
#include <string>
class ShaderSource;
class Module;
class Scene;
class Pipeline
{
protected:
/**
* @brief every module in this vector will be used by the renderer for resizing, and rendering
*/
std::vector<Module*> modules;
public:
/**
* @brief getModules is a getter used by the renderer to access the pipeline modules
*/
std::vector<Module*>& getModules() {return modules;}
/**
* the destructor deletes all the modules
*/
~Pipeline();
};
/**
* @brief The SimplePipeline class creates a simple graphic pipeline able to render 3D meshes
* it is compatible with crappy rendering
*/
class SimplePipeline : public Pipeline
{
bool isCrappy;
public:
SimplePipeline(ShaderSource *forwardSource = NULL);
void refreshScene(Scene *scene);
};
class DefaultPipeline : public Pipeline
{
public:
struct Settings
{
bool usesDeferred;
bool hasSkybox;
bool hasPicking;
bool hasBloom;
};
struct SourcePack
{
std::string forward_frag;
std::string forward_vert;
std::string gbuffer_frag;
std::string gbuffer_vert;
std::string deferred_frag;
std::string deferred_vert;
std::string bloom_frag;
std::string blur_frag;
std::string hdr_frag;
std::string luminance_frag;
std::string reduction_frag;
};
DefaultPipeline(const Settings &mySettings, const SourcePack &mySourcePack);
void refreshScene(Scene *scene);
};
#endif // PIPELINE_H

View File

@ -29,7 +29,15 @@ struct GeometryNode
class Scene class Scene
{ {
protected:
Camera *camera;
public: public:
Scene() : camera(NULL) {}
void setCamera(Camera* myCamera) {camera = myCamera;}
Camera* getCamera() {return camera;}
virtual SceneIterator<Light*>* getLights() = 0; virtual SceneIterator<Light*>* getLights() = 0;
virtual SceneIterator<GeometryNode*>* getGeometry() = 0; virtual SceneIterator<GeometryNode*>* getGeometry() = 0;
}; };
@ -54,6 +62,8 @@ protected:
std::vector<Light*> lights; std::vector<Light*> lights;
std::vector<GeometryNode*> geometry; std::vector<GeometryNode*> geometry;
public: public:
ArrayScene() : Scene() {}
void clearLights() {lights.clear();} void clearLights() {lights.clear();}
void clearEntities() {geometry.clear();} void clearEntities() {geometry.clear();}
void clearScene() {clearLights(); clearEntities();} void clearScene() {clearLights(); clearEntities();}

View File

@ -44,16 +44,6 @@ Shader* ShaderSource::compile(int nbDefines, const char** defines)
return new Shader(compiledSources[VERTEX], compiledSources[FRAGMENT]); return new Shader(compiledSources[VERTEX], compiledSources[FRAGMENT]);
} }
bool isDefined(const std::string &str, int nbDefines, const char** defines)
{
for(int i=0; i<nbDefines; ++i)
{
if(str.compare(defines[i]) == 0)
return true;
}
return false;
}
std::string ShaderSource::preprocess(std::string source, int nbDefines, const char** defines, const char* version) std::string ShaderSource::preprocess(std::string source, int nbDefines, const char** defines, const char* version)
{ {
std::string header = "#version "+std::string(version); std::string header = "#version "+std::string(version);
@ -61,41 +51,3 @@ std::string ShaderSource::preprocess(std::string source, int nbDefines, const ch
header += "\n#define "+std::string(defines[i]); header += "\n#define "+std::string(defines[i]);
return header+"\n#line 1\n"+source; return header+"\n#line 1\n"+source;
} }
/*
std::string ShaderSource::preprocess(std::string source, int nbDefines, const char** defines)
{
std::string compiled = "";
std::istringstream ss(source);
std::string line;
std::vector<bool> allowedStack;
while (std::getline(ss, line)) {
if(line.size() > 0 && line.at(0) == '#')
{
if(line.compare(0, 8, "#version") == 0)
compiled.append(line+'\n');
else if(line.compare(0, 7, "#ifdef ") == 0)
allowedStack.push_back(isDefined(line.substr(7), nbDefines, defines));
else if(line.compare(0, 8, "#ifndef ") == 0)
allowedStack.push_back(!isDefined(line.substr(8), nbDefines, defines));
else if(line.compare("#endif") == 0)
allowedStack.pop_back();
else if(line.compare("#else") == 0)
allowedStack.back() = !allowedStack.back();
}
else
{
bool ok = true;
for(bool allowed : allowedStack)
{
if(!allowed)
{
ok = false; break;
}
}
if(ok)
compiled.append(line+'\n');
}
}
return compiled;
}
*/

View File

@ -10,8 +10,12 @@
#include <chrono> #include <chrono>
#include <string.h> #include <string.h>
#include <iostream> #include <iostream>
#include "pipeline.h"
#include "scene.h"
// main methods // main methods
std::vector<Module*> SparrowRenderer::NO_MODULES = std::vector<Module*>();
bool SparrowRenderer::modernOpenglAvailable = false; bool SparrowRenderer::modernOpenglAvailable = false;
void SparrowRenderer::initGL(int w, int h, bool forceCrappy) void SparrowRenderer::initGL(int w, int h, bool forceCrappy)
@ -48,22 +52,14 @@ void SparrowRenderer::initGL(int w, int h, bool forceCrappy)
resizeGL(w, h); resizeGL(w, h);
} }
void SparrowRenderer::destroyGL()
{
for(ModuleNode &m : modules)
delete m.module;
modules.clear();
}
void SparrowRenderer::resizeGL(int w, int h) void SparrowRenderer::resizeGL(int w, int h)
{ {
width = w; width = w;
height = h; height = h;
glAssert(glViewport(0, 0, width, height)); if(scene != NULL && scene->getCamera() != NULL)
if(camera != NULL) scene->getCamera()->resize(width, height);
camera->resize(width, height); for(Module *m : modules)
for(ModuleNode &mn : modules) m->resize(w, h);
mn.module->resize(w, h);
} }
void SparrowRenderer::renderGL() void SparrowRenderer::renderGL()
@ -71,15 +67,11 @@ void SparrowRenderer::renderGL()
glAssert(glViewport(0, 0, width, height)); glAssert(glViewport(0, 0, width, height));
glAssert(glClearColor(clearColor.r, clearColor.g, clearColor.b, 1)); glAssert(glClearColor(clearColor.r, clearColor.g, clearColor.b, 1));
glAssert(glClearDepth(1.0)); glAssert(glClearDepth(1.0));
for(ModuleNode &m : modules)
for(Module *m : modules)
{ {
if(m.isEnabled) glFinish();
{ m->renderGL(scene == NULL ? NULL : scene->getCamera(), scene);
glFinish();
std::chrono::high_resolution_clock::time_point t = std::chrono::high_resolution_clock::now();
m.module->renderGL(getCamera(), scene);
m.seconds = std::chrono::duration_cast<std::chrono::duration<double>>(std::chrono::high_resolution_clock::now() - t).count();
}
} }
glFinish(); glFinish();
} }
@ -89,56 +81,14 @@ bool SparrowRenderer::isModernOpenGLAvailable()
return modernOpenglAvailable; return modernOpenglAvailable;
} }
// clock methods // pipeline methods
double SparrowRenderer::getFPS() void SparrowRenderer::setPipeline(Pipeline* pipeline)
{ {
double totalTime = 0; if(pipeline != NULL)
for(ModuleNode &m : modules) modules = pipeline->getModules();
{ else
if(m.isEnabled) modules = NO_MODULES;
totalTime += m.seconds;
}
return 1./totalTime;
}
double SparrowRenderer::getModuleTime(int moduleId)
{
return modules[moduleId].seconds;
}
// module methods
void SparrowRenderer::addModule(Module* myModule, std::string name)
{
if(modernOpenglAvailable || !myModule->requiresModernOpenGL())
modules.push_back(ModuleNode(myModule, name));
}
int SparrowRenderer::getNbModules()
{
return modules.size();
}
void SparrowRenderer::setModuleEnabled(std::string module, bool isEnabled)
{
for(ModuleNode &node : modules)
{
if(node.name.compare(module) == 0)
node.isEnabled = isEnabled;
}
}
// camera methods
void SparrowRenderer::setCamera(Camera* myCamera)
{
camera = myCamera;
}
Camera* SparrowRenderer::getCamera()
{
return camera;
} }
// scene methods // scene methods

View File

@ -9,61 +9,45 @@
class Camera; class Camera;
class Module; class Module;
class Scene; class Scene;
class Pipeline;
class SparrowRenderer class SparrowRenderer
{ {
public: public:
SparrowRenderer() : SparrowRenderer() :
camera(NULL),
scene(NULL), scene(NULL),
modules(NO_MODULES),
clearColor(0) clearColor(0)
{} {}
// main methods // main methods
void initGL(int w, int h, bool forceCrappy = false); void initGL(int w, int h, bool forceCrappy = false);
void destroyGL();
void resizeGL(int w, int h); void resizeGL(int w, int h);
void renderGL(); void renderGL();
static bool isModernOpenGLAvailable(); static bool isModernOpenGLAvailable();
void setClearColor(glm::vec3 color) {clearColor=color;} void setClearColor(glm::vec3 color) {clearColor=color;}
// clock methods // pipeline methods
double getFPS(); void setPipeline(Pipeline* pipeline);
double getModuleTime(int moduleId);
// modules methods
void addModule(Module* myModule, std::string name);
int getNbModules();
void setModuleEnabled(std::string module, bool isEnabled);
// camera methods
void setCamera(Camera* myCamera);
Camera* getCamera();
// scene methods // scene methods
void setScene(Scene* myScene); void setScene(Scene* myScene);
Scene* getScene(); Scene* getScene();
protected: protected:
typedef struct s_moduleNode{
Module* module;
std::string name;
bool isEnabled;
double seconds;
s_moduleNode(Module* myModule, const std::string &myName) : module(myModule), name(myName), isEnabled(true) {}
} ModuleNode;
int width; int width;
int height; int height;
Camera* camera;
Scene* scene; Scene* scene;
std::vector<ModuleNode> modules; std::vector<Module*> &modules;
static bool modernOpenglAvailable; static bool modernOpenglAvailable;
glm::vec3 clearColor; glm::vec3 clearColor;
std::vector<ModuleNode>::iterator getModuleNode(std::string name); private:
static std::vector<Module*> NO_MODULES;
}; };
#endif // SPARROWRENDERER_H #endif // SPARROWRENDERER_H