1 #include "pch.h"
2 #include "../Def_Str.h"
3 #include "../vdrift/par.h"
4 #include "SceneXml.h"
5 #include "FluidsXml.h"
6 #include "TracksXml.h"
7 #include "../Axes.h"
8 #include "tinyxml.h"
9 #include "tinyxml2.h"
10 #include <OgreSceneNode.h>
11 #include "../vdrift/game.h" // for surfaces map
12 using namespace std;
13 using namespace Ogre;
14 using namespace tinyxml2;
15
16
Scene()17 Scene::Scene()
18 : pGame(0)
19 {
20 pFluidsXml = 0; pReverbsXml = 0;
21 Default();
22 }
Default()23 void Scene::Default()
24 {
25 ter = true; vdr = false; secEdited = 0;
26
27 asphalt = false; denyReversed = false; noWrongChks = false;
28 windAmt = 0.f; damageMul = 1.f;
29 gravity = 9.81f;
30
31 sAmbient = ""; sReverbs = "";
32
33 skyMtr = "World/NoonSky"; skyYaw = 0.f;
34 rainEmit = 0; rainName = "";
35 rain2Emit = 0; rain2Name = "";
36
37 fogStart = 600; fogEnd = 1600;
38 fogClr = fogClr2 = fogClrH = SColor(0.73f, 0.86f, 1.0f, 1.f);
39 fogHeight = -300.f; fogHDensity = 100.f; fogHStart = 0; fogHEnd = 400;
40 fHDamage = 0.f;
41
42 ldPitch = 50.f; ldYaw = 30.f;
43 lAmb = SColor(0.16f, 0.0f, 0.45f);
44 lDiff = SColor(0.16f, 0.0f, 0.7f); lSpec = SColor(0.16f, 0.05f, 1.f);
45
46 sParDust = "Dust"; sParMud = "Mud"; sParSmoke = "Smoke";
47
48 td.Default();
49
50 densTrees=0; densGrass=0; grDensSmooth=6;
51 grPage = 80; grDist = 80;
52
53 for (int i=0; i < ciNumGrLay; ++i)
54 {
55 SGrassLayer* gr = &grLayersAll[i];
56 gr->on = i == 0;
57 gr->material = "grassJungle"; gr->colorMap = "grClrJungle.png";
58 gr->minSx = 1.2f; gr->minSy = 1.2f; gr->maxSx = 1.6f; gr->maxSy = 1.6f;
59 gr->swayDistr = 4.0f; gr->swayLen = 0.2f; gr->swaySpeed = 0.5f;
60 }
61 trPage = 200; trDist = 200; trDistImp = 800; trRdDist = 3;
62
63 camPos = Vector3(10.f,20.f,10.f); camDir = Vector3(0.f,-0.3f,1.f);
64
65 fluids.clear(); //
66 objects.clear(); //
67 }
68
PagedLayer()69 PagedLayer::PagedLayer()
70 {
71 on = 0; name = ""; dens = 0.1f; cnt = 0;
72 windFx = 0.0f; windFy = 0.0f; addRdist = 0; maxRdist = 100;
73 minScale = 0.1f; maxScale = 0.25f; ofsY = 0.f;
74 maxTerAng = 50.f; minTerH = -100.f; maxTerH = 100.f;
75 maxDepth = 5.f;
76 }
77
SGrassLayer()78 SGrassLayer::SGrassLayer()
79 {
80 on = false; grl = 0;
81 dens = 0.1f; iChan = 0;
82 minSx = 1.2f; minSy = 1.2f; maxSx = 1.6f; maxSy = 1.6f;
83 swayDistr = 4.f; swayLen = 0.2f; swaySpeed = 0.5f;
84 material = "grassForest"; colorMap = "grClrForest.png";
85 }
86
SGrassChannel()87 SGrassChannel::SGrassChannel()
88 {
89 angMin = 0.f; angMax = 30.f; angSm = 20.f;
90 hMin = -100.f; hMax = 100.f; hSm = 20.f; rdPow = 0.f;
91 noise = 0.0f; nFreq = 25.f; nPers = 0.3f; nPow = 1.2f; nOct = 3;
92 }
93
94
FluidBox()95 FluidBox::FluidBox()
96 :cobj(0), id(-1), idParticles(0), solid(false), deep(false)
97 ,pos(Vector3::ZERO), rot(Vector3::ZERO)
98 ,size(Vector3::ZERO), tile(0.01,0.01)
99 { }
100
Object()101 Object::Object()
102 :nd(0),ent(0),ms(0),co(0),rb(0), dyn(false)
103 ,pos(0,0,0),rot(0,-1,0,0), tr1(0)
104 ,scale(Vector3::UNIT_SCALE)
105 { }
106
107
108 /// start
109 ///------------------------------
GetStart(int index)110 pair <MATHVECTOR<float,3>, QUATERNION<float> > Scene::GetStart(int index)
111 {
112 pair <MATHVECTOR<float,3>, QUATERNION<float> > sp = make_pair(startPos, startRot);
113 if (index == 0)
114 return sp;
115
116 MATHVECTOR<float,3> backward(-gPar.startNextDist * index,0,0);
117 sp.second.RotateVector(backward);
118 sp.first = sp.first + backward;
119 return sp;
120 }
121
122
123 /// bullet to ogre ----------
SetFromBlt()124 void Object::SetFromBlt()
125 {
126 if (!nd) return;
127 nd->setPosition(Axes::toOgre(pos));
128 nd->setOrientation(Axes::toOgreW(rot));
129 }
130
131
UpdRevSet()132 void Scene::UpdRevSet()
133 {
134 if (!pReverbsXml) return;
135 string s = sReverbs == "" ? "base" : sReverbs;
136
137 int id = pReverbsXml->revmap[sReverbs]-1;
138 if (id == -1)
139 { LogO("!scene.xml reverb set not found in xml: "+sReverbs);
140 //..
141 }else
142 { const ReverbSet &r = pReverbsXml->revs[id], &b = pReverbsXml->base;
143 revSet.descr = r.descr != "" ? r.descr : b.descr;
144 revSet.normal = r.normal != "" ? r.normal : b.normal;
145 revSet.cave = r.cave != "" ? r.cave : b.cave;
146 revSet.cavebig = r.cavebig != "" ? r.cavebig : b.cavebig;
147 revSet.pipe = r.pipe != "" ? r.pipe : b.pipe;
148 revSet.pipebig = r.pipebig != "" ? r.pipebig : b.pipebig;
149 revSet.influid = r.influid != "" ? r.influid : b.influid;
150 }
151 }
152
153
UpdateFluidsId()154 void Scene::UpdateFluidsId()
155 {
156 if (!pFluidsXml) return;
157
158 // set fluids id from name
159 for (int i=0; i < fluids.size(); ++i)
160 {
161 int id = pFluidsXml->flMap[fluids[i].name]-1;
162 fluids[i].id = id;
163 fluids[i].idParticles = id == -1 ? -1 : pFluidsXml->fls[id].idParticles;
164 fluids[i].solid = id == -1 ? false : pFluidsXml->fls[id].solid;
165 fluids[i].deep = id == -1 ? false : pFluidsXml->fls[id].deep;
166 if (id == -1)
167 LogO("!Warning: Scene fluid name: " + fluids[i].name + " not found in xml!");
168 }
169 }
170
171
UpdateSurfId()172 void Scene::UpdateSurfId()
173 {
174 if (!pGame) return;
175 // update surfId from surfName
176 int i;
177 // terrain
178 for (i=0; i < td.ciNumLay; ++i)
179 {
180 const std::string& s = td.layersAll[i].surfName;
181 int id = pGame->surf_map[s]-1;
182 if (id == -1)
183 { id = 0; // default if not found
184 LogO("! Warning: Surface not found (terrain): "+s);
185 }
186 td.layersAll[i].surfId = id; // cached
187 }
188 // road
189 for (i=0; i < 4; ++i)
190 {
191 const std::string& s = td.layerRoad[i].surfName;
192 int id = pGame->surf_map[s]-1;
193 if (id == -1)
194 { id = 0;
195 LogO("! Warning: Surface not found (road): "+s);
196 }
197 // road1mtr ?
198 td.layerRoad[i].surfId = id;
199 }
200 }
201
202
TerData()203 TerData::TerData()
204 {
205 hfHeight = NULL;
206 Default();
207 }
Default()208 void TerData::Default()
209 {
210 iVertsX = 512*2 +1;
211 fTriangleSize = 1.f; // scale
212 triplanarLayer1 = 8; triplanarLayer2 = 8; triplCnt = 0; // off
213 errorNorm = 1.7; normScale = 1.f;
214 emissive = false; specularPow = 32.f; specularPowEm = 2.f;
215 road1mtr = true;
216
217 for (int i=0; i < ciNumLay; ++i)
218 {
219 TerLayer& l = layersAll[i]; l.tiling = 8.5f;
220 l.on = i==0;
221 l.texFile = ""; l.texNorm = "";
222 l.dust = 0.f; l.mud = 1.f; l.smoke = 0.f;
223 l.tclr = SColor(0.16f,0.5f,0.2f,0.7f);
224 l.fDamage = 0.f;
225 }
226 for (int i=0; i < 4; ++i)
227 {
228 TerLayer& r = layerRoad[i];
229 r.dust = 0.f; r.mud = 0.f; // r.smoke = 1.f;
230 r.tclr = SColor(0.16f,0.5f,0.2f,0.7f); r.tcl = r.tclr.GetRGBA();
231 r.fDamage = 0.f;
232 }
233 UpdVals(); UpdLayers();
234 }
235
TerLayer()236 TerLayer::TerLayer() :
237 on(true), tiling(4.f), triplanar(false),
238 dust(0.f),dustS(0.2f), mud(0.f), smoke(0.f),
239 tclr(0.16f,0.5f,0.2f,0.7f),
240 angMin(0.f),angMax(90.f), angSm(20.f),
241 hMin(-300.f),hMax(300.f), hSm(20.f), nOnly(false),
242 noise(1.f), nprev(0.f), nnext2(0.f),
243 surfName("Default"), surfId(0), //!
244 fDamage(0.f)
245 {
246 nFreq[0]=25.f; nPers[0]=0.30f; nPow[0]=1.5f; nOct[0]=3;
247 nFreq[1]=30.f; nPers[1]=0.40f; nPow[1]=1.2f; nOct[1]=3;
248 }
249
UpdVals()250 void TerData::UpdVals()
251 {
252 iVertsY = iVertsX; //square only-[]
253 iTerSize = iVertsX;
254 fTerWorldSize = (iTerSize-1)*fTriangleSize;
255 }
256
257
258 // fill only active layers
259 //------------------------------------------
UpdLayers()260 void TerData::UpdLayers()
261 {
262 layers.clear(); int li = 0;
263 triplanarLayer1 = 8; triplanarLayer2 = 8; triplCnt = 0; // off
264 for (int i=0; i < ciNumLay; ++i)
265 {
266 if (layersAll[i].on)
267 {
268 if (layersAll[i].triplanar)
269 { ++triplCnt;
270 if (triplanarLayer1 < 8)
271 triplanarLayer2 = li;
272 else
273 triplanarLayer1 = li; }
274 ++li;
275 layers.push_back(i);
276 } }
277 }
278
UpdPgLayers()279 void Scene::UpdPgLayers()
280 {
281 pgLayers.clear();
282 for (int i=0; i < ciNumPgLay; ++i)
283 {
284 if (pgLayersAll[i].on)
285 pgLayers.push_back(i);
286 }
287 }
288
289
290
291 /// Presets
292
PSky()293 PSky::PSky()
294 :mtr("sky"), clr("#C0E0FF")
295 ,ldYaw(0.f), ldPitch(0.f)
296 { }
297
PTer()298 PTer::PTer()
299 :tiling(8.f), triplanar(false)
300 ,dust(0.f), dustS(0.2f), mud(0.f)
301 ,tclr(0.2f, 0.2f, 0.1f, 0.6f)
302 ,angMin(0.f), angMax(90.f), dmg(0.f)
303 ,surfName("Default")
304 { }
305
PRoad()306 PRoad::PRoad()
307 :dust(0.f), dustS(0.2f), mud(0.f)
308 ,tclr(0.2f, 0.2f, 0.1f, 0.6f)
309 { }
310
PGrass()311 PGrass::PGrass()
312 :clr("GrassClrJungle")
313 ,minSx(1.2f), minSy(1.2f), maxSx(1.6f), maxSy(1.6f)
314 { }
315
PVeget()316 PVeget::PVeget()
317 :minScale(0.6f), maxScale(1.f)
318 ,windFx(0.02f), windFy(0.002f)
319 ,addRdist(1)
320 ,maxTerAng(30.f)
321 ,maxDepth(0.f)
322 { }
323
324
GetSky(std::string mtr)325 const PSky* Presets::GetSky(std::string mtr)
326 {
327 int id = isky[mtr]-1;
328 return id >= 0 ? &sky[id] : 0;
329 }
330
GetTer(std::string tex)331 const PTer* Presets::GetTer(std::string tex)
332 {
333 int id = iter[tex]-1;
334 return id >= 0 ? &ter[id] : 0;
335 }
336
GetRoad(std::string mtr)337 const PRoad* Presets::GetRoad(std::string mtr)
338 {
339 int id = ird[mtr]-1;
340 return id >= 0 ? &rd[id] : 0;
341 }
342
GetGrass(std::string mtr)343 const PGrass* Presets::GetGrass(std::string mtr)
344 {
345 int id = igr[mtr]-1;
346 return id >= 0 ? &gr[id] : 0;
347 }
348
GetVeget(std::string mesh)349 const PVeget* Presets::GetVeget(std::string mesh)
350 {
351 int id = iveg[mesh]-1;
352 return id >= 0 ? &veg[id] : 0;
353 }
354