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