break;
case SDLK_F2:
//FPS
+ if (key_toggle[SDLK_F2])
+ Graphix::disableEffects(EF_FPS_OBJ);
+ else
+ Graphix::enableEffects(EF_FPS_OBJ);
message("FPS", !key_toggle[SDLK_F2]);
break;
case SDLK_F3:
#include "SDL2\SDL.h"
#include "Average.h"
-#define DELTA_CAP 100
+#define DELTA_CAP 50
/*
Übernimmt die FPS berechnungen
{\r
active = this;\r
\r
- Fps fps(0.3f);\r
int sleep_time=0;\r
float message_time=0;\r
int framecount = 0;\r
current_world->bindShader();\r
\r
while (!Events::halt){\r
- fps.step();\r
+ Graphix::fps.step();\r
\r
#ifdef FRAMERATE_FIX\r
- sleep_time += (int)(1000./ FRAMERATE_FIX - fps.getTicks());\r
+ sleep_time += (int)(1000./ FRAMERATE_FIX - Graphix::fps.getTicks());\r
\r
if (sleep_time < 0)\r
sleep_time = 0;\r
\r
Sleep(sleep_time);\r
#endif\r
- if (Events::isKToggleActive(SDLK_F2))\r
- {\r
- ++framecount;\r
- message_time += fps.getDelta();\r
- if (message_time >= 0.5)\r
- {\r
- Graphix::updateFPS((float)framecount / message_time);\r
- //Message::info((string)"Fps: " + std::to_string((float)framecount/message_time));\r
- message_time = 0;\r
- framecount = 0;\r
- }\r
-\r
- }\r
- else\r
- Graphix::updateFPS(-1);\r
-\r
-\r
\r
Events::processEvents();\r
//Message::info(std::to_string(fps.getDelta()));\r
- update(fps.getCappedDelta());\r
+ update(Graphix::fps.getCappedDelta());\r
\r
Graphix::clear();\r
\r
#define MOTION_BLUR_COEFF 0.99f\r
#define MOTION_BLUR_INTENS 0.99f\r
\r
+float fps_time = 99;\r
+float fps_current;\r
+\r
void Graphix::setWindowSize(unsigned int _width, unsigned int _height)\r
{\r
width = _width;\r
\r
string out = windowTitle;\r
\r
- if (fps > 0)\r
- out += "(FPS:" + std::to_string(fps) + ")";\r
- if (obj >= 0)\r
- out += "(NumObj:" + std::to_string(obj) + ")";\r
+ if (testEffect(EF_FPS_OBJ))\r
+ {\r
+ if (fps_time > .5f)\r
+ {\r
+ fps_current = fps.getAvFPS();\r
+ fps_time = 0;\r
+ }\r
+ fps_time += fps.getDelta();\r
+\r
+ out += "(FPS:" + std::to_string((int)fps_current) + ")";\r
+ if (obj >= 0)\r
+ out += "(NumObj:" + std::to_string(obj) + ")";\r
+ }\r
+ \r
SDL_SetWindowTitle(sdl_window, out.c_str());\r
}\r
\r
return error;\r
}\r
\r
-void Graphix::updateFPS(float _fps)\r
-{\r
- fps = _fps;\r
-}\r
-\r
void Graphix::updateNumObjects(int _obj)\r
{\r
obj = _obj;\r
short Graphix::effects = EF_TRANSPARENCY | EF_BLOOM | EF_FRUSTUM_CULLING;\r
\r
int Graphix::obj = -1;\r
-float Graphix::fps = -1;\r
+Fps Graphix::fps(0.3f);\r
#include <GL\glew.h>
#include <string>
+#include "../Fps.h"
#define BIT(x) (1<<(x))
EF_TRANSPARENCY = BIT(2),
EF_BLOOM = BIT(3),
EF_FRUSTUM_CULLING = BIT(4),
- EF_MOTION_BLUR = BIT(5)
+ EF_MOTION_BLUR = BIT(5),
+ EF_FPS_OBJ = BIT(6)
};
class Graphix
static unsigned int getWindowHeight();
static unsigned int getWindowWidth();
- static void updateFPS(float fps);
static void updateNumObjects(int obj);
static void FullScreen(bool enable, bool keepDesktopResolution = true);
static unsigned int getGlError();
+ static Fps fps;
+
private:
static void updateEffects();
static short effects;
static int obj;
- static float fps;
-
};
void Scene::update(float deltaT)
{
+ /* Save Old Mat's*/
+ if (Graphix::testEffect(EF_MOTION_BLUR)) {
+ camera.saveProjView();
+ for (auto i = SceneObjects.begin(); i != SceneObjects.end(); ++i)
+ {
+ (*i)->saveModelMat();
+ }
+ }
+
// XYAchse um den Player
//float rotatex = 0.002f*Events::getViewX();
//float rotatey = 0.001f*Events::getViewY();
}
-
//Directional Light Shadow
glCullFace(GL_FRONT);
glEnable(GL_POLYGON_OFFSET_FILL);
glCullFace(GL_BACK);
glDisable(GL_POLYGON_OFFSET_FILL);
+
+ /* Prepere DRAW SCENE */
camera.useCamera();
render->useBuffer();
dirLight->updateDirLightView();
fBufferObject::clearBuffer();
}
- /*DRAW SCENE*/
+ /*DRAW SCENE -> SkyBox*/
Shader::getShader(SH_BASICTEXTURE)->useShader();
SkyBox.draw();
//Shader::getShader(SH_BASICTEXTURE)->useShader();
//Shader::getShader(SH_BASICTEXTURE)->setUniformLocation("uFar", false);
- Shader::getShader(SH_LIGHTING)->useShader();
- drawSceneObjects();
+ Shader::getShader(SH_LIGHTING)->useShader();
+ /* MOTION BLUR */
+ if (Graphix::testEffect(EF_MOTION_BLUR))
+ {
+ camera.useOldProjView();
+ Shader::getShader(SH_ACTIVE)->setUniformLocation("uDelta",Graphix::fps.getCappedDelta());
+ //upload deltaT
+ drawSceneObjects(DRAW_ModelMotionBlur);
+ }
+ else
+ {
+ drawSceneObjects();
+ }
+
//Pointlights & their shadows
//for (auto i = pointlights.begin(); i != pointlights.end(); ++i)
//{
out vec3 PointLightPosition1, DirectionalLightDirection1;
+out mat4 new2old;
+
//out vec3 fPosition;
out vec4 DirLightSpacePos;
uniform mat4 uProjection, uView, uModel=mat4(1.f);
uniform mat4 dirLightProj, dirLightView;
+uniform mat4 uOldProjView, uInvProjView, uCur2OldModel;
+
uniform int uEnableBloom = 1;
uniform int uEnableTransp = 1;
void main()
{
+ new2old = uOldProjView * uCur2OldModel * uInvProjView;
+
PointLightPosition1 = (uView * vec4(0.0f, 1.0f, 0.0f, 1.f)).xyz;
DirectionalLightDirection1 = normalize((uView * vec4(DirectionalLightDirection, 0.0f)).xyz);
in vec3 PointLightPosition1, DirectionalLightDirection1;
+in mat4 new2old;
+
//in vec3 fPosition;
in vec4 DirLightSpacePos;
uniform vec3 dirLightColor;
uniform vec3 AmbientLightColor;
+uniform float uDelta;
+
float DirLightCalcShadowFactor(vec4 LightSpacePos)
{
vec3 pos = LightSpacePos.xyz / LightSpacePos.w;