From Chris Hanson:
Spelling fixes in include/osg/LOD Negated priority in PagedLOD when using _rangeMode==PIXEL_SIZE_ON_SCREEN Added clampedPixelSize() methods to CullStack and CullingSet to return fabs()ed values. Changed LOD and PagedLOD ::traverse to use clampedPixelSize() methods.
This commit is contained in:
@@ -65,6 +65,18 @@ class OSG_EXPORT CullStack : public osg::CullSettings
|
||||
return pixelSize(bs.center(),bs.radius());
|
||||
}
|
||||
|
||||
/** Compute the pixel size of an object at position v, with specified radius. fabs()ed to always be positive. */
|
||||
float clampedPixelSize(const Vec3& v,float radius) const
|
||||
{
|
||||
return getCurrentCullingSet().clampedPixelSize(v,radius);
|
||||
}
|
||||
|
||||
/** Compute the pixel size of the bounding sphere. fabs()ed to always be positive. */
|
||||
float clampedPixelSize(const BoundingSphere& bs) const
|
||||
{
|
||||
return clampedPixelSize(bs.center(),bs.radius());
|
||||
}
|
||||
|
||||
inline void disableAndPushOccludersCurrentMask(NodePath& nodePath)
|
||||
{
|
||||
getCurrentCullingSet().disableAndPushOccludersCurrentMask(nodePath);
|
||||
|
||||
@@ -18,6 +18,8 @@
|
||||
#include <osg/ShadowVolumeOccluder>
|
||||
#include <osg/Referenced>
|
||||
|
||||
#include <math.h>
|
||||
|
||||
|
||||
namespace osg {
|
||||
|
||||
@@ -172,6 +174,12 @@ class OSG_EXPORT CullingSet : public Referenced
|
||||
/** Compute the pixel of a bounding sphere.*/
|
||||
float pixelSize(const BoundingSphere& bs) const { return bs.radius()/(bs.center()*_pixelSizeVector); }
|
||||
|
||||
/** Compute the pixel of an object at position v, with specified radius. fabs()ed to always be positive. */
|
||||
float clampedPixelSize(const Vec3& v,float radius) const { return fabs(pixelSize(v, radius)); }
|
||||
|
||||
/** Compute the pixel of a bounding sphere. fabs()ed to always be positive. */
|
||||
float clampedPixelSize(const BoundingSphere& bs) const { return fabs(pixelSize(bs)); }
|
||||
|
||||
|
||||
inline bool isCulled(const std::vector<Vec3>& vertices)
|
||||
{
|
||||
|
||||
@@ -55,17 +55,17 @@ class OSG_EXPORT LOD : public Group
|
||||
typedef std::pair<float,float> MinMaxPair;
|
||||
typedef std::vector<MinMaxPair> RangeList;
|
||||
|
||||
/** Modes which control how the center of object should be determined when computed which child is active.*/
|
||||
/** Modes which control how the center of object should be determined when computing which child is active.*/
|
||||
enum CenterMode
|
||||
{
|
||||
USE_BOUNDING_SPHERE_CENTER,
|
||||
USER_DEFINED_CENTER
|
||||
};
|
||||
|
||||
/** Set how the center of object should be determined when computed which child is active.*/
|
||||
/** Set how the center of object should be determined when computing which child is active.*/
|
||||
void setCenterMode(CenterMode mode) { _centerMode=mode; }
|
||||
|
||||
/** Get how the center of object should be determined when computed which child is active.*/
|
||||
/** Get how the center of object should be determined when computing which child is active.*/
|
||||
CenterMode getCenterMode() const { return _centerMode; }
|
||||
|
||||
/** Sets the object-space point which defines the center of the osg::LOD.
|
||||
|
||||
@@ -54,7 +54,7 @@ void LOD::traverse(NodeVisitor& nv)
|
||||
osg::CullStack* cullStack = dynamic_cast<osg::CullStack*>(&nv);
|
||||
if (cullStack)
|
||||
{
|
||||
required_range = cullStack->pixelSize(getBound());
|
||||
required_range = cullStack->clampedPixelSize(getBound());
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -104,7 +104,7 @@ bool LOD::addChild( Node *child )
|
||||
if (_children.size()>_rangeList.size())
|
||||
{
|
||||
float maxRange = !_rangeList.empty()?
|
||||
_rangeList.back().second : 0.0f;
|
||||
maxRange=_rangeList.back().second : 0.0f;
|
||||
|
||||
_rangeList.resize(_children.size(),MinMaxPair(maxRange,maxRange));
|
||||
}
|
||||
|
||||
@@ -126,7 +126,7 @@ void PagedLOD::traverse(NodeVisitor& nv)
|
||||
osg::CullStack* cullStack = dynamic_cast<osg::CullStack*>(&nv);
|
||||
if (cullStack)
|
||||
{
|
||||
required_range = cullStack->pixelSize(getBound());
|
||||
required_range = cullStack->clampedPixelSize(getBound());
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -170,12 +170,18 @@ void PagedLOD::traverse(NodeVisitor& nv)
|
||||
_children[numChildren-1]->accept(nv);
|
||||
}
|
||||
|
||||
// now request the loading of the next unload child.
|
||||
// now request the loading of the next unloaded child.
|
||||
if (nv.getDatabaseRequestHandler() && numChildren<_perRangeDataList.size())
|
||||
{
|
||||
// compute priority from where abouts in the required range the distance falls.
|
||||
float priority = (_rangeList[numChildren].second-required_range)/(_rangeList[numChildren].second-_rangeList[numChildren].first);
|
||||
|
||||
// invert priority for PIXEL_SIZE_ON_SCREEN mode
|
||||
if(_rangeMode==PIXEL_SIZE_ON_SCREEN)
|
||||
{
|
||||
priority = -priority;
|
||||
}
|
||||
|
||||
// modify the priority according to the child's priority offset and scale.
|
||||
priority = _perRangeDataList[numChildren]._priorityOffset + priority * _perRangeDataList[numChildren]._priorityScale;
|
||||
|
||||
@@ -185,7 +191,7 @@ void PagedLOD::traverse(NodeVisitor& nv)
|
||||
}
|
||||
else
|
||||
{
|
||||
// prepend the databasePath to the childs filename.
|
||||
// prepend the databasePath to the child's filename.
|
||||
nv.getDatabaseRequestHandler()->requestNodeFile(_databasePath+_perRangeDataList[numChildren]._filename,this,priority,nv.getFrameStamp());
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user