nuclear@6: /* nuclear@6: GoatKit - a themable/animated widget toolkit for games nuclear@6: Copyright (C) 2014 John Tsiombikas nuclear@6: nuclear@6: This program is free software: you can redistribute it and/or modify nuclear@6: it under the terms of the GNU Lesser General Public License as published by nuclear@6: the Free Software Foundation, either version 3 of the License, or nuclear@6: (at your option) any later version. nuclear@6: nuclear@6: This program is distributed in the hope that it will be useful, nuclear@6: but WITHOUT ANY WARRANTY; without even the implied warranty of nuclear@6: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the nuclear@6: GNU Lesser General Public License for more details. nuclear@6: nuclear@6: You should have received a copy of the GNU Lesser General Public License nuclear@6: along with this program. If not, see . nuclear@6: */ nuclear@6: #include "boolanm.h" nuclear@6: nuclear@6: static long default_get_msec(); nuclear@6: nuclear@6: BoolAnim::BoolAnim(bool st) nuclear@6: { nuclear@6: set(st); nuclear@6: trans_start = 0; nuclear@6: trans_dur = 500; nuclear@6: get_msec = default_get_msec; nuclear@6: } nuclear@6: nuclear@6: void BoolAnim::update(long tm) const nuclear@6: { nuclear@6: if(trans_dir == 0.0) return; nuclear@6: nuclear@6: float dt = (tm - trans_start) / 1000.0; nuclear@6: float t = dt / (trans_dur / 1000.0); nuclear@6: nuclear@6: if(trans_dir > 0.0) { nuclear@6: value = t; nuclear@6: } else { nuclear@6: value = 1.0 - t; nuclear@6: } nuclear@6: nuclear@6: if(value < 0.0) { nuclear@6: value = 0.0; nuclear@6: trans_dir = 0.0; nuclear@6: } else if(value > 1.0) { nuclear@6: value = 1.0; nuclear@6: trans_dir = 0.0; nuclear@6: } nuclear@6: } nuclear@6: nuclear@6: void BoolAnim::set_transition_duration(long dur) nuclear@6: { nuclear@6: trans_dur = dur; nuclear@6: } nuclear@6: nuclear@6: void BoolAnim::set_time_callback(long (*time_func)()) nuclear@6: { nuclear@6: get_msec = time_func; nuclear@6: } nuclear@6: nuclear@6: void BoolAnim::set(bool st) nuclear@6: { nuclear@6: value = st ? 1.0 : 0.0; nuclear@6: trans_dir = 0.0; nuclear@6: } nuclear@6: nuclear@6: void BoolAnim::change(bool st) nuclear@6: { nuclear@6: change(st, get_msec()); nuclear@6: } nuclear@6: nuclear@6: void BoolAnim::change(bool st, long tm) nuclear@6: { nuclear@6: trans_dir = st ? 1.0 : -1.0; nuclear@6: trans_start = tm; nuclear@6: } nuclear@6: nuclear@6: bool BoolAnim::get_state() const nuclear@6: { nuclear@6: return get_state(get_msec()); nuclear@6: } nuclear@6: nuclear@6: bool BoolAnim::get_state(long tm) const nuclear@6: { nuclear@6: update(tm); nuclear@6: nuclear@6: // if we're not in transition use the value (should be 0 or 1) nuclear@6: if(trans_dir == 0.0) { nuclear@6: return value > 0.5; nuclear@6: } nuclear@6: nuclear@6: // if we're in transition base it on the direction of the transition nuclear@6: return trans_dir > 0.0; nuclear@6: } nuclear@6: nuclear@6: float BoolAnim::get_value() const nuclear@6: { nuclear@6: return get_value(get_msec()); nuclear@6: } nuclear@6: nuclear@6: float BoolAnim::get_value(long tm) const nuclear@6: { nuclear@6: update(tm); nuclear@6: return value; nuclear@6: } nuclear@6: nuclear@6: float BoolAnim::get_dir() const nuclear@6: { nuclear@6: return get_dir(get_msec()); nuclear@6: } nuclear@6: nuclear@6: float BoolAnim::get_dir(long tm) const nuclear@6: { nuclear@6: update(tm); nuclear@6: return trans_dir; nuclear@6: } nuclear@6: nuclear@6: BoolAnim::operator bool() const nuclear@6: { nuclear@6: return get_state(); nuclear@6: } nuclear@6: nuclear@6: BoolAnim::operator float() const nuclear@6: { nuclear@6: return get_value(); nuclear@6: } nuclear@6: nuclear@6: #ifdef WIN32 nuclear@6: #include nuclear@6: nuclear@6: static long default_get_msec() nuclear@6: { nuclear@6: return GetTickCount(); nuclear@6: } nuclear@6: #else nuclear@6: #include nuclear@6: nuclear@6: static long default_get_msec() nuclear@6: { nuclear@6: static struct timeval tv0; nuclear@6: struct timeval tv; nuclear@6: nuclear@6: gettimeofday(&tv, 0); nuclear@6: if(tv0.tv_sec == 0 && tv0.tv_usec == 0) { nuclear@6: tv0 = tv; nuclear@6: return 0; nuclear@6: } nuclear@6: return (tv.tv_sec - tv0.tv_sec) * 1000 + (tv.tv_usec - tv0.tv_usec) / 1000; nuclear@6: } nuclear@6: #endif