WS30: Property configuration VPB

Configure the VPB elevation mesh via properties:
/scenery/elevation-mesh/sample-ratio controls the elevation
mesh sampling, allowing reduction in mesh size

/scenery/elevation-mesh/vertical-scale is just for fun and
scales the mesh vertically making mountains taller.

/scenery/elevation-mesh/constraint-gap-m controls how much below
airports etc. elevation vertices are forced to be.
This commit is contained in:
Stuart Buchanan 2021-01-27 20:00:39 +00:00
parent b04cdbc491
commit d695d37563
2 changed files with 13 additions and 12 deletions

View File

@ -274,7 +274,7 @@ class VertexNormalGenerator
typedef std::pair< osg::ref_ptr<osg::Vec2Array>, Locator* > TexCoordLocatorPair; typedef std::pair< osg::ref_ptr<osg::Vec2Array>, Locator* > TexCoordLocatorPair;
typedef std::map< Layer*, TexCoordLocatorPair > LayerToTexCoordMap; typedef std::map< Layer*, TexCoordLocatorPair > LayerToTexCoordMap;
VertexNormalGenerator(Locator* masterLocator, const osg::Vec3d& centerModel, int numRows, int numColmns, float scaleHeight, bool createSkirt); VertexNormalGenerator(Locator* masterLocator, const osg::Vec3d& centerModel, int numRows, int numColmns, float scaleHeight, float vtx_gap, bool createSkirt);
void populateCenter(osgTerrain::Layer* elevationLayer, LayerToTexCoordMap& layerToTexCoordMap); void populateCenter(osgTerrain::Layer* elevationLayer, LayerToTexCoordMap& layerToTexCoordMap);
void populateLeftBoundary(osgTerrain::Layer* elevationLayer); void populateLeftBoundary(osgTerrain::Layer* elevationLayer);
@ -443,6 +443,7 @@ class VertexNormalGenerator
int _numRows; int _numRows;
int _numColumns; int _numColumns;
float _scaleHeight; float _scaleHeight;
float _constraint_vtx_gap;
Indices _indices; Indices _indices;
@ -454,12 +455,13 @@ class VertexNormalGenerator
}; };
VertexNormalGenerator::VertexNormalGenerator(Locator* masterLocator, const osg::Vec3d& centerModel, int numRows, int numColumns, float scaleHeight, bool createSkirt): VertexNormalGenerator::VertexNormalGenerator(Locator* masterLocator, const osg::Vec3d& centerModel, int numRows, int numColumns, float scaleHeight, float vtx_gap, bool createSkirt):
_masterLocator(masterLocator), _masterLocator(masterLocator),
_centerModel(centerModel), _centerModel(centerModel),
_numRows(numRows), _numRows(numRows),
_numColumns(numColumns), _numColumns(numColumns),
_scaleHeight(scaleHeight) _scaleHeight(scaleHeight),
_constraint_vtx_gap(vtx_gap)
{ {
int numVerticesInBody = numColumns*numRows; int numVerticesInBody = numColumns*numRows;
int numVerticesInSkirt = createSkirt ? numColumns*2 + numRows*2 - 4 : 0; int numVerticesInSkirt = createSkirt ? numColumns*2 + numRows*2 - 4 : 0;
@ -510,7 +512,7 @@ void VertexNormalGenerator::populateCenter(osgTerrain::Layer* elevationLayer, La
_masterLocator->convertLocalToModel(osg::Vec3d(ndc.x(), ndc.y(), -1000), origin); _masterLocator->convertLocalToModel(osg::Vec3d(ndc.x(), ndc.y(), -1000), origin);
_masterLocator->convertLocalToModel(ndc, model); _masterLocator->convertLocalToModel(ndc, model);
model = VPBTechnique::checkAgainstElevationConstraints(origin, model); model = VPBTechnique::checkAgainstElevationConstraints(origin, model, _constraint_vtx_gap);
for(VertexNormalGenerator::LayerToTexCoordMap::iterator itr = layerToTexCoordMap.begin(); for(VertexNormalGenerator::LayerToTexCoordMap::iterator itr = layerToTexCoordMap.begin();
itr != layerToTexCoordMap.end(); itr != layerToTexCoordMap.end();
@ -845,7 +847,9 @@ void VPBTechnique::generateGeometry(BufferData& buffer, Locator* masterLocator,
numRows = elevationLayer->getNumRows(); numRows = elevationLayer->getNumRows();
} }
float sampleRatio = terrain ? terrain->getSampleRatio() : 1.0f; double scaleHeight = atof(_options->getPluginStringData("SimGear::ELEV_MESH_VERTICAL_SCALE").c_str());
double sampleRatio = atof(_options->getPluginStringData("SimGear::ELEV_MESH_SAMPLE_RATIO").c_str());
double constraint_gap = atof(_options->getPluginStringData("SimGear::ELEV_MESH_CONSTRAINT_GAP").c_str());
// OSG_NOTICE<<"Sample ratio="<<sampleRatio<<std::endl; // OSG_NOTICE<<"Sample ratio="<<sampleRatio<<std::endl;
@ -875,11 +879,8 @@ void VPBTechnique::generateGeometry(BufferData& buffer, Locator* masterLocator,
bool createSkirt = skirtHeight != 0.0f; bool createSkirt = skirtHeight != 0.0f;
float scaleHeight = terrain ? terrain->getVerticalScale() : 1.0f;
// construct the VertexNormalGenerator which will manage the generation and the vertices and normals // construct the VertexNormalGenerator which will manage the generation and the vertices and normals
VertexNormalGenerator VNG(masterLocator, centerModel, numRows, numColumns, scaleHeight, createSkirt); VertexNormalGenerator VNG(masterLocator, centerModel, numRows, numColumns, scaleHeight, constraint_gap, createSkirt);
unsigned int numVertices = VNG.capacity(); unsigned int numVertices = VNG.capacity();
@ -1682,7 +1683,7 @@ void VPBTechnique::removeElevationConstraint(osg::ref_ptr<osg::Node> constraint)
// Check a given vertex against any elevation constraints E.g. to ensure the terrain mesh doesn't // Check a given vertex against any elevation constraints E.g. to ensure the terrain mesh doesn't
// poke through any airport meshes. If such a constraint exists, the function will return a replacement // poke through any airport meshes. If such a constraint exists, the function will return a replacement
// vertex displaces such that it lies 1m below the contraint relative to the passed in origin. // vertex displaces such that it lies 1m below the contraint relative to the passed in origin.
osg::Vec3d VPBTechnique::checkAgainstElevationConstraints(osg::Vec3d origin, osg::Vec3d vertex) osg::Vec3d VPBTechnique::checkAgainstElevationConstraints(osg::Vec3d origin, osg::Vec3d vertex, float vtx_gap)
{ {
const std::lock_guard<std::mutex> lock(VPBTechnique::_constraint_mutex); // Lock the _constraintGroup for this scope const std::lock_guard<std::mutex> lock(VPBTechnique::_constraint_mutex); // Lock the _constraintGroup for this scope
osg::ref_ptr<osgUtil::LineSegmentIntersector> intersector; osg::ref_ptr<osgUtil::LineSegmentIntersector> intersector;
@ -1694,7 +1695,7 @@ osg::Vec3d VPBTechnique::checkAgainstElevationConstraints(osg::Vec3d origin, osg
// We have an intersection with our constraints model, so move the terrain vertex to 1m below the intersection point // We have an intersection with our constraints model, so move the terrain vertex to 1m below the intersection point
osg::Vec3d ray = intersector->getFirstIntersection().getWorldIntersectPoint() - origin; osg::Vec3d ray = intersector->getFirstIntersection().getWorldIntersectPoint() - origin;
ray.normalize(); ray.normalize();
return intersector->getFirstIntersection().getWorldIntersectPoint() - ray*1.0; return intersector->getFirstIntersection().getWorldIntersectPoint() - ray*vtx_gap;
} else { } else {
return vertex; return vertex;
} }

View File

@ -89,7 +89,7 @@ class VPBTechnique : public TerrainTechnique
static void addElevationConstraint(osg::ref_ptr<osg::Node> constraint, osg::Group* terrain); static void addElevationConstraint(osg::ref_ptr<osg::Node> constraint, osg::Group* terrain);
static void removeElevationConstraint(osg::ref_ptr<osg::Node> constraint); static void removeElevationConstraint(osg::ref_ptr<osg::Node> constraint);
static osg::Vec3d checkAgainstElevationConstraints(osg::Vec3d origin, osg::Vec3d vertex); static osg::Vec3d checkAgainstElevationConstraints(osg::Vec3d origin, osg::Vec3d vertex, float vertex_gap);
protected: protected: