]> git.leopard-lacewing.eu Git - cgue_weave.git/commitdiff
rewinding time semi-functions
authorLockedLunatic <locked.lunatic@aon.at>
Wed, 27 May 2015 09:22:20 +0000 (11:22 +0200)
committerLockedLunatic <locked.lunatic@aon.at>
Wed, 27 May 2015 09:22:20 +0000 (11:22 +0200)
Weave/Events.cpp
Weave/Scene/Scene.cpp
Weave/Scene/Scene.h
Weave/Scene/SceneObject.cpp
Weave/Scene/SceneObject.h

index dae30aa5ca34027ffe36b7efc833121487ffd943..467b48f32160ef3ee996d8d2224ec167d4e1447a 100644 (file)
@@ -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))
index 3db42e3b23867f21bde2a40a9e4303a2d147c963..fd3e4f04fde293210aac05ca4211e6893d2e9841 100644 (file)
@@ -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);
+       }
 
 
 }
index 827e74a381abb356099bdc7b71980afcfd78fe2d..d84571cb10c93ebd043aa90935c1e5f6a19e0fe0 100644 (file)
@@ -7,6 +7,7 @@
 
 #include <list>
 #include <set>
+#include <stack>
 
 class SceneObject;
 class ViewPort;
@@ -41,4 +42,7 @@ protected:
 
        float move_delta;
 
+       float currenttime;
+       std::stack<mat4> PlayerModels;
+       //std::stack<vec3> PlayerDirections;
 };
index e0b99edfc43b36f9fac8b37fef00160b814bb44d..e8429399807ffc5b35175a3534ebb5c1ecd55c1e 100644 (file)
@@ -181,6 +181,9 @@ vec3 SceneObject::getPosition() const
        return vec3(modelMat[3]);
 }
 
+mat4 SceneObject::getModelMat(){
+       return modelMat;
+}
 
 void SceneObject::setModel(mat4& _modelMat){
        modelMat = _modelMat;
index 4cc765f5ff8993179f79b3dc4dadb77ec76667cf..7ee69a1eb82db4a45cd813d20ef0cf22c7b4db4e 100644 (file)
@@ -31,6 +31,7 @@ public:
 
        virtual vec3 getPosition() const;
 
+       virtual mat4 getModelMat();
        __declspec(deprecated)
        virtual void setModel(mat4&);
        __declspec(deprecated)