00001 #include "OglGui/ChangingToView.h"
00002 #include "OglGui/RadioGroup.h"
00003 #include "OglGui/FramesPerSecond.h"
00004
00005 namespace OglGui {
00006
00007 const static int sChNrViews = 144;
00008 const static int sChNrRows = 12;
00009
00010 static ChangingToView* sChViews[sChNrViews];
00011 static int sChXRot, sChYRot, sChZRot;
00012
00013 class MyChangingToViewListener : public ChangingToViewListener
00014 {
00015 public:
00016 virtual void OnChangingToViewDestiny(ChangingToView *src, void *userData)
00017 {
00018 int id = (int)(long long) userData;
00019 mNrFinished++;
00020 if (mNrFinished >= sChNrViews && mFollowing)
00021 {
00022 mNrFinished = 0;
00023 for (int i=0; i<sChNrViews; i++)
00024 {
00025 float x, y, z;
00026 sChViews[(i+1)%sChNrViews]->GetDimensions3D(&x, &y, &z, 0, 0, 0);
00027 sChViews[i]->MoveTo(x,y,z,500);
00028 sChViews[i]->RotateTo(sChXRot, sChYRot, sChZRot, 800);
00029 }
00030 }
00031 }
00032 void Reset() { mNrFinished = 0; }
00033 void ToggleFollowing() { mFollowing = !mFollowing; }
00034
00035 private:
00036 int mNrFinished;
00037 bool mFollowing;
00038 } MyChViewListener;
00039
00040 class ChangingToDemo : public Window,
00041 public WindowListener,
00042 public RadioGroupListener
00043 {
00044 public:
00045 ChangingToDemo(int x, int y, int w, int h) :
00046 Window(x, y, w, h, false)
00047 {
00048 Init();
00049 }
00050
00051 ChangingToDemo(Window* parent, int w, int h) :
00052 Window(parent, w, h, false)
00053 {
00054 Init();
00055 }
00056
00057 ChangingToDemo(Window* parent, int x, int y, int w, int h) :
00058 Window(parent, x, y, w, h, false)
00059 {
00060 Init();
00061 }
00062
00063 protected:
00064
00065 virtual void OnRadioButton(RadioGroup *src, int button, void* data)
00066 {
00067 pickRandom = false;
00068 SelectMode(button);
00069 }
00070
00071 void SelectMode(int m)
00072 {
00073 MyChViewListener.Reset();
00074 switch(m)
00075 {
00076 case 0: ToGrid(); break;
00077 case 1: ToOGL(); break;
00078 case 2: ToSpiral(); break;
00079 case 3: ToCircle(); break;
00080 case 4: ToStack(); break;
00081 case 5: ToRandom(); break;
00082 case 6: pickRandom = true;
00083 }
00084 }
00085
00086 virtual void
00087 WindowKeyboardEvent(Window *src, int c, int state, void *userData)
00088 {
00089 MyChViewListener.Reset();
00090 if (c=='x') sChXRot = sChXRot ? 0 : 360;
00091 if (c=='z') sChZRot = sChZRot ? 0 : 360;
00092 if (c=='y') sChYRot = sChYRot ? 0 : 360;
00093 if (c=='r') ToRandom();
00094 if (c=='g') ToGrid();
00095 if (c=='c') ToCircle();
00096 if (c=='s') ToSpiral();
00097 if (c=='o') ToOGL();
00098 if (c=='p') ToStack();
00099 if (c=='f') MyChViewListener.ToggleFollowing();
00100 }
00101
00102 virtual void
00103 WindowDisplayEvent(Window *src, void *userData)
00104 {
00105 if (pickRandom && (oglWndSecondsSinceStart-lastChangeTime)>5)
00106 {
00107 mode = (mode + 1) % 6;
00108 SelectMode(mode);
00109 lastChangeTime = oglWndSecondsSinceStart;
00110 }
00111 }
00112
00113 void StartListening()
00114 {
00115 for (int i=0; i<sChNrViews; i++)
00116 sChViews[i]->SetChangingToViewListener(&MyChViewListener, (void *) i);
00117 }
00118
00119 void ToGrid()
00120 {
00121 mode = 0;
00122 for (int j=0; j<sChNrViews; j++)
00123 {
00124 int row = j % sChNrRows;
00125 int col = j / sChNrRows;
00126 int s = -sChNrRows/2;
00127 if (col%2) row = sChNrRows - row -1;
00128 OGLVIEW3D* v3D = sChViews[j]->GetOGLVIEW3D();
00129 int duration = mDuration + j*mDurExtra;
00130 view3DSys.SetRotation(v3D,0,0,0);
00131 sChViews[j]->MoveTo(s+1.1*row, s+1.1*col, -20, duration);
00132 sChViews[j]->RotateTo(sChXRot, sChYRot, sChZRot, duration + mRotDurationExtra);
00133 }
00134 }
00135
00136 void ToRandom()
00137 {
00138 mode = 5;
00139 for (int j=0; j<sChNrViews; j++)
00140 {
00141 int row = j / sChNrRows;
00142 int col = j % sChNrRows;
00143 int s = -sChNrRows/2;
00144 OGLVIEW3D* v3D = sChViews[j]->GetOGLVIEW3D();
00145 int duration = mDuration + j*mDurExtra;
00146 view3DSys.SetRotation(v3D,0,0,0);
00147 float offX = row + (rand()%100)/50.;
00148 float offY = col + (rand()%100)/50.;
00149 sChViews[j]->MoveTo(s+offX, s+offY, -20+j/1000., duration);
00150 sChViews[j]->RotateTo(sChXRot, sChYRot, sChZRot, duration + mRotDurationExtra);
00151 }
00152 }
00153
00154 void ToCircle()
00155 {
00156 mode = 3;
00157 for (int j=0; j<sChNrViews; j++)
00158 {
00159 OGLVIEW3D* v3D = sChViews[j]->GetOGLVIEW3D();
00160 view3DSys.SetRotation(v3D,0,0,0);
00161 int duration = mDuration + j*mDurExtra;
00162 float rad = DEG2RAD(j*(360.f/sChNrViews));
00163 if (!(j%12))
00164 {
00165 rad = DEG2RAD((j/12.)*(360/12.));
00166 sChViews[j]->MoveTo(1.5*sin(rad), 1.5*cos(rad), -12+j/1000., duration);
00167 }
00168 else
00169 sChViews[j]->MoveTo(6*sin(rad), 6*cos(rad), -20+j/1000., duration);
00170 sChViews[j]->RotateTo(sChXRot, sChYRot, sChZRot, duration + mRotDurationExtra);
00171 }
00172 }
00173
00174 void ToSpiral()
00175 {
00176 mode = 2;
00177 for (int j=0; j<sChNrViews; j++)
00178 {
00179 OGLVIEW3D* v3D = sChViews[j]->GetOGLVIEW3D();
00180 view3DSys.SetRotation(v3D,0,0,0);
00181 int duration = mDuration + j*mDurExtra;
00182 float rad = DEG2RAD(j*(4*360.)/sChNrViews);
00183 sChViews[j]->MoveTo( (j/16)*sin(rad), (j/16)*cos(rad), -22+j/1000., duration);
00184 sChViews[j]->RotateTo(sChXRot, sChYRot, sChZRot, duration + mRotDurationExtra);
00185 }
00186 }
00187
00188 void ToStack()
00189 {
00190 mode = 4;
00191 for (int j=0; j<sChNrViews; j++)
00192 {
00193 OGLVIEW3D* v3D = sChViews[j]->GetOGLVIEW3D();
00194 view3DSys.SetRotation(v3D,0,0,0);
00195 int duration = mDuration + j*mDurExtra;
00196 float rad = DEG2RAD(j*(360.f/sChNrViews));
00197 float off = (j%(sChNrViews-1)) ? 0 : 0.5;
00198 float n = (sChNrViews-j)/20.;
00199 sChViews[j]->MoveTo(n + off, -n + off, -33 + j/5., duration);
00200 sChViews[j]->RotateTo(sChXRot, sChYRot, sChZRot, duration + mRotDurationExtra);
00201 }
00202 }
00203
00204 void ToOGL()
00205 {
00206 int mode = 1;
00207 for (int j=0; j<sChNrViews; j++)
00208 {
00209 OGLVIEW3D* v3D = sChViews[j]->GetOGLVIEW3D();
00210 view3DSys.SetRotation(v3D,0,0,0);
00211 int duration = mDuration + j*mDurExtra;
00212 float x, y, rad;
00213 if (j<40)
00214 {
00215 rad = DEG2RAD(j*(360.f/39));
00216 x = -5 + 2.5 * sin(rad);
00217 y = 2.5 * cos(rad);
00218 }
00219 else if (j<70)
00220 {
00221 rad = DEG2RAD((j-40)*(360/39));
00222 x = 1.2 - 2.5 * sin(rad);
00223 y = 2.5 * cos(rad);
00224 }
00225 else if (j<75)
00226 {
00227 x = 3.7 - (j-70)*.4;
00228 y = 0;
00229 }
00230 else if (j<86)
00231 {
00232 x = 5;
00233 y = 2.5 - (j-75)*.5;
00234 }
00235 else if (j<91)
00236 {
00237 x = 5.2 + (j-86)*.5;
00238 }
00239 else
00240 {
00241 rad = DEG2RAD((j-91)*(360.f/53));
00242 x = 9 * sin(rad);
00243 y = 9 * cos(rad);
00244 }
00245 sChViews[j]->MoveTo(x, y, -24 - j*.001, duration);
00246 sChViews[j]->RotateTo(sChXRot, sChYRot, sChZRot, duration + mRotDurationExtra);
00247 }
00248 }
00249
00250 private:
00251 void Init()
00252 {
00253 sChXRot = sChYRot = sChZRot = 0;
00254 MyChViewListener.ToggleFollowing();
00255 mDuration = 500;
00256 mRotDurationExtra = 0;
00257 mDurExtra = 5;
00258
00259 OGLIMAGE* imgs[7];
00260 for (int i=0; i<7; i++)
00261 {
00262 char buf[512];
00263 sprintf(buf, "Im_%d.png", i+1);
00264 imgs[i] = TryReadPNG(buf);
00265 }
00266
00267 for (int j=0; j<sChNrViews; j++)
00268 {
00269 sChViews[j] = new ChangingToView(this, imgs[j%7], -0, 0, -50, 1, 1, 1);
00270 view3DSys.SetTags(sChViews[j]->GetOGLVIEW3D(), FlexViewTags & ~deletableTag);
00271 }
00272
00273 for (int i=0; i<7; i++)
00274 ReleaseOglImage(imgs[i]);
00275
00276 RadioGroup* radioGrp = new RadioGroup(this, 4, 4, W()-8, 24);
00277 radioGrp->SetButtonDimensions((W()-50)/7,20);
00278 radioGrp->SetRadioListener(this, 1);
00279 radioGrp->Add("Grid");
00280 radioGrp->Add("OGL");
00281 radioGrp->Add("Spiral");
00282 radioGrp->Add("Circle");
00283 radioGrp->Add("Stack");
00284 radioGrp->Add("RndGrid");
00285 radioGrp->Add("ALL");
00286 radioGrp->SetActiveRadio(6);
00287 radioGrp->RepositionViewports();
00288 radioGrp->ScaleChildren();
00289 radioGrp->ConnectTo(this,OglGui::TOLEFTRIGHT);
00290
00291 ToGrid();
00292 StartListening();
00293
00294 pickRandom = true;
00295 lastChangeTime = 0;
00296 oglSys.AllowPicking(mOglWnd,1,1);
00297 SetWindowListener(this);
00298 FramesPerSecond* fps = new FramesPerSecond(this,4,30,80,24);
00299 fps->ConnectTo(this,OglGui::TOBOTTOMLEFT);
00300 }
00301
00302 bool pickRandom;
00303 int mDuration;
00304 int mDurExtra;
00305
00306 int mRotDurationExtra;
00307
00308 int lastChangeTime;
00309 int mode;
00310 };
00311
00312 }