00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #include <windows.h>
00013 #include <commctrl.h>
00014 #include "winviewoptsdlg.h"
00015 #include "..\celengine\render.h"
00016
00017 #include "res/resource.h"
00018
00019 using namespace std;
00020
00021 static const int DistanceSliderRange = 10000;
00022 static const float MinDistanceLimit = 1.0f;
00023 static const float MaxDistanceLimit = 1.0e6f;
00024
00025 static BOOL APIENTRY ViewOptionsProc(HWND hDlg,
00026 UINT message,
00027 UINT wParam,
00028 LONG lParam)
00029 {
00030 ViewOptionsDialog* Dlg = reinterpret_cast<ViewOptionsDialog*>(GetWindowLong(hDlg, DWL_USER));
00031
00032 switch (message)
00033 {
00034 case WM_INITDIALOG:
00035 {
00036 ViewOptionsDialog* Dlg = reinterpret_cast<ViewOptionsDialog*>(lParam);
00037 if (Dlg == NULL)
00038 return EndDialog(hDlg, 0);
00039 SetWindowLong(hDlg, DWL_USER, lParam);
00040
00041
00042 Dlg->initialRenderFlags = Dlg->appCore->getRenderer()->getRenderFlags();
00043 Dlg->initialLabelMode = Dlg->appCore->getRenderer()->getLabelMode();
00044 Dlg->initialHudDetail = Dlg->appCore->getHudDetail();
00045
00046
00047 Dlg->SetControls(hDlg);
00048
00049 return(TRUE);
00050 }
00051 break;
00052
00053 case WM_COMMAND:
00054 {
00055 Renderer* renderer = Dlg->appCore->getRenderer();
00056 uint32 renderFlags = renderer->getRenderFlags();
00057 uint32 labelMode = renderer->getLabelMode();
00058 uint32 orbitMask = renderer->getOrbitMask();
00059
00060 switch (LOWORD(wParam))
00061 {
00062 case IDC_SHOWATMOSPHERES:
00063 renderer->setRenderFlags(renderFlags ^ Renderer::ShowAtmospheres);
00064 break;
00065 case IDC_SHOWCELESTIALGRID:
00066 renderer->setRenderFlags(renderFlags ^ Renderer::ShowCelestialSphere);
00067 break;
00068 case IDC_SHOWCLOUDS:
00069 renderer->setRenderFlags(renderFlags ^ Renderer::ShowCloudMaps);
00070 break;
00071 case IDC_SHOWCONSTELLATIONS:
00072 renderer->setRenderFlags(renderFlags ^ Renderer::ShowDiagrams);
00073 break;
00074 case IDC_SHOWECLIPSESHADOWS:
00075 renderer->setRenderFlags(renderFlags ^ Renderer::ShowEclipseShadows);
00076 break;
00077 case IDC_SHOWGALAXIES:
00078 renderer->setRenderFlags(renderFlags ^ Renderer::ShowGalaxies);
00079 break;
00080 case IDC_SHOWNEBULAE:
00081 renderer->setRenderFlags(renderFlags ^ Renderer::ShowNebulae);
00082 break;
00083 case IDC_SHOWNIGHTSIDELIGHTS:
00084 renderer->setRenderFlags(renderFlags ^ Renderer::ShowNightMaps);
00085 break;
00086 case IDC_SHOWORBITS:
00087 renderer->setRenderFlags(renderFlags ^ Renderer::ShowOrbits);
00088 break;
00089 case IDC_PLANETORBITS:
00090 renderer->setOrbitMask(orbitMask ^ Body::Planet);
00091 break;
00092 case IDC_MOONORBITS:
00093 renderer->setOrbitMask(orbitMask ^ Body::Moon);
00094 break;
00095 case IDC_ASTEROIDORBITS:
00096 renderer->setOrbitMask(orbitMask ^ Body::Asteroid);
00097 break;
00098 case IDC_COMETORBITS:
00099 renderer->setOrbitMask(orbitMask ^ Body::Comet);
00100 break;
00101 case IDC_SPACECRAFTORBITS:
00102 renderer->setOrbitMask(orbitMask ^ Body::Spacecraft);
00103 break;
00104 case IDC_SHOWPLANETS:
00105 renderer->setRenderFlags(renderFlags ^ Renderer::ShowPlanets);
00106 break;
00107 case IDC_SHOWSTARS:
00108 renderer->setRenderFlags(renderFlags ^ Renderer::ShowStars);
00109 break;
00110 case IDC_SHOWCONSTELLATIONBORDERS:
00111 renderer->setRenderFlags(renderFlags ^ Renderer::ShowBoundaries);
00112 break;
00113 case IDC_SHOWRINGSHADOWS:
00114 renderer->setRenderFlags(renderFlags ^ Renderer::ShowRingShadows);
00115 break;
00116 case IDC_SHOWCOMETTAILS:
00117 renderer->setRenderFlags(renderFlags ^ Renderer::ShowCometTails);
00118 break;
00119 case IDC_SHOWMARKERS:
00120 renderer->setRenderFlags(renderFlags ^ Renderer::ShowMarkers);
00121 break;
00122 case IDC_LABELCONSTELLATIONS:
00123 renderer->setLabelMode(labelMode ^ Renderer::ConstellationLabels);
00124 break;
00125 case IDC_LABELGALAXIES:
00126 renderer->setLabelMode(labelMode ^ Renderer::GalaxyLabels);
00127 break;
00128 case IDC_LABELNEBULAE:
00129 renderer->setLabelMode(labelMode ^ Renderer::NebulaLabels);
00130 break;
00131 case IDC_LABELOPENCLUSTERS:
00132 renderer->setLabelMode(labelMode ^ Renderer::OpenClusterLabels);
00133 break;
00134 case IDC_LABELPLANETS:
00135 renderer->setLabelMode(labelMode ^ Renderer::PlanetLabels);
00136 break;
00137 case IDC_LABELMOONS:
00138 renderer->setLabelMode(labelMode ^ Renderer::MoonLabels);
00139 break;
00140 case IDC_LABELSTARS:
00141 renderer->setLabelMode(labelMode ^ Renderer::StarLabels);
00142 break;
00143 case IDC_LABELASTEROIDS:
00144 renderer->setLabelMode(labelMode ^ Renderer::AsteroidLabels);
00145 break;
00146 case IDC_LABELCOMETS:
00147 renderer->setLabelMode(labelMode ^ Renderer::CometLabels);
00148 break;
00149 case IDC_LABELSPACECRAFT:
00150 renderer->setLabelMode(labelMode ^ Renderer::SpacecraftLabels);
00151 break;
00152 case IDC_INFOTEXT0:
00153 Dlg->appCore->setHudDetail(0);
00154 break;
00155 case IDC_INFOTEXT1:
00156 Dlg->appCore->setHudDetail(1);
00157 break;
00158 case IDC_INFOTEXT2:
00159 Dlg->appCore->setHudDetail(2);
00160 break;
00161 case IDOK:
00162 if (Dlg != NULL && Dlg->parent != NULL)
00163 {
00164 SendMessage(Dlg->parent, WM_COMMAND, IDCLOSE,
00165 reinterpret_cast<LPARAM>(Dlg));
00166 }
00167 EndDialog(hDlg, 0);
00168 return TRUE;
00169 case IDCANCEL:
00170 if (Dlg != NULL && Dlg->parent != NULL)
00171 {
00172
00173
00174 Dlg->RestoreSettings(hDlg);
00175 SendMessage(Dlg->parent, WM_COMMAND, IDCLOSE,
00176 reinterpret_cast<LPARAM>(Dlg));
00177 }
00178 EndDialog(hDlg, 0);
00179 return TRUE;
00180 }
00181 break;
00182 }
00183
00184 case WM_DESTROY:
00185 if (Dlg != NULL && Dlg->parent != NULL)
00186 {
00187 SendMessage(Dlg->parent, WM_COMMAND, IDCLOSE,
00188 reinterpret_cast<LPARAM>(Dlg));
00189 }
00190 return TRUE;
00191
00192 case WM_HSCROLL:
00193 {
00194 WORD sbValue = LOWORD(wParam);
00195 switch (sbValue)
00196 {
00197 case SB_THUMBTRACK:
00198
00199 {
00200 char val[16];
00201 HWND hwnd = GetDlgItem(hDlg, IDC_EDIT_FILTER_DISTANCE);
00202 float logDistanceLimit = (float) HIWORD(wParam) /
00203 (float) DistanceSliderRange;
00204 float distanceLimit = (float) pow(MaxDistanceLimit,
00205 logDistanceLimit);
00206 sprintf(val, "%d", (int) distanceLimit);
00207 SetWindowText(hwnd, val);
00208 Dlg->appCore->getRenderer()->setDistanceLimit(distanceLimit);
00209 break;
00210 }
00211
00212 default:
00213 cout << "Slider msg: " << sbValue << '\n';
00214 break;
00215 #if 0
00216 case SB_THUMBPOSITION:
00217 {
00218 browser->nStars = (int)HIWORD(wParam);
00219 RefreshItems(hDlg, browser);
00220 break;
00221 }
00222 #endif
00223 }
00224 }
00225 }
00226
00227 return FALSE;
00228 }
00229
00230
00231 ViewOptionsDialog::ViewOptionsDialog(HINSTANCE appInstance,
00232 HWND _parent,
00233 CelestiaCore* _appCore) :
00234 CelestiaWatcher(*_appCore),
00235 appCore(_appCore),
00236 parent(_parent)
00237 {
00238 hwnd = CreateDialogParam(appInstance,
00239 MAKEINTRESOURCE(IDD_VIEWOPTIONS),
00240 parent,
00241 ViewOptionsProc,
00242 reinterpret_cast<LONG>(this));
00243 }
00244
00245
00246 static void dlgCheck(HWND hDlg, WORD item, uint32 flags, uint32 f)
00247 {
00248 SendDlgItemMessage(hDlg, item, BM_SETCHECK,
00249 ((flags & f) != 0) ? BST_CHECKED : BST_UNCHECKED, 0);
00250 }
00251
00252 void ViewOptionsDialog::SetControls(HWND hDlg)
00253 {
00254 int renderFlags = appCore->getRenderer()->getRenderFlags();
00255 int labelMode = appCore->getRenderer()->getLabelMode();
00256 int hudDetail = appCore->getHudDetail();
00257 int orbitMask = appCore->getRenderer()->getOrbitMask();
00258
00259
00260 SendDlgItemMessage(hDlg, IDC_SHOWATMOSPHERES, BM_SETCHECK,
00261 (renderFlags & Renderer::ShowAtmospheres)? BST_CHECKED:BST_UNCHECKED, 0);
00262 SendDlgItemMessage(hDlg, IDC_SHOWCELESTIALGRID, BM_SETCHECK,
00263 (renderFlags & Renderer::ShowCelestialSphere)? BST_CHECKED:BST_UNCHECKED, 0);
00264 SendDlgItemMessage(hDlg, IDC_SHOWCLOUDS, BM_SETCHECK,
00265 (renderFlags & Renderer::ShowCloudMaps)? BST_CHECKED:BST_UNCHECKED, 0);
00266 SendDlgItemMessage(hDlg, IDC_SHOWCONSTELLATIONS, BM_SETCHECK,
00267 (renderFlags & Renderer::ShowDiagrams)? BST_CHECKED:BST_UNCHECKED, 0);
00268 SendDlgItemMessage(hDlg, IDC_SHOWECLIPSESHADOWS, BM_SETCHECK,
00269 (renderFlags & Renderer::ShowEclipseShadows)? BST_CHECKED:BST_UNCHECKED, 0);
00270 SendDlgItemMessage(hDlg, IDC_SHOWGALAXIES, BM_SETCHECK,
00271 (renderFlags & Renderer::ShowGalaxies)? BST_CHECKED:BST_UNCHECKED, 0);
00272 SendDlgItemMessage(hDlg, IDC_SHOWNEBULAE, BM_SETCHECK,
00273 (renderFlags & Renderer::ShowNebulae)? BST_CHECKED:BST_UNCHECKED, 0);
00274 SendDlgItemMessage(hDlg, IDC_SHOWNIGHTSIDELIGHTS, BM_SETCHECK,
00275 (renderFlags & Renderer::ShowNightMaps)? BST_CHECKED:BST_UNCHECKED, 0);
00276 dlgCheck(hDlg, IDC_SHOWORBITS, renderFlags, Renderer::ShowOrbits);
00277 dlgCheck(hDlg, IDC_PLANETORBITS, orbitMask, Body::Planet);
00278 dlgCheck(hDlg, IDC_MOONORBITS, orbitMask, Body::Moon);
00279 dlgCheck(hDlg, IDC_ASTEROIDORBITS, orbitMask, Body::Asteroid);
00280 dlgCheck(hDlg, IDC_COMETORBITS, orbitMask, Body::Comet);
00281 dlgCheck(hDlg, IDC_SPACECRAFTORBITS, orbitMask, Body::Spacecraft);
00282 SendDlgItemMessage(hDlg, IDC_SHOWPLANETS, BM_SETCHECK,
00283 (renderFlags & Renderer::ShowPlanets)? BST_CHECKED:BST_UNCHECKED, 0);
00284 SendDlgItemMessage(hDlg, IDC_SHOWSTARS, BM_SETCHECK,
00285 (renderFlags & Renderer::ShowStars)? BST_CHECKED:BST_UNCHECKED, 0);
00286 SendDlgItemMessage(hDlg, IDC_SHOWCONSTELLATIONBORDERS, BM_SETCHECK,
00287 (renderFlags & Renderer::ShowBoundaries)? BST_CHECKED:BST_UNCHECKED, 0);
00288 SendDlgItemMessage(hDlg, IDC_SHOWRINGSHADOWS, BM_SETCHECK,
00289 (renderFlags & Renderer::ShowRingShadows)? BST_CHECKED:BST_UNCHECKED, 0);
00290 SendDlgItemMessage(hDlg, IDC_SHOWCOMETTAILS, BM_SETCHECK,
00291 (renderFlags & Renderer::ShowCometTails)? BST_CHECKED:BST_UNCHECKED, 0);
00292 SendDlgItemMessage(hDlg, IDC_SHOWMARKERS, BM_SETCHECK,
00293 (renderFlags & Renderer::ShowMarkers)? BST_CHECKED:BST_UNCHECKED, 0);
00294
00295 dlgCheck(hDlg, IDC_LABELCONSTELLATIONS, labelMode, Renderer::ConstellationLabels);
00296 dlgCheck(hDlg, IDC_LABELGALAXIES, labelMode, Renderer::GalaxyLabels);
00297 dlgCheck(hDlg, IDC_LABELNEBULAE, labelMode, Renderer::NebulaLabels);
00298 dlgCheck(hDlg, IDC_LABELOPENCLUSTERS, labelMode, Renderer::OpenClusterLabels);
00299 dlgCheck(hDlg, IDC_LABELSTARS, labelMode, Renderer::StarLabels);
00300 dlgCheck(hDlg, IDC_LABELPLANETS, labelMode, Renderer::PlanetLabels);
00301 dlgCheck(hDlg, IDC_LABELMOONS, labelMode, Renderer::MoonLabels);
00302 dlgCheck(hDlg, IDC_LABELASTEROIDS, labelMode, Renderer::AsteroidLabels);
00303 dlgCheck(hDlg, IDC_LABELCOMETS, labelMode, Renderer::CometLabels);
00304 dlgCheck(hDlg, IDC_LABELSPACECRAFT, labelMode, Renderer::SpacecraftLabels);
00305
00306 CheckRadioButton(hDlg, IDC_INFOTEXT0, IDC_INFOTEXT2, IDC_INFOTEXT0 + hudDetail);
00307
00308
00309 SendDlgItemMessage(hDlg,
00310 IDC_SLIDER_FILTER_DISTANCE,
00311 TBM_SETRANGE,
00312 (WPARAM)TRUE,
00313 (LPARAM) MAKELONG(0, DistanceSliderRange));
00314 float distanceLimit = appCore->getRenderer()->getDistanceLimit();
00315 float logDistanceLimit = (float) (log(distanceLimit) /
00316 log(MaxDistanceLimit));
00317 SendDlgItemMessage(hDlg,
00318 IDC_SLIDER_FILTER_DISTANCE,
00319 TBM_SETPOS,
00320 (WPARAM) TRUE,
00321 (LPARAM) (logDistanceLimit * DistanceSliderRange));
00322
00323 char val[16];
00324 HWND hwnd = GetDlgItem(hDlg, IDC_EDIT_FILTER_DISTANCE);
00325 sprintf(val, "%d", (int) distanceLimit);
00326 SetWindowText(hwnd, val);
00327 }
00328
00329
00330 void ViewOptionsDialog::RestoreSettings(HWND hDlg)
00331 {
00332 appCore->getRenderer()->setRenderFlags(initialRenderFlags);
00333 appCore->getRenderer()->setLabelMode(initialLabelMode);
00334 appCore->setHudDetail(initialHudDetail);
00335 }
00336
00337 void ViewOptionsDialog::notifyChange(CelestiaCore*, int)
00338 {
00339 if (parent != NULL)
00340 SetControls(hwnd);
00341 }