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