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
00029 SetTitle(_titleString());
00030 CreateStatusBar();
00031
00032
00033
00034 m_Data->setFileName(DataFile);
00035
00036
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
00072
00073
00074 template <int SIZE, class TYPE>
00075 void vuSphericRevolver<SIZE,TYPE>::addBottom(wxSizer *sizer)
00076 {
00077
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
00096 {
00097 m_CHOICEnumberOfViews =
00098 new wxChoice(this, idNUMBEROFVIEWS, wxDefaultPosition, wxSize(45,20),
00099 0, NULL, wxMAXIMIZE_BOX, wxDefaultValidator, "Views");
00100
00101
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
00175 }
00176
00177 template <int SIZE, class TYPE>
00178 void vuSphericRevolver<SIZE,TYPE>::onKeyboard(wxKeyEvent& event)
00179 {
00180 switch(event.GetKeyCode()) {
00181 case '>': {
00182 int delta = (event.m_controlDown) ? 1 : 10;
00183 _updateScaleAndRefresh(m_ImageScale->GetValue() + delta);
00184 break;
00185 }
00186 case '<': {
00187 int delta = (event.m_controlDown) ? 1 : 10;
00188 _updateScaleAndRefresh(m_ImageScale->GetValue() - delta);
00189 break;
00190 }
00191 case ' ': {
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
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
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 }