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