gameui
annotate src/boolanm.cc @ 2:e5b1525084f7
boolanim
author | John Tsiombikas <nuclear@member.fsf.org> |
---|---|
date | Thu, 20 Mar 2014 07:03:58 +0200 |
parents | |
children | f1014234dece |
rev | line source |
---|---|
nuclear@2 | 1 #include "boolanm.h" |
nuclear@2 | 2 |
nuclear@2 | 3 static long default_get_msec(); |
nuclear@2 | 4 |
nuclear@2 | 5 BoolAnim::BoolAnim(bool st) |
nuclear@2 | 6 { |
nuclear@2 | 7 value = st ? 1.0 : 0.0; |
nuclear@2 | 8 trans_dir = 0.0; |
nuclear@2 | 9 trans_start = 0; |
nuclear@2 | 10 trans_dur = 1000; |
nuclear@2 | 11 get_msec = default_get_msec; |
nuclear@2 | 12 } |
nuclear@2 | 13 |
nuclear@2 | 14 void BoolAnim::update(long tm) const |
nuclear@2 | 15 { |
nuclear@2 | 16 if(trans_dir == 0.0) return; |
nuclear@2 | 17 |
nuclear@2 | 18 float dt = (tm - trans_start) / 1000.0; |
nuclear@2 | 19 float t = dt / (trans_dur / 1000.0); |
nuclear@2 | 20 |
nuclear@2 | 21 if(trans_dir > 0.0) { |
nuclear@2 | 22 value = t; |
nuclear@2 | 23 } else { |
nuclear@2 | 24 value = 1.0 - t; |
nuclear@2 | 25 } |
nuclear@2 | 26 |
nuclear@2 | 27 if(value < 0.0) { |
nuclear@2 | 28 value = 0.0; |
nuclear@2 | 29 trans_dir = 0.0; |
nuclear@2 | 30 } else if(value > 1.0) { |
nuclear@2 | 31 value = 1.0; |
nuclear@2 | 32 trans_dir = 0.0; |
nuclear@2 | 33 } |
nuclear@2 | 34 } |
nuclear@2 | 35 |
nuclear@2 | 36 void BoolAnim::set_transition_duration(long dur) |
nuclear@2 | 37 { |
nuclear@2 | 38 trans_dur = dur; |
nuclear@2 | 39 } |
nuclear@2 | 40 |
nuclear@2 | 41 void BoolAnim::set_time_callback(long (*time_func)()) |
nuclear@2 | 42 { |
nuclear@2 | 43 get_msec = time_func; |
nuclear@2 | 44 } |
nuclear@2 | 45 |
nuclear@2 | 46 void BoolAnim::change(bool st) |
nuclear@2 | 47 { |
nuclear@2 | 48 change(st, get_msec()); |
nuclear@2 | 49 } |
nuclear@2 | 50 |
nuclear@2 | 51 void BoolAnim::change(bool st, long tm) |
nuclear@2 | 52 { |
nuclear@2 | 53 trans_dir = st ? 1.0 : -1.0; |
nuclear@2 | 54 trans_start = tm; |
nuclear@2 | 55 } |
nuclear@2 | 56 |
nuclear@2 | 57 bool BoolAnim::get_state() const |
nuclear@2 | 58 { |
nuclear@2 | 59 return get_state(get_msec()); |
nuclear@2 | 60 } |
nuclear@2 | 61 |
nuclear@2 | 62 bool BoolAnim::get_state(long tm) const |
nuclear@2 | 63 { |
nuclear@2 | 64 update(tm); |
nuclear@2 | 65 |
nuclear@2 | 66 // if we're not in transition use the value (should be 0 or 1) |
nuclear@2 | 67 if(trans_dir == 0.0) { |
nuclear@2 | 68 return value > 0.5; |
nuclear@2 | 69 } |
nuclear@2 | 70 |
nuclear@2 | 71 // if we're in transition base it on the direction of the transition |
nuclear@2 | 72 return trans_dir > 0.0; |
nuclear@2 | 73 } |
nuclear@2 | 74 |
nuclear@2 | 75 float BoolAnim::get_value() const |
nuclear@2 | 76 { |
nuclear@2 | 77 return get_value(get_msec()); |
nuclear@2 | 78 } |
nuclear@2 | 79 |
nuclear@2 | 80 float BoolAnim::get_value(long tm) const |
nuclear@2 | 81 { |
nuclear@2 | 82 update(tm); |
nuclear@2 | 83 return value; |
nuclear@2 | 84 } |
nuclear@2 | 85 |
nuclear@2 | 86 float BoolAnim::get_dir() const |
nuclear@2 | 87 { |
nuclear@2 | 88 return get_dir(get_msec()); |
nuclear@2 | 89 } |
nuclear@2 | 90 |
nuclear@2 | 91 float BoolAnim::get_dir(long tm) const |
nuclear@2 | 92 { |
nuclear@2 | 93 update(tm); |
nuclear@2 | 94 return trans_dir; |
nuclear@2 | 95 } |
nuclear@2 | 96 |
nuclear@2 | 97 BoolAnim::operator bool() const |
nuclear@2 | 98 { |
nuclear@2 | 99 return get_state(); |
nuclear@2 | 100 } |
nuclear@2 | 101 |
nuclear@2 | 102 BoolAnim::operator float() const |
nuclear@2 | 103 { |
nuclear@2 | 104 return get_value(); |
nuclear@2 | 105 } |
nuclear@2 | 106 |
nuclear@2 | 107 #ifdef WIN32 |
nuclear@2 | 108 #include <windows.h> |
nuclear@2 | 109 |
nuclear@2 | 110 static long default_get_msec() |
nuclear@2 | 111 { |
nuclear@2 | 112 return GetTickCount(); |
nuclear@2 | 113 } |
nuclear@2 | 114 #else |
nuclear@2 | 115 #include <sys/time.h> |
nuclear@2 | 116 |
nuclear@2 | 117 static long default_get_msec() |
nuclear@2 | 118 { |
nuclear@2 | 119 static struct timeval tv0; |
nuclear@2 | 120 struct timeval tv; |
nuclear@2 | 121 |
nuclear@2 | 122 gettimeofday(&tv, 0); |
nuclear@2 | 123 if(tv0.tv_sec == 0 && tv0.tv_usec == 0) { |
nuclear@2 | 124 tv0 = tv; |
nuclear@2 | 125 return 0; |
nuclear@2 | 126 } |
nuclear@2 | 127 return (tv.tv_sec - tv0.tv_sec) * 1000 + (tv.tv_usec - tv0.tv_usec) / 1000; |
nuclear@2 | 128 } |
nuclear@2 | 129 #endif |