Home || Visual Search || Applications || Architecture || Important Messages || OGL || Src

ChangingToDemo.h

Go to the documentation of this file.
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 } // namespace OglGui

Generated on Thu Jan 13 09:04:49 2011 for ImpalaSrc by  doxygen 1.5.1