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

vuFVR.cpp

Go to the documentation of this file.
00001 #include "vuFVR.h"
00002 #include "vuColourRGBa.h"
00003 #include "../../wxUIElements/vuGLCanvas.h"
00004 #include <wx/colordlg.h>
00005 
00006 
00007 //----------------------------------------------------------------------------
00008 //------------------------- The vuFVR event table --------------------------
00009 //----------------------------------------------------------------------------
00010 
00011 enum
00012 {
00013   idDEPTH_CUEING,
00014   idDIFFUSE_SHADING,
00015   idFILTER
00016 };
00017 
00018 
00019 BEGIN_EVENT_TABLE(vuFVR, vuBasicUtility)
00020   EVT_CHECKBOX(idDEPTH_CUEING,    vuFVR::OnCheckBoxDepthCueing)
00021   EVT_CHECKBOX(idDIFFUSE_SHADING, vuFVR::OnCheckBoxDiffuseShading)
00022   EVT_CHOICE(idFILTER,            vuFVR::OnChoiceFilter)
00023 END_EVENT_TABLE();
00024 
00025 //----------------------------------------------------------------------------
00026 //------------------------- The constructor ----------------------------------
00027 //----------------------------------------------------------------------------
00028 
00029 vuFVR::vuFVR() : m_TFunc(4), m_TFDialog(this,m_TFunc)
00030 {
00031     m_Data          = NULL;
00032     m_ViewScale     = 2.0f;
00033     m_Filter        = NULL;
00034 }
00035 
00036 //----------------------------------------------------------------------------
00037 //------------------------- The destructor -----------------------------------
00038 //----------------------------------------------------------------------------
00039 
00040 vuFVR::~vuFVR()
00041 {
00042     if (m_Data   != NULL) delete m_Data;
00043     if (m_Filter != NULL) delete m_Filter;
00044 }
00045 
00046 //----------------------------------------------------------------------------
00047 //------------------------- public: getFileType() ----------------------------
00048 //----------------------------------------------------------------------------
00049 
00050 const char* vuFVR::getFileType()
00051 {
00052     return "11121";
00053 }
00054 
00055 //----------------------------------------------------------------------------
00056 //------------------------- public: init() -----------------------------------
00057 //----------------------------------------------------------------------------
00058 
00059 void vuFVR::setTitle(const char* _title)
00060 {
00061   vuString title(_title);
00062   if (m_Data) {
00063     title += " [";
00064     title += vuString(m_Data->getDim1Size());
00065     title += "x";
00066     title += vuString(m_Data->getDim2Size());
00067     title += "x";
00068     title += vuString(m_Data->getDim3Size());
00069     title += "]";
00070   }
00071   vuBasicUtility::SetTitle(title.c_str());
00072 }
00073 
00074 bool vuFVR::init(const char* DataFile)
00075 {
00076   //Set up the window for the FVR.
00077   CreateStatusBar();
00078 
00079   m_isRefineSlice = true;
00080     
00081   //Create a volume data instance.
00082   m_Data   = new vu1112117;
00083   m_Filter = new TorstensFilters(d0_c0_1ef);
00084   m_Data->setFilter(m_Filter);
00085   m_Data->setSliceScale(0.125);
00086   m_Data->setFileName(DataFile);
00087   m_Data->setIsDepthCueing(false);
00088   m_Data->setIsDiffuseShading(false);
00089 
00090   m_CameraLight.setPosition(vuVector(1.0, 0.0, 0.0));
00091   
00092   //Read in the data.
00093   bool success = m_Data->read();
00094   if (success) {
00095     m_glCanvas->SetSize(512,512);
00096     Fit();
00097   }
00098   else {
00099     wxMessageDialog dlg(this,m_Data->getErrorMessage(),"vuFVR",wxOK);
00100     dlg.ShowModal();
00101   }
00102   setTitle("vuFVR");
00103   return success;
00104 };
00105 
00106 void vuFVR::DrawAgain ()
00107 {
00108   m_glCanvas->redraw();
00109 }
00110 
00111 void vuFVR::DrawFromImage ()
00112 {
00113   cerr << "??? drawFromImage.." << endl;
00114   //m_Data->drawPic();
00115 }
00116 
00117 vuImage* vuFVR::getCurrentImage ()
00118 {
00119   return m_Data->getBuffer();
00120 }
00121 
00122 vuCamera* vuFVR::getCamera ()
00123 {
00124         return &m_Camera;
00125 }
00126 
00127 //----------------------------------------------------------------------------
00128 //------------------------- public: addRight() -------------------------------
00129 //----------------------------------------------------------------------------
00130 
00131 void vuFVR::addRight(wxSizer *sizer)
00132 {
00133   //Add some control elements
00134   m_CBdepthCueing = new wxCheckBox(this,idDEPTH_CUEING,"Depth Cueing");
00135   m_CBdepthCueing->SetValue(false);
00136 
00137   m_CBdiffuseShading= new wxCheckBox(this,idDIFFUSE_SHADING,"Diffuse Shading");
00138   m_CBdiffuseShading->SetValue(false);
00139 
00140   m_CHOICEfilter = 
00141     new wxChoice(this, idFILTER, wxDefaultPosition, wxSize(-1,-1),
00142                  0, NULL, wxMAXIMIZE_BOX, wxDefaultValidator, "Filter");
00143 
00144   m_CHOICEfilter->Append("d0_c0_2ef");
00145   m_CHOICEfilter->Append("d0_c0_3ef");
00146   m_CHOICEfilter->Append("d0_c0_4ef");
00147   m_CHOICEfilter->Append("d0_c1_1ef");
00148   m_CHOICEfilter->Append("d0_c1_2ef");
00149   m_CHOICEfilter->Append("d0_c1_3ef");
00150   m_CHOICEfilter->Append("d0_c1_4ef");
00151   m_CHOICEfilter->Append("d0_c2_1ef");
00152   m_CHOICEfilter->Append("d0_c2_2ef");
00153   m_CHOICEfilter->Append("d0_c2_3ef");
00154   m_CHOICEfilter->Append("d0_c2_4ef");
00155   m_CHOICEfilter->Append("d0_c3_1ef");
00156   m_CHOICEfilter->Append("d0_c3_2ef");
00157   m_CHOICEfilter->Append("d0_c3_3ef");
00158   m_CHOICEfilter->Append("d0_c3_4ef");
00159   m_CHOICEfilter->Append("d0_cn_1ef");
00160   m_CHOICEfilter->Append("d0_cn_2ef");
00161   m_CHOICEfilter->Append("d0_cn_3ef");
00162   m_CHOICEfilter->Append("d0_cn_4ef");
00163   m_CHOICEfilter->SetSelection(0);
00164 
00165   sizer->Add(m_CBdepthCueing,0,wxALL|wxALIGN_LEFT,1);
00166   sizer->Add(m_CBdiffuseShading,0,wxALL|wxALIGN_LEFT,1);
00167   sizer->Add(m_CHOICEfilter,0,wxALL|wxALIGN_LEFT,1);
00168 }
00169 
00170 //----------------------------------------------------------------------------
00171 //---------------- protected: Callbacks for UserInterface --------------------
00172 //----------------------------------------------------------------------------
00173 
00174 void vuFVR::OnCheckBoxDepthCueing( wxCommandEvent& event)
00175 {
00176   m_Data->setIsDepthCueing(m_CBdepthCueing->GetValue());
00177   m_Data->setIsReRendering(true);
00178   m_glCanvas->redraw();
00179 }
00180 
00181 void vuFVR::OnCheckBoxDiffuseShading( wxCommandEvent& event)
00182 {
00183   m_Data->setIsDiffuseShading(m_CBdiffuseShading->GetValue());
00184   m_Data->setIsReRendering(true);
00185   m_glCanvas->redraw();
00186 }
00187 
00188 void vuFVR::OnChoiceFilter( wxCommandEvent& event)
00189 #define FILTER_SET_SUB(x) { m_Filter = new TorstensFilters((x)); m_Data->setFilter(m_Filter);}
00190 {
00191   Filter* tmp = m_Filter;
00192 
00193   switch(m_CHOICEfilter->GetSelection()) {
00194     case 0:  FILTER_SET_SUB(d0_c0_1ef); break;
00195     case 1:  FILTER_SET_SUB(d0_c0_2ef); break;
00196     case 2:  FILTER_SET_SUB(d0_c0_3ef); break;
00197     case 3:  FILTER_SET_SUB(d0_c0_4ef); break;
00198     case 4:  FILTER_SET_SUB(d0_c1_1ef); break;
00199     case 5:  FILTER_SET_SUB(d0_c1_2ef); break;
00200     case 6:  FILTER_SET_SUB(d0_c1_3ef); break;
00201     case 7:  FILTER_SET_SUB(d0_c1_4ef); break;
00202     case 8:  FILTER_SET_SUB(d0_c2_1ef); break;
00203     case 9:  FILTER_SET_SUB(d0_c2_2ef); break;
00204     case 10: FILTER_SET_SUB(d0_c2_3ef); break;
00205     case 11: FILTER_SET_SUB(d0_c2_4ef); break;
00206     case 12: FILTER_SET_SUB(d0_c3_1ef); break;
00207     case 13: FILTER_SET_SUB(d0_c3_2ef); break;
00208     case 14: FILTER_SET_SUB(d0_c3_3ef); break;
00209     case 15: FILTER_SET_SUB(d0_c3_4ef); break;
00210     case 16: FILTER_SET_SUB(d0_cn_1ef); break;
00211     case 17: FILTER_SET_SUB(d0_cn_2ef); break;
00212     case 18: FILTER_SET_SUB(d0_cn_3ef); break;
00213     case 19: FILTER_SET_SUB(d0_cn_4ef); break;
00214     default: return;
00215   }
00216   if (tmp) delete tmp;
00217   m_Data->setIsReRendering(true);
00218   m_glCanvas->redraw();
00219 #undef FILTER_SET_SUB
00220 }
00221 
00222 //----------------------------------------------------------------------------
00223 //------------------------- protected: glInit() ------------------------------
00224 //----------------------------------------------------------------------------
00225 
00226 bool vuFVR::glInit(void)
00227 {
00228     if (m_Data == NULL) return false;
00229 
00230     m_Data->initOpenGL();
00231 
00232     return true;
00233 };
00234 
00235 
00236 //----------------------------------------------------------------------------
00237 //------------------------- protected: glRender() ----------------------------
00238 //----------------------------------------------------------------------------
00239 
00240 void vuFVR::glRender()
00241 {
00242   glClear(GL_COLOR_BUFFER_BIT);
00243   glPixelZoom(m_scaleX, m_scaleY);
00244 
00245   glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
00246   glMatrixMode(GL_PROJECTION);
00247   glLoadIdentity();
00248   gluOrtho2D(0,m_glCanvas->getWidth(),
00249              0,m_glCanvas->getHeight());
00250   glMatrixMode(GL_MODELVIEW);
00251   glLoadIdentity();
00252 
00253   if (m_Data->IsReRendering()) {
00254     wxStopWatch watch;
00255     watch.Start();
00256 
00257     if (m_isRefineSlice) {
00258       m_Data->clearSlices();
00259       m_Data->refineSlice(0, 0, 20, 20);
00260     }
00261     else
00262       m_Data->computeSlice();
00263 
00264     m_Data->setIsReRendering(false);
00265 
00266     watch.Pause();
00267     SetStatusText(wxString("Render Time: ") + 
00268                   vuString(watch.Time()).c_str() + "ms");
00269     m_Data->drawImageFromSlices();
00270     m_Data->setIsPostProcessing(false);
00271 
00272   }
00273   if (m_Data->IsPostProcessing()) {
00274     wxStopWatch watch;
00275     watch.Start();
00276 
00277     m_Data->drawImageFromSlices();
00278     m_Data->setIsPostProcessing(false);
00279 
00280     watch.Pause();
00281     SetStatusText(wxString("Postprocessing Time: ") + 
00282                   vuString(watch.Time()).c_str() + "ms");
00283   }
00284   m_Data->render();
00285 };
00286 
00287 //---------------------------------------------------------------------------
00288 void vuFVR::notifyDataChanged()
00289 {
00290     m_glCanvas->redraw();
00291 }
00292 
00293 //----------------------------------------------------------------------------
00294 //------------------------- protected: glResize() ----------------------------
00295 //----------------------------------------------------------------------------
00296 
00297 void vuFVR::glResize()
00298 {
00299     glViewport(0, 0, (GLint)m_glCanvas->getWidth(),(GLint)m_glCanvas->getHeight());
00300 
00301     m_scaleX = (float)m_glCanvas->getWidth()  / (float)m_Data->getSliceWidth();
00302     m_scaleY = (float)m_glCanvas->getHeight() / (float)m_Data->getSliceWidth();
00303 }
00304 
00305 //----------------------------------------------------------------------------
00306 //------------------------- protected: glOnMouse() ---------------------------
00307 //----------------------------------------------------------------------------
00308 
00309 void vuFVR::glOnMouse(wxMouseEvent &ev)
00310 {
00311     if (ev.LeftDown() || ev.RightDown()) {
00312         //Store the click position.
00313         m_x = (int) ev.GetX();
00314         m_y = (int) ev.GetY();
00315     }
00316     else if (ev.LeftIsDown() && ev.Moving()) {
00317         //Rotate the volume
00318         vuVector t = m_Camera.getPosition();
00319 
00320         m_Camera.rotateAboutUp(ev.GetX() - m_x);
00321         m_Camera.rotateAboutRight(ev.GetY() - m_y);
00322 
00323         m_Camera.gluLookAt();
00324 #if 0
00325         m_Data->setViewVectors(vuVector(0,0,1),
00326                                vuVector(0,1,0),
00327                                vuVector(1,0,0));
00328 #else
00329         m_Data->setViewVectors(m_Camera.getLookAtVector(),
00330                                m_Camera.getUpVector(),
00331                                m_Camera.getRightVector());
00332 #endif
00333         m_isRefineSlice = true;
00334         m_Data->setIsReRendering(true);
00335         m_glCanvas->redraw();
00336 
00337         //Store the click position.
00338         m_x = (int) ev.GetX();
00339         m_y = (int) ev.GetY();
00340     }
00341     else if (ev.RightIsDown() && ev.Moving()) {
00342         //Rotate the volume
00343         vuVector t = m_CameraLight.getPosition();
00344         float d = t.norm();
00345 
00346         m_CameraLight.translateXYZ(0.0f, 0.0f, d);
00347         m_CameraLight.rotateAboutUp(ev.GetX() - m_x);
00348         m_CameraLight.rotateAboutRight(ev.GetY() - m_y);
00349         m_CameraLight.translateXYZ(0.0f, 0.0f, -d);
00350 
00351         m_Data->setLightPosition(m_CameraLight.getPosition());
00352 
00353         m_isRefineSlice = false;
00354         m_Data->setIsReRendering(true);
00355         m_glCanvas->redraw();
00356 
00357         //Store the click position.
00358         m_x = (int) ev.GetX();
00359         m_y = (int) ev.GetY();
00360     }
00361     else if (ev.LeftDClick())
00362     {
00363         //Pop up the transfer function editor
00364         m_TFDialog.Show(true);
00365 #if 0   
00366         if (dlg.ShowModal() == wxID_OK) {
00367           m_TFunc = (vuTFDesignSpec&)dlg.getTransferFunc();
00368           m_Data->setTransferFunc(m_TFunc);
00369           m_glCanvas->redraw();
00370         }
00371 #endif
00372     }
00373     else if (ev.LeftUp() || ev.RightUp()) {
00374       if (m_isRefineSlice) {
00375         m_isRefineSlice = false;
00376         m_Data->setIsReRendering(true);
00377         m_glCanvas->redraw();
00378       }
00379     }
00380 }
00381 
00383 void vuFVR::onKeyboard(wxKeyEvent& event) 
00384 {
00385   char key = event.GetKeyCode();
00386 
00387   switch(key)
00388   {
00389     case 'a':
00390     case 'd':
00391     case 'A':
00392     case 'D':
00393       {
00394         wxColourData data;
00395         vuColourRGBa vuCol;
00396         wxColour     wxCol;
00397 
00398         if (key == 'a' || key == 'A') 
00399           vuCol = m_Data->getAmbientColour();
00400         else // key = 'd' || key == 'D'
00401           vuCol = m_Data->getDiffuseColour();
00402 
00403         wxCol.Set((unsigned char)(vuCol[0]*255),
00404                   (unsigned char)(vuCol[1]*255),
00405                   (unsigned char)(vuCol[2]*255));
00406         data.SetColour(wxCol);
00407         wxColourDialog dialog(this, &data);
00408         if (dialog.ShowModal() == wxID_OK) {
00409           wxColourData retData = dialog.GetColourData();
00410           wxCol   = retData.GetColour();
00411           vuCol   = vuColourRGBa(((float)wxCol.Red())/255,
00412                                  ((float)wxCol.Green())/255,
00413                                  ((float)wxCol.Blue())/255);
00414           if (key == 'a' || key == 'A')
00415             m_Data->setAmbientColour(vuCol);
00416           else // key = 'd' || key = 'D'
00417             m_Data->setDiffuseColour(vuCol);
00418           m_Data->setIsPostProcessing(true);
00419           m_glCanvas->redraw();
00420         }
00421         break;
00422       }
00423     case 'r':
00424     case 'R':
00425       {
00426         m_Data->setIsReRendering(false);
00427         m_Data->clearSlices();
00428         m_Data->refineSlice(0, 0, 30, 30);
00429         m_glCanvas->redraw();
00430         break;
00431       }
00432   }
00433 }
00434 
00435 bool vuFVR::IsReRendering() {
00436   return m_Data->IsReRendering();
00437 }
00438 
00439 void vuFVR::setIsReRendering(bool isit) {
00440   m_Data->setIsReRendering(isit);
00441 }

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