istereo2
annotate libs/goatkit/boolanm.cc @ 6:3bccfc7d10fe
goatkit is drawing
author | John Tsiombikas <nuclear@member.fsf.org> |
---|---|
date | Wed, 23 Sep 2015 05:44:58 +0300 |
parents | |
children | 018f997dc646 |
rev | line source |
---|---|
nuclear@6 | 1 /* |
nuclear@6 | 2 GoatKit - a themable/animated widget toolkit for games |
nuclear@6 | 3 Copyright (C) 2014 John Tsiombikas <nuclear@member.fsf.org> |
nuclear@6 | 4 |
nuclear@6 | 5 This program is free software: you can redistribute it and/or modify |
nuclear@6 | 6 it under the terms of the GNU Lesser General Public License as published by |
nuclear@6 | 7 the Free Software Foundation, either version 3 of the License, or |
nuclear@6 | 8 (at your option) any later version. |
nuclear@6 | 9 |
nuclear@6 | 10 This program is distributed in the hope that it will be useful, |
nuclear@6 | 11 but WITHOUT ANY WARRANTY; without even the implied warranty of |
nuclear@6 | 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
nuclear@6 | 13 GNU Lesser General Public License for more details. |
nuclear@6 | 14 |
nuclear@6 | 15 You should have received a copy of the GNU Lesser General Public License |
nuclear@6 | 16 along with this program. If not, see <http://www.gnu.org/licenses/>. |
nuclear@6 | 17 */ |
nuclear@6 | 18 #include "boolanm.h" |
nuclear@6 | 19 |
nuclear@6 | 20 static long default_get_msec(); |
nuclear@6 | 21 |
nuclear@6 | 22 BoolAnim::BoolAnim(bool st) |
nuclear@6 | 23 { |
nuclear@6 | 24 set(st); |
nuclear@6 | 25 trans_start = 0; |
nuclear@6 | 26 trans_dur = 500; |
nuclear@6 | 27 get_msec = default_get_msec; |
nuclear@6 | 28 } |
nuclear@6 | 29 |
nuclear@6 | 30 void BoolAnim::update(long tm) const |
nuclear@6 | 31 { |
nuclear@6 | 32 if(trans_dir == 0.0) return; |
nuclear@6 | 33 |
nuclear@6 | 34 float dt = (tm - trans_start) / 1000.0; |
nuclear@6 | 35 float t = dt / (trans_dur / 1000.0); |
nuclear@6 | 36 |
nuclear@6 | 37 if(trans_dir > 0.0) { |
nuclear@6 | 38 value = t; |
nuclear@6 | 39 } else { |
nuclear@6 | 40 value = 1.0 - t; |
nuclear@6 | 41 } |
nuclear@6 | 42 |
nuclear@6 | 43 if(value < 0.0) { |
nuclear@6 | 44 value = 0.0; |
nuclear@6 | 45 trans_dir = 0.0; |
nuclear@6 | 46 } else if(value > 1.0) { |
nuclear@6 | 47 value = 1.0; |
nuclear@6 | 48 trans_dir = 0.0; |
nuclear@6 | 49 } |
nuclear@6 | 50 } |
nuclear@6 | 51 |
nuclear@6 | 52 void BoolAnim::set_transition_duration(long dur) |
nuclear@6 | 53 { |
nuclear@6 | 54 trans_dur = dur; |
nuclear@6 | 55 } |
nuclear@6 | 56 |
nuclear@6 | 57 void BoolAnim::set_time_callback(long (*time_func)()) |
nuclear@6 | 58 { |
nuclear@6 | 59 get_msec = time_func; |
nuclear@6 | 60 } |
nuclear@6 | 61 |
nuclear@6 | 62 void BoolAnim::set(bool st) |
nuclear@6 | 63 { |
nuclear@6 | 64 value = st ? 1.0 : 0.0; |
nuclear@6 | 65 trans_dir = 0.0; |
nuclear@6 | 66 } |
nuclear@6 | 67 |
nuclear@6 | 68 void BoolAnim::change(bool st) |
nuclear@6 | 69 { |
nuclear@6 | 70 change(st, get_msec()); |
nuclear@6 | 71 } |
nuclear@6 | 72 |
nuclear@6 | 73 void BoolAnim::change(bool st, long tm) |
nuclear@6 | 74 { |
nuclear@6 | 75 trans_dir = st ? 1.0 : -1.0; |
nuclear@6 | 76 trans_start = tm; |
nuclear@6 | 77 } |
nuclear@6 | 78 |
nuclear@6 | 79 bool BoolAnim::get_state() const |
nuclear@6 | 80 { |
nuclear@6 | 81 return get_state(get_msec()); |
nuclear@6 | 82 } |
nuclear@6 | 83 |
nuclear@6 | 84 bool BoolAnim::get_state(long tm) const |
nuclear@6 | 85 { |
nuclear@6 | 86 update(tm); |
nuclear@6 | 87 |
nuclear@6 | 88 // if we're not in transition use the value (should be 0 or 1) |
nuclear@6 | 89 if(trans_dir == 0.0) { |
nuclear@6 | 90 return value > 0.5; |
nuclear@6 | 91 } |
nuclear@6 | 92 |
nuclear@6 | 93 // if we're in transition base it on the direction of the transition |
nuclear@6 | 94 return trans_dir > 0.0; |
nuclear@6 | 95 } |
nuclear@6 | 96 |
nuclear@6 | 97 float BoolAnim::get_value() const |
nuclear@6 | 98 { |
nuclear@6 | 99 return get_value(get_msec()); |
nuclear@6 | 100 } |
nuclear@6 | 101 |
nuclear@6 | 102 float BoolAnim::get_value(long tm) const |
nuclear@6 | 103 { |
nuclear@6 | 104 update(tm); |
nuclear@6 | 105 return value; |
nuclear@6 | 106 } |
nuclear@6 | 107 |
nuclear@6 | 108 float BoolAnim::get_dir() const |
nuclear@6 | 109 { |
nuclear@6 | 110 return get_dir(get_msec()); |
nuclear@6 | 111 } |
nuclear@6 | 112 |
nuclear@6 | 113 float BoolAnim::get_dir(long tm) const |
nuclear@6 | 114 { |
nuclear@6 | 115 update(tm); |
nuclear@6 | 116 return trans_dir; |
nuclear@6 | 117 } |
nuclear@6 | 118 |
nuclear@6 | 119 BoolAnim::operator bool() const |
nuclear@6 | 120 { |
nuclear@6 | 121 return get_state(); |
nuclear@6 | 122 } |
nuclear@6 | 123 |
nuclear@6 | 124 BoolAnim::operator float() const |
nuclear@6 | 125 { |
nuclear@6 | 126 return get_value(); |
nuclear@6 | 127 } |
nuclear@6 | 128 |
nuclear@6 | 129 #ifdef WIN32 |
nuclear@6 | 130 #include <windows.h> |
nuclear@6 | 131 |
nuclear@6 | 132 static long default_get_msec() |
nuclear@6 | 133 { |
nuclear@6 | 134 return GetTickCount(); |
nuclear@6 | 135 } |
nuclear@6 | 136 #else |
nuclear@6 | 137 #include <sys/time.h> |
nuclear@6 | 138 |
nuclear@6 | 139 static long default_get_msec() |
nuclear@6 | 140 { |
nuclear@6 | 141 static struct timeval tv0; |
nuclear@6 | 142 struct timeval tv; |
nuclear@6 | 143 |
nuclear@6 | 144 gettimeofday(&tv, 0); |
nuclear@6 | 145 if(tv0.tv_sec == 0 && tv0.tv_usec == 0) { |
nuclear@6 | 146 tv0 = tv; |
nuclear@6 | 147 return 0; |
nuclear@6 | 148 } |
nuclear@6 | 149 return (tv.tv_sec - tv0.tv_sec) * 1000 + (tv.tv_usec - tv0.tv_usec) / 1000; |
nuclear@6 | 150 } |
nuclear@6 | 151 #endif |