#ifndef __OREGENESIS_H__ #define __OREGENESIS_H__ #include #include "gwtypes.h" #include "mindb.h" #include "stratum.h" #include "geometry.h" #include "worldfile.h" #include "gwconfig.h" namespace geoworld { class OreInstance { public: MineralDeposit deposit; size_t pass; OreInstance (const mars::ptr< MineralDef > & pMin, const size_t pass, const DepositDistribution enddDepositDistribution) : deposit(pMin, enddDepositDistribution), pass(pass) {} }; typedef mars::OctTree_SphereIndexed< OreInstance, GeoSpherePack::SCALAR > OctTreeOreInstance; class DepositSynthesizer : public IMineralQuery { public: static const float FREQUENCY_MULTIPLIER; DepositSynthesizer(const MineralsDB * pMinDB, const DepositSynthesizerSettings & settings, const WorldUnit nWidth, const WorldUnit nHeight, const WorldUnit nDepth, const unsigned short nDEMLOD); ~DepositSynthesizer(); static DepositSynthesizerSettings loadSettings (IDepositSynthConfigReader & cfgreader); void generateStrata(); void generateMinerals(const unsigned int nPass); inline const Stratum & getStratum () const { return _stratum; } inline Stratum & getStratum () { return _stratum; } inline const OctTreeOreInstance & getOctTreeMineralDeposits () const { return _otOre; } inline void operator >> (FileSource::MineralHostMap & dest) const { dest << _stratum; } inline void operator << (FileSource::MineralHostMap & src) { src >> _stratum; } void operator >> (FileSource::MineralMap & dest) const; private: typedef SpherePackFactory< OctTreeOreInstance::SCALAR > BubbleGumFactory; mars::StaticParabolicScale< PointScale, CountPtSc > _pbsAbundance, _pbsDepositSize; mars::ParabolicScale< size_t > _pbsThickness; const MineralsDB * _pMinDB; BubbleGumFactory _factBubbleGum; const unsigned long _nAbsWidth, _nAbsHeight; Stratum _stratum; OctTreeOreInstance _otOre; DepositSynthesizerSettings _settings; std::pair< BubbleGumFactory::PackPtr, DepositDistribution > depositMineral( const PetrogenyDef & petrogeny, const OctTreeOreInstance::VECTOR & ptChosenSpot, const mars::ptr< MineralDef > & pMin, const size_t nPass ); static Silica selectSilica (const float fRatio); static Origin selectOrigin (const float fRatio); }; } #endif