using std::list;
using std::set;
+using std::stack;
#define TIME_TILL_MAX_MOVE 2
#define TIME_TILL_DIRECTION_ROTATE 1
#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;
}
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);
+ }
}