-/*] Copyright (c) 2009-2010, Charles McGarvey [**************************
+/*] Copyright (c) 2009-2011, Charles McGarvey [*****************************
**] All rights reserved.
*
-* vi:ts=4 sw=4 tw=75
-*
* Distributable under the terms and conditions of the 2-clause BSD license;
* see the file COPYING for a complete text of the license.
*
-**************************************************************************/
+*****************************************************************************/
-#include <cstdlib> // exit, srand
-#include <boost/noncopyable.hpp>
+#include <cstdlib> // exit, srand
#include <SDL/SDL.h>
-#include "fastevents.h"
#include "application.hh"
+#include "fastevents.h"
#include "log.hh"
#include "settings.hh"
-#include "timer.hh"
#include "video.hh"
application::application(settings& settings) :
last_update_(timer::ticks()),
- total_time_(SCALAR(0.0)),
accum_(SCALAR(0.0))
{
unsigned random_seed;
settings.get("framerate", framerate);
framerate = SCALAR(1.0) / framerate;
- //timer::default_source().scale(SCALAR(1.2));
-
- //update_timer_.init(boost::bind(&application::dispatch_update, this, _1, _2),
- //timestep_, timer::repeat, this);
- next_update_ = update_timer_.expiration();
+ //update_timer_.init(boost::bind(&application::dispatch_update,
+ //this, _1, _2), timestep_, timer::repeat);
+ //add_timer(update_timer_);
+
+ game_time_.reset(timestep_);
+ //game_time_.scale(SCALAR(0.5));
- draw_timer_.init(boost::bind(&application::dispatch_draw, this, _1, _2),
- framerate, timer::repeat);
+ draw_timer_.init(boost::bind(&application::dispatch_draw,
+ this, _1, _2), framerate, timer::repeat);
add_timer(draw_timer_);
-}
+ //timer::default_source().scale(SCALAR(0.2));
+}
void application::dispatch_update(timer& timer, scalar t)
{
{
switch (event.type)
{
- case SDL_KEYDOWN:
-
- if (event.key.keysym.sym == SDLK_ESCAPE &&
- (SDL_GetModState() & KMOD_CTRL) )
- {
- // emergency escape
- log_warning("escape forced");
- exit(1);
- }
- break;
-
- case SDL_VIDEORESIZE:
-
- video::current()->resize(event.resize.w, event.resize.h);
- break;
+ case SDL_KEYDOWN:
+ if (event.key.keysym.sym == SDLK_ESCAPE &&
+ (SDL_GetModState() & KMOD_CTRL))
+ {
+ log_warning("escape forced");
+ exit(1);
+ }
+ break;
+
+ case SDL_VIDEORESIZE:
+ video::current()->resize(event.resize.w,
+ event.resize.h);
+ break;
}
-
handle_event(event);
}
-
- //const int MAX_FRAMESKIP = 15;
+ const int MAX_CONSECUTIVE_UPDATES = 15;
log_debug("updating", timer.expiration(), "/", t);
- //int i = 0;
- //while (next_update_ < t && ++i < MAX_FRAMESKIP)
- //{
- //total_time_ += timestep_;
- //update(total_time_, timestep_);
-
- //next_update_ += timestep_;
- //log_debug("updated", next_update_, "time:", timer::ticks());
- //}
-
scalar deltaTime = t - last_update_;
accum_ += deltaTime;
- while (timestep_ <= accum_)
+ int i = 0;
+ while (timestep_ <= accum_ && i < MAX_CONSECUTIVE_UPDATES)
{
- log_debug("UPDATING");
- update(total_time_, timestep_);
- total_time_ += timestep_;
+ scalar dt = game_time_.step();
+ update(game_time_.ticks(), dt);
accum_ -= timestep_;
}
void application::dispatch_draw(timer& timer, scalar t)
{
- log_debug("next update", update_timer_.expiration());
log_debug("draw", timer.expiration(), "/", t);
+ // XXX temporary
+ thread::main_runloop().run_once();
+
dispatch_update(timer, t);
- //if (t < next_update_ - timestep_) return;
- //scalar alpha = (t + timestep_ - next_update_) * inverse_timestep_;
- //scalar alpha = (t + timestep_ - update_timer_.expiration()) * inverse_timestep_;
- //scalar alpha = (next_update_ - t) * inverse_timestep_;
scalar alpha = accum_ * inverse_timestep_;
- //if (alpha < SCALAR(0.0) || SCALAR(1.0) < alpha) return;
- alpha = cml::clamp(alpha, SCALAR(-1.0), SCALAR(2.0));
+ //alpha = cml::clamp(alpha, SCALAR(-1.0), SCALAR(2.0));
if (alpha < SCALAR(0.0)) log_warning("alpha:", alpha);
else if (alpha > SCALAR(1.0)) log_warning("alpha:", alpha);
else log_debug("alpha:", alpha);
scalar begin = timer::ticks();
video::current()->swap(t);
-
scalar duration = timer::ticks() - begin;
- log_debug("flip duration:", duration);
+ log_debug("flip duration:", duration, begin, timer::ticks());
+
+ log_info("draw difference:", t - last_draw_);
+ last_draw_ = t;
}