OpenSceneGraph/include/osg/LOD

79 lines
2.9 KiB
Plaintext
Raw Normal View History

//C++ header - Open Scene Graph - Copyright (C) 1998-2001 Robert Osfield
//Distributed under the terms of the GNU Library General Public License (LGPL)
//as published by the Free Software Foundation.
2001-01-11 00:32:10 +08:00
#ifndef OSG_LOD
#define OSG_LOD 1
#include <osg/Group>
2001-01-11 00:32:10 +08:00
namespace osg {
/** LOD - Level Of Detail group node which allows switching between children
depending on distance from eye point.
Typical uses are for load balancing - objects further away from
the eye point are rendered at a lower level of detail, and at times
of high stress on the graphics pipeline lower levels of detail can
also be chosen.
The children are ordered from most detailed (for close up views) to the least
(see from a distance), and a set of ranges are used to decide which LOD is used
at different view distances, the criteria used is child 'i' is used when
range[i]<dist<range[i+1] is true. This requires there to be n+1 range values where the number of
children is n, since no maximum distance of infinity is assumed. If the number of range values (m)
is insufficient then the children m through to n will be ignored, only 0..m-1 will be used
during rendering.
2001-01-11 00:32:10 +08:00
*/
class SG_EXPORT LOD : public Group
{
public :
2001-01-11 00:32:10 +08:00
LOD() {}
/** Copy constructor using Cloner to manage deep vs shallow copy.*/
LOD(const LOD&,const Cloner& cloner=ShallowCopy());
2001-09-22 10:42:08 +08:00
META_Node(LOD);
2001-01-11 00:32:10 +08:00
virtual void traverse(NodeVisitor& nv);
/** Sets the value of range list element index to range which
is a floating point distance specified in world coordinates.
Range list automatically expands to accommodate values beyond
2001-01-11 00:32:10 +08:00
the current getNumRanges().*/
void setRange(const unsigned int index, const float range);
/** returns the range for specified index.*/
inline const float getRange(const unsigned int index) const { return _rangeList[index]; }
2001-01-11 00:32:10 +08:00
/** returns the number of ranges currently set.*/
inline const int getNumRanges() const { return _rangeList.size(); }
2001-01-11 00:32:10 +08:00
/** Sets the object-space point which defines the center of the osg::LOD.
center is affected by any transforms in the hierarchy above the osg::LOD.*/
inline void setCenter(const Vec3 &center) { _center = center; }
2001-01-11 00:32:10 +08:00
/** return the LOD center point. */
inline const Vec3& getCenter() const { return _center; }
2001-01-11 00:32:10 +08:00
/** return the child to traverse.
Selected by the distance between the eye point in local
coordinates and the LOD center, multiplied by the bias.*/
const int evaluate(const Vec3& eye_local,const float bias=1.0f) const;
2001-01-11 00:32:10 +08:00
protected :
virtual ~LOD() {}
typedef std::vector<float> RangeList;
RangeList _rangeList;
RangeList _rangeList2;
Vec3 _center;
};
};
#endif