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