00001
00002
00003
00004 #include "stdafx.h"
00005 #include "3dvis.h"
00006 #include "VolumeDialog.h"
00007
00008
00009 #include "raycaster.h"
00010 extern Raycaster *raycaster;
00011
00012
00013
00014 #ifndef XY
00015 #define XY 0
00016 #endif
00017
00018 #ifndef XZ
00019 #define XZ 1
00020 #endif
00021
00022 #ifndef YZ
00023 #define YZ 2
00024 #endif
00025
00026
00027
00028
00029 #ifdef _DEBUG
00030 #define new DEBUG_NEW
00031 #undef THIS_FILE
00032 static char THIS_FILE[] = __FILE__;
00033 #endif
00034
00036
00037
00038
00039 CVolumeDialog::CVolumeDialog(CWnd* pParent )
00040 : CDialog(CVolumeDialog::IDD, pParent) {
00041
00042 m_dFHTreshold = 1500;
00043 m_fAmbient = 0.2f;
00044 m_fDiffuse = 0.2f;
00045 m_dHeight = 0;
00046 m_dWidth = 0;
00047 m_fZoom = 1.1f;
00048 m_dHighlight = 8.0f;
00049 m_dLX = 300;
00050 m_dLY = 300;
00051 m_dLZ = 300;
00052 m_fSpecular = 0.2f;
00053 m_bLight = FALSE;
00054
00055
00056
00057 m_dRotateTo = NONE;
00058 m_dRenderPlane = XZ;
00059 m_dRenderMode = FH;
00060
00061
00062 m_BGColor = 0x00000000;
00063 m_dX = 92;
00064 m_dY = -300;
00065 m_dZ = 85;
00066
00067 m_bfirst = true;
00068 }
00069
00070
00071 void CVolumeDialog::DoDataExchange(CDataExchange* pDX) {
00072 CDialog::DoDataExchange(pDX);
00073
00074 DDX_Text(pDX, IDC_EDIT_FH_THRESHOLD, m_dFHTreshold);
00075 DDV_MinMaxInt(pDX, m_dFHTreshold, 0, 4095);
00076 DDX_Text(pDX, IDC_EDIT_AMBIENT, m_fAmbient);
00077 DDV_MinMaxFloat(pDX, m_fAmbient, 0.f, 1.f);
00078 DDX_Text(pDX, IDC_EDIT_DIFFUSE, m_fDiffuse);
00079 DDV_MinMaxFloat(pDX, m_fDiffuse, 0.f, 1.f);
00080 DDX_Text(pDX, IDC_EDIT_HEIGHT, m_dHeight);
00081 DDV_MinMaxInt(pDX, m_dHeight, 0, 1600);
00082 DDX_Text(pDX, IDC_EDIT_WIDTH, m_dWidth);
00083 DDV_MinMaxInt(pDX, m_dWidth, 0, 1800);
00084 DDX_Text(pDX, IDC_EDIT_ZOOM, m_fZoom);
00085 DDV_MinMaxFloat(pDX, m_fZoom, 0.1f, 10.f);
00086 DDX_Text(pDX, IDC_EDIT_X, m_dX);
00087 DDV_MinMaxInt(pDX, m_dX, -1000, 1000);
00088 DDX_Text(pDX, IDC_EDIT_Y, m_dY);
00089 DDV_MinMaxInt(pDX, m_dY, -1000, 1000);
00090 DDX_Text(pDX, IDC_EDIT_Z, m_dZ);
00091 DDV_MinMaxInt(pDX, m_dZ, -1000, 1000);
00092 DDX_Text(pDX, IDC_EDIT_HIGHLIGHT, m_dHighlight);
00093 DDX_Text(pDX, IDC_EDIT_LIGHTPOS_X, m_dLX);
00094 DDX_Text(pDX, IDC_EDIT_LIGHTPOS_Y, m_dLY);
00095 DDX_Text(pDX, IDC_EDIT_LIGHTPOS_Z, m_dLZ);
00096 DDX_Text(pDX, IDC_EDIT_SPECULAR, m_fSpecular);
00097 DDX_Check(pDX, IDC_CHECK_LIGHT, m_bLight);
00098
00099 }
00100
00101
00102 BEGIN_MESSAGE_MAP(CVolumeDialog, CDialog)
00103
00104 ON_WM_SHOWWINDOW()
00105 ON_BN_CLICKED(IDC_RADIO_FIRSTHIT, OnRadioFirsthit)
00106 ON_BN_CLICKED(IDC_RADIO_STANDARD, OnRadioStandard)
00107 ON_BN_CLICKED(IDC_RADIO_MIP, OnRadioMip)
00108 ON_BN_CLICKED(IDC_RADIO_VOL_XY, OnRadioVolXy)
00109 ON_BN_CLICKED(IDC_RADIO_VOL_XZ, OnRadioVolXz)
00110 ON_BN_CLICKED(IDC_RADIO_VOL_YZ, OnRadioVolYz)
00111 ON_EN_CHANGE(IDC_EDIT_FH_THRESHOLD, OnChangeEditFhThreshold)
00112 ON_EN_CHANGE(IDC_EDIT_ZOOM, OnChangeEditZoom)
00113 ON_EN_CHANGE(IDC_EDIT_HEIGHT, OnChangeEditHeight)
00114 ON_EN_CHANGE(IDC_EDIT_WIDTH, OnChangeEditWidth)
00115 ON_EN_CHANGE(IDC_EDIT_AMBIENT, OnChangeEditAmbient)
00116 ON_EN_CHANGE(IDC_EDIT_DIFFUSE, OnChangeEditDiffuse)
00117 ON_BN_CLICKED(IDC_BUTTON_BGCOLOR, OnButtonBgcolor)
00118 ON_WM_PAINT()
00119 ON_EN_CHANGE(IDC_EDIT_X, OnChangeEditX)
00120 ON_EN_CHANGE(IDC_EDIT_Y, OnChangeEditY)
00121 ON_EN_CHANGE(IDC_EDIT_Z, OnChangeEditZ)
00122 ON_BN_CLICKED(IDC_CHECK_LIGHT, OnCheckLight)
00123 ON_EN_CHANGE(IDC_EDIT_LIGHTPOS_X, OnChangeEditLightposX)
00124 ON_EN_CHANGE(IDC_EDIT_LIGHTPOS_Y, OnChangeEditLightposY)
00125 ON_EN_CHANGE(IDC_EDIT_LIGHTPOS_Z, OnChangeEditLightposZ)
00126 ON_EN_CHANGE(IDC_EDIT_HIGHLIGHT, OnChangeEditHighlight)
00127 ON_EN_CHANGE(IDC_EDIT_SPECULAR, OnChangeEditSpecular)
00128 ON_BN_CLICKED(IDC_RADIO_XRAY, OnRadioXray)
00129
00130 END_MESSAGE_MAP()
00131
00132
00133
00134
00135 void CVolumeDialog::OnShowWindow(BOOL bShow, UINT nStatus) {
00136 CDialog::OnShowWindow(bShow, nStatus);
00137
00138 if (!bShow || !raycaster)
00139 return;
00140
00141
00142 int button;
00143 switch (m_dRenderPlane) {
00144 case XY:
00145 OnRadioVolXy();
00146 button = IDC_RADIO_VOL_XY;
00147 break;
00148 case XZ:
00149 OnRadioVolXz();
00150 button = IDC_RADIO_VOL_XZ;
00151 break;
00152 case YZ:
00153 OnRadioVolYz();
00154 button = IDC_RADIO_VOL_YZ;
00155 break;
00156 default:
00157 button = -1;
00158 break;
00159 }
00160
00161 if (button != -1)
00162 ((CButton *)GetDlgItem(button))->SetCheck(1);
00163
00164
00165 switch (m_dRenderMode) {
00166 case FH:
00167 button = IDC_RADIO_FIRSTHIT;
00168 break;
00169 case STANDARD:
00170 button = IDC_RADIO_STANDARD;
00171 break;
00172 default:
00173 button = -1;
00174 break;
00175 }
00176
00177 if (button != -1)
00178 ((CButton *)GetDlgItem(button))->SetCheck(1);
00179
00180
00181
00182 CDC *cdc = (CDC *)this->GetDC();
00183 cdc->FillSolidRect(117, 380, 30, 22, m_BGColor);
00184
00185
00186 raycaster->GetScreenShotImage(m_dWidth, m_dHeight);
00187
00188 UpdateData(FALSE);
00189 }
00190
00191
00192 void CVolumeDialog::OnRadioFirsthit() {
00193 raycaster->SetRendermode(FH);
00194 m_dRenderMode = FH;
00195 }
00196
00197 void CVolumeDialog::OnRadioStandard() {
00198 raycaster->SetRendermode(STANDARD);
00199 m_dRenderMode = STANDARD;
00200 }
00201
00202
00203 void CVolumeDialog::OnRadioMip() {
00204 raycaster->SetRendermode(MI);
00205 m_dRenderMode = MI;
00206 }
00207
00208
00209 void CVolumeDialog::OnRadioXray() {
00210 raycaster->SetRendermode(XRAY);
00211 m_dRenderMode = XRAY;
00212 }
00213
00214
00215 void CVolumeDialog::OnRadioVolXy() {
00216 if (!raycaster)
00217 return;
00218
00219 if (m_bfirst) {
00220 m_bfirst = false;
00221 return;
00222 }
00223
00224 m_dRotateTo = XY;
00225 m_dRotateTo = NONE;
00226 raycaster->SetViewingPlanePos(92, 128, -300);
00227
00228 m_dX = 92;
00229 m_dY = 128;
00230 m_dZ = -300;
00231
00232 UpdateData(FALSE);
00233 }
00234
00235 void CVolumeDialog::OnRadioVolXz() {
00236 if (!raycaster)
00237 return;
00238
00239 m_dRotateTo = XZ;
00240 m_dRotateTo = NONE;
00241 raycaster->SetViewingPlanePos(92, -300, 85);
00242
00243 m_dX = 92;
00244 m_dY = -300;
00245 m_dZ = 85;
00246
00247 UpdateData(FALSE);
00248 }
00249
00250 void CVolumeDialog::OnRadioVolYz() {
00251 if (!raycaster)
00252 return;
00253
00254 m_dRotateTo = YZ;
00255 m_dRotateTo = NONE;
00256 raycaster->SetViewingPlanePos(300, 128, 85);
00257
00258 m_dX = 300;
00259 m_dY = 128;
00260 m_dZ = 85;
00261
00262 UpdateData(FALSE);
00263 }
00264
00265 void CVolumeDialog::OnChangeEditFhThreshold() {
00266 UpdateData(TRUE);
00267 raycaster->SetTreshold(m_dFHTreshold);
00268 }
00269
00270 void CVolumeDialog::OnChangeEditZoom() {
00271 UpdateData(TRUE);
00272 raycaster->Zoom(m_fZoom);
00273 }
00274
00275 void CVolumeDialog::OnChangeEditHeight() {
00276 UpdateData(TRUE);
00277 raycaster->SetHeight(m_dHeight);
00278 }
00279
00280 void CVolumeDialog::OnChangeEditWidth() {
00281 UpdateData(TRUE);
00282 raycaster->SetWidth(m_dWidth);
00283 }
00284
00285 void CVolumeDialog::OnChangeEditAmbient() {
00286 UpdateData(TRUE);
00287 raycaster->SetAmbient(m_fAmbient);
00288 }
00289
00290 void CVolumeDialog::OnChangeEditDiffuse() {
00291 UpdateData(TRUE);
00292 raycaster->SetDiffuse(m_fDiffuse);
00293 }
00294
00295 void CVolumeDialog::OnButtonBgcolor() {
00296 CColorDialog colDiag;
00297 if (colDiag.DoModal() != IDOK)
00298 return;
00299
00300 m_BGColor = colDiag.GetColor();
00301
00302 CDC *cdc = (CDC *)this->GetDC();
00303 cdc->FillSolidRect(117, 380, 30, 22, m_BGColor);
00304
00305 unsigned char col[3] = { m_BGColor & 0x000000FF,
00306 (m_BGColor & 0x0000FF00) >> 8,
00307 (m_BGColor & 0x00FF0000) >> 16 };
00308
00309 raycaster->SetBackgroundColor(col[0], col[1], col[2]);
00310 }
00311
00312 void CVolumeDialog::OnPaint() {
00313 CPaintDC dc(this);
00314
00315 dc.FillSolidRect(117, 380, 30, 22, m_BGColor);
00316 }
00317
00318 void CVolumeDialog::OnChangeEditX() {
00319 UpdateData(TRUE);
00320 raycaster->SetViewingPlanePos(m_dX, m_dY, m_dZ);
00321 }
00322
00323 void CVolumeDialog::OnChangeEditY() {
00324 UpdateData(TRUE);
00325 raycaster->SetViewingPlanePos(m_dX, m_dY, m_dZ);
00326 }
00327
00328 void CVolumeDialog::OnChangeEditZ() {
00329 UpdateData(TRUE);
00330 raycaster->SetViewingPlanePos(m_dX, m_dY, m_dZ);
00331 }
00332
00333 #pragma warning ( push )
00334 #pragma warning (disable : 4800)
00335
00336 void CVolumeDialog::OnCheckLight() {
00337 UpdateData(TRUE);
00338 raycaster->SetLight(m_bLight);
00339 }
00340
00341 #pragma warning ( pop )
00342
00343
00344 void CVolumeDialog::OnChangeEditLightposX() {
00345 UpdateData(TRUE);
00346 raycaster->SetLightpos(VECTOR(m_dLX, m_dLY, m_dLZ));
00347 }
00348
00349 void CVolumeDialog::OnChangeEditLightposY() {
00350 UpdateData(TRUE);
00351 raycaster->SetLightpos(VECTOR(m_dLX, m_dLY, m_dLZ));
00352 }
00353
00354 void CVolumeDialog::OnChangeEditLightposZ() {
00355 UpdateData(TRUE);
00356 raycaster->SetLightpos(VECTOR(m_dLX, m_dLY, m_dLZ));
00357 }
00358
00359 void CVolumeDialog::OnChangeEditHighlight() {
00360 UpdateData(TRUE);
00361 raycaster->SetHighlight(m_dHighlight);
00362 }
00363
00364 void CVolumeDialog::OnChangeEditSpecular() {
00365 UpdateData(TRUE);
00366 raycaster->SetSpecular(m_fSpecular);
00367 }