Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

vuSphericRevolver.cpp

Go to the documentation of this file.
00001 #include "vuSphericRevolver.h"
00002 #include "Volume/Lightfield/Unimodal/Spheric/vuSphericFilterFactory.h"
00003 #include "General/vuLightfield/vuSphericViewFilterFactory.h"
00004 
00005 template <int SIZE, class TYPE>
00006 vuSphericRevolver<SIZE,TYPE>::vuSphericRevolver()
00007 {
00008   m_Data = NULL;
00009 }
00010 
00011 template <int SIZE, class TYPE>
00012 vuSphericRevolver<SIZE,TYPE>::~vuSphericRevolver()
00013 {
00014   CHECKNDELETE(m_Data);
00015 }
00016 
00017 template <int SIZE, class TYPE>
00018 const char *vuSphericRevolver<SIZE,TYPE>::_titleString()
00019 {
00020   return "Spherical Lightfield Revolver";
00021 }
00022 
00023 template <int SIZE, class TYPE>
00024 bool vuSphericRevolver<SIZE,TYPE>::init(const char* DataFile)
00025 {
00026   SetEvtHandlerEnabled(true);
00027 
00028   //Set up the window
00029   SetTitle(_titleString());
00030   CreateStatusBar();
00031 
00032   //Create a volume data instance.
00033   // the "m_Data = new vu1611?2" is called by child classes
00034   m_Data->setFileName(DataFile);
00035 
00036   //Read in the data.
00037   bool success = m_Data->read();
00038   if (success) {
00039     m_glCanvas->SetSize(512,512);
00040     vuString str;
00041     str  = _titleString();
00042     str += ": [";
00043     str += m_Data->getWidth();
00044     str += "x";
00045     str += m_Data->getHeight();
00046     str += "] x ";
00047     str += m_Data->getNumberOfViews();
00048     str += " Views <";
00049     str += SIZE;
00050     str += " ";
00051     str += m_Data->_typeName();
00052     str += ">";
00053     SetTitle(str.c_str());
00054     Fit();
00055     m_Data->setViewFilter(vuSphericViewFilterFactory<SIZE,TYPE>::
00056                           getFilter("Blend"));
00057     m_Data->setFilter(vuSphericFilterFactory<SIZE,TYPE>::getFilter("Nearest"));
00058 
00059     m_Data->setIsReRendering(true);
00060   }
00061   else {
00062     wxMessageDialog dlg(this,m_Data->getErrorMessage(),
00063                         "vuSphericRevolver",wxOK);
00064     dlg.ShowModal();
00065   }
00066   return success;
00067 }
00068 
00069 
00070 /* ------------------------------------------------------------------------ */
00071 /* --- add some ui elements ----------------------------------------------- */
00072 /* ------------------------------------------------------------------------ */
00073 
00074 template <int SIZE, class TYPE>
00075 void vuSphericRevolver<SIZE,TYPE>::addBottom(wxSizer *sizer)
00076 {
00077   //Add some control elements
00078   wxBoxSizer *verSpacer = new wxBoxSizer(wxVERTICAL);
00079   wxBoxSizer *horSpacer = new wxBoxSizer(wxHORIZONTAL);
00080 
00081   m_ImageScale = new wxSlider(this, idIMAGESCALE, 100, 1,
00082                               1500, 
00083                               wxDefaultPosition, wxSize(300,18),
00084                               wxSL_HORIZONTAL,wxDefaultValidator,"imageScale");
00085 
00086   horSpacer->Add(10,0);
00087   horSpacer->Add(new wxStaticText(this, -1, "Scale:"));
00088   horSpacer->Add(5,0);
00089   horSpacer->Add(m_ImageScale);
00090   horSpacer->Add(5,0);
00091   horSpacer->Add(new wxButton(this, idIMAGESCALE2ONE, "fit",
00092                  wxDefaultPosition, wxSize(40,18)));
00093   horSpacer->Add(18,0);
00094 
00095   // number of nearest views
00096   {  
00097     m_CHOICEnumberOfViews = 
00098       new wxChoice(this, idNUMBEROFVIEWS, wxDefaultPosition, wxSize(45,20),
00099                    0, NULL, wxMAXIMIZE_BOX, wxDefaultValidator, "Views");
00100 
00101     // lightfield filter choice
00102     m_CHOICEnumberOfViews->Append("1");
00103     m_CHOICEnumberOfViews->Append("2");
00104     m_CHOICEnumberOfViews->Append("3");
00105     m_CHOICEnumberOfViews->Append("4");
00106     m_CHOICEnumberOfViews->SetSelection(0);
00107 
00108     horSpacer->Add(new wxStaticText(this, -1, "Views:"));
00109     horSpacer->Add(5,0);
00110     horSpacer->Add(m_CHOICEnumberOfViews,0,wxALL|wxALIGN_LEFT,1);
00111   }
00112 
00113   verSpacer->Add(1,10);
00114   verSpacer->Add(horSpacer);
00115   verSpacer->Add(1,10);
00116   sizer->Add(verSpacer);
00117 }
00118 
00119 template <int SIZE, class TYPE>
00120 bool vuSphericRevolver<SIZE,TYPE>::glInit()
00121 {
00122   if (m_Data == NULL) return false;
00123   m_Data->initOpenGL();
00124   m_Data->glResize(m_glCanvas->getWidth(), m_glCanvas->getHeight());
00125   m_Data->setIsReRendering(true);
00126   return true;
00127 }
00128 
00129 template <int SIZE, class TYPE>
00130 void vuSphericRevolver<SIZE,TYPE>::glRender()
00131 {
00132   wxStopWatch watch;
00133 
00134   watch.Start();
00135   vuFixelMap<SIZE,TYPE> map = *(m_Data->computeAndReturnImage());
00136   map.scaleAndBias((float)m_ImageScale->GetValue()/100);
00137   map.glRender();
00138   watch.Pause();
00139   
00140   wxString statusText = "";
00141   int      idx        = -1;
00142 
00143   vuSphericViewFilter<SIZE,TYPE> *filter = m_Data->getViewFilter();
00144   if (filter) {
00145     idx = m_Data->getIndexOfView(filter->getView(0));
00146   }
00147   
00148   {
00149     char msg[64];
00150     sprintf(msg,"Render Time: %3lu ms", watch.Time());
00151     statusText += msg;
00152   }
00153   
00154   if (idx >= 0) {
00155     char msg[32];
00156     sprintf(msg,"  --  view: %4lu", (dword)idx);
00157     statusText += msg;
00158   }
00159 
00160   statusText += "  --  Press '?' for help";
00161 
00162   SetStatusText(statusText);
00163 }
00164 
00165 template <int SIZE, class TYPE>
00166 void vuSphericRevolver<SIZE,TYPE>::glResize()
00167 {
00168   m_Data->glResize(m_glCanvas->getWidth(), m_glCanvas->getHeight());
00169 }
00170 
00171 template <int SIZE, class TYPE>
00172 void vuSphericRevolver<SIZE,TYPE>::onMouse(wxMouseEvent &ev)
00173 {
00174   // here is the place for additional mouse bevaviour.
00175 }
00176 
00177 template <int SIZE, class TYPE>
00178 void vuSphericRevolver<SIZE,TYPE>::onKeyboard(wxKeyEvent& event)
00179 {
00180   switch(event.GetKeyCode()) {
00181     case '>': { // plus
00182       int delta = (event.m_controlDown) ? 1 : 10;
00183       _updateScaleAndRefresh(m_ImageScale->GetValue() + delta);
00184       break;
00185     }
00186     case '<': { // minus
00187       int delta = (event.m_controlDown) ? 1 : 10;
00188       _updateScaleAndRefresh(m_ImageScale->GetValue() - delta);
00189       break;
00190     }
00191     case ' ': { // space --> set image scaling to one
00192       _updateScaleAndRefresh(100);
00193     }
00194   }
00195 }
00196 
00197 template <int SIZE, class TYPE>
00198 wxString vuSphericRevolver<SIZE,TYPE>::helpText()
00199 {
00200   wxString str("");
00201 
00202   str += 
00203     "\n  Keyboard bindings:\n\n"
00204     "\t ?\t\t\t this help window\n"
00205     "\t k\t\t\t Keyframer\n"
00206     "\t right\t\t\t rotate right\n"
00207     "\t LEFT\t\t\t rotate left\n"
00208     "\t UP\t\t rotate up\n"
00209     "\t DOWN\t\t rotate down\n"
00210     "\t SHIFT-RIGHT\t rotate slowly right\n"
00211     "\t SHIFT-LEFT\t\t rotate slowly left\n"
00212     "\t SHIFT-UP\t\t rotate slowly up\n"
00213     "\t SHIFT-DOWN\t rotate slowly down\n"
00214     "\t <\t\t\t decrease image scaling\n"
00215     "\t >\t\t\t increase image scaling\n"
00216     "\t CONTROL+<\t\t slowly decrease image scaling\n"
00217     "\t CONTROL+>\t\t slowly increase image scaling\n"
00218     "\t SPACE\t\t\t set image scaling to one (same as 'fit' button)\n";
00219 
00220   return str;
00221 }
00222 
00223 
00224 template <int SIZE, class TYPE>
00225 vu1 *vuSphericRevolver<SIZE,TYPE>::getVolume()
00226 {
00227   return (vu1 *)m_Data;
00228 }
00229 
00230 /* --------------------------------------------------------------------- */
00231 /* --- some GUI callbacks ---------------------------------------------- */
00232 /* --------------------------------------------------------------------- */
00233 
00234 template <int SIZE, class TYPE>
00235 void vuSphericRevolver<SIZE,TYPE>::OnChoiceNumberOfViews(wxCommandEvent& event)
00236 {
00237   vuSphLfFlt_Nearest<SIZE,TYPE> *filter = NULL;
00238 
00239   filter = (vuSphLfFlt_Nearest<SIZE,TYPE>*)m_Data->getFilter();
00240   
00241   if (filter == NULL) return;
00242   
00243   dword idx = m_CHOICEnumberOfViews->GetSelection();
00244  
00245   filter->setNumberOfViews(idx+1);
00246   
00247   m_Data->setIsReRendering(true);
00248   m_glCanvas->redraw();
00249 }
00250 
00251 template<int SIZE,class TYPE>
00252 void vuSphericRevolver<SIZE,TYPE>::OnScaleImage(wxScrollEvent& event)
00253 {
00254   m_glCanvas->redraw();
00255 }
00256 
00257 template<int SIZE,class TYPE>
00258 #if wxMINOR_VERSION < 5
00259 void vuSphericRevolver<SIZE,TYPE>::OnScaleImage2One(wxScrollEvent& event)
00260 #else
00261 void vuSphericRevolver<SIZE,TYPE>::OnScaleImage2One(wxCommandEvent& event)
00262 #endif
00263 {
00264   m_ImageScale->SetValue(100);
00265   m_glCanvas->redraw();
00266 }
00267 
00268 template <int SIZE, class TYPE>
00269 vuCamera* vuSphericRevolver<SIZE,TYPE>::getCamera()
00270 {
00271   return m_Data->getCameraPtr ();
00272 }
00273 
00274 template <int SIZE, class TYPE>
00275 vuImage* vuSphericRevolver<SIZE,TYPE>::getCurrentImage()
00276 {
00277   return NULL;
00278 }
00279 
00280 template <int SIZE, class TYPE>
00281 void vuSphericRevolver<SIZE,TYPE>::DrawFromImage()
00282 {
00283   m_glCanvas->redraw ();
00284 }
00285 
00286 template <int SIZE, class TYPE>
00287 void vuSphericRevolver<SIZE,TYPE>::DrawAgain()
00288 {
00289 }
00290 
00291 /* ------------------------------------------------------------------------- */
00292 /* --- internal methods ---------------------------------------------------- */
00293 /* ------------------------------------------------------------------------- */
00294 
00295 template<int SIZE,class TYPE>
00296 void vuSphericRevolver<SIZE,TYPE>::_updateScaleAndRefresh(int scale)
00297 {
00298   if (scale >= 1 && scale <= 1500) {
00299     m_ImageScale->SetValue(scale);
00300     m_glCanvas->redraw();
00301   }
00302 }

Generated on Wed Dec 15 21:20:37 2004 for vuVolume by  doxygen 1.3.9.1