#pragma once #include "geomorph.h" #include "gwutil.h" #include "gmregistry.h" #include "gwtypes.h" namespace geoworld { class WindErosionGM : public HeightMapGeoMorph { private: typedef float RationalType; unsigned int _iterations; RationalType _frDecayLevel; bool _bSmoothPost; const IGeoWorldAccessor * _pAccessor; const GMScalarField * _psfDensity; RationalType _fgaussblur[5][5]; using NoiseGen = NoiseGenerator< RationalType >; NoiseGen _ngen; template< typename T > inline void grad5( const mars::ScalarField< T > & hmf, const signed int x, const signed int y, VectorTag< RationalType >:: V2 & v ) const { v.x = (hmf(x + 2, y) - hmf(x - 2, y)) / static_cast< T > (4); v.y = (hmf(x, y + 2) - hmf(x, y - 2)) / static_cast< T > (4); } inline RationalType & gaussblur (const signed int x, const signed int y) { assert(x >= -2 && y >= -2 && x <= +2 && y <= +2); return _fgaussblur[x + 2][y + 2]; } inline RationalType gaussblur (const signed int x, const signed int y) const { assert(x >= -2 && y >= -2 && x <= +2 && y <= +2); return _fgaussblur[x + 2][y + 2]; } public: WindErosionGM ( const unsigned int nIterations = 8, const float frDecayLevel = 0.1f, const bool bSmoothPost = true ); ~WindErosionGM(); void init (SynthesisSession & manager, const IGeoWorldAccessor & accessor, const unsigned short nMaxWidth, const unsigned short nMaxHeight); void doMorph (LockedGWSection & section) const; }; class WindErosionGTFactory : public GeoTemplateFactory, public IOpenGeoMorphFactory { private: mars::RangeX< unsigned int > _mmnIterations; float _frDecayLevel; bool _bSmoothPost; public: virtual GeoMorph * createRandomInstance() const; virtual void configure( IConfigGTFactory * pFactoryConfig, const IConfigGTFactory::Settings & settings ); }; }