/*] Copyright (c) 2009-2010, 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 #include #include "fastevents.h" #include "application.hh" #include "log.hh" #include "settings.hh" #include "timer.hh" #include "video.hh" namespace moof { application::application(settings& settings) : last_update_(timer::ticks()), total_time_(SCALAR(0.0)), accum_(SCALAR(0.0)) { unsigned random_seed; if (settings.get("rngseed", random_seed)) srand(random_seed); else srand(time(0)); scalar timestep = SCALAR(80.0); settings.get("timestep", timestep); timestep_ = SCALAR(1.0) / timestep; inverse_timestep_ = timestep; scalar framerate = SCALAR(40.0); 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(); draw_timer_.init(boost::bind(&application::dispatch_draw, this, _1, _2), framerate, timer::repeat); add_timer(draw_timer_); } void application::dispatch_update(timer& timer, scalar t) { event event; while (FE_PollEvent(&event) == 1) { 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; } handle_event(event); } //const int MAX_FRAMESKIP = 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_) { log_debug("UPDATING"); update(total_time_, timestep_); total_time_ += timestep_; accum_ -= timestep_; } last_update_ = t; } void application::dispatch_draw(timer& timer, scalar t) { log_debug("next update", update_timer_.expiration()); log_debug("draw", timer.expiration(), "/", t); 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)); 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); scalar begin = timer::ticks(); video::current()->swap(t); scalar duration = timer::ticks() - begin; log_debug("flip duration:", duration); } } // namespace moof