00001 #include "vuFVR.h"
00002 #include "vuColourRGBa.h"
00003 #include "../../wxUIElements/vuGLCanvas.h"
00004 #include <wx/colordlg.h>
00005
00006
00007
00008
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
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
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
00048
00049
00050 const char* vuFVR::getFileType()
00051 {
00052 return "11121";
00053 }
00054
00055
00056
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
00077 CreateStatusBar();
00078
00079 m_isRefineSlice = true;
00080
00081
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
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
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
00129
00130
00131 void vuFVR::addRight(wxSizer *sizer)
00132 {
00133
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
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
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
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
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
00307
00308
00309 void vuFVR::glOnMouse(wxMouseEvent &ev)
00310 {
00311 if (ev.LeftDown() || ev.RightDown()) {
00312
00313 m_x = (int) ev.GetX();
00314 m_y = (int) ev.GetY();
00315 }
00316 else if (ev.LeftIsDown() && ev.Moving()) {
00317
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
00338 m_x = (int) ev.GetX();
00339 m_y = (int) ev.GetY();
00340 }
00341 else if (ev.RightIsDown() && ev.Moving()) {
00342
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
00358 m_x = (int) ev.GetX();
00359 m_y = (int) ev.GetY();
00360 }
00361 else if (ev.LeftDClick())
00362 {
00363
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
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
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 }