00001 #include "vuTFDialogSpec.h"
00002 #include "vuColourRGBa.h"
00003 #include <iostream.h>
00004
00005
00006
00007
00008
00009 #define LIGHT(n) vuTFDialogSpec::idLIGHT+n
00010 #define SLDRES 1000
00011
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
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
00075 lSizer->Add(m_LightName[nlight], 0, wxALIGN_LEFT|wxALL,3);
00076 lSizer->Add(m_LightSlider[nlight], 1, wxALIGN_RIGHT|wxALL, 3 );
00077
00078 }
00079
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
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;
00102
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
00118 }
00119
00120
00121
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