WS30: Improved vegetation constraints
Unlike the elevation constraints, the vegetation constraints don't need to be global. So no need for mutexes. Big speed up.
This commit is contained in:
parent
8cc3c15712
commit
d1e9134a89
@ -61,6 +61,7 @@ VPBTechnique::VPBTechnique()
|
|||||||
setFilterBias(0);
|
setFilterBias(0);
|
||||||
setFilterWidth(0.1);
|
setFilterWidth(0.1);
|
||||||
setFilterMatrixAs(GAUSSIAN);
|
setFilterMatrixAs(GAUSSIAN);
|
||||||
|
_vegetationConstraintGroup = new osg::Group();
|
||||||
}
|
}
|
||||||
|
|
||||||
VPBTechnique::VPBTechnique(const SGReaderWriterOptions* options)
|
VPBTechnique::VPBTechnique(const SGReaderWriterOptions* options)
|
||||||
@ -69,6 +70,7 @@ VPBTechnique::VPBTechnique(const SGReaderWriterOptions* options)
|
|||||||
setFilterWidth(0.1);
|
setFilterWidth(0.1);
|
||||||
setFilterMatrixAs(GAUSSIAN);
|
setFilterMatrixAs(GAUSSIAN);
|
||||||
setOptions(options);
|
setOptions(options);
|
||||||
|
_vegetationConstraintGroup = new osg::Group();
|
||||||
}
|
}
|
||||||
|
|
||||||
VPBTechnique::VPBTechnique(const VPBTechnique& gt,const osg::CopyOp& copyop):
|
VPBTechnique::VPBTechnique(const VPBTechnique& gt,const osg::CopyOp& copyop):
|
||||||
@ -78,6 +80,7 @@ VPBTechnique::VPBTechnique(const VPBTechnique& gt,const osg::CopyOp& copyop):
|
|||||||
setFilterWidth(gt._filterWidth);
|
setFilterWidth(gt._filterWidth);
|
||||||
setFilterMatrix(gt._filterMatrix);
|
setFilterMatrix(gt._filterMatrix);
|
||||||
setOptions(gt._options);
|
setOptions(gt._options);
|
||||||
|
_vegetationConstraintGroup = new osg::Group();
|
||||||
}
|
}
|
||||||
|
|
||||||
VPBTechnique::~VPBTechnique()
|
VPBTechnique::~VPBTechnique()
|
||||||
@ -2283,21 +2286,24 @@ osg::Vec3d VPBTechnique::checkAgainstElevationConstraints(osg::Vec3d origin, osg
|
|||||||
// intersection with the constraint model.
|
// intersection with the constraint model.
|
||||||
void VPBTechnique::addVegetationConstraint(osg::ref_ptr<osg::Node> constraint)
|
void VPBTechnique::addVegetationConstraint(osg::ref_ptr<osg::Node> constraint)
|
||||||
{
|
{
|
||||||
const std::lock_guard<std::mutex> lock(VPBTechnique::_vegetationConstraintMutex); // Lock the _vegetationConstraintGroup for this scope
|
|
||||||
_vegetationConstraintGroup->addChild(constraint.get());
|
_vegetationConstraintGroup->addChild(constraint.get());
|
||||||
}
|
}
|
||||||
|
|
||||||
// Remove a previously added constraint. E.g on model unload.
|
// Remove a previously added constraint. E.g on model unload.
|
||||||
void VPBTechnique::removeVegetationConstraint(osg::ref_ptr<osg::Node> constraint)
|
void VPBTechnique::removeVegetationConstraint(osg::ref_ptr<osg::Node> constraint)
|
||||||
{
|
{
|
||||||
const std::lock_guard<std::mutex> lock(VPBTechnique::_vegetationConstraintMutex); // Lock the _vegetationConstraintGroup for this scope
|
|
||||||
_vegetationConstraintGroup->removeChild(constraint.get());
|
_vegetationConstraintGroup->removeChild(constraint.get());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Remove all the constraints, which will still be referenced by the terrain tile itself.
|
||||||
|
void VPBTechnique::clearVegetationConstraints()
|
||||||
|
{
|
||||||
|
_vegetationConstraintGroup->removeChildren(0, _vegetationConstraintGroup->getNumChildren());
|
||||||
|
}
|
||||||
|
|
||||||
// Check a given vertex against any vegetation constraints E.g. to ensure we don't get trees sprouting from roads or runways.
|
// Check a given vertex against any vegetation constraints E.g. to ensure we don't get trees sprouting from roads or runways.
|
||||||
bool VPBTechnique::checkAgainstVegetationConstraints(osg::Vec3d origin, osg::Vec3d vertex)
|
bool VPBTechnique::checkAgainstVegetationConstraints(osg::Vec3d origin, osg::Vec3d vertex)
|
||||||
{
|
{
|
||||||
const std::lock_guard<std::mutex> lock(VPBTechnique::_vegetationConstraintMutex); // Lock the _vegetationConstraintGroup for this scope
|
|
||||||
osg::ref_ptr<osgUtil::LineSegmentIntersector> intersector;
|
osg::ref_ptr<osgUtil::LineSegmentIntersector> intersector;
|
||||||
intersector = new osgUtil::LineSegmentIntersector(origin, vertex);
|
intersector = new osgUtil::LineSegmentIntersector(origin, vertex);
|
||||||
osgUtil::IntersectionVisitor visitor(intersector.get());
|
osgUtil::IntersectionVisitor visitor(intersector.get());
|
||||||
@ -2308,9 +2314,7 @@ bool VPBTechnique::checkAgainstVegetationConstraints(osg::Vec3d origin, osg::Vec
|
|||||||
void VPBTechnique::clearConstraints()
|
void VPBTechnique::clearConstraints()
|
||||||
{
|
{
|
||||||
const std::lock_guard<std::mutex> elock(VPBTechnique::_elevationConstraintMutex); // Lock the _elevationConstraintGroup for this scope
|
const std::lock_guard<std::mutex> elock(VPBTechnique::_elevationConstraintMutex); // Lock the _elevationConstraintGroup for this scope
|
||||||
const std::lock_guard<std::mutex> vlock(VPBTechnique::_vegetationConstraintMutex); // Lock the _vegetationConstraintGroup for this scope
|
|
||||||
_elevationConstraintGroup = new osg::Group();
|
_elevationConstraintGroup = new osg::Group();
|
||||||
_vegetationConstraintGroup = new osg::Group();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void VPBTechnique::addLineFeatureList(SGBucket bucket, LineFeatureBinList roadList)
|
void VPBTechnique::addLineFeatureList(SGBucket bucket, LineFeatureBinList roadList)
|
||||||
|
@ -91,16 +91,12 @@ class VPBTechnique : public TerrainTechnique
|
|||||||
* for all graphics contexts. */
|
* for all graphics contexts. */
|
||||||
virtual void releaseGLObjects(osg::State* = 0) const;
|
virtual void releaseGLObjects(osg::State* = 0) const;
|
||||||
|
|
||||||
// Elevation constraints ensure that the terrain mesh is placed underneath objects such as airports
|
// Elevation constraints ensure that the terrain mesh is placed underneath objects such as airports.
|
||||||
|
// As airports are generated in a separate loading thread, these are static.
|
||||||
static void addElevationConstraint(osg::ref_ptr<osg::Node> constraint);
|
static void addElevationConstraint(osg::ref_ptr<osg::Node> constraint);
|
||||||
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, float vertex_gap);
|
static osg::Vec3d checkAgainstElevationConstraints(osg::Vec3d origin, osg::Vec3d vertex, float vertex_gap);
|
||||||
|
|
||||||
// Vegetation constraints ensure that trees don't grow in roads
|
|
||||||
static void addVegetationConstraint(osg::ref_ptr<osg::Node> constraint);
|
|
||||||
static void removeVegetationConstraint(osg::ref_ptr<osg::Node> constraint);
|
|
||||||
static bool checkAgainstVegetationConstraints(osg::Vec3d origin, osg::Vec3d vertex);
|
|
||||||
|
|
||||||
static void clearConstraints();
|
static void clearConstraints();
|
||||||
|
|
||||||
// LineFeatures and AreaFeatures are draped over the underlying mesh.
|
// LineFeatures and AreaFeatures are draped over the underlying mesh.
|
||||||
@ -178,6 +174,13 @@ class VPBTechnique : public TerrainTechnique
|
|||||||
|
|
||||||
virtual osg::Vec3d getMeshIntersection(BufferData& buffer, Locator* masterLocator, osg::Vec3d pt, osg::Vec3d up);
|
virtual osg::Vec3d getMeshIntersection(BufferData& buffer, Locator* masterLocator, osg::Vec3d pt, osg::Vec3d up);
|
||||||
|
|
||||||
|
// Vegetation constraints ensure that trees don't grow in roads. Unlike the elevation constraints,
|
||||||
|
// we only use these internally and during generation of this particular tile.
|
||||||
|
virtual void addVegetationConstraint(osg::ref_ptr<osg::Node> constraint);
|
||||||
|
virtual void removeVegetationConstraint(osg::ref_ptr<osg::Node> constraint);
|
||||||
|
virtual bool checkAgainstVegetationConstraints(osg::Vec3d origin, osg::Vec3d vertex);
|
||||||
|
virtual void clearVegetationConstraints();
|
||||||
|
|
||||||
OpenThreads::Mutex _writeBufferMutex;
|
OpenThreads::Mutex _writeBufferMutex;
|
||||||
osg::ref_ptr<BufferData> _currentBufferData;
|
osg::ref_ptr<BufferData> _currentBufferData;
|
||||||
osg::ref_ptr<BufferData> _newBufferData;
|
osg::ref_ptr<BufferData> _newBufferData;
|
||||||
@ -189,12 +192,11 @@ class VPBTechnique : public TerrainTechnique
|
|||||||
osg::Matrix3 _filterMatrix;
|
osg::Matrix3 _filterMatrix;
|
||||||
osg::ref_ptr<osg::Uniform> _filterMatrixUniform;
|
osg::ref_ptr<osg::Uniform> _filterMatrixUniform;
|
||||||
osg::ref_ptr<SGReaderWriterOptions> _options;
|
osg::ref_ptr<SGReaderWriterOptions> _options;
|
||||||
|
osg::ref_ptr<osg::Group> _vegetationConstraintGroup;
|
||||||
|
|
||||||
inline static osg::ref_ptr<osg::Group> _elevationConstraintGroup = new osg::Group();
|
inline static osg::ref_ptr<osg::Group> _elevationConstraintGroup = new osg::Group();
|
||||||
inline static std::mutex _elevationConstraintMutex; // protects the _elevationConstraintGroup;
|
inline static std::mutex _elevationConstraintMutex; // protects the _elevationConstraintGroup;
|
||||||
|
|
||||||
inline static osg::ref_ptr<osg::Group> _vegetationConstraintGroup = new osg::Group();
|
|
||||||
inline static std::mutex _vegetationConstraintMutex; // protects the _vegetationConstraintGroup;
|
|
||||||
|
|
||||||
typedef std::pair<SGBucket, LineFeatureBinList> BucketLineFeatureBinList;
|
typedef std::pair<SGBucket, LineFeatureBinList> BucketLineFeatureBinList;
|
||||||
typedef std::pair<SGBucket, AreaFeatureBinList> BucketAreaFeatureBinList;
|
typedef std::pair<SGBucket, AreaFeatureBinList> BucketAreaFeatureBinList;
|
||||||
|
Loading…
Reference in New Issue
Block a user