00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #ifndef BANIMATION_H
00013 #define BANIMATION_H
00014
00015
00016
00017
00018
00019 #include "BRunLoop.h"
00020
00021 class BAnimation: public BRunLoop::VBlankReceiver {
00022 public:
00023
00028 typedef s32 FIXED;
00029 static u8 FIX_SHIFT;
00030 static FIXED FIX_SCALE;
00031 static float FIX_SCALEF;
00032 static float FIX_SCALEF_;
00033 static inline FIXED INT2FIX(int _i) { return ((_i)<<FIX_SHIFT); }
00034 static inline int FIX2INT(FIXED _n) { return ((_n)>>FIX_SHIFT); }
00035 static inline FIXED FIX_FRAC(FIXED _n) { return ((_n)&(FIX_SCALE-1)); }
00036
00037 static inline FIXED FLOAT2FIX(float _f) { return (FIXED((_f)*FIX_SCALEF)); }
00038 static inline float FIX2FLOAT(FIXED _n) { return ((_n)*FIX_SCALEF_); }
00039
00040 static inline FIXED FIX_ADD(FIXED a, FIXED b) { return a+b; }
00041 static inline FIXED FIX_SUB(FIXED a, FIXED b) { return a-b; }
00042 static inline FIXED FIX_MUL(FIXED a, FIXED b) { return (a*b)>>FIX_SHIFT; }
00043 static inline FIXED FIX_DIV(FIXED a, FIXED b) { return (a<<FIX_SHIFT)/b; }
00048 class Delegate {
00049 public:
00050 virtual ~Delegate() {}
00051 virtual void animationDidStart(BAnimation* animation) {}
00052 virtual void animationDidChangeValue(BAnimation* animation, FIXED value) {}
00053 virtual void animationDidFinish(BAnimation* animation) {}
00054 };
00055
00056 BAnimation();
00057 ~BAnimation();
00058
00059 typedef FIXED (* FixedModifier)(FIXED);
00060
00061 void addTarget(volatile uint32* target, FixedModifier modifier = NULL);
00062 void addTarget(volatile uint16* target, FixedModifier modifier = NULL);
00063 void clearTargets();
00064
00065 static FIXED pageflipModifierYDY(FIXED value);
00066 static FIXED pageflipModifierCY(FIXED value);
00067
00068 void setStartValue(int value);
00069 void setStartValue(float value);
00070 FIXED startValue() { return _start; }
00071
00072 void setStepValue(int value);
00073 void setStepValue(float value);
00074 FIXED stepValue() { return _step; }
00075
00076 void setEndValue(int value);
00077 void setEndValue(float value);
00078 FIXED endValue() { return _end; }
00079
00080 FIXED value() { return _value; }
00081
00083 void schedule(bool global = false);
00085 void unschedule();
00086
00088 void run();
00089
00090 void runloopReachedVBlank(BRunLoop* loop);
00091
00092 void setDelegate(Delegate* deleg);
00093 Delegate* delegate() { return _deleg; }
00094
00095 private:
00096 void setTarget(FIXED value);
00097
00098 typedef struct {
00099 volatile void* target;
00100 bool targetIs16Bit;
00101 FixedModifier modifier;
00102 } AnimTarget;
00103
00104 std::vector<AnimTarget> _targets;
00105 FIXED _start, _end, _step, _value;
00106 bool _running, _global;
00107 Delegate* _deleg;
00108 BRunLoop* _loop;
00109 };
00110
00111 #endif