X-Git-Url: https://git.dogcows.com/gitweb?p=chaz%2Fyoink;a=blobdiff_plain;f=src%2Fmoof%2Fapplication.cc;h=e0b73b78d9ac053e7a5f8805a2431acc4c730235;hp=fd9ea451fba72ec20e50212be89719646408acfa;hb=574af38ed616d1adfa5e6ce35f67cda1f707f89d;hpb=d6990468d297a6cbee98e4d0d33ab37e1b2352c9 diff --git a/src/moof/application.cc b/src/moof/application.cc index fd9ea45..e0b73b7 100644 --- a/src/moof/application.cc +++ b/src/moof/application.cc @@ -1,15 +1,13 @@ -/*] 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 // exit, srand +#include // exit, srand #include #include @@ -26,8 +24,8 @@ namespace moof { application::application(settings& settings) : - next_update_(timer::ticks()), - total_time_(SCALAR(0.0)) + last_update_(timer::ticks()), + accum_(SCALAR(0.0)) { unsigned random_seed; if (settings.get("rngseed", random_seed)) srand(random_seed); @@ -42,12 +40,19 @@ application::application(settings& settings) : settings.get("framerate", framerate); framerate = SCALAR(1.0) / framerate; - update_timer_.init(boost::bind(&application::dispatch_update, this, _1, _2), - timestep_, timer::repeat, this); - draw_timer_.init(boost::bind(&application::dispatch_draw, this, _1, _2), - framerate, timer::repeat, this); -} + //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); + add_timer(draw_timer_); + + //timer::default_source().scale(SCALAR(0.2)); +} void application::dispatch_update(timer& timer, scalar t) { @@ -57,47 +62,66 @@ 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_CONSECUTIVE_UPDATES = 15; - const int MAX_FRAMESKIP = 15; + log_debug("updating", timer.expiration(), "/", t); + + scalar deltaTime = t - last_update_; + accum_ += deltaTime; int i = 0; - while (next_update_ < t && ++i < MAX_FRAMESKIP) + while (timestep_ <= accum_ && i < MAX_CONSECUTIVE_UPDATES) { - total_time_ += timestep_; - update(total_time_, timestep_); - - next_update_ += timestep_; + scalar dt = game_time_.step(); + update(game_time_.ticks(), dt); + accum_ -= timestep_; } + + last_update_ = t; } void application::dispatch_draw(timer& timer, scalar t) { - scalar alpha = (t + timestep_ - next_update_) * inverse_timestep_; - if (alpha < SCALAR(0.0)) log_error("UH OH!!!!! It's NEGATIVE", alpha); - if (alpha > SCALAR(1.0)) log_error("UH OH!!!!! It's POSITIVE", alpha); + log_debug("draw", timer.expiration(), "/", t); + + // XXX temporary + thread::main_runloop().run_once(); + + dispatch_update(timer, t); + + scalar alpha = accum_ * inverse_timestep_; + + //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); draw(alpha); - video::current()->swap(); + + scalar begin = timer::ticks(); + video::current()->swap(t); + scalar duration = timer::ticks() - begin; + log_debug("flip duration:", duration, begin, timer::ticks()); + + log_info("draw difference:", t - last_draw_); + last_draw_ = t; }