//C++ header - Open Scene Graph - Copyright (C) 1998-2002 Robert Osfield //Distributed under the terms of the GNU Library General Public License (LGPL) //as published by the Free Software Foundation. #ifndef OSG_LOD #define OSG_LOD 1 #include 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] MinMaxPair; typedef std::vector RangeList; enum CenterMode { USE_BOUNDING_SPHERE_CENTER, USER_DEFINED_CENTER }; void setCenterMode(CenterMode mode) { _centerMode=mode; } CenterMode getCenterMode() const { return _centerMode; } /** 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) { _centerMode=USER_DEFINED_CENTER; _userDefinedCenter = center; } /** return the LOD center point. */ inline const Vec3& getCenter() const { if (_centerMode==USER_DEFINED_CENTER) return _userDefinedCenter; else return getBound().center(); } /** Sets the min and max visible ranges of range of specifiec child. Values are floating point distance specified in local objects coordinates.*/ void setRange(unsigned int childNo, float min,float max); /** returns the min visible range for specified child.*/ inline float getMinRange(unsigned int childNo) const { return _rangeList[childNo].first; } /** returns the max visible range for specified child.*/ inline float getMaxRange(unsigned int childNo) const { return _rangeList[childNo].second; } /** returns the number of ranges currently set. * An LOD which has been fully set up will have getNumChildren()==getNumRanges(). */ inline unsigned int getNumRanges() const { return _rangeList.size(); } /** return the list of MinMax ranges for each child.*/ inline RangeList& getRangeList() { return _rangeList; } /** return the list of MinMax ranges for each child.*/ inline const RangeList& getRangeList() const { return _rangeList; } protected : virtual ~LOD() {} CenterMode _centerMode; Vec3 _userDefinedCenter; RangeList _rangeList; }; } #endif