1 #include "pch.h"
2 #include "../ogre/common/Def_Str.h"
3 #include "../ogre/common/Gui_Def.h"
4 #include "../ogre/common/GuiCom.h"
5 #include "../ogre/common/CScene.h"
6 #include "settings.h"
7 #include "CApp.h"
8 #include "CGui.h"
9 #include "../road/Road.h"
10 #include "../ogre/common/MessageBox/MessageBox.h"
11 using namespace MyGUI;
12 using namespace Ogre;
13 
14 
15 ///  tools  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
16 /// . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
17 
18 //  track files  for copy, new
19 const int cnTrkFm = 3, cnTrkFo = 1, cnTrkFp = 3;
20 const Ogre::String
21 	csTrkFm[cnTrkFm] = {"/heightmap.f32", "/road.xml", "/scene.xml"},  // in /
22 	csTrkFo[cnTrkFo] = {"/waterDepth.png"},							// in /objects/
23 	csTrkFp[cnTrkFp] = {"/view.jpg", "/road.png", "/terrain.jpg"};	// in /preview/
24 
25 
btnTrkCopySel(WP)26 void CGui::btnTrkCopySel(WP)  // set copy source
27 {
28 	sCopyTrack = gcom->sListTrack;
29 	bCopyTrackU = gcom->bListTrackU;
30 	if (valTrkCpySel)  valTrkCpySel->setCaption(sCopyTrack);
31 }
32 
ChkTrkCopy()33 bool CGui::ChkTrkCopy()
34 {
35 	if (sCopyTrack == "")  // none
36 	{
37 		Message::createMessageBox(
38 			"Message", TR("#{Track} - #{Copy}"), TR("#{CopyTrackNoSource}"),
39 			MessageBoxStyle::IconWarning | MessageBoxStyle::Ok);
40 		return false;
41 	}
42 	if (sCopyTrack == pSet->gui.track && bCopyTrackU == (pSet->gui.track_user ? 1 : 0))
43 	{
44 		Message::createMessageBox(
45 			"Message", TR("#{Track} - #{Copy}"), TR("#{CopyTrackSourceSame}"),
46 			MessageBoxStyle::IconWarning | MessageBoxStyle::Ok);
47 		return false;
48 	}
49 	return true;
50 }
51 
52 ///  copy Hmap
btnCopyTerHmap(WP)53 void CGui::btnCopyTerHmap(WP)
54 {
55 	if (!ChkTrkCopy())  return;
56 
57 	String from = PathCopyTrk(),
58 		name = gcom->TrkDir() + "heightmap-new.f32";
59 	Copy(from + "/heightmap.f32", name);
60 
61 	Scene sF;  sF.LoadXml(from + "/scene.xml");
62 	sc->td.iVertsX = sF.td.iTerSize;  //  ter sizes
63 	sc->td.fTriangleSize = sF.td.fTriangleSize;
64 	sc->td.UpdVals();
65 	app->bNewHmap = true;
66 	SetGuiFromXmls();	app->UpdateTrack();
67 	if (app->scn->road)  app->scn->road->UpdAllMarkers();
68 }
69 
70 //  copy sun, etc.
btnCopySun(WP)71 void CGui::btnCopySun(WP)
72 {
73 	if (!ChkTrkCopy())  return;
74 	String from = PathCopyTrk();
75 	Scene sF;  sF.LoadXml(from + "/scene.xml");
76 
77 	sc->skyMtr = sF.skyMtr;  // sky
78 	sc->skyYaw = sF.skyYaw;
79 	sc->rainEmit = sF.rainEmit;  sc->rain2Emit = sF.rain2Emit;
80 	sc->rainName = sF.rainName;  sc->rain2Name = sF.rain2Name;
81 
82 	sc->fogClr = sF.fogClr;  sc->fogClr2 = sF.fogClr2;  sc->fogClrH = sF.fogClrH;
83 	sc->fogStart = sF.fogStart;  sc->fogEnd = sF.fogEnd;
84 	sc->fogHStart = sF.fogHStart;  sc->fogHEnd = sF.fogHEnd;
85 	sc->fogHDensity = sF.fogHDensity;  sc->fogHeight = sF.fogHeight;
86 
87 	sc->ldPitch = sF.ldPitch;  sc->ldYaw = sF.ldYaw;  // light
88 	sc->lAmb = sF.lAmb;  sc->lDiff = sF.lDiff;  sc->lSpec = sF.lSpec;
89 
90 	SetGuiFromXmls();	app->UpdateTrack();
91 	app->scn->DestroyWeather();  app->scn->CreateWeather();
92 }
93 
94 //  copy ter layers
btnCopyTerLayers(WP)95 void CGui::btnCopyTerLayers(WP)
96 {
97 	if (!ChkTrkCopy())  return;
98 	String from = PathCopyTrk();
99 	Scene sF;  sF.LoadXml(from + "/scene.xml");
100 
101 	for (int i=0; i < sc->td.ciNumLay; ++i)
102 		sc->td.layersAll[i] = sF.td.layersAll[i];
103 	sc->sParDust = sF.sParDust;  sc->sParMud = sF.sParMud;
104 	sc->sParSmoke = sF.sParSmoke;
105 	sc->td.UpdLayers();
106 
107 	SetGuiFromXmls();	app->UpdateTrack();
108 }
109 
110 //  copy veget
btnCopyVeget(WP)111 void CGui::btnCopyVeget(WP)
112 {
113 	if (!ChkTrkCopy())  return;
114 	String from = PathCopyTrk();
115 	Scene sF;  sF.LoadXml(from + "/scene.xml");
116 
117 	sc->densGrass = sF.densGrass;  sc->densTrees = sF.densTrees;
118 	sc->trPage = sF.trPage;  sc->trDist = sF.trDist;
119 	sc->trRdDist = sF.trRdDist;  sc->trDistImp = sF.trDistImp;
120 
121 	sc->grPage = sF.grPage;  sc->grDist = sF.grDist;
122 
123 	for (int i=0; i < sc->ciNumGrLay; ++i)
124 		sc->grLayersAll[i] = sF.grLayersAll[i];
125 
126 	for (int i=0; i < sc->ciNumPgLay; ++i)
127 		sc->pgLayersAll[i] = sF.pgLayersAll[i];
128 
129 	SetGuiFromXmls();	app->UpdateTrack();
130 }
131 
132 //  copy road
btnCopyRoad(WP)133 void CGui::btnCopyRoad(WP)
134 {
135 	if (!ChkTrkCopy() || !app->scn->road)  return;
136 	String from = PathCopyTrk();
137 	app->scn->road->LoadFile(from + "/road.xml");
138 
139 	SetGuiFromXmls();	app->scn->road->Rebuild(true);
140 	scn->UpdPSSMMaterials();	app->scn->road->UpdAllMarkers();
141 }
142 
143 //  copy road pars
btnCopyRoadPars(WP)144 void CGui::btnCopyRoadPars(WP)
145 {
146 	SplineRoad* r = app->scn->road;
147 	if (!ChkTrkCopy() || !r)  return;
148 	String from = PathCopyTrk();
149 	SplineRoad rd(app);  rd.LoadFile(from + "/road.xml",false);
150 
151 	for (int i=0; i < MTRs; ++i)
152 	{	r->sMtrRoad[i] = rd.sMtrRoad[i];
153 		r->SetMtrPipe(i, rd.sMtrPipe[i]);  }
154 
155 	r->g_tcMul  = rd.g_tcMul;	r->g_tcMulW = rd.g_tcMulW;
156 	r->g_tcMulP = rd.g_tcMulP;	r->g_tcMulPW= rd.g_tcMulPW;
157 	r->g_tcMulC = rd.g_tcMulC;
158 	r->g_LenDim0 = rd.g_LenDim0;
159 	r->g_iWidthDiv0 = rd.g_iWidthDiv0;
160 	r->g_ColNSides = rd.g_ColNSides;
161 	r->g_ColRadius = rd.g_ColRadius;
162 	r->g_P_iw_mul = rd.g_P_iw_mul;
163 	r->g_P_il_mul = rd.g_P_il_mul;
164 	r->g_Height = rd.g_Height;
165 	r->g_SkirtLen = rd.g_SkirtLen;
166 	r->g_SkirtH = rd.g_SkirtH;
167 	r->g_MergeLen = rd.g_MergeLen;
168 	r->g_LodPntLen = rd.g_LodPntLen;
169 
170 	SetGuiFromXmls();	app->scn->road->Rebuild(true);
171 	scn->UpdPSSMMaterials();	app->scn->road->UpdAllMarkers();
172 }
173 
174 
175 ///  tools 	. . . . . . . . . . . . . . . . . . . .	. . . . . . . . . . . . . . . . . . . . . . . . . . . . .
176 
btnDeleteRoad(WP)177 void CGui::btnDeleteRoad(WP)
178 {
179 	int l = app->scn->road->getNumPoints();
180 	for (int i=0; i < l; ++i)
181 	{
182 		app->scn->road->iChosen = app->scn->road->getNumPoints()-1;
183 		app->scn->road->Delete();
184 	}
185 	//app->scn->road->Rebuild(true);
186 }
btnDeleteFluids(WP)187 void CGui::btnDeleteFluids(WP)
188 {
189 	sc->fluids.clear();
190 	app->bRecreateFluids = true;
191 }
btnDeleteObjects(WP)192 void CGui::btnDeleteObjects(WP)
193 {
194 	app->DestroyObjects(true);
195 	app->iObjCur = -1;
196 }
197 
198 //  Scale track  --------------------------------
btnScaleAll(WP)199 void CGui::btnScaleAll(WP)
200 {
201 	if (!app->scn->road)  return;
202 	Real sf = std::max(0.1f, fScale);  // scale mul
203 
204 	//  road
205 	for (int i=0; i < app->scn->road->getNumPoints(); ++i)
206 	{
207 		app->scn->road->Scale1(i, sf, 0.f);
208 		app->scn->road->mP[i].width *= sf;
209 	}
210 	app->scn->road->bSelChng = true;
211 
212 	//  fluids
213 	for (int i=0; i < sc->fluids.size(); ++i)
214 	{
215 		FluidBox& fb = sc->fluids[i];
216 		fb.pos.x *= sf;  fb.pos.z *= sf;
217 		fb.size.x *= sf;  fb.size.z *= sf;
218 	}
219 
220 	//  objs
221 	for (int i=0; i < sc->objects.size(); ++i)
222 	{
223 		Object& o = sc->objects[i];
224 		o.pos[0] *= sf;  o.pos[1] *= sf;
225 		o.SetFromBlt();
226 	}
227 
228 	//  ter  ---
229 	sc->td.fTriangleSize *= sf;  sc->td.UpdVals();
230 
231 	SetGuiFromXmls();	app->UpdateTrack();
232 
233 	//  road upd
234 	if (0) //road)  // doesnt work here..
235 	{	app->scn->road->UpdPointsH();
236 		app->scn->road->Rebuild(true);
237 	}
238 
239 	//  start pos
240 	app->scn->sc->startPos[0] *= sf;
241 	app->scn->sc->startPos[1] *= sf;  app->UpdStartPos();
242 }
243 
244 
245 ///  track 	. . . . . . . . . . . . . . . . . . . .	. . . . . . . . . . . . . . . . . . . . . . . . . . . . .
246 //-----------------------------------------------------------------------------------------------------------
247 
PathCopyTrk(int user)248 String CGui::PathCopyTrk(int user) {
249 	int u = user == -1 ? bCopyTrackU : user;	return gcom->pathTrk[u] + sCopyTrack;  }
250 
251 
252 ///  New (duplicate)
btnTrackNew(WP)253 void CGui::btnTrackNew(WP)
254 {
255 	String name = trkName->getCaption();
256 	name = StringUtil::replaceAll(name, "*", "");
257 
258 	if (gcom->TrackExists(name))  {
259 		Message::createMessageBox(
260 			"Message", TR("#{Track} - #{NewDup}"), TR("#{Track}: ") + name + TR(" #{AlreadyExists}."),
261 			MessageBoxStyle::IconWarning | MessageBoxStyle::Ok);
262 		return;  }
263 
264 	sc->baseTrk = gcom->sListTrack;
265 	String st = gcom->PathListTrk(),  t = gcom->pathTrk[1] + name,
266 		sto = st + "/objects", stp = st + "/preview",  // from
267 		to = t + "/objects",   tp = t + "/preview";  // to,new
268 
269 	//  Copy
270 	CreateDir(t);  CreateDir(to);  CreateDir(tp);
271 	int i;
272 	for (i=0; i < cnTrkFm; ++i)  Copy(st + csTrkFm[i], t + csTrkFm[i]);
273 	for (i=0; i < cnTrkFo; ++i)  Copy(sto + csTrkFo[i], to + csTrkFo[i]);
274 	for (i=1; i < cnTrkFp; ++i)  Copy(stp + csTrkFp[i], tp + csTrkFp[i]);  // 1-not view.jpg
275 
276 	gcom->sListTrack = name;  pSet->gui.track = name;  pSet->gui.track_user = 1;
277 	app->UpdWndTitle();
278 	gcom->FillTrackLists();  gcom->TrackListUpd();
279 }
280 
281 ///  Rename
btnTrackRename(WP)282 void CGui::btnTrackRename(WP)
283 {
284 	String name = trkName->getCaption();
285 	if (name == gcom->sListTrack)  return;
286 
287 	if (!pSet->allow_save)  // could force when originals writable..
288 	if (gcom->bListTrackU==0)  {
289 		return;  }
290 
291 	if (gcom->TrackExists(name))  {
292 		Message::createMessageBox(
293 			"Message", TR("#{Track} - #{Rename}"), TR("#{AlreadyExists}."),
294 			MessageBoxStyle::IconWarning | MessageBoxStyle::Ok);
295 		return;  }
296 
297 	//  Rename
298 	Rename(gcom->PathListTrk(), gcom->pathTrk[/*1*/gcom->bListTrackU ? 1 : 0] + name);
299 
300 	gcom->sListTrack = name;  pSet->gui.track = name;  pSet->gui.track_user = 1;/**/
301 	app->UpdWndTitle();
302 	gcom->FillTrackLists();  gcom->TrackListUpd();  //gcom->listTrackChng(trkList,0);
303 }
304 
305 ///  Delete
btnTrackDel(WP)306 void CGui::btnTrackDel(WP)
307 {
308 	Message* message = Message::createMessageBox(
309 		"Message", TR("#{DeleteTrack}"), gcom->sListTrack,
310 		MessageBoxStyle::IconQuest | MessageBoxStyle::Yes | MessageBoxStyle::No);
311 	message->eventMessageBoxResult += newDelegate(this, &CGui::msgTrackDel);
312 	//message->setUserString("FileName", fileName);
313 }
msgTrackDel(Message * sender,MessageBoxStyle result)314 void CGui::msgTrackDel(Message* sender, MessageBoxStyle result)
315 {
316 	if (result != MessageBoxStyle::Yes)
317 		return;
318 	String t = gcom->PathListTrk(),
319 		to = t + "/objects", tp = t + "/preview";
320 	int i;
321 	for (i=0; i < cnTrkFo; ++i)  Delete(to + csTrkFo[i]);
322 	for (i=0; i < cnTrkFp; ++i)  Delete(tp + csTrkFp[i]);
323 	for (i=0; i < cnTrkFm; ++i)  Delete(t + csTrkFm[i]);
324 	Delete(t + "/heightmap-new.f32");
325 	DeleteDir(to);  DeleteDir(tp);  DeleteDir(t);
326 
327 	String st = pSet->gui.track;
328 	gcom->FillTrackLists();
329 	gcom->TrackListUpd();
330 	if (st != pSet->gui.track)
331 		app->LoadTrack();  //load 1st if deleted cur
332 }
333