source: Revenant/geoworld/src/mindb.cpp@ 8125274

port/mars-tycoon
Last change on this file since 8125274 was 80a6a52, checked in by Jonathan Neufeld <support@…>, 3 years ago

Get to a compile state for terrain procedural generation

  • Property mode set to 100644
File size: 12.6 KB
Line 
1#include "mindb.h"
2
3#include <mars_util.h>
4
5namespace geoworld
6{
7 void MineralsDB::resolveReferences()
8 {
9 // Resolving all mineral references to classes
10 for (MineralMap::iterator iMin = _minerals.begin(); iMin != _minerals.end(); ++iMin)
11 {
12 resolve(iMin->second->clazz);
13 }
14
15 // Determining all class groupings of minerals
16 for (ClassesMap::const_iterator iClass = _classes.all.begin(); iClass != _classes.all.end(); ++iClass)
17 {
18 DirectMineralList & grouping = _groups.classes[iClass->first] = DirectMineralList();
19
20 for (MineralMap::iterator iMin = _minerals.begin(); iMin != _minerals.end(); ++iMin)
21 {
22 if (!iMin->second->clazz.isNull())
23 {
24 const std::string & name = iMin->second->clazz->name;
25
26 if (name == iClass->first)
27 grouping.push_back(iMin->second);
28 }
29 }
30
31 if (grouping.empty())
32 _groups.classes.erase(iClass->first);
33 }
34
35 // Resolving all group definition minerals
36 for (MineralGroups::iterator iGrp = _groups.all.begin(); iGrp != _groups.all.end(); ++iGrp)
37 {
38 for (MineralGroupDef::MineralList::iterator iGrpMin = iGrp->second->members.begin(); iGrpMin != iGrp->second->members.end(); ++iGrpMin)
39 resolve(*iGrpMin);
40 }
41
42 for (MineralMap::iterator i = _minerals.begin(); i != _minerals.end(); ++i)
43 {
44 for (MineralDef::GenesisList::iterator ig = i->second->genesis.begin();
45 ig != i->second->genesis.end();
46 ++ig)
47 {
48 resolve(ig->associations);
49 resolve(ig->protolith);
50 resolve(ig->host.mineral);
51 resolve(ig->environments);
52 }
53 }
54 }
55
56 void MineralsDB::createIndexes()
57 {
58 // Create class-by-silica index
59 for (ClassesMap::const_iterator j = _classes.all.begin(); j != _classes.all.end(); ++j)
60 for (MineralClass::DispositionList::const_iterator i = j->second->dispositions.begin(); i != j->second->dispositions.end(); ++i)
61 _classes.silica[i->silica.base].insert(j->second);
62
63 // Create mineral-by-associated index
64 for (MineralMap::const_iterator i = _minerals.begin(); i != _minerals.end(); ++i)
65 {
66 for (MineralDef::GenesisList::const_iterator j = i->second->genesis.begin(); j != i->second->genesis.end(); ++j)
67 {
68 for (MineralReferenceList::const_iterator k = j->associations.begin(); k != j->associations.end(); ++k)
69 {
70 if (!k->mineral.isNull())
71 {
72 PetrogenyMineralMultiMap::iterator u = _associations.find(k->mineral);
73
74 if (u == _associations.end())
75 u = _associations.insert(_associations.begin(), std::pair< MineralPtr, PetrogenyMineralSet > (k->mineral, PetrogenyMineralSet()));
76
77 u->second.insert(GenesisMineralMapping(*k, i->second, j));
78 }
79 }
80 }
81 }
82
83 // Create mineral-by-protolith index
84 for (MineralMap::const_iterator i = _minerals.begin(); i != _minerals.end(); ++i)
85 {
86 for (MineralDef::GenesisList::const_iterator j = i->second->genesis.begin(); j != i->second->genesis.end(); ++j)
87 {
88 for (MineralReferenceList::const_iterator k = j->protolith.begin(); k != j->protolith.end(); ++k)
89 {
90 if (!k->mineral.isNull())
91 {
92 PetrogenyMineralMultiMap::iterator u = _protoliths.find(k->mineral);
93
94 if (u == _protoliths.end())
95 u = _protoliths.insert(_protoliths.begin(), std::pair< MineralPtr, PetrogenyMineralSet > (k->mineral, PetrogenyMineralSet()));
96
97 u->second.insert(GenesisMineralMapping(*k, i->second, j));
98 }
99 }
100 }
101 }
102
103 // Create mineral-by-host index
104 for (MineralMap::const_iterator i = _minerals.begin(); i != _minerals.end(); ++i)
105 {
106 for (MineralDef::GenesisList::const_iterator j = i->second->genesis.begin(); j != i->second->genesis.end(); ++j)
107 {
108 if (j->host)
109 {
110 PetrogenyMineralMultiMap::iterator u = _hosts.find(j->host.mineral);
111
112 if (u == _hosts.end())
113 u = _hosts.insert(_hosts.begin(), std::pair< MineralPtr, PetrogenyMineralSet > (j->host.mineral, PetrogenyMineralSet()));
114
115 u->second.insert(GenesisMineralMapping(j->host, i->second, j));
116 }
117 }
118 }
119
120 // Create mineral-by-environment index
121 for (MineralMap::const_iterator i = _minerals.begin(); i != _minerals.end(); ++i)
122 {
123 for (MineralDef::GenesisList::const_iterator j = i->second->genesis.begin(); j != i->second->genesis.end(); ++j)
124 {
125 for (MinClassReferenceList::const_iterator k = j->environments.begin(); k != j->environments.end(); ++k)
126 {
127 if (!k->isNull())
128 {
129 PetrogenyClassMultiMap::iterator u = _environments.find(*k);
130
131 if (u == _environments.end())
132 u = _environments.insert(_environments.begin(), std::pair< MinClassPtr, PetrogenyClassSet > (*k, PetrogenyClassSet()));
133
134 u->second.insert(GenesisClassMapping(i->second, j));
135 }
136 }
137 }
138 }
139 }
140
141 void MineralsDB::resolve( MineralPtr & rWRef )
142 {
143 if (!rWRef.isNull() && rWRef.getState() == MineralPtr::Weak)
144 {
145 MineralMap::const_iterator iMineral = _minerals.find(rWRef.getName());
146
147 if (iMineral != _minerals.end())
148 rWRef.resolve(iMineral->second);
149 else
150 rWRef.makeNull();
151 }
152 }
153 void MineralsDB::resolve( mars::WeakReference< MineralClass > & rWRef )
154 {
155 if (!rWRef.isNull() && rWRef.getState() == mars::WeakReference< MineralClass >::Weak)
156 {
157 ClassesMap::const_iterator iClass = _classes.all.find(rWRef.getName());
158
159 if (iClass != _classes.all.end())
160 rWRef.resolve(iClass->second);
161 else
162 rWRef.makeNull();
163 }
164 }
165 void MineralsDB::resolve( MinClassReferenceList & list )
166 {
167 for (MinClassReferenceList::iterator i = list.begin(); i != list.end(); ++i)
168 {
169 resolve (*i);
170 }
171 }
172 void MineralsDB::resolve( MineralReferenceList & list )
173 {
174 class MineralReferenceCompare
175 {
176 public:
177 inline bool operator() (const MineralReference & a, const MineralReference & b) const
178 {
179 if (a.mineral.isNull())
180 return !b.mineral.isNull();
181 else if (b.mineral.isNull())
182 return false;
183 else
184 {
185 const std::string &
186 aName = getName(a.mineral),
187 bName = getName(b.mineral);
188
189 if (aName == bName)
190 return a.distributions.to_ulong() < b.distributions.to_ulong();
191 else
192 return aName < bName;
193 }
194 }
195 };
196 std::set <MineralReference, MineralReferenceCompare> tracker;
197
198 for (MineralReferenceList::iterator i = list.begin();
199 i != list.end();
200 ++i)
201 {
202 MineralMap::const_iterator iMin = _minerals.find(getName(i->mineral));
203
204 if (iMin != _minerals.end())
205 {
206 tracker.insert(*i);
207 i->mineral.resolve(iMin->second);
208 }
209 }
210
211 MineralReferenceList::iterator i = list.begin();
212 if (i != list.end()) do
213 {
214 MineralGroupMap::const_iterator iClass = _groups.classes.find(getName(i->mineral));
215
216 if (iClass != _groups.classes.end())
217 {
218 MineralReference oMineralDefault = *i;
219
220 i = list.erase(i);
221 for (DirectMineralList::const_iterator iClassMin = iClass->second.begin(); iClassMin != iClass->second.end(); ++iClassMin)
222 {
223 oMineralDefault.mineral = MineralPtr (*iClassMin);
224 if (tracker.end() == tracker.find(oMineralDefault))
225 {
226 list.insert(i, oMineralDefault);
227 tracker.insert(oMineralDefault);
228 }
229 }
230 } else {
231 MineralGroups::const_iterator iGrp = _groups.all.find(getName(i->mineral));
232
233 if (iGrp != _groups.all.end())
234 {
235 MineralReference oMineralDefault = *i;
236
237 i = list.erase(i);
238 for (MineralGroupDef::MineralList::const_iterator iGrpMin = iGrp->second->members.begin(); iGrpMin != iGrp->second->members.end(); ++iGrpMin)
239 {
240 oMineralDefault.mineral = *iGrpMin;
241 if (tracker.end() == tracker.find(oMineralDefault))
242 {
243 list.insert(i, oMineralDefault);
244 tracker.insert(oMineralDefault);
245 }
246 }
247 } else
248 i++;
249 }
250 } while (i != list.end());
251 }
252
253 const mars::ptr< MineralDef > MineralsDB::getMinByName( const std::string & sName ) const
254 {
255 MineralMap::const_iterator i = _minerals.find(sName);
256
257 if (i == _minerals.end())
258 throw Ex("No such mineral");
259 else
260 return i->second;
261 }
262
263 const mars::ptr< MineralClass > MineralsDB::getClassByName( const std::string & sName ) const
264 {
265 ClassesMap::const_iterator i = _classes.all.find(sName);
266
267 if (i == _classes.all.end())
268 throw Ex("No such mineral class");
269 else
270 return i->second;
271 }
272
273 mars::ptr< MineralClass > MineralsDB::addClass( const mars::ptr< MineralClass > & ptr )
274 {
275 switch (ptr->type)
276 {
277 case MineralClass::Type_Igneous: _classes.igneous[ptr->name] = ptr; break;
278 case MineralClass::Type_Sedimentary: _classes.sedimentary[ptr->name] = ptr; break;
279 }
280 _classes.all[ptr->name] = ptr;
281
282 return ptr;
283 }
284
285 mars::ptr< MineralGroupDef > MineralsDB::addGroup( const mars::ptr< MineralGroupDef > & ptr )
286 {
287 return _groups.all[ptr->name] = ptr;
288 }
289
290 mars::ptr< MineralDef > MineralsDB::addMineral( const mars::ptr< MineralDef > & ptr )
291 {
292 return _minerals[ptr->name] = ptr;
293 }
294
295 geoworld::MineralsDB::classes_const_iterator MineralsDB::beginClasses( const MineralClass::Type enmcType ) const
296 {
297 const ClassesMap * pMap = NULL;
298
299 switch (enmcType)
300 {
301 case MineralClass::Type_Igneous: pMap = &_classes.igneous; break;
302 case MineralClass::Type_Sedimentary: pMap = &_classes.sedimentary; break;
303 default: pMap = &_classes.all; break;
304 }
305
306 return classes_const_iterator(pMap->begin());
307 }
308
309 geoworld::MineralsDB::classes_const_iterator MineralsDB::endClasses( const MineralClass::Type enmcType ) const
310 {
311 const ClassesMap * pMap = NULL;
312
313 switch (enmcType)
314 {
315 case MineralClass::Type_Igneous: pMap = &_classes.igneous; break;
316 case MineralClass::Type_Sedimentary: pMap = &_classes.sedimentary; break;
317 default: pMap = &_classes.all; break;
318 }
319
320 return classes_const_iterator(pMap->end());
321 }
322
323 MineralsDB::PetrogenyMineralSetFacade MineralsDB::getAssociatedMinerals( const std::string & sName ) const
324 {
325 MineralMap::const_iterator i = _minerals.find(sName);
326
327 if (i != _minerals.end())
328 return getAssociatedMinerals(MineralPtr(i->second));
329 else
330 return PetrogenyMineralSetFacade(_endMineralPetrogeny);
331 }
332
333 MineralsDB::PetrogenyMineralSetFacade MineralsDB::getAssociatedMinerals( const MineralPtr & pMin ) const
334 {
335 PetrogenyMineralMultiMap::const_iterator i = _associations.find(pMin);
336
337 if (i != _associations.end())
338 return PetrogenyMineralSetFacade(i->second);
339 else
340 return PetrogenyMineralSetFacade(_endMineralPetrogeny);
341 }
342
343 MineralsDB::PetrogenyMineralSetFacade MineralsDB::getIncubatedMinerals( const std::string & sName ) const
344 {
345 MineralMap::const_iterator i = _minerals.find(sName);
346
347 if (i != _minerals.end())
348 return getIncubatedMinerals(MineralPtr(i->second));
349 else
350 return PetrogenyMineralSetFacade(_endMineralPetrogeny);
351 }
352
353 MineralsDB::PetrogenyMineralSetFacade MineralsDB::getIncubatedMinerals( const MineralPtr & pMin ) const
354 {
355 PetrogenyMineralMultiMap::const_iterator i = _protoliths.find(pMin);
356
357 if (i != _protoliths.end())
358 return PetrogenyMineralSetFacade(i->second);
359 else
360 return PetrogenyMineralSetFacade(_endMineralPetrogeny);
361 }
362
363 MineralsDB::PetrogenyMineralSetFacade MineralsDB::getHostedMinerals( const std::string & sName ) const
364 {
365 MineralMap::const_iterator i = _minerals.find(sName);
366
367 if (i != _minerals.end())
368 return getHostedMinerals(MineralPtr(i->second));
369 else
370 return PetrogenyMineralSetFacade(_endMineralPetrogeny);
371 }
372
373 MineralsDB::PetrogenyMineralSetFacade MineralsDB::getHostedMinerals( const MineralPtr & pMin ) const
374 {
375 PetrogenyMineralMultiMap::const_iterator i = _hosts.find(pMin);
376
377 if (i != _hosts.end())
378 return PetrogenyMineralSetFacade(i->second);
379 else
380 return PetrogenyMineralSetFacade(_endMineralPetrogeny);
381 }
382
383 MineralsDB::PetrogenyClassSetFacade MineralsDB::getMineralsByEnvironment( const std::string & sName ) const
384 {
385 ClassesMap::const_iterator i = _classes.all.find(sName);
386
387 if (i != _classes.all.end())
388 return getMineralsByEnvironment(MinClassPtr(i->second));
389 else
390 return PetrogenyClassSetFacade(_endClassPetrogeny);
391 }
392
393 MineralsDB::PetrogenyClassSetFacade MineralsDB::getMineralsByEnvironment( const MinClassPtr & pClass ) const
394 {
395 PetrogenyClassMultiMap::const_iterator i = _environments.find(pClass);
396
397 if (i != _environments.end())
398 return PetrogenyClassSetFacade(i->second);
399 else
400 return PetrogenyClassSetFacade(_endClassPetrogeny);
401 }
402
403 // TODO: Move?
404 bool PetrogenyDef::intersection( const MineralReferenceList & lstSubject, const MineralDepositList & lstObject )
405 {
406 for (MineralReferenceList::const_iterator i = lstSubject.begin(); i != lstSubject.end(); ++i)
407 for (MineralDepositList::const_iterator j = lstObject.begin(); j != lstObject.end(); ++j)
408 if (*i & *j)
409 return true;
410
411 return false;
412 }
413
414 // TODO: Move?
415 bool PetrogenyDef::intersection( const MinClassReferenceList & lstSubject, const MinClassPtr & pMinClassObject )
416 {
417 for (MinClassReferenceList::const_iterator i = lstSubject.begin(); i != lstSubject.end(); ++i)
418 if (*i == pMinClassObject)
419 return true;
420
421 return false;
422 }
423}
Note: See TracBrowser for help on using the repository browser.