From 91d3a0352088611d3b78d3344b7a2bf2d4955a0a Mon Sep 17 00:00:00 2001 From: Stijn Buys Date: Tue, 6 May 2008 21:07:11 +0000 Subject: client-side frame interpolation: frames and timers --- src/core/gameinterface.cc | 48 ++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 47 insertions(+), 1 deletion(-) (limited to 'src/core/gameinterface.cc') diff --git a/src/core/gameinterface.cc b/src/core/gameinterface.cc index 5789592..8d351a0 100644 --- a/src/core/gameinterface.cc +++ b/src/core/gameinterface.cc @@ -91,7 +91,53 @@ void GameInterface::clear() // remove all models model::Model::clear(); + + game_previousframetime = 0; + game_serverframetime = 0; + game_clientframetime = 0; + game_timestep = 0; + game_frames = 0; } +void GameInterface::reset_clientstate(float servertime) +{ + game_timestep = (servertime - game_serverframetime); + + if (game_timestep < 0) + game_timestep = 0; + + game_previousframetime = game_serverframetime; + game_serverframetime = servertime; + game_clientframetime = game_previousframetime; + + std::map::iterator it; + for (it=core::Entity::registry.begin(); it != core::Entity::registry.end(); it++) { + + core::Entity *entity = (*it).second; + + if (entity->state() && !(entity->flags() & Entity::Static)) + entity->state()->assign(entity); + } + + game_frames = 0; +} -} // namespace core +void GameInterface::update_clientstate() +{ + game_frames++; + game_clientframetime += game_timestep; + + if (game_clientframetime > game_serverframetime) + game_clientframetime = game_serverframetime; +} + +float GameInterface::timeoffset() { + float d = game_serverframetime - game_previousframetime; + if (d < 0) + d = 1; + float t = game_serverframetime - game_clientframetime; + + return t/d; +} + +} -- cgit v1.2.3