double SingleTweener::DoUpdate( double dt ) { const double t( std::min(duration_ - date_, dt) ); const double result = dt - t; date_ += t; const double val( GetValue() ); update_callback_(val); return result; }
void discobreak::Lwindow::Run() { XMapWindow(display_->xdisplay_, win_); x11_fd_ = ConnectionNumber(display_->xdisplay_); gettimeofday(&t1_, NULL); glXMakeCurrent(display_->xdisplay_, win_, graphics_->gg_->glc_); Atom wmDeleteMessage = XInternAtom(display_->xdisplay_, "WM_DELETE_WINDOW", False); XSetWMProtocols(display_->xdisplay_, win_, &wmDeleteMessage, 1); bool running = true; while (running) { // Create a File Description Set containing x11_fd FD_ZERO(&in_fds_); FD_SET(x11_fd_, &in_fds_); // Set our timer. One second sounds good. tv_.tv_usec = 16660; tv_.tv_sec = 0; // Wait for X Event or a Timer if (select(x11_fd_+1, &in_fds_, 0, 0, &tv_)) { if(XPending(display_->xdisplay_)) XNextEvent(display_->xdisplay_, &xev_); if (xev_.xclient.data.l[0] == static_cast<long>(wmDeleteMessage)) { running = false; } else if (xev_.type == KeyPress || xev_.type == KeyRelease) { Input::SetKeyState((char)XLookupKeysym(&xev_.xkey, xev_.xkey.state), xev_.type == KeyPress); //printf("%i\n", (int)XLookupKeysym(&xev_.xkey, xev_.xkey.state)); } else if(xev_.type == DestroyNotify) running = false; xev_ = XEvent(); } else { // Handle timer here XGetWindowAttributes(display_->xdisplay_, win_, &gwa_); glViewport(0, 0, gwa_.width, gwa_.height); gettimeofday(&t2_, NULL); elapsedTime_ = (t2_.tv_sec - t1_.tv_sec) * 1000.0; // sec to ms elapsedTime_ += (t2_.tv_usec - t1_.tv_usec) / 1000.0; // us to ms if(update_callback_) update_callback_(elapsedTime_); if(draw_callback_) draw_callback_(elapsedTime_); Input::PostUpdate(); gettimeofday(&t1_, NULL); glXSwapBuffers(display_->xdisplay_, win_); } } return; }
void mixable::updated() const { if (update_callback_) { update_callback_(); } }