source: Revenant/geoworld/src/gwmorphs/crater.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: 7.2 KB
Line 
1#include "crater.h"
2#include "mars_ptr.h"
3#include "geoworld.h"
4
5namespace geoworld
6{
7 void CraterGM::init(SynthesisSession & manager, const IGeoWorldAccessor & accessor, const unsigned short nMaxWidth, const unsigned short nMaxHeight)
8 {
9 _gcOrigin = accessor.createCoords(_ptOrigin);
10 }
11
12 void CraterGM::doMorph (LockedGWSection & section) const
13 {
14 using namespace mars;
15 using namespace geoworld;
16
17 const unsigned short nDim = static_cast <unsigned short> (_zones.puz.outside() * 2.0f);
18
19 mars::ptr< NoiseGenerator< float >::NoiseMap > pMPField = _noise.compute(nDim, nDim);
20 for (PerimiterUpliftZone::UpsideDEMIterator <PerimiterUpliftZone> it = _zones.puz.walkUpside (_gcOrigin); it; ++it)
21 {
22 section.heightmap(it->x, it->y) =
23 blend(
24 section.heightmap(it->x, it->y),
25 it->z + (*pMPField)(it->x, it->y),
26 _zones.puz.outslope.taper.f (
27 static_cast< float > (it->x - _ptOrigin.x),
28 static_cast< float > (it->y - _ptOrigin.y)
29 )
30 );
31 }
32
33 // TODO: Why are we walking the downside? is this an inverted function?
34 for (CraterZone::DownsideDEMIterator <CraterZone> it = _zones.czone.walkDownside (_gcOrigin); it; ++it)
35 {
36 section.heightmap(it->x, it->y) = static_cast< GeoHeightMap::Precision > (mars::RNDi(it->z + pMPField->getw(it->x, it->y))); // TODO: Verify use of RNDi
37 }
38
39 for (CentralUpliftZone::UpsideDEMIterator <CentralUpliftZone> it = _zones.central.walkUpside (_gcOrigin); it; ++it)
40 {
41 section.heightmap(it->x, it->y) = static_cast< GeoHeightMap::Precision > (mars::RNDi(it->z + pMPField->getw(it->x, it->y))); // TODO: Verify use of RNDi
42 }
43 }
44
45 GMScalarField * CraterGM::queryField( const FieldType enft, const GeoHeightMap & hm )
46 {
47 switch (enft)
48 {
49 case FT_Density: return new DensityScalarField(_zones.density, _gcOrigin);
50 default: return NULL;
51 }
52 }
53
54 void CraterGM::releaseField( const GMScalarField * pField )
55 {
56 delete pField;
57 }
58
59 mars::BBox< long > CraterGM::getBBox() const
60 {
61 return mars::BBox< long > (
62 _ptOrigin - static_cast< long > (floor (_zones.puz.outside())),
63 _ptOrigin + static_cast< long > (ceil (_zones.puz.outside()))
64 );
65 }
66
67 mars::ptr< PersistentGeoMorph::State > CraterGM::createState() const
68 {
69 CraterGMState * pState = new CraterGMState();
70
71 pState->fBowlDepth = -_zones.czone.bowl.depth;
72 pState->fCentralUpliftBroadnessScale = _fCentralUpliftBroadnessScale;
73 pState->fCentralUpliftDepthScale = _fCentralUpliftDepthScale;
74 pState->frBowlBroadness = _zones.czone.bowl.broadness;
75 pState->frNoise = _noise.noise;
76 pState->frScale = _zones.czone.bowl.scale;
77 pState->fSpallFalloffFactor = _zones.puz.outslope.falloff;
78 pState->gcOrigin = _gcOrigin;
79 pState->ptOrigin = _ptOrigin;
80
81 return dynamic_cast< PersistentGeoMorph::State * > (pState);
82 }
83
84 CraterGM::CraterGM( const VectorTag< GeoHeightMap::Precision >::V2 & ptOrigin, const float frSample, const float frScale, const float frBowlBroadness, const float fBowlDepth, const float fSpallFalloffFactor, const float frNoise, const float fCentralUpliftDepthScale, const float fCentralUpliftBroadnessScale )
85 :
86 _zones(
87 CraterZone(
88 BowlFn(
89 frScale,
90 frBowlBroadness,
91 -fBowlDepth
92 )
93 ),
94 PerimeterUpsideEq(
95 frScale,
96 frBowlBroadness,
97 0.0f
98 ),
99 PerimeterDownsideEq(
100 frScale,
101 frBowlBroadness / 4.0f * mars::SQ(-fBowlDepth),
102 0.0f
103 ),
104 CentralUpliftEq(
105 frScale,
106 1.0f,
107 fCentralUpliftBroadnessScale * frBowlBroadness,
108 -fBowlDepth * fCentralUpliftDepthScale
109 ),
110 fSpallFalloffFactor
111 ),
112 _fCentralUpliftDepthScale(fCentralUpliftDepthScale),
113 _fCentralUpliftBroadnessScale(fCentralUpliftBroadnessScale),
114 _noise (0.4f, frNoise),
115 // TODO: Messy redundant EqSet instantiation to satisfy constructor member initialization limitations
116 _ptOrigin(ptOrigin)
117 {}
118
119 CraterGM::CraterGM( const CraterGMState & state )
120 : _zones(
121 CraterZone(
122 BowlFn(
123 state.frScale,
124 state.frBowlBroadness,
125 -state.fBowlDepth
126 )
127 ),
128 PerimeterUpsideEq(
129 state.frScale,
130 state.frBowlBroadness,
131 0.0f
132 ),
133 PerimeterDownsideEq(
134 state.frScale,
135 state.frBowlBroadness / 4.0f * mars::SQ(-state.fBowlDepth),
136 0.0f
137 ),
138 CentralUpliftEq(
139 state.frScale,
140 1.0f,
141 state.fCentralUpliftBroadnessScale * state.frBowlBroadness,
142 -state.fBowlDepth * state.fCentralUpliftDepthScale
143 ),
144 state.fSpallFalloffFactor
145 ),
146 _fCentralUpliftDepthScale(state.fCentralUpliftDepthScale),
147 _fCentralUpliftBroadnessScale(state.fCentralUpliftBroadnessScale),
148 _noise (0.4f, state.frNoise),
149 // TODO: Messy redundant EqSet instantiation to satisfy constructor member initialization limitations
150 _ptOrigin(state.ptOrigin),
151 _gcOrigin(state.gcOrigin)
152 {}
153
154 CraterGM::DensityScalarField::ResultType CraterGM::DensityScalarField::operator () (const IndexType x, const IndexType y, const IndexType z) const
155 {
156 return std::max(1.0f, _zone.upside(static_cast< float > (x), static_cast< float > (y)));
157 }
158 CraterGM::DensityGradientField::ResultType CraterGM::DensityGradientField::operator () (const IndexType x, const IndexType y, const IndexType z) const
159 {
160 using namespace mars;
161
162 const vector3Df dir (
163 static_cast< float > (_gcOrigin.x - x),
164 static_cast< float > (_gcOrigin.y - y),
165 static_cast< float > (_gcOrigin.z - z)
166 );
167
168 const float fMag = MAG(dir);
169
170 return fMag > _zone.outside() ? vector3Df() : -mars::U(dir) * _zone.upsideGrad(static_cast< float > (x), static_cast< float > (y));
171 }
172
173 CraterGMFactory::~CraterGMFactory() {}
174
175 GeoMorph * CraterGMFactory::createRandomInstance( const long x, const long y ) const
176 {
177 return new CraterGM(
178 GWSurfacePos(x, y),
179 _rngfrSample.next(),
180 _rngfrScale.next(),
181 _rngfrBowlBroadness.next(),
182 _rngfBowlDepth.next(),
183 _fSpallFalloffFactor,
184 _frNoise,
185 _fCentralUpliftDepthScale,
186 _fCentralUpliftBroadnessScale
187 );
188 }
189
190 void CraterGMFactory::configure( IConfigGMFactory * pFactoryConfig, const IConfigGMFactory::Settings & settings )
191 {
192 const geoworld::IConfigSection & section = *pFactoryConfig->getSection();
193
194 *section["sample"] >> _rngfrSample;
195 *section["scale"] >> _rngfrScale;
196 *section["broadness"] >> _rngfrBowlBroadness;
197 *section["depth"] >> _rngfBowlDepth;
198 *section["falloff"] >> _fSpallFalloffFactor;
199 *section["noise"] >> _frNoise;
200 *section["uplift_depth"] >> _fCentralUpliftDepthScale;
201 *section["uplift_broadness"] >> _fCentralUpliftBroadnessScale;
202 }
203
204 void CraterGMFactory::save( const GeoMorph * pGM, mars::ObjectStream & outs ) const
205 {
206 const CraterGM * pCraterGM = dynamic_cast< const CraterGM * > (pGM);
207 assert(pCraterGM != NULL);
208 *(pCraterGM->createState()) >> outs;
209 }
210
211 const GeoMorph * CraterGMFactory::restore( mars::ObjectStream & ins ) const
212 {
213 CraterGM::CraterGMState state;
214
215 state << ins;
216 return new CraterGM(state);
217 }
218
219 mars::ObjectStream & CraterGM::CraterGMState::operator >> ( mars::ObjectStream & outs ) const
220 {
221 outs << frScale << frBowlBroadness << fBowlDepth << fCentralUpliftBroadnessScale << fCentralUpliftDepthScale << fSpallFalloffFactor << frNoise << ptOrigin << gcOrigin;
222 return outs;
223 }
224
225 mars::ObjectStream & CraterGM::CraterGMState::operator << ( mars::ObjectStream & ins )
226 {
227 ins >> frScale >> frBowlBroadness >> fBowlDepth >> fCentralUpliftBroadnessScale >> fCentralUpliftDepthScale >> fSpallFalloffFactor >> frNoise >> ptOrigin >> gcOrigin;
228 return ins;
229 }
230
231}
Note: See TracBrowser for help on using the repository browser.