nuclear@2: #include "boolanm.h" nuclear@2: nuclear@2: static long default_get_msec(); nuclear@2: nuclear@2: BoolAnim::BoolAnim(bool st) nuclear@2: { nuclear@3: set(st); nuclear@2: trans_start = 0; nuclear@3: trans_dur = 500; nuclear@2: get_msec = default_get_msec; nuclear@2: } nuclear@2: nuclear@2: void BoolAnim::update(long tm) const nuclear@2: { nuclear@2: if(trans_dir == 0.0) return; nuclear@2: nuclear@2: float dt = (tm - trans_start) / 1000.0; nuclear@2: float t = dt / (trans_dur / 1000.0); nuclear@2: nuclear@2: if(trans_dir > 0.0) { nuclear@2: value = t; nuclear@2: } else { nuclear@2: value = 1.0 - t; nuclear@2: } nuclear@2: nuclear@2: if(value < 0.0) { nuclear@2: value = 0.0; nuclear@2: trans_dir = 0.0; nuclear@2: } else if(value > 1.0) { nuclear@2: value = 1.0; nuclear@2: trans_dir = 0.0; nuclear@2: } nuclear@2: } nuclear@2: nuclear@2: void BoolAnim::set_transition_duration(long dur) nuclear@2: { nuclear@2: trans_dur = dur; nuclear@2: } nuclear@2: nuclear@2: void BoolAnim::set_time_callback(long (*time_func)()) nuclear@2: { nuclear@2: get_msec = time_func; nuclear@2: } nuclear@2: nuclear@3: void BoolAnim::set(bool st) nuclear@3: { nuclear@3: value = st ? 1.0 : 0.0; nuclear@3: trans_dir = 0.0; nuclear@3: } nuclear@3: nuclear@2: void BoolAnim::change(bool st) nuclear@2: { nuclear@2: change(st, get_msec()); nuclear@2: } nuclear@2: nuclear@2: void BoolAnim::change(bool st, long tm) nuclear@2: { nuclear@2: trans_dir = st ? 1.0 : -1.0; nuclear@2: trans_start = tm; nuclear@2: } nuclear@2: nuclear@2: bool BoolAnim::get_state() const nuclear@2: { nuclear@2: return get_state(get_msec()); nuclear@2: } nuclear@2: nuclear@2: bool BoolAnim::get_state(long tm) const nuclear@2: { nuclear@2: update(tm); nuclear@2: nuclear@2: // if we're not in transition use the value (should be 0 or 1) nuclear@2: if(trans_dir == 0.0) { nuclear@2: return value > 0.5; nuclear@2: } nuclear@2: nuclear@2: // if we're in transition base it on the direction of the transition nuclear@2: return trans_dir > 0.0; nuclear@2: } nuclear@2: nuclear@2: float BoolAnim::get_value() const nuclear@2: { nuclear@2: return get_value(get_msec()); nuclear@2: } nuclear@2: nuclear@2: float BoolAnim::get_value(long tm) const nuclear@2: { nuclear@2: update(tm); nuclear@2: return value; nuclear@2: } nuclear@2: nuclear@2: float BoolAnim::get_dir() const nuclear@2: { nuclear@2: return get_dir(get_msec()); nuclear@2: } nuclear@2: nuclear@2: float BoolAnim::get_dir(long tm) const nuclear@2: { nuclear@2: update(tm); nuclear@2: return trans_dir; nuclear@2: } nuclear@2: nuclear@2: BoolAnim::operator bool() const nuclear@2: { nuclear@2: return get_state(); nuclear@2: } nuclear@2: nuclear@2: BoolAnim::operator float() const nuclear@2: { nuclear@2: return get_value(); nuclear@2: } nuclear@2: nuclear@2: #ifdef WIN32 nuclear@2: #include nuclear@2: nuclear@2: static long default_get_msec() nuclear@2: { nuclear@2: return GetTickCount(); nuclear@2: } nuclear@2: #else nuclear@2: #include nuclear@2: nuclear@2: static long default_get_msec() nuclear@2: { nuclear@2: static struct timeval tv0; nuclear@2: struct timeval tv; nuclear@2: nuclear@2: gettimeofday(&tv, 0); nuclear@2: if(tv0.tv_sec == 0 && tv0.tv_usec == 0) { nuclear@2: tv0 = tv; nuclear@2: return 0; nuclear@2: } nuclear@2: return (tv.tv_sec - tv0.tv_sec) * 1000 + (tv.tv_usec - tv0.tv_usec) / 1000; nuclear@2: } nuclear@2: #endif