bt_dynamics_world->setGravity(btVector3(0, YFALL_SPEED, 0));
/*BUFFERS*/
- render = new fBufferObject(2);
+ render = new fBufferObject();
render->bindBuffer(W_WIDTH, W_HEIGHT);
blurPingPong = new fBufferObject*[2];
shadowdir = new dBufferObject();
shadowdir->bindBuffer(1024, 1024);
- postRender = new fBufferObject(1, false);
- postRender->bindBuffer(W_WIDTH, W_HEIGHT);
-
- postRenderSmall = new fBufferObject(1, false);
- postRenderSmall->bindBuffer(W_WIDTH / SMALL_F, W_HEIGHT / SMALL_F);
+ postRenderPingPong = new fBufferObject*[2];
+ for (int i = 0; i < 2; i++)
+ {
+ postRenderPingPong[i] = new fBufferObject(1, false);
+ postRenderPingPong[i]->bindBuffer(W_WIDTH, W_HEIGHT);
+ }
+
+ motionVecs = new fBufferObject();
+ motionVecs->bindBuffer(W_WIDTH , W_HEIGHT);
fBufferObject::clearBuffer();
//Graphix::disableEffects(EF_BLOOM);
+ //Graphix::disableEffects(EF_MOTION_BLUR);
for (int s = 0; s < NELEMS(shader); s++)
{
delete blurPingPong;
delete shadowdir;
- delete postRender;
- delete postRenderSmall;
+ for (int i = 0; i < 2; i++)
+ delete postRenderPingPong[i];
+ delete postRenderPingPong;
+ delete motionVecs;
//if (viewPort != nullptr)
void Scene::draw() const
{
+ GLboolean horizontal_blurPP = true, postRenderPP = true;
+
+ fBufferObject* lastScreen = nullptr;
+
+ /* Update Camera */
for (int s = 0; s < NELEMS(shader); s++)
{
Shader::getShader(shader[s])->useShader();
camera.useView();
}
- /*Draw WireFrame ONLY*/
+ /* Draw WireFrame ONLY */
if (Events::isKToggleActive(SDLK_F3))
{
Shader::getShader(SH_BASICTEXTURE)->useShader();
return;
}
-
- //Directional Light Shadow
+ /* Prepare Shadows */
glCullFace(GL_FRONT);
glEnable(GL_POLYGON_OFFSET_FILL);
glPolygonOffset(4.f, 0.f);
glDisable(GL_POLYGON_OFFSET_FILL);
glViewport(0, 0, W_WIDTH, W_HEIGHT);
+
/* Prepare DRAW SCENE */
camera.useCamera();
- render->useBuffer();
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
- dirLight->updateDirLightView();
- Shader::getShader(SH_LIGHTING)->useShader();
- fBufferObject::clearBuffer();
- shadowdir->getTexture()->useTexture(uPLightXP);
-
-
-
- /* DRAW SCENE */
if (Graphix::testEffect(EF_BLOOM) || Graphix::testEffect(EF_MOTION_BLUR))
{
render->useBuffer();
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ lastScreen = render;
}
else
{
fBufferObject::clearBuffer();
}
- /*DRAW SCENE -> SkyBox*/
+ /* DRAW SCENE -> SkyBox */
Shader::getShader(SH_BASICTEXTURE)->useShader();
SkyBox.draw();
- //Shader::getShader(SH_BASICTEXTURE)->useShader();
- //Shader::getShader(SH_BASICTEXTURE)->setUniformLocation("uFar", false);
-
+ /* DRAW SCENE -> Rest */
Shader::getShader(SH_LIGHTING)->useShader();
+ dirLight->updateDirLightView();
+ shadowdir->getTexture()->useTexture(uPLightXP);
drawSceneObjects();
+ /*DRAW BBOX WIRES*/
+ if (lastScreen != nullptr)
+ lastScreen->useBuffer();
+ else
+ fBufferObject::clearBuffer();
+
+ if (Events::isKToggleActive(SDLK_F6))
+ {
+ Shader::getShader(SH_BASIC)->useShader();
+ drawSceneObjects(DRAW_Coll);
+ }
/* MOTION BLUR */
if (Graphix::testEffect(EF_MOTION_BLUR))
{
- postRender->useBuffer();
+
+ /* calculate Motion */
+ motionVecs->useBuffer();
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
Shader::getShader(SH_FILTER_MOTION)->useShader();
camera.useOldProjView();
- Shader::getShader(SH_ACTIVE)->setUniformLocation("uDelta", Graphix::fps.getCappedDelta());
- drawSceneObjects(DRAW_ModelMotionBlur);
- }
- else
- {
+ drawSceneObjects(DRAW_ModelMotionBlur);
+
+ /* Blur Scene */
+ Shader::getShader(SH_BLUR_DIRECTIONAL)->useShader();
+ Shader::getShader(SH_ACTIVE)->setUniformLocation("uDelta", Graphix::fps.getCappedDelta());
+ motionVecs->getTexture()->useTexture(uBLURVEC);
+
+ bool firstit = true;
+ for (int i = 0; i < 1; i++)
+ {
+
+ postRenderPingPong[!postRenderPP]->useBuffer();
+ glClear(GL_COLOR_BUFFER_BIT);
+ if (firstit)
+ {
+ lastScreen->getTexture()->useTexture(uCOLOR);
+ firstit = false;
+ }
+ else
+ postRenderPingPong[postRenderPP]->getTexture()->useTexture(uCOLOR);
+ Model::getPlaneModel()->drawModel(mat4(1.f));
+ postRenderPP = !postRenderPP;
+ }
+
+
+ lastScreen = postRenderPingPong[postRenderPP];
}
+
//Pointlights & their shadows
//for (auto i = pointlights.begin(); i != pointlights.end(); ++i)
//{
- // postRender->useBuffer();
+ // postRenderPingPong->useBuffer();
// glClear(GL_COLOR_BUFFER_BIT);
// Shader::getShader(SH_POINTLIGHT)->useShader();
// render->getTexture()->useTexture();
// drawSceneObjects(DRAW_Model, false);
- // postRender->useBuffer();
+ // postRenderPingPong->useBuffer();
// Shader::getShader(SH_POINTLIGHT)->useShader();
// //shadowdir->getTexture()->useTexture(uPLightXP + j);
// switch (j)
// drawSceneObjects();
// render->useBuffer();
- // //TODO copy the texture from postrender to render
+ // //TODO copy the texture from postRenderPingPong to render
// //render->getTexture()->
//}
-
- GLboolean horizontal = true, firstit = true;
if (Graphix::testEffect(EF_BLOOM))
{
/* DRAW BRIGHTNESS */
glViewport(0, 0, W_WIDTH / SMALL_F, W_HEIGHT / SMALL_F);
- postRenderSmall->useBuffer();
+ blurPingPong[!horizontal_blurPP]->useBuffer();
glClear(GL_COLOR_BUFFER_BIT);
//glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
- render->getTexture()->downscale(1);
+ lastScreen->getTexture()->downscale(1);
Shader::getShader(SH_FILTER_BRIGHT)->useShader();
Shader::getShader(SH_ACTIVE)->setUniformLocation("uFilterThreshold",1.2f);
- render->getTexture()->useTexture();
+ lastScreen->getTexture()->useTexture();
Model::getPlaneModel()->drawModel(mat4(1.f));
+ horizontal_blurPP = !horizontal_blurPP;
/* BLUR BRIGHTNESS */
Shader::getShader(SH_BLUR)->useShader();
for (int i = 0; i < 4; i++)
{
- blurPingPong[horizontal]->useBuffer();
+ blurPingPong[!horizontal_blurPP]->useBuffer();
glClear(GL_COLOR_BUFFER_BIT);
- Shader::getShader(SH_ACTIVE)->setUniformLocation("uHorizontal", horizontal);
- if (firstit)
- {
- postRenderSmall->getTexture()->useTexture();
- firstit = false;
- }
- else
- blurPingPong[!horizontal]->getTexture()->useTexture();
+
+ Shader::getShader(SH_ACTIVE)->setUniformLocation("uHorizontal", horizontal_blurPP);
+ blurPingPong[horizontal_blurPP]->getTexture()->useTexture();
Model::getPlaneModel()->drawModel(mat4(1.f));
- horizontal = !horizontal;
+ horizontal_blurPP = !horizontal_blurPP;
}
glViewport(0, 0, W_WIDTH, W_HEIGHT);
}
-
- /*DRAW BBOX WIRES*/
- if (Graphix::testEffect(EF_BLOOM))
- render->useBuffer();
- if (Events::isKToggleActive(SDLK_F6))
- {
- Shader::getShader(SH_BASIC)->useShader();
- drawSceneObjects(DRAW_Coll);
- }
-
-
- if (Graphix::testEffect(EF_BLOOM))
+ /* FINAL DRAW -> if needed*/
+ if (lastScreen != nullptr)
{
fBufferObject::clearBuffer();
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
- /* BLEND BRIGHTNESS TO ORIGINAL*/
- Shader::getShader(SH_BLEND)->useShader();
- render->getTexture(0)->useTexture(uCOLOR);
- blurPingPong[!horizontal]->getTexture()->useTexture(uBLEND);
-
-
-
- //Shader::getShader(SH_BASICTEXTURE)->useShader();
- //postRender->getTexture(1)->useTexture(uCOLOR);
- //SceneObjects.front()->gTexture()->useTexture();
- //blurPingPong[!horizontal]->getTexture()->useTexture();
- //postRenderSmall->getTexture()->useTexture();
-
+ if (Graphix::testEffect(EF_BLOOM))
+ {
+ /* BLEND BRIGHTNESS TO ORIGINAL*/
+ Shader::getShader(SH_BLEND)->useShader();
+ blurPingPong[horizontal_blurPP]->getTexture()->useTexture(uBLEND);
+ }
+ else
+ {
+ Shader::getShader(SH_BASICTEXTURE)->useShader();
+ }
+ lastScreen->getTexture()->useTexture(uCOLOR);
Model::getPlaneModel()->drawModel(mat4(1.f));
}
+ //Shader::getShader(SH_BASICTEXTURE)->useShader();
+ //SceneObjects.front()->gTexture()->useTexture();
+ //blurPingPong[horizontal_blurPP]->getTexture()->useTexture();
+ //postRenderPingPong[postRenderPP]->getTexture()->useTexture();
+ //shadowdir->getTexture()->useTexture();
+
}
void Scene::drawSceneObjects(drawTarget _target, bool _culling) const
}
render->updateSize(width, height);
- postRender->updateSize(width, height);
- postRenderSmall->updateSize(width / SMALL_F, height / SMALL_F);
+ motionVecs->updateSize(width, height);
for (int i = 0; i < 2; i++)
+ {
blurPingPong[i]->updateSize(width / SMALL_F, height / SMALL_F);
+ postRenderPingPong[i]->updateSize(width, height);
+ }
+
//shadowdir->updateSize(width, height);
}