WS30: Fix regression of lakes

Fix regression that stopped lakes from being generated.
This commit is contained in:
Stuart Buchanan 2021-05-12 21:36:11 +01:00
parent 81b93cffbb
commit d0f4e9018c

View File

@ -176,9 +176,11 @@ void VPBTechnique::init(int dirtyMask, bool assumeMultiThreaded)
else else
{ {
generateGeometry(*buffer, masterLocator, centerModel); generateGeometry(*buffer, masterLocator, centerModel);
applyColorLayers(*buffer, masterLocator); applyColorLayers(*buffer, masterLocator);
applyTrees(*buffer, masterLocator); applyTrees(*buffer, masterLocator);
applyLineFeatures(*buffer, masterLocator); applyLineFeatures(*buffer, masterLocator);
applyAreaFeatures(*buffer, masterLocator);
applyCoastline(*buffer, masterLocator); applyCoastline(*buffer, masterLocator);
} }
@ -1848,6 +1850,8 @@ void VPBTechnique::applyAreaFeatures(BufferData& buffer, Locator* masterLocator)
if (v->size() == 0) continue; if (v->size() == 0) continue;
c->push_back(osg::Vec4(1.0,1.0,1.0,1.0)); c->push_back(osg::Vec4(1.0,1.0,1.0,1.0));
geometry->dirtyBound();
EffectGeode* geode = new EffectGeode; EffectGeode* geode = new EffectGeode;
geode->addDrawable(geometry); geode->addDrawable(geometry);
@ -1881,6 +1885,7 @@ void VPBTechnique::generateAreaFeature(BufferData& buffer, Locator* masterLocato
// Build up the tesselator while also determining the correct elevation for the feature. // Build up the tesselator while also determining the correct elevation for the feature.
double elev = 0; double elev = 0;
unsigned int elev_count = 0; unsigned int elev_count = 0;
osg::Vec3d last_pt;
auto area_iter = area._nodes.begin(); auto area_iter = area._nodes.begin();
osg::Vec3d pt = *area_iter - modelCenter; osg::Vec3d pt = *area_iter - modelCenter;
@ -1892,12 +1897,21 @@ void VPBTechnique::generateAreaFeature(BufferData& buffer, Locator* masterLocato
for (; area_iter != area._nodes.end(); area_iter++) { for (; area_iter != area._nodes.end(); area_iter++) {
pt = *area_iter - modelCenter; pt = *area_iter - modelCenter;
// Ignore small segments - we really don't need resolution less than 10m
if ((pt - last_pt).length2() < 100.0) continue;
ma = getMeshIntersection(buffer, masterLocator, pt, up); ma = getMeshIntersection(buffer, masterLocator, pt, up);
if (ma !=pt) { if (ma !=pt) {
elev += up*ma; elev += up*ma;
elev_count++; elev_count++;
} }
tessellator->addVertex(new osg::Vec3f(*area_iter - modelCenter));
// To handle the case where the feature overlaps the edge of this particular mesh,
// we always add vertices, even if they don't intersect the edge of the mesh.
tessellator->addVertex(new osg::Vec3f(pt));
last_pt = pt;
} }
tessellator->endContour(); tessellator->endContour();