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:
parent
1304562344
commit
8ceca758e9
@ -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
40
src/pipeline.cpp
Normal 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
79
src/pipeline.h
Normal 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
|
10
src/scene.h
10
src/scene.h
@ -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();}
|
||||||
|
@ -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;
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user