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

vuTFDialogSpec.cpp

Go to the documentation of this file.
00001 #include "vuTFDialogSpec.h"
00002 #include "vuColourRGBa.h"
00003 #include <iostream.h>
00004 
00005 //----------------------------------------------------------------------------
00006 //------------------------- The vuTFDialogSpec event table -----------------
00007 //----------------------------------------------------------------------------
00008 
00009 #define LIGHT(n)        vuTFDialogSpec::idLIGHT+n
00010 #define SLDRES          1000
00011 //#define DO_OPACITY_SLIDE
00012 
00013 BEGIN_EVENT_TABLE(vuTFDialogSpec, vuTransferDialog)
00014   EVT_COMMAND_SCROLL(LIGHT(0), vuTFDialogSpec::OnSlideLight)
00015   EVT_COMMAND_SCROLL(LIGHT(1), vuTFDialogSpec::OnSlideLight)
00016   EVT_COMMAND_SCROLL(LIGHT(2), vuTFDialogSpec::OnSlideLight)
00017   EVT_COMMAND_SCROLL(LIGHT(3), vuTFDialogSpec::OnSlideLight)
00018   EVT_COMMAND_SCROLL(LIGHT(4), vuTFDialogSpec::OnSlideLight)
00019   EVT_COMMAND_SCROLL(LIGHT(5), vuTFDialogSpec::OnSlideLight)
00020   EVT_COMMAND_SCROLL(LIGHT(6), vuTFDialogSpec::OnSlideLight)
00021   EVT_COMMAND_SCROLL(LIGHT(7), vuTFDialogSpec::OnSlideLight)
00022   EVT_COMMAND_SCROLL(LIGHT(8), vuTFDialogSpec::OnSlideLight)
00023   EVT_COMMAND_SCROLL(LIGHT(9), vuTFDialogSpec::OnSlideLight)
00024   EVT_COMMAND_SCROLL(vuTFDialogSpec::idLIGHTINT, vuTFDialogSpec::OnSlideLight)
00025   EVT_BUTTON(vuTFDialogSpec::idSETUPNODES, vuTFDialogSpec::OnSetupNodes)
00026   EVT_BUTTON(vuTFDialogSpec::idEDITPAL, vuTFDialogSpec::OnEditPalette)
00027 END_EVENT_TABLE();
00028 
00029 //----------------------------------------------------------------------------
00030 //------------------------- The constructor ----------------------------------
00031 //----------------------------------------------------------------------------
00032 
00033 vuTFDialogSpec::vuTFDialogSpec(wxWindow *parent, vuTFDesignSpec &tf)
00034     : vuTransferDialog(parent, tf), m_PaletteDlg(this,tf.getPalette())
00035 {
00036     m_LightIntensity = NULL; 
00037     m_IName = NULL;
00038     for(word nlight = 0; nlight < TFDLG_NLIGHTS; nlight++) {
00039         m_LightName[nlight] = NULL;
00040         m_LightSlider[nlight] = NULL;
00041     }
00042     
00043     m_mktri = m_edpal = NULL;
00044     rebuildCustomSizer();
00045     m_IsUpdated = true;
00046 }
00047 
00048 void vuTFDialogSpec::buildCustomSizer()
00049 {
00050     vuTFDesignSpec& tf = (vuTFDesignSpec&)m_Canvas->getTransferFunc();
00051     m_NLights = tf.getNumLights();
00052     wxSize sliderSize(200,30);
00053     wxFlexGridSizer *lSizer = new wxFlexGridSizer(2);
00054     if(m_DoSpectral && m_NLights>0)
00055     {
00056         char lname[255];
00057         for(word nlight=0; nlight<m_NLights; nlight++)
00058         {
00059             sprintf(lname,"Light %i",nlight+1);
00060             if(!m_LightSlider[nlight])
00061             {
00062                 m_LightSlider[nlight] = new wxSlider(this, LIGHT(nlight),
00063                                                      SLDRES, 0, SLDRES,
00064                                                      wxDefaultPosition,
00065                                                      sliderSize,
00066                                                      wxSL_HORIZONTAL, 
00067                                                      wxDefaultValidator,
00068                                                      lname);
00069                 m_LightName[nlight] = new wxStaticText(this,-1,lname);
00070             }
00071             if(nlight == 0)
00072                 m_LightSlider[nlight]->SetValue(SLDRES);
00073             else m_LightSlider[nlight]->SetValue(0);
00074             //wxBoxSizer *lSizer = new wxBoxSizer(wxHORIZONTAL);
00075             lSizer->Add(m_LightName[nlight], 0, wxALIGN_LEFT|wxALL,3);
00076             lSizer->Add(m_LightSlider[nlight], 1, wxALIGN_RIGHT|wxALL, 3 );
00077             //m_CustomSizer->Add(lSizer,0,wxALIGN_CENTER);
00078         }
00079         //int(SLDRES*TFDLG_INTENSITY0/TFDLG_MAX_INTENSITY);
00080         if(!m_LightIntensity)
00081         {
00082             m_LightIntensity = new wxSlider(this, idLIGHTINT, SLDRES, 0,
00083                                             SLDRES,
00084                                             wxDefaultPosition, sliderSize,
00085                                             wxSL_HORIZONTAL, 
00086                                             wxDefaultValidator, lname);
00087             m_IName = new wxStaticText(this,-1,"Intensity");
00088         }
00089         m_LightIntensity->SetValue(SLDRES/3);
00090         //wxBoxSizer *lSizer = new wxBoxSizer(wxHORIZONTAL);
00091         lSizer->Add(m_IName, 0,wxALIGN_LEFT|wxALL,3);
00092         lSizer->Add(m_LightIntensity, 1, wxALIGN_RIGHT|wxALL, 3 );
00093         m_CustomSizer->Add(lSizer,0,wxALIGN_CENTER);
00094     }
00095     if(!m_mktri)
00096         m_mktri = new wxButton(this,idSETUPNODES,"Make Triangles");
00097     m_CustomSizer->Add(m_mktri,0,wxALIGN_CENTER|wxALL,1);
00098     if(!m_edpal)
00099         m_edpal = new wxButton(this,idEDITPAL,"Edit Palette");
00100     m_CustomSizer->Add(m_edpal,0,wxALIGN_CENTER|wxALL,1);
00101     m_NoSliderUpdates = 0;  // slider handler should react
00102     //tf.setupMtlTriAlphaNodes();
00103     if(m_NLights) {
00104         wxScrollEvent sev(0,LIGHT(0));
00105         OnSlideLight(sev);
00106     }
00107 }
00108 
00109 void vuTFDialogSpec::updateSliders() {
00110     vuTFDesignSpec& tf = (vuTFDesignSpec&)m_Canvas->getTransferFunc();
00111     for(word l=0;l<m_NLights;l++)
00112     {
00113         float lightweight = tf.getLightNode(l).weight;
00114         m_LightSlider[l]->SetValue(int(lightweight*SLDRES));
00115     }
00116     m_LightIntensity->SetValue((int)(tf.getLightIntensity()*float(SLDRES)/TFDLG_MAX_INTENSITY));
00117 //    m_Canvas->redraw();
00118 }
00119 
00120 //----------------------------------------------------------------------------
00121 //------------------------- public: OnSlideLight() -----------------
00122 //----------------------------------------------------------------------------
00123 
00124 void vuTFDialogSpec::OnSlideLight(wxScrollEvent& event)
00125 {
00126     if(m_NoSliderUpdates) {
00127         m_NoSliderUpdates--;
00128         return;
00129     }
00130     
00131     dword slId = event.GetId()-LIGHT(0);
00132     vuTFDesignSpec& tf = (vuTFDesignSpec&)m_Canvas->getTransferFunc();
00133     float lightweight[TFDLG_NLIGHTS];
00134     float summme = 0;
00135     for(dword l=0;l<m_NLights;l++) {
00136         if(slId == l)
00137             lightweight[l] = m_LightSlider[l]->GetValue()/float(SLDRES);
00138         else
00139             lightweight[l] = tf.getLightNode(l).weight;
00140         summme += lightweight[l];
00141     }
00142 
00143     float intensity = (m_LightIntensity->GetValue()/float(SLDRES))*TFDLG_MAX_INTENSITY;
00144     if(slId < m_NLights && slId >= 0)
00145     {
00146         float scale = 1;
00147         float addval = 0;
00148         if(summme > 0.0f)
00149         {
00150             float rest = summme-lightweight[slId];
00151             if(rest == 0)
00152                 addval = (1-lightweight[slId])/(m_NLights-1);
00153             else
00154                 scale = (1-lightweight[slId])/rest;
00155         }
00156         for(word l=0;l<m_NLights;l++)
00157         {
00158             if(l!=slId)
00159             {
00160                 lightweight[l] = (lightweight[l]*scale)+addval;
00161                 m_NoSliderUpdates++;
00162                 m_LightSlider[l]->SetValue(int(lightweight[l]*SLDRES));
00163             }
00164         }
00165 #ifdef DO_OPACITY_SLIDE
00166         const vuTFDesign::OpacityNode *on = m_Canvas->getActiveOpacity();
00167         if (on != 0) tf.setLightOpacityNode(slId,(*on).intensity);
00168         else tf.setLightOpacityNode(slId, -1);
00169 #endif
00170     } 
00171     tf.setLightIntensity(intensity);
00172     tf.weightLights(lightweight);
00173     tf.setAlphaByLight();
00174     tf.generateFunction();
00175     m_Canvas->redraw();
00176     m_IsUpdated = true;
00177     repaintParent();
00178 }
00179 
00180 //----------------------------------------------------------------------------
00181 
00182 void vuTFDialogSpec::OnSetupNodes(wxCommandEvent &ev)
00183 {
00184     vuTFDesignSpec& tf = (vuTFDesignSpec&)m_Canvas->getTransferFunc();
00185     tf.setupMtlTriAlphaNodes();
00186     tf.generateFunction();
00187     m_Canvas->redraw();
00188     repaintParent();
00189 }
00190 
00191 //----------------------------------------------------------------------------
00193 #if wxMINOR_VERSION < 5
00194 void vuTFDialogSpec::OnEditPalette(void)
00195 #else
00196 void vuTFDialogSpec::OnEditPalette(wxCommandEvent& ev)
00197 #endif
00198 {
00199     vuTFDesignSpec& tf = (vuTFDesignSpec&)m_Canvas->getTransferFunc();
00200     tf.updatePalette();
00201     m_PaletteDlg.UpdateWidgets();
00202     if (m_PaletteDlg.ShowModal() == wxID_OK)
00203     {
00204                 tf.updateFromPalette();
00205                 if(m_NLights!=tf.getNumLights())
00206                         rebuildCustomSizer();
00207     }
00208     tf.generateFunction();
00209     m_Canvas->redraw();
00210     m_IsUpdated = true;
00211     repaintParent();
00212 }
00213 
00214 void vuTFDialogSpec::editSpecColour(dword id)
00215 {
00216     vuTFDesignSpec& tf = (vuTFDesignSpec&)m_Canvas->getTransferFunc();
00217     tf.updatePalette();
00218     m_PaletteDlg.UpdateWidgets();
00219     m_PaletteDlg.selectSpec(id,-1);
00220     if (m_PaletteDlg.ShowModal() == wxID_OK)
00221     {
00222         tf.updateFromPalette();
00223         if(m_NLights!=tf.getNumLights())
00224             rebuildCustomSizer();
00225     }
00226     tf.generateFunction();
00227     m_Canvas->redraw();
00228     m_IsUpdated = true;
00229     repaintParent();
00230 }
00231 
00232 //----------------------------------------------------------------------------
00233 //----------------------------------------------------------------------------

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