From dea2a8ca33942be2169f5f95ac47d861922a9239 Mon Sep 17 00:00:00 2001 From: LockedLunatic Date: Wed, 27 May 2015 11:22:20 +0200 Subject: [PATCH] rewinding time semi-functions --- Weave/Events.cpp | 2 +- Weave/Scene/Scene.cpp | 137 ++++++++++++++++++++++-------------- Weave/Scene/Scene.h | 4 ++ Weave/Scene/SceneObject.cpp | 3 + Weave/Scene/SceneObject.h | 1 + 5 files changed, 94 insertions(+), 53 deletions(-) diff --git a/Weave/Events.cpp b/Weave/Events.cpp index dae30aa..467b48f 100644 --- a/Weave/Events.cpp +++ b/Weave/Events.cpp @@ -43,7 +43,7 @@ void Events::processEvents() case SDL_KEYDOWN: if (sdl_event.key.keysym.sym == SDLK_ESCAPE) { - //quit = true; //TODO nicht gleich alles beenden bei Escape + //quit = true; halt = true; } if (!isKHeld(sdl_event.key.keysym.sym)) diff --git a/Weave/Scene/Scene.cpp b/Weave/Scene/Scene.cpp index 3db42e3..fd3e4f0 100644 --- a/Weave/Scene/Scene.cpp +++ b/Weave/Scene/Scene.cpp @@ -18,6 +18,7 @@ using std::list; using std::set; +using std::stack; #define TIME_TILL_MAX_MOVE 2 #define TIME_TILL_DIRECTION_ROTATE 1 @@ -25,13 +26,15 @@ using std::set; #define SPEED_MOVE_NORMAL 1.5f #define MOVE_FASTER 2.5f +#define timestep 0.01f + Scene::Scene(unsigned int x, unsigned int y, unsigned int width, unsigned int height, float fovy, float zNear, float zFar, vec3 pos, SceneObject* _lookat) : viewPort(x, y, width, height, fovy, zNear, zFar), lookat(_lookat), move_delta(0) { - + currenttime = 0; } @@ -64,74 +67,104 @@ void Scene::update(float deltaT) pos = lookat->getPosition(); } - int move_x = Events::getMoveX(); - int move_y = Events::getMoveY(); - //int shoot = Events::getAction1(); - //int reset = Events::getAction2(); - // XYAchse um den Player viewPort.rotateView(0.002f*Events::getViewX(), 0.001f*Events::getViewY()); - //Jump - if (Events::getJump() && lookat->floorBound()) - lookat->ySpeed += 5.5; - //else if (!Events::isKHeld(SDLK_SPACE) && lookat->ySpeed>0) - // lookat->ySpeed = 0; - - // MOVE Player - if (move_x) - lookat->move(SPEED_MOVE_NORMAL *move_x * deltaT * viewPort.rotateDirection(vec3(-1.f, 0.f, 0.f))); - - if (move_y){ - if (move_y > 0){ - if (move_delta < TIME_TILL_MAX_MOVE) - move_delta += deltaT; - if (move_delta > TIME_TILL_MAX_MOVE) - move_delta = TIME_TILL_MAX_MOVE; - lookat->move(SPEED_MOVE_NORMAL * (MOVE_FASTER * move_delta / TIME_TILL_MAX_MOVE + 1) *move_y * deltaT * viewPort.rotateDirection(vec3(0.f, 0.f, -1.f))); + + if (!Events::getTimeShift()) + { + if (ceil((currenttime + deltaT) / timestep) > ceil(currenttime / timestep)) + { + PlayerModels.push(lookat->getModelMat()); + } + currenttime += deltaT; + + + + int move_x = Events::getMoveX(); + int move_y = Events::getMoveY(); + //int shoot = Events::getAction1(); + //int reset = Events::getAction2(); + + //Jump + if (Events::getJump() && lookat->floorBound()) + lookat->ySpeed += 5.5; + //else if (!Events::isKHeld(SDLK_SPACE) && lookat->ySpeed>0) + // lookat->ySpeed = 0; + + // MOVE Player + if (move_x) + lookat->move(SPEED_MOVE_NORMAL *move_x * deltaT * viewPort.rotateDirection(vec3(-1.f, 0.f, 0.f))); + + if (move_y){ + if (move_y > 0){ + if (move_delta < TIME_TILL_MAX_MOVE) + move_delta += deltaT; + if (move_delta > TIME_TILL_MAX_MOVE) + move_delta = TIME_TILL_MAX_MOVE; + lookat->move(SPEED_MOVE_NORMAL * (MOVE_FASTER * move_delta / TIME_TILL_MAX_MOVE + 1) *move_y * deltaT * viewPort.rotateDirection(vec3(0.f, 0.f, -1.f))); + } + else + lookat->move(SPEED_MOVE_NORMAL *move_y * deltaT * viewPort.rotateDirection(vec3(0.f, 0.f, -1.f))); } else - lookat->move(SPEED_MOVE_NORMAL *move_y * deltaT * viewPort.rotateDirection(vec3(0.f, 0.f, -1.f))); - } - else - { - move_delta = 0; - } + { + move_delta = 0; + } - //Rotate Play in move direction + //Rotate Play in move direction - if (move_x || move_y) - lookat->turnTo(viewPort.rotateDirection(vec3(0.f, 0.f, -1.f)), 3 * deltaT / TIME_TILL_DIRECTION_ROTATE); + if (move_x || move_y) + lookat->turnTo(viewPort.rotateDirection(vec3(0.f, 0.f, -1.f)), 3 * deltaT / TIME_TILL_DIRECTION_ROTATE); - //// Zoom auf Player - //if (Events::getViewZ()) - //{ - //// float dist = 0; - //// if (lookat!=NULL) - //// dist = VektorAbs(getViewerPos() - lookat->getPosition()); - //// if (true) - // view = translate( vec3(0.f,0.f,(float)(5*deltaT *sign(Events::getViewZ()))))*view; - // //view = view*scale(vec3((float)(1 + deltaT * sign(Events::getViewZ())))); - //} + //// Zoom auf Player + //if (Events::getViewZ()) + //{ + //// float dist = 0; + //// if (lookat!=NULL) + //// dist = VektorAbs(getViewerPos() - lookat->getPosition()); + //// if (true) + // view = translate( vec3(0.f,0.f,(float)(5*deltaT *sign(Events::getViewZ()))))*view; + // //view = view*scale(vec3((float)(1 + deltaT * sign(Events::getViewZ())))); + //} - // Alle Objekte der Scene aktualisieren - for (auto i = SceneObjects.begin(); i != SceneObjects.end(); ++i) - { - (*i)->update(deltaT); - } + // Alle Objekte der Scene aktualisieren + for (auto i = SceneObjects.begin(); i != SceneObjects.end(); ++i) + { + (*i)->update(deltaT); + } - for (auto i = SceneObjects.begin(); i != SceneObjects.end(); ++i) - { - auto j = i; - for (j++; j != SceneObjects.end(); ++j) + for (auto i = SceneObjects.begin(); i != SceneObjects.end(); ++i) { - SceneObject::checkCollision(*i, *j); + auto j = i; + for (j++; j != SceneObjects.end(); ++j) + { + SceneObject::checkCollision(*i, *j); + } } + } + else + { + if (ceil(max(0.0f, currenttime - deltaT) / timestep) < ceil(currenttime / timestep)) + { + mat4& tmp = PlayerModels.top(); + PlayerModels.pop(); + lookat->setModel(tmp); + } + + //for (auto i = SceneObjects.begin(); i != SceneObjects.end(); ++i) + //{ + // (*i)->update(-deltaT); + //} + //TODO revert events + //TODO go from keyframe to current time + currenttime = max(0.0f, currenttime - deltaT); + } } diff --git a/Weave/Scene/Scene.h b/Weave/Scene/Scene.h index 827e74a..d84571c 100644 --- a/Weave/Scene/Scene.h +++ b/Weave/Scene/Scene.h @@ -7,6 +7,7 @@ #include #include +#include class SceneObject; class ViewPort; @@ -41,4 +42,7 @@ protected: float move_delta; + float currenttime; + std::stack PlayerModels; + //std::stack PlayerDirections; }; diff --git a/Weave/Scene/SceneObject.cpp b/Weave/Scene/SceneObject.cpp index e0b99ed..e842939 100644 --- a/Weave/Scene/SceneObject.cpp +++ b/Weave/Scene/SceneObject.cpp @@ -181,6 +181,9 @@ vec3 SceneObject::getPosition() const return vec3(modelMat[3]); } +mat4 SceneObject::getModelMat(){ + return modelMat; +} void SceneObject::setModel(mat4& _modelMat){ modelMat = _modelMat; diff --git a/Weave/Scene/SceneObject.h b/Weave/Scene/SceneObject.h index 4cc765f..7ee69a1 100644 --- a/Weave/Scene/SceneObject.h +++ b/Weave/Scene/SceneObject.h @@ -31,6 +31,7 @@ public: virtual vec3 getPosition() const; + virtual mat4 getModelMat(); __declspec(deprecated) virtual void setModel(mat4&); __declspec(deprecated) -- 2.47.3