00001 #include "vuSphericBrowser.h"
00002
00003 #define BROWSER_MAX 10000
00004
00005 template<int SIZE,class TYPE>
00006 vuSphericBrowser<SIZE,TYPE>::vuSphericBrowser()
00007 {
00008 m_Data = NULL;
00009 }
00010
00011 template<int SIZE,class TYPE>
00012 vuSphericBrowser<SIZE,TYPE>::~vuSphericBrowser()
00013 {
00014 if (m_Data != NULL) {
00015 delete m_Data;
00016 m_Data = NULL;
00017 }
00018 }
00019
00020 template<int SIZE,class TYPE>
00021 const char *vuSphericBrowser<SIZE,TYPE>::_titleString()
00022 {
00023 return "Spheric Lightfield Browser";
00024 }
00025
00026 template<int SIZE,class TYPE>
00027 bool vuSphericBrowser<SIZE,TYPE>::init(const char* DataFile)
00028 {
00029 SetEvtHandlerEnabled(true);
00030
00031
00032 SetTitle(_titleString());
00033 CreateStatusBar();
00034
00035
00036
00037 m_Data->setFileName(DataFile);
00038
00039
00040 bool success = m_Data->read();
00041 if (success) {
00042 m_glCanvas->SetSize(512,512);
00043 vuString str(m_Data->getNumberOfViews() - 1);
00044 m_ViewsText->SetLabel(str.c_str());
00045 str = "";
00046 str += _titleString();
00047 str += ": [";
00048 str += m_Data->getWidth();
00049 str += "x";
00050 str += m_Data->getHeight();
00051 str += "] x ";
00052 str += m_Data->getNumberOfViews();
00053 str += " Views <";
00054 str += SIZE;
00055 str += " ";
00056 str += m_Data->_typeName();
00057 str += ">";
00058 SetTitle(str.c_str());
00059 Fit();
00060 }
00061 else {
00062 wxMessageDialog dlg(this,m_Data->getErrorMessage(),
00063 _titleString(), wxOK);
00064 dlg.ShowModal();
00065 }
00066 return success;
00067 }
00068
00069 template<int SIZE,class TYPE>
00070 vuCamera* vuSphericBrowser<SIZE,TYPE>::getCamera()
00071 {
00072 return NULL;
00073 }
00074
00075 template<int SIZE,class TYPE>
00076 vuImage* vuSphericBrowser<SIZE,TYPE>::getCurrentImage()
00077 {
00078 return NULL;
00079 }
00080
00081 template<int SIZE,class TYPE>
00082 void vuSphericBrowser<SIZE,TYPE>::DrawFromImage()
00083 {
00084 }
00085
00086 template<int SIZE,class TYPE>
00087 void vuSphericBrowser<SIZE,TYPE>::DrawAgain()
00088 {
00089 }
00090
00091 template<int SIZE,class TYPE>
00092 wxString vuSphericBrowser<SIZE,TYPE>::helpText()
00093 {
00094 wxString str("");
00095
00096 str +=
00097 "\n Keyboard bindings:\n\n"
00098 "\t ?\t\t\t\t this help window\n"
00099 "\t UP\t\t\t previous view\n"
00100 "\t DOWN\t\t\t next view\n"
00101 "\t LEFT\t\t\t decrease image scaling\n"
00102 "\t RIGHT\t\t\t increase image scaling\n"
00103 "\t SHIFT+LEFT\t\t slowly decrease image scaling\n"
00104 "\t SHIFT+RIGHT\t\t slowly increase image scaling\n"
00105 "\t SPACE\t\t\t set image scaling to one (same as 'fit' button)\n";
00106
00107 return str;
00108 }
00109
00110 template<int SIZE,class TYPE>
00111 void vuSphericBrowser<SIZE,TYPE>::addRight(wxSizer *sizer)
00112 {
00113
00114 sizer->Add(new wxStaticText(this, -1, "0", wxDefaultPosition,
00115 wxSize(40,20), wxALIGN_CENTRE), 0,
00116 wxEXPAND, 5);
00117
00118 m_ViewSlider = new wxSlider(this, idBROWSELIGHTFIELD, 0, 0,
00119 BROWSER_MAX,
00120 wxDefaultPosition, wxSize(30,300),
00121 wxSL_VERTICAL, wxDefaultValidator,"browser");
00122 sizer->Add(m_ViewSlider, 1, wxALL, 10);
00123
00124 m_ViewsText = new wxStaticText(this, -1, "0", wxDefaultPosition,
00125 wxSize(40,20), wxALIGN_CENTRE);
00126 sizer->Add(m_ViewsText, 0, wxEXPAND, 5);
00127 }
00128
00129 template<int SIZE,class TYPE>
00130 void vuSphericBrowser<SIZE,TYPE>::addBottom(wxSizer *sizer)
00131 {
00132
00133 wxBoxSizer *verSpacer = new wxBoxSizer(wxVERTICAL);
00134 wxBoxSizer *horSpacer = new wxBoxSizer(wxHORIZONTAL);
00135
00136 m_ImageScale = new wxSlider(this, idIMAGESCALE, 100, 1,
00137 1500,
00138 wxDefaultPosition, wxSize(300,18),
00139 wxSL_HORIZONTAL,wxDefaultValidator,"imageScale");
00140
00141 horSpacer->Add(10,0);
00142 horSpacer->Add(new wxStaticText(this, -1, "Scale:"));
00143 horSpacer->Add(5,0);
00144 horSpacer->Add(m_ImageScale);
00145 horSpacer->Add(5,0);
00146 horSpacer->Add(new wxButton(this, idIMAGESCALE2ONE, "fit",
00147 wxDefaultPosition, wxSize(40,18)));
00148 horSpacer->Add(40,0);
00149
00150 verSpacer->Add(1,10);
00151 verSpacer->Add(horSpacer);
00152 verSpacer->Add(1,10);
00153 sizer->Add(verSpacer);
00154 }
00155
00156
00157 template<int SIZE,class TYPE>
00158 bool vuSphericBrowser<SIZE,TYPE>::glInit()
00159 {
00160 if (m_Data == NULL) return false;
00161 m_Data->initOpenGL();
00162 return true;
00163 }
00164
00165 template<int SIZE,class TYPE>
00166 void vuSphericBrowser<SIZE,TYPE>::glRender()
00167 {
00168 m_Data->render();
00169 vuFixelMap<SIZE,TYPE> map = *(m_Data->getMap());
00170
00171 map.scaleAndBias((float)m_ImageScale->GetValue()/100);
00172 map.glRender();
00173
00174 char msg[512];
00175 vuVector lookFrom = m_Data->getCurrentView()->getLookFrom();
00176 sprintf(msg,"view: %lu x=%6.3f y=%6.3f z=%6.3f",
00177 m_Data->getViewIndex(), lookFrom[0], lookFrom[1], lookFrom[2]);
00178 wxString statusText = msg;
00179 statusText += " -- Press '?' for help";
00180
00181 SetStatusText(statusText);
00182 }
00183
00184 template<int SIZE,class TYPE>
00185 void vuSphericBrowser<SIZE,TYPE>::glResize()
00186 {
00187 m_Data->glResize(m_glCanvas->getWidth(), m_glCanvas->getHeight());
00188 m_glCanvas->redraw();
00189 }
00190
00191 template<int SIZE,class TYPE>
00192 void vuSphericBrowser<SIZE,TYPE>::glOnMouse(wxMouseEvent &ev)
00193 {
00194
00195 }
00196
00197 template<int SIZE,class TYPE>
00198 void vuSphericBrowser<SIZE,TYPE>::OnChar(wxKeyEvent &event)
00199 {
00200 switch(event.GetKeyCode()) {
00201 case '?' :
00202 onKeyboardHelp(event);
00203 break;
00204 case 317: {
00205 dword idx = m_Data->getViewIndex();
00206 if (idx > 0)
00207 _updateIndexAndRefresh(idx - 1);
00208 break;
00209 }
00210 case 319: {
00211 dword idx = m_Data->getViewIndex() + 1;
00212 if (idx < m_Data->getNumberOfViews())
00213 _updateIndexAndRefresh(idx);
00214 break;
00215 }
00216 case 318: {
00217 int delta = (event.m_shiftDown) ? 1 : 10;
00218 _updateScaleAndRefresh(m_ImageScale->GetValue() + delta);
00219 break;
00220 }
00221 case 316: {
00222 int delta = (event.m_shiftDown) ? 1 : 10;
00223 _updateScaleAndRefresh(m_ImageScale->GetValue() - delta);
00224 break;
00225 }
00226 case ' ': {
00227 _updateScaleAndRefresh(100);
00228 }
00229 }
00230 }
00231
00232 template<int SIZE,class TYPE>
00233 void vuSphericBrowser<SIZE,TYPE>::OnBrowseViews(wxScrollEvent& event)
00234 {
00235 dword idx;
00236
00237 idx = m_ViewSlider->GetValue()*m_Data->getNumberOfViews()/BROWSER_MAX;
00238 m_Data->setViewIndex(idx);
00239 m_glCanvas->redraw();
00240 }
00241
00242 template<int SIZE,class TYPE>
00243 void vuSphericBrowser<SIZE,TYPE>::OnScaleImage(wxScrollEvent& event)
00244 {
00245 m_glCanvas->redraw();
00246 }
00247
00248 template<int SIZE,class TYPE>
00249 #if wxMINOR_VERSION < 5
00250 void vuSphericBrowser<SIZE,TYPE>::OnScaleImage2One(wxScrollEvent& event)
00251 #else
00252 void vuSphericBrowser<SIZE,TYPE>::OnScaleImage2One(wxCommandEvent& event)
00253 #endif
00254 {
00255 m_ImageScale->SetValue(100);
00256 m_glCanvas->redraw();
00257 }
00258
00259
00260
00261
00262
00263 template<int SIZE,class TYPE>
00264 void vuSphericBrowser<SIZE,TYPE>::_updateIndexAndRefresh(dword idx)
00265 {
00266 m_Data->setViewIndex(idx);
00267 m_ViewSlider->SetValue(BROWSER_MAX*idx/(m_Data->getNumberOfViews()-1));
00268 m_glCanvas->redraw();
00269 }
00270
00271 template<int SIZE,class TYPE>
00272 void vuSphericBrowser<SIZE,TYPE>::_updateScaleAndRefresh(int scale)
00273 {
00274 if (scale >= 1 && scale <= 1500) {
00275 m_ImageScale->SetValue(scale);
00276 m_glCanvas->redraw();
00277 }
00278 }