2001-10-04 23:12:57 +08:00
|
|
|
//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
|
|
|
|
|
2001-09-20 05:08:56 +08:00
|
|
|
#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.
|
2002-01-01 07:16:20 +08:00
|
|
|
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 :
|
Added support for shallow and deep copy of nodes, drawables and state, via a
copy constructor which takes an optional Cloner object, and the old
osg::Object::clone() has changed so that it now requires a Cloner as paramter.
This is passed on to the copy constructor to help control the shallow vs
deep copying. The old functionality of clone() which was clone of type has
been renamed to cloneType().
Updated all of the OSG to work with these new conventions, implemention all
the required copy constructors etc. A couple of areas will do shallow
copies by design, a couple of other still need to be updated to do either
shallow or deep.
Neither of the shallow or deep copy operations have been tested yet, only
the old functionality of the OSG has been checked so far, such running the
viewer on various demo datasets.
Also fixed a problem in osg::Optimize::RemoveRendundentNodesVisitor which
was not checking that Group didn't have have any attached StateSet's, Callbacks
or UserData. These checks have now been added, which fixes a bug which was
revealled by the new osgscribe demo, this related to removal of group acting
as state decorator.
method
2002-01-29 05:17:01 +08:00
|
|
|
|
2001-01-11 00:32:10 +08:00
|
|
|
LOD() {}
|
|
|
|
|
2002-01-29 22:04:06 +08:00
|
|
|
/** Copy constructor using CopyOp to manage deep vs shallow copy.*/
|
|
|
|
LOD(const LOD&,const CopyOp& copyop=CopyOp::SHALLOW_COPY);
|
Added support for shallow and deep copy of nodes, drawables and state, via a
copy constructor which takes an optional Cloner object, and the old
osg::Object::clone() has changed so that it now requires a Cloner as paramter.
This is passed on to the copy constructor to help control the shallow vs
deep copying. The old functionality of clone() which was clone of type has
been renamed to cloneType().
Updated all of the OSG to work with these new conventions, implemention all
the required copy constructors etc. A couple of areas will do shallow
copies by design, a couple of other still need to be updated to do either
shallow or deep.
Neither of the shallow or deep copy operations have been tested yet, only
the old functionality of the OSG has been checked so far, such running the
viewer on various demo datasets.
Also fixed a problem in osg::Optimize::RemoveRendundentNodesVisitor which
was not checking that Group didn't have have any attached StateSet's, Callbacks
or UserData. These checks have now been added, which fixes a bug which was
revealled by the new osgscribe demo, this related to removal of group acting
as state decorator.
method
2002-01-29 05:17:01 +08:00
|
|
|
|
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.
|
2001-09-29 04:10:41 +08:00
|
|
|
Range list automatically expands to accommodate values beyond
|
2001-01-11 00:32:10 +08:00
|
|
|
the current getNumRanges().*/
|
2001-09-20 05:08:56 +08:00
|
|
|
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.*/
|
2001-09-20 05:08:56 +08:00
|
|
|
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.*/
|
2001-09-20 05:08:56 +08:00
|
|
|
inline void setCenter(const Vec3 ¢er) { _center = center; }
|
|
|
|
|
2001-01-11 00:32:10 +08:00
|
|
|
/** return the LOD center point. */
|
2001-09-20 05:08:56 +08:00
|
|
|
inline const Vec3& getCenter() const { return _center; }
|
2001-01-11 00:32:10 +08:00
|
|
|
|
|
|
|
|
2002-02-07 09:07:11 +08:00
|
|
|
/** Callback attached to an LOD which allows the users to customize the selection of LOD children.*/
|
|
|
|
struct EvaluateLODCallback : public osg::Referenced
|
|
|
|
{
|
|
|
|
/** Compute the child to select.*/
|
|
|
|
virtual const int evaluateLODChild(const osg::LOD* lod, const Vec3& eye_local, const float bias) const;
|
|
|
|
};
|
|
|
|
|
|
|
|
friend struct osg::LOD::EvaluateLODCallback;
|
|
|
|
|
|
|
|
/** Set the EvaluateLODCallback which allows users to attach customize computation of the the selection of LOD children.*/
|
|
|
|
void setEvaluateLODCallback(EvaluateLODCallback* cbc) { _evaluateLODCallback=cbc; }
|
|
|
|
|
|
|
|
/** Get the non const ComputeBillboardCallback.*/
|
|
|
|
EvaluateLODCallback* getEvaluateLODCallback() { return _evaluateLODCallback.get(); }
|
|
|
|
|
|
|
|
/** Get the const ComputeBillboardCallback.*/
|
|
|
|
const EvaluateLODCallback* getEvaluateLODCallback() const { return _evaluateLODCallback.get(); }
|
|
|
|
|
|
|
|
|
|
|
|
|
2001-01-11 00:32:10 +08:00
|
|
|
/** return the child to traverse.
|
|
|
|
Selected by the distance between the eye point in local
|
2001-09-29 04:10:41 +08:00
|
|
|
coordinates and the LOD center, multiplied by the bias.*/
|
2002-02-07 09:07:11 +08:00
|
|
|
inline const int evaluate(const Vec3& eye_local,const float bias=1.0f) const
|
|
|
|
{
|
|
|
|
if (_evaluateLODCallback.valid())
|
|
|
|
return _evaluateLODCallback->evaluateLODChild(this,eye_local,bias);
|
|
|
|
else
|
|
|
|
return evaluateLODChild(eye_local,bias);
|
|
|
|
}
|
2001-01-11 00:32:10 +08:00
|
|
|
|
|
|
|
|
|
|
|
protected :
|
|
|
|
virtual ~LOD() {}
|
|
|
|
|
2002-02-07 09:07:11 +08:00
|
|
|
virtual const int evaluateLODChild(const Vec3& eye_local,const float bias) const;
|
|
|
|
|
2001-01-11 00:32:10 +08:00
|
|
|
typedef std::vector<float> RangeList;
|
|
|
|
RangeList _rangeList;
|
|
|
|
RangeList _rangeList2;
|
2002-02-07 09:07:11 +08:00
|
|
|
|
|
|
|
ref_ptr<EvaluateLODCallback> _evaluateLODCallback;
|
2001-01-11 00:32:10 +08:00
|
|
|
|
|
|
|
Vec3 _center;
|
|
|
|
|
2002-02-07 09:07:11 +08:00
|
|
|
|
2001-01-11 00:32:10 +08:00
|
|
|
};
|
|
|
|
|
2002-02-03 20:33:41 +08:00
|
|
|
}
|
2001-01-11 00:32:10 +08:00
|
|
|
|
|
|
|
#endif
|