00001 //345678901234567890123456789012345678901234567890123456789012345678901234567890 00002 // Animator.h 00003 // 00004 // Author: Richard van Balen 00005 #ifndef OglGui_Animator_h 00006 #define OglGui_Animator_h 00007 00008 #ifndef OglGui_Window_h 00009 #include "OglGui/Window.h" 00010 #endif 00011 00012 #ifndef OglGui_time_included 00013 #include <time.h> 00014 #define OglGui_time_included 00015 #endif 00016 00017 namespace OglGui { 00018 00019 class Animator : public Window 00020 { 00021 public: 00022 Animator(Window* parent,int x,int y,int w,int h): 00023 Window(parent, x, y, w, h) 00024 { 00025 Init(); 00026 } 00027 00028 void Animate() 00029 { 00030 SetVisible(true); 00031 Clear(); 00032 mCnt = 120; 00033 Prepare(mOglWnd->parent); 00034 SetAlwaysDraw(true); 00035 } 00036 00037 void Prepare(OGLWND* oglWnd) 00038 { 00039 if (!oglWnd) 00040 return; 00041 00042 LIST* obj; 00043 OGLWND* child; 00044 for (obj=oglWnd->wndList; obj; obj=obj->next) 00045 { 00046 child = (OGLWND*) obj->info; 00047 if (child==mOglWnd) 00048 continue; 00049 int userData = (long long) child->UserData1; 00050 mOglWindows.push_back(child); 00051 mXs.push_back(child->x); 00052 mYs.push_back(child->y); 00053 int offX = 600 - rand() % 1200; 00054 int offY = 600 - rand() % 1200; 00055 mDXs.push_back(offX/(mCnt*1.f)); 00056 mDYs.push_back(offY/(mCnt*1.f)); 00057 if (child->wndList!=0) 00058 Prepare(child); 00059 } 00060 } 00061 00062 virtual void DisplayFunc() 00063 { 00064 Window::DisplayFunc(); 00065 if (!mInitialized) 00066 { 00067 mInitialized = true; 00068 Animate(); 00069 } 00070 00071 if (mCnt>=0) 00072 { 00073 int sz = mOglWindows.size(); 00074 for (int i=0; i<sz; i++) 00075 { 00076 mOglWindows[i]->x = mXs[i] + sin(DEG2RAD(2*mCnt)) * mCnt * mDXs[i]; 00077 mOglWindows[i]->y = mYs[i] + cos(DEG2RAD(2*mCnt)) * mCnt * mDYs[i]; 00078 } 00079 UpdateScene(); 00080 } 00081 if (--mCnt==-2) 00082 { 00083 SetAlwaysDraw(false); 00084 UpdateScene(); 00085 Clear(); 00086 SetVisible(false); 00087 } 00088 } 00089 00090 void Clear() 00091 { 00092 mOglWindows.clear(); 00093 mXs.clear(); 00094 mYs.clear(); 00095 mDXs.clear(); 00096 mDYs.clear(); 00097 } 00098 00099 00100 private: 00101 std::vector<OGLWND*> mOglWindows; 00102 std::vector<int> mXs; 00103 std::vector<int> mYs; 00104 std::vector<float> mDXs; 00105 std::vector<float> mDYs; 00106 int mCnt; 00107 int mInitialized; 00108 int mRecurs; 00109 00110 void Init() 00111 { 00112 srand(clock()); 00113 mInitialized = false; 00114 mRecurs = 0; 00115 } 00116 00117 }; 00118 00119 } // Namespace OglGui 00120 #endif 00121