2012-03-22 01:36:20 +08:00
|
|
|
/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2006 Robert Osfield
|
2003-01-22 00:45:36 +08:00
|
|
|
*
|
2012-03-22 01:36:20 +08:00
|
|
|
* This library is open source and may be redistributed and/or modified under
|
|
|
|
* the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
|
2003-01-22 00:45:36 +08:00
|
|
|
* (at your option) any later version. The full license is in LICENSE file
|
|
|
|
* included with this distribution, and on the openscenegraph.org website.
|
2012-03-22 01:36:20 +08:00
|
|
|
*
|
2003-01-22 00:45:36 +08:00
|
|
|
* This library is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
2012-03-22 01:36:20 +08:00
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
2003-01-22 00:45:36 +08:00
|
|
|
* OpenSceneGraph Public License for more details.
|
|
|
|
*/
|
2001-10-04 23:12:57 +08:00
|
|
|
|
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
|
2007-02-28 18:10:21 +08:00
|
|
|
also be chosen by adjusting the viewers's Camera/CullSettings LODScale value.
|
2007-02-28 18:08:45 +08:00
|
|
|
Each child has a corresponding valid range consisting of a minimum
|
|
|
|
and maximum distance. Given a distance to the viewer (d), LOD displays
|
|
|
|
a child if min <= d < max. LOD may display multiple children simultaneously
|
|
|
|
if their corresponding ranges overlap. Children can be in any order,
|
|
|
|
and don't need to be sorted by range or amount of detail. If the number of
|
|
|
|
ranges (m) is less than the number of children (n), then children m+1 through
|
|
|
|
n are ignored.
|
2001-01-11 00:32:10 +08:00
|
|
|
*/
|
2005-04-12 01:14:17 +08:00
|
|
|
class OSG_EXPORT LOD : public Group
|
2001-01-11 00:32:10 +08:00
|
|
|
{
|
|
|
|
public :
|
2012-03-22 01:36:20 +08:00
|
|
|
|
2003-07-10 22:53:07 +08:00
|
|
|
LOD();
|
2001-01-11 00:32:10 +08:00
|
|
|
|
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
|
|
|
|
2002-06-06 21:25:36 +08:00
|
|
|
META_Node(osg, LOD);
|
2001-09-22 10:42:08 +08:00
|
|
|
|
2008-04-04 02:36:50 +08:00
|
|
|
typedef osg::BoundingSphere::vec_type vec_type;
|
|
|
|
typedef osg::BoundingSphere::value_type value_type;
|
|
|
|
|
2001-01-11 00:32:10 +08:00
|
|
|
virtual void traverse(NodeVisitor& nv);
|
2012-03-22 01:36:20 +08:00
|
|
|
|
2015-10-22 22:14:53 +08:00
|
|
|
using osg::Group::addChild;
|
|
|
|
|
2002-10-08 05:23:37 +08:00
|
|
|
virtual bool addChild(Node *child);
|
2001-01-11 00:32:10 +08:00
|
|
|
|
2015-10-22 22:14:53 +08:00
|
|
|
virtual bool addChild(Node *child, float rmin, float rmax);
|
|
|
|
|
|
|
|
template<class T> bool addChild( const ref_ptr<T>& child, float rmin, float rmax) { return addChild(child.get(), rmin, rmax); }
|
2002-10-08 05:23:37 +08:00
|
|
|
|
2006-05-02 17:45:31 +08:00
|
|
|
virtual bool removeChildren(unsigned int pos,unsigned int numChildrenToRemove=1);
|
2001-01-11 00:32:10 +08:00
|
|
|
|
2002-10-07 04:33:13 +08:00
|
|
|
typedef std::pair<float,float> MinMaxPair;
|
|
|
|
typedef std::vector<MinMaxPair> RangeList;
|
2012-03-22 01:36:20 +08:00
|
|
|
|
2005-09-28 21:33:58 +08:00
|
|
|
/** Modes which control how the center of object should be determined when computing which child is active.*/
|
2002-10-07 04:33:13 +08:00
|
|
|
enum CenterMode
|
2002-02-07 09:07:11 +08:00
|
|
|
{
|
2002-10-07 04:33:13 +08:00
|
|
|
USE_BOUNDING_SPHERE_CENTER,
|
2011-09-19 18:34:31 +08:00
|
|
|
USER_DEFINED_CENTER,
|
|
|
|
UNION_OF_BOUNDING_SPHERE_AND_USER_DEFINED
|
2002-02-07 09:07:11 +08:00
|
|
|
};
|
|
|
|
|
2005-09-28 21:33:58 +08:00
|
|
|
/** Set how the center of object should be determined when computing which child is active.*/
|
2002-10-07 04:33:13 +08:00
|
|
|
void setCenterMode(CenterMode mode) { _centerMode=mode; }
|
|
|
|
|
2005-09-28 21:33:58 +08:00
|
|
|
/** Get how the center of object should be determined when computing which child is active.*/
|
2002-10-07 04:33:13 +08:00
|
|
|
CenterMode getCenterMode() const { return _centerMode; }
|
|
|
|
|
2012-03-22 01:36:20 +08:00
|
|
|
/** Sets the object-space point which defines the center of the osg::LOD.
|
2002-10-07 04:33:13 +08:00
|
|
|
center is affected by any transforms in the hierarchy above the osg::LOD.*/
|
2011-09-19 18:34:31 +08:00
|
|
|
inline void setCenter(const vec_type& center) { if (_centerMode!=UNION_OF_BOUNDING_SPHERE_AND_USER_DEFINED) { _centerMode=USER_DEFINED_CENTER; } _userDefinedCenter = center; }
|
2012-03-22 01:36:20 +08:00
|
|
|
|
2002-10-07 04:33:13 +08:00
|
|
|
/** return the LOD center point. */
|
2011-09-19 18:34:31 +08:00
|
|
|
inline const vec_type& getCenter() const { if ((_centerMode==USER_DEFINED_CENTER)||(_centerMode==UNION_OF_BOUNDING_SPHERE_AND_USER_DEFINED)) return _userDefinedCenter; else return getBound().center(); }
|
2002-02-07 09:07:11 +08:00
|
|
|
|
2004-07-01 03:07:05 +08:00
|
|
|
|
2012-03-22 01:36:20 +08:00
|
|
|
/** Set the object-space reference radius of the volume enclosed by the LOD.
|
2007-12-11 01:30:18 +08:00
|
|
|
* Used to determine the bounding sphere of the LOD in the absence of any children.*/
|
2008-04-04 02:36:50 +08:00
|
|
|
inline void setRadius(value_type radius) { _radius = radius; }
|
2012-03-22 01:36:20 +08:00
|
|
|
|
2004-07-01 21:53:30 +08:00
|
|
|
/** Get the object-space radius of the volume enclosed by the LOD.*/
|
2008-04-04 02:36:50 +08:00
|
|
|
inline value_type getRadius() const { return _radius; }
|
2004-07-01 21:53:30 +08:00
|
|
|
|
2007-12-11 01:30:18 +08:00
|
|
|
/** Modes that control how the range values should be interpreted when computing which child is active.*/
|
2004-07-01 03:07:05 +08:00
|
|
|
enum RangeMode
|
|
|
|
{
|
|
|
|
DISTANCE_FROM_EYE_POINT,
|
|
|
|
PIXEL_SIZE_ON_SCREEN
|
|
|
|
};
|
2012-03-22 01:36:20 +08:00
|
|
|
|
2007-12-11 01:30:18 +08:00
|
|
|
/** Set how the range values should be interpreted when computing which child is active.*/
|
2004-07-01 03:07:05 +08:00
|
|
|
void setRangeMode(RangeMode mode) { _rangeMode = mode; }
|
|
|
|
|
2007-12-11 01:30:18 +08:00
|
|
|
/** Get how the range values should be interpreted when computing which child is active.*/
|
2004-07-01 03:07:05 +08:00
|
|
|
RangeMode getRangeMode() const { return _rangeMode; }
|
|
|
|
|
|
|
|
|
2007-12-11 01:30:18 +08:00
|
|
|
/** Sets the min and max visible ranges of range of specific child.
|
2002-10-07 04:33:13 +08:00
|
|
|
Values are floating point distance specified in local objects coordinates.*/
|
|
|
|
void setRange(unsigned int childNo, float min,float max);
|
2012-03-22 01:36:20 +08:00
|
|
|
|
2002-10-07 04:33:13 +08:00
|
|
|
/** returns the min visible range for specified child.*/
|
|
|
|
inline float getMinRange(unsigned int childNo) const { return _rangeList[childNo].first; }
|
2001-01-11 00:32:10 +08:00
|
|
|
|
2002-10-07 04:33:13 +08:00
|
|
|
/** returns the max visible range for specified child.*/
|
|
|
|
inline float getMaxRange(unsigned int childNo) const { return _rangeList[childNo].second; }
|
2012-03-22 01:36:20 +08:00
|
|
|
|
|
|
|
/** returns the number of ranges currently set.
|
2002-10-07 04:33:13 +08:00
|
|
|
* An LOD which has been fully set up will have getNumChildren()==getNumRanges(). */
|
2013-05-15 00:12:21 +08:00
|
|
|
inline unsigned int getNumRanges() const { return static_cast<unsigned int>(_rangeList.size()); }
|
2001-01-11 00:32:10 +08:00
|
|
|
|
2004-12-17 09:06:33 +08:00
|
|
|
/** set the list of MinMax ranges for each child.*/
|
|
|
|
inline void setRangeList(const RangeList& rangeList) { _rangeList=rangeList; }
|
|
|
|
|
2002-10-07 04:33:13 +08:00
|
|
|
/** return the list of MinMax ranges for each child.*/
|
|
|
|
inline const RangeList& getRangeList() const { return _rangeList; }
|
2002-05-29 07:43:22 +08:00
|
|
|
|
2005-05-12 22:03:22 +08:00
|
|
|
virtual BoundingSphere computeBound() const;
|
|
|
|
|
2001-01-11 00:32:10 +08:00
|
|
|
protected :
|
|
|
|
virtual ~LOD() {}
|
|
|
|
|
2002-10-07 04:33:13 +08:00
|
|
|
CenterMode _centerMode;
|
2008-04-04 02:36:50 +08:00
|
|
|
vec_type _userDefinedCenter;
|
|
|
|
value_type _radius;
|
2002-02-07 09:07:11 +08:00
|
|
|
|
2004-07-01 03:07:05 +08:00
|
|
|
RangeMode _rangeMode;
|
2002-10-07 04:33:13 +08:00
|
|
|
RangeList _rangeList;
|
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
|