1 #include "pch.h"
2 #include "../ogre/common/Def_Str.h"
3 #include "../ogre/common/Gui_Def.h"
4 #include "../ogre/common/RenderConst.h"
5 #include "../ogre/common/GuiCom.h"
6 #include "../ogre/common/CScene.h"
7 #include "settings.h"
8 #include "CApp.h"
9 #include "CGui.h"
10 #include "../road/Road.h"
11 #include "../road/PaceNotes.h"
12 #include "../ogre/common/MultiList2.h"
13 #include "../sdl4ogre/sdlcursormanager.hpp"
14 #include "../sdl4ogre/sdlinputwrapper.hpp"
15 #include <OgreTerrain.h>
16 #include <OgreOverlay.h>
17 #include <OgreOverlayElement.h>
18 #include <OgreCamera.h>
19 #include <OgreSceneNode.h>
20 #include <OgreViewport.h>
21 #include <MyGUI.h>
22 using namespace MyGUI;
23 using namespace Ogre;
24
25
26 /// Update all Gui controls
27 /// (after track Load, or Copy)
28 /// basing on values in scene and road
29 //..........................................................................................................
SetGuiFromXmls()30 void CGui::SetGuiFromXmls()
31 {
32 if (!app->mWndEdit) return;
33 bGI = false;
34
35 Vector3 c;
36 #define _Ed(name, val) ed##name->setCaption(toStr(val))
37 #define _Clr(name, val) c = val.GetRGB1(); clr##name->setColour(Colour(c.x,c.y,c.z))
38 #define _Cmb(cmb, str) cmb->setIndexSelected( cmb->findItemIndexWith(str) )
39
40
41 // [Sky]
42 //-----------------------------------------------
43 btnSky->setCaption(sc->skyMtr);
44 String s = sc->skyMtr; s = s.substr(4, s.length()); // sel on pick list
45 for (size_t i=0; i < liSky->getItemCount(); ++i)
46 if (liSky->getSubItemNameAt(1, i).substr(7) == s)
47 liSky->setIndexSelected(i);
48
49 svSkyYaw.Upd(); svSunPitch.Upd(); svSunYaw.Upd();
50 _Clr(Amb, sc->lAmb); _Clr(Diff, sc->lDiff); _Clr(Spec, sc->lSpec);
51 _Clr(Fog, sc->fogClr); _Clr(Fog2, sc->fogClr2); _Clr(FogH, sc->fogClrH);
52 svFogStart.Upd(); svFogEnd.Upd();
53 svFogHStart.Upd(); svFogHEnd.Upd();
54 svFogHeight.Upd(); svFogHDensity.Upd(); svFogHDmg.Upd();
55 svRain1Rate.Upd(); svRain2Rate.Upd();
56 _Cmb(cmbRain1, sc->rainName);
57 _Cmb(cmbRain2, sc->rain2Name);
58 _Cmb(cmbReverbs, sc->sReverbs); UpdRevDescr();
59
60 // [Terrain]
61 //-----------------------------------------------
62 updTabHmap();
63 svTerTriSize.Upd();
64 svTerErrorNorm.Upd(); svTerNormScale.Upd();
65 svTerSpecPow.Upd(); svTerSpecPowEm.Upd();
66
67 tabTerLayer(tabsTerLayers, idTerLay);
68 _Cmb(cmbParDust, sc->sParDust); _Cmb(cmbParMud, sc->sParMud);
69 _Cmb(cmbParSmoke,sc->sParSmoke);
70
71 // [Vegetation]
72 //-----------------------------------------------
73 svGrassDens.Upd(); svTreesDens.Upd();
74 _Ed(TrPage, sc->trPage); _Ed(TrDist, sc->trDist);
75 _Ed(GrPage, sc->grPage); _Ed(GrDist, sc->grDist); _Ed(TrImpDist, sc->trDistImp);
76 svTrRdDist.Upd(); svGrDensSmooth.Upd();
77
78 tabGrLayers(tabsGrLayers, idGrLay);
79 tabPgLayers(tabsPgLayers, idPgLay);
80
81 // [Road]
82 //-----------------------------------------------
83 SplineRoad* rd = scn->road;
84 for (int i=0; i < 4/*MTRs*/; ++i)
85 { btnRoad[i]->setCaption(rd->sMtrRoad[i]);
86 _Cmb(cmbPipeMtr[i], rd->sMtrPipe[i]); }
87 _Cmb(cmbRoadWMtr, rd->sMtrWall); _Cmb(cmbRoadColMtr, rd->sMtrCol);
88 _Cmb(cmbPipeWMtr, rd->sMtrWallPipe);
89
90 _Ed(RdHeightOfs, rd->g_Height);
91 _Ed(RdSkirtLen, rd->g_SkirtLen); _Ed(RdSkirtH, rd->g_SkirtH);
92 SldUpd_Road();
93 ckRoad1Mtr.Upd();
94
95 // [Game]
96 //-----------------------------------------------
97 ckDenyReversed.Upd(&sc->denyReversed);
98 ckTiresAsphalt.Upd(&sc->asphalt);
99 ckTerrainEmissive.Upd(&sc->td.emissive);
100 ckNoWrongChks.Upd(&sc->noWrongChks);
101 SldUpd_Game();
102 UpdEdInfo();
103
104 // [Surface]
105 //-----------------------------------------------
106 UpdSurfList();
107 listSurf(surfList, idSurf);
108
109 bGI = true;
110 }
111
112
btnNewGame(WP)113 void CGui::btnNewGame(WP)
114 {
115 if (trkName) trkName->setCaption(gcom->sListTrack);
116 pSet->gui.track = gcom->sListTrack;
117 pSet->gui.track_user = gcom->bListTrackU; //UpdWndTitle();//? load
118 app->LoadTrack();
119 }
120
121
122 // Update input, info
123 //-------------------------------------------------------------------------------
124 // tool wnds show/hide
UpdEditWnds()125 void App::UpdEditWnds()
126 {
127 if (mWndBrush)
128 { if (edMode == ED_Deform)
129 { mWndBrush->setCaption(TR("#{TerDeform}"));
130 mWndBrush->setColour(Colour(0.5f, 0.9f, 0.3f));
131 mWndBrush->setVisible(true); }
132 else if (edMode == ED_Filter)
133 { mWndBrush->setCaption(TR("#{TerFilter}"));
134 mWndBrush->setColour(Colour(0.5f, 0.75f, 1.0f));
135 mWndBrush->setVisible(true); }
136 else if (edMode == ED_Smooth)
137 { mWndBrush->setCaption(TR("#{TerSmooth}"));
138 mWndBrush->setColour(Colour(0.3f, 0.8f, 0.8f));
139 mWndBrush->setVisible(true); }
140 else if (edMode == ED_Height)
141 { mWndBrush->setCaption(TR("#{TerHeight}"));
142 mWndBrush->setColour(Colour(0.7f, 1.0f, 0.7f));
143 mWndBrush->setVisible(true); }
144 else
145 mWndBrush->setVisible(false);
146 }
147 if (mWndRoadCur) mWndRoadCur->setVisible(edMode == ED_Road);
148 if (mWndCam) mWndCam->setVisible(edMode == ED_PrvCam);
149
150 if (mWndStart) mWndStart->setVisible(edMode == ED_Start);
151
152 if (mWndFluids) mWndFluids->setVisible(edMode == ED_Fluids);
153 UpdFluidBox();
154
155 if (mWndObjects) mWndObjects->setVisible(edMode == ED_Objects);
156
157 if (mWndRivers) mWndRivers->setVisible(edMode == ED_Rivers);
158
159 UpdStartPos(); // StBox visible
160 UpdVisGui(); //br prv..
161
162 UpdMtrWaterDepth();
163 }
164
165
166 // change editor mode
167 //-----------------------------------------------
SetEdMode(ED_MODE newMode)168 void App::SetEdMode(ED_MODE newMode)
169 {
170 static bool first = true;
171 if (newMode == ED_Objects && first)
172 {
173 SetObjNewType(iObjTNew);
174 first = false;
175 }
176
177 //if (pSet->autoWaterDepth) //..?
178 if (edMode == ED_Fluids && newMode != ED_Fluids)
179 SaveWaterDepth(); // update, on exit from Fluids editing
180
181 edMode = newMode;
182 }
183
184
185 // wnd vis
186 //-----------------------------------------------
UpdVisGui()187 void App::UpdVisGui()
188 {
189 // wnd
190 bool g = bGuiFocus;
191 bool notMain = g && !pSet->isMain;
192 mWndMain->setVisible(g && pSet->isMain);
193 mWndTrack->setVisible(notMain && pSet->inMenu == WND_Track);
194 mWndEdit->setVisible(notMain && pSet->inMenu == WND_Edit);
195 mWndHelp->setVisible(notMain && pSet->inMenu == WND_Help);
196 mWndOpts->setVisible(notMain && pSet->inMenu == WND_Options);
197
198 if (!g) mWndPick->setVisible(false);
199 if (!g) mWndTrkFilt->setVisible(false);
200 if (!g && gui->wndColor) gui->wndColor->setVisible(false);
201 if (gcom->bnQuit) gcom->bnQuit->setVisible(g);
202
203 // mode
204 if (gui->imgCam)
205 { gui->imgCam->setVisible(!g && bMoveCam);
206 gui->imgEdit->setVisible(!g && !bMoveCam);
207 gui->imgGui->setVisible(g);
208 }
209
210 bool vis = g || !bMoveCam;
211 mInputWrapper->setMouseVisible(vis);
212 mInputWrapper->setMouseRelative(!vis);
213 mInputWrapper->setAllowGrab(pSet->mouse_capture);
214 mInputWrapper->setGrabPointer(!vis);
215
216 if (scn->road) scn->road->SetTerHitVis(bEdit());
217 if (!g && gcom->mToolTip) gcom->mToolTip->setVisible(false);
218
219 if (ovBrushPrv)
220 if (edMode >= ED_Road || bMoveCam)
221 ovBrushPrv->hide(); else ovBrushPrv->show();
222
223 for (int i=0; i < WND_ALL; ++i)
224 mWndMainPanels[i]->setVisible(pSet->inMenu == i);
225
226 if (gui->txWarn) gui->txWarn->setVisible(false);
227
228 // 1st center mouse
229 static bool first = true;
230 if (g && first)
231 { first = false;
232 gcom->GuiCenterMouse();
233 }
234 }
235
toggleGui(bool toggle)236 void CGui::toggleGui(bool toggle)
237 {
238 if (app->edMode == ED_PrvCam) return;
239 if (toggle)
240 app->bGuiFocus = !app->bGuiFocus;
241 app->UpdVisGui();
242 }
243
244
245 // bottom status bar
Status(String s,float r,float g,float b)246 void CGui::Status(String s, float r,float g,float b)
247 {
248 txtStatus->setCaption(TR(s));
249 txtStatus->setTextColour(Colour(r,g,b));
250 panStatus->setColour(Colour(r,g,b));
251 panStatus->setAlpha(1.f); panStatus->setVisible(true);
252 app->fStFade = 1.5f;
253 }
254
255
256 /// Preview Camera mode - - - - - - - - - - - - - - - - - - - - - - - -
togPrvCam()257 void App::togPrvCam()
258 {
259 static bool oldV = false, oldI = false;
260 if (edMode == ED_PrvCam) // leave
261 {
262 SetEdMode(edModeOld);
263 mViewport->setVisibilityMask(RV_MaskAll);
264 rt[RTs].ndMini->setVisible(false);
265 ndCar->setVisible(true);
266
267 scn->UpdateWaterRTT(mCamera);
268 scn->UpdFog(); // restore fog, veget
269 if (oldV) { bTrGrUpd = true; oldV = false; }
270 pSet->bWeather = oldI;
271 scn->UpdTerErr();
272
273 scn->sc->camPos = mCamera->getPosition();
274 scn->sc->camDir = mCamera->getDirection();
275 mCamera->setPosition( mCamPosOld);
276 mCamera->setDirection(mCamDirOld);
277 }else // enter
278 {
279 edModeOld = edMode;
280 SetEdMode(ED_PrvCam);
281 bMoveCam = true; UpdVisGui();
282 mViewport->setVisibilityMask(RV_MaskPrvCam);
283 rt[RTs].ndMini->setVisible(true);
284 ndCar->setVisible(false);
285
286 scn->UpdateWaterRTT(rt[3].cam);
287 scn->UpdFog(true); // on fog, veget, weather
288 if (!pSet->bTrees) { bTrGrUpd = true; oldV = true; }
289 oldI = pSet->bWeather; pSet->bWeather = false;
290 scn->mTerrainGlobals->setMaxPixelError(0.5f); //hq ter
291
292 mCamPosOld = mCamera->getPosition();
293 mCamDirOld = mCamera->getDirection();
294 mCamera->setPosition( scn->sc->camPos);
295 mCamera->setDirection(scn->sc->camDir);
296 }
297 UpdEditWnds();
298 }
299
300
301 // Gui Shortcut alt-letters
302 //.......................................................................................
GuiShortcut(WND_Types wnd,int tab,int subtab)303 void CGui::GuiShortcut(WND_Types wnd, int tab, int subtab)
304 {
305 if (subtab == -1 && (!app->bGuiFocus || pSet->inMenu != wnd)) subtab = -2; // cancel subtab cycling
306
307 if (!app->bGuiFocus)
308 if (app->edMode != ED_PrvCam) {
309 app->bGuiFocus = !app->bGuiFocus; app->UpdVisGui(); }
310
311 //isFocGui = true;
312 pSet->isMain = false; pSet->inMenu = wnd;
313
314 TabPtr mWndTabs = 0;
315 std::vector<TabControl*>* subt = 0;
316
317 switch (wnd)
318 { case WND_Track: mWndTabs = app->mWndTabsTrack; subt = &vSubTabsTrack; break;
319 case WND_Edit: mWndTabs = app->mWndTabsEdit; subt = &vSubTabsEdit; break;
320 case WND_Help: mWndTabs = app->mWndTabsHelp; subt = &vSubTabsHelp; break;
321 case WND_Options: mWndTabs = app->mWndTabsOpts; subt = &vSubTabsOpts; break;
322 }
323 if (wnd != WND_Edit)
324 app->mWndPick->setVisible(false);
325 toggleGui(false);
326
327
328 size_t t = mWndTabs->getIndexSelected();
329 mWndTabs->setIndexSelected(tab);
330
331 if (!subt) return;
332 TabControl* tc = (*subt)[tab]; if (!tc) return;
333 int cnt = tc->getItemCount();
334
335 if (t == tab && subtab == -1) // cycle subpages if same tab
336 { if (app->shift)
337 tc->setIndexSelected( (tc->getIndexSelected()-1+cnt) % cnt );
338 else
339 tc->setIndexSelected( (tc->getIndexSelected()+1) % cnt );
340 }
341 if (subtab > -1)
342 tc->setIndexSelected( std::min(cnt-1, subtab) );
343 }
344
345
346 // next num tab alt-1,2
347 //.......................................................................................
NumTabNext(int rel)348 void CGui::NumTabNext(int rel)
349 {
350 if (!app->bGuiFocus || pSet->isMain /*|| pSet->inMenu != WND_Edit*/) return;
351
352 TabPtr tab = 0;
353
354 #define tabNum(event) { \
355 int cnt = tab->getItemCount(); \
356 tab->setIndexSelected( (tab->getIndexSelected()+rel+cnt) % cnt ); \
357 event(tab, tab->getIndexSelected()); }
358
359 int id = app->mWndTabsEdit->getIndexSelected();
360 switch (id)
361 {
362 case TAB_Layers: tab = tabsTerLayers; tabNum(tabTerLayer); break;
363 case TAB_Grass: switch (vSubTabsEdit[id]->getIndexSelected())
364 { case 1: tab = tabsGrLayers; tabNum(tabGrLayers); break;
365 case 2: tab = tabsGrChan; tabNum(tabGrChan); break; } break;
366 case TAB_Veget: tab = tabsPgLayers; tabNum(tabPgLayers); break;
367 case TAB_Surface: { int t = (surfList->getIndexSelected() +5 +rel) % 5;
368 surfList->setIndexSelected(t); listSurf(surfList, t); } break;
369 }
370 }
371
372
373 /// Update (frame start) .,.,.,.,..,.,.,.,..,.,.,.,..,.,.,.,.
GuiUpdate()374 void CGui::GuiUpdate()
375 {
376 gcom->UnfocusLists();
377
378 if (iLoadNext) // load next/prev track (warnings)
379 { size_t cnt = gcom->trkList->getItemCount();
380 if (cnt > 0)
381 { int i = std::max(0, std::min((int)cnt-1, (int)gcom->trkList->getIndexSelected() + iLoadNext ));
382 iLoadNext = 0;
383 gcom->trkList->setIndexSelected(i);
384 gcom->trkList->beginToItemAt(std::max(0, i-11)); // center
385 gcom->listTrackChng(gcom->trkList,i);
386 btnNewGame(0);
387 } }
388
389 if (gcom->bGuiReinit) // after language change from combo
390 { gcom->bGuiReinit = false;
391
392 mGui->destroyWidgets(app->vwGui);
393 gcom->bnQuit=0; app->mWndOpts=0; gcom->trkList=0; //todo: rest too..
394
395 bGI = false;
396 InitGui();
397
398 SetGuiFromXmls();
399 app->bWindowResized = true;
400 }
401
402 // sort trk list
403 gcom->SortTrkList();
404
405
406 if (app->bWindowResized)
407 { app->bWindowResized = false;
408
409 gcom->ResizeOptWnd();
410 //bSizeHUD = true;
411 gcom->SizeGUI();
412 gcom->updTrkListDim();
413 viewCanvas->setCoord(GetViewSize());
414
415 //slSizeMinimap(0);
416 //LoadTrack(); // shouldnt be needed ...
417 }
418
419 }
420
421
422 /// Color tool window
423 //...............................................................................
btnClrSet(WP w)424 void CGui::btnClrSet(WP w)
425 {
426 SColor* v; // rgb
427 if (w == clrAmb) v = &sc->lAmb; else
428 if (w == clrDiff) v = &sc->lDiff; else
429 if (w == clrSpec) v = &sc->lSpec;
430 bool oth = wpClrSet != w; wpClrSet = w;
431
432 svAlp.setVisible(false);
433 svHue.UpdF(&v->h); svSat.UpdF(&v->s); svVal.UpdF(&v->v);
434 svNeg.UpdF(&v->n);
435
436 IntPoint p = w->getAbsolutePosition(); p.left += 100; p.top -= 50;
437 wndColor->setPosition(p);
438 if (!(wndColor->getVisible() && oth)) // dont hide if changed
439 wndColor->setVisible(!wndColor->getVisible());
440 }
btnClrSetA(WP w)441 void CGui::btnClrSetA(WP w)
442 {
443 SColor* v; // rgba
444 if (w == clrFog) v = &sc->fogClr; else
445 if (w == clrFog2) v = &sc->fogClr2; else
446 if (w == clrFogH) v = &sc->fogClrH; else
447 if (w == clrTrail) {
448 TerLayer* l = GetTerRdLay();
449 v = &l->tclr; }
450 bool oth = wpClrSet != w; wpClrSet = w;
451
452 svAlp.setVisible(true);
453 svHue.UpdF(&v->h); svSat.UpdF(&v->s); svVal.UpdF(&v->v);
454 svAlp.UpdF(&v->a); svNeg.UpdF(&v->n);
455
456 IntPoint p = w->getAbsolutePosition(); p.left += 100; p.top -= 50;
457 wndColor->setPosition(p);
458 if (!(wndColor->getVisible() && oth))
459 wndColor->setVisible(!wndColor->getVisible());
460 }
461
slUpdClr(SV * sv)462 void CGui::slUpdClr(SV* sv)
463 {
464 SColor c(svHue.getF(), svSat.getF(), svVal.getF(), svAlp.getF(), svNeg.getF());
465 Vector3 cc = c.GetRGB1();
466 wpClrSet->setColour(Colour(cc.x,cc.y,cc.z)); // img
467
468 WP w = wpClrSet;
469 if (w == clrAmb) { sc->lAmb = c; scn->UpdSun(); }else
470 if (w == clrDiff){ sc->lDiff = c; scn->UpdSun(); }else
471 if (w == clrSpec){ sc->lSpec = c; scn->UpdSun(); }else
472
473 if (w == clrFog) { sc->fogClr = c; scn->UpdFog(); }else
474 if (w == clrFog2){ sc->fogClr2 = c; scn->UpdFog(); }else
475 if (w == clrFogH){ sc->fogClrH = c; scn->UpdFog(); }else
476
477 if (w == clrTrail) {
478 TerLayer* l = GetTerRdLay();
479 l->tclr = c; }
480 }
481