#include <OSGDistanceLOD.h>
Inheritance diagram for osg::DistanceLOD:

Public Types | |
| typedef DistanceLODPtr | Ptr |
| enum | { CenterFieldId = Inherited::NextFieldId, RangeFieldId = CenterFieldId + 1, NextFieldId = RangeFieldId + 1 } |
Public Member Functions | |
Sync | |
| *virtual void | changed (BitVector whichField, UInt32 origin) |
Dump | |
| *virtual void | dump (UInt32 uiIndent=0, const BitVector bvFlags=0) const |
FieldContainer Get | |
| *virtual FieldContainerType & | getType (void) |
| virtual const FieldContainerType & | getType (void) const |
| virtual UInt32 | getContainerSize (void) const |
Field Get | |
| *SFPnt3f * | getSFCenter (void) |
| Get the DistanceLOD::_sfCenter field. | |
| MFReal32 * | getMFRange (void) |
| Get the DistanceLOD::_mfRange field. | |
| Pnt3f & | getCenter (void) |
| Get the value of the DistanceLOD::_sfCenter field. | |
| const Pnt3f & | getCenter (void) const |
| Get the value of the DistanceLOD::_sfCenter field. | |
| Real32 & | getRange (const UInt32 index) |
| Get the value of the index element the DistanceLOD::_mfRange field. | |
| MFReal32 & | getRange (void) |
| Get the DistanceLOD::_mfRange field. | |
| const MFReal32 & | getRange (void) const |
| Get the DistanceLOD::_mfRange field. | |
Field Set | |
| *void | setCenter (const Pnt3f &value) |
| Set the value of the DistanceLOD::_sfCenter field. | |
Binary Access | |
| *virtual UInt32 | getBinSize (const BitVector &whichField) |
| virtual void | copyToBin (BinaryDataHandler &pMem, const BitVector &whichField) |
| virtual void | copyFromBin (BinaryDataHandler &pMem, const BitVector &whichField) |
Copy | |
| *virtual FieldContainerPtr | shallowCopy (void) const |
Static Public Member Functions | |
Class Get | |
| *static FieldContainerType & | getClassType (void) |
| access the type of the class | |
| static UInt32 | getClassTypeId (void) |
| access the numerical type of the class | |
Construction | |
| *static DistanceLODPtr | create (void) |
| create a new instance of the class | |
| static DistanceLODPtr | createEmpty (void) |
| create an empty new instance of the class, do not copy the prototype | |
Static Public Attributes | |
| static const osg::BitVector | CenterFieldMask |
| static const osg::BitVector | RangeFieldMask |
| static const osg::BitVector | MTInfluenceMask |
| static const BitVector | ParentsFieldMask = (1 << NodeCore::ParentsFieldId ) |
| static const BitVector | AttachmentsFieldMask |
| static const BitVector | NextFieldMask |
Protected Types | |
| typedef DistanceLODBase | Inherited |
Protected Member Functions | |
Constructors | |
| * | DistanceLOD (void) |
| DistanceLOD (const DistanceLOD &source) | |
Destructors | |
| *virtual | ~DistanceLOD (void) |
Draw | |
| *Action::ResultE | draw (Action *action) |
Sync | |
| *void | executeSyncImpl (DistanceLODBase *pOther, const BitVector &whichField) |
| virtual void | executeSync (FieldContainer &other, const BitVector &whichField) |
Protected Attributes | |
Fields | |
| *SFPnt3f | _sfCenter |
| MFReal32 | _mfRange |
Private Member Functions | |
| void | operator= (const DistanceLOD &source) |
| prohibit default function (move to 'public' if needed) | |
Static Private Member Functions | |
Init | |
| *static void | initMethod (void) |
Friends | |
| class | FieldContainer |
| class | DistanceLODBase |
The node chooses which child to render based on the range values in the Range multi-field and the current distance of the camera from the object. The children should be ordered from the highest level of detail to the lowest level of detail. The range values specify the distances at which to switch between the different children.
The center field is a translation offset in the local coordinate system that specified the center of the object for distance calculations. In order to calculate which level to display, first the distance is calculate from the viewpoint to the center point of the LOD node (which corresponding transformations). If the distance is less than the first range value, then the first LOD is drawn. If it is between the first and the second values, then the second LOD is drawn, and so on.
Example: Setting up a osg::DistanceLOD
Here is an example of setting up an lod core with a center and a range. You would also need to add children for the 4 LODs.
DistanceLOD lod = DistanceLOD::create(); beginEditCP(lod); // this is supposed to be the center of the LOD model, // that is, this is the point the distance is measured from lod->setCenter(12,1,5); // now we add the distances when models will change lod->getMFRange()->push_back(6.0); lod->getMFRange()->push_back(12.0); lod->getMFRange()->push_back(24.0); endEditCP(lod);
Definition at line 56 of file OSGDistanceLOD.h.
|
|
Reimplemented from osg::DistanceLODBase. Definition at line 80 of file OSGDistanceLOD.h. |
|
|
Reimplemented from osg::GroupBase. Definition at line 91 of file OSGDistanceLODBase.h. |
|
|
Reimplemented from osg::NodeCore. Definition at line 93 of file OSGDistanceLODBase.h. 00094 { 00095 CenterFieldId = Inherited::NextFieldId, 00096 RangeFieldId = CenterFieldId + 1, 00097 NextFieldId = RangeFieldId + 1 00098 };
|
|
|
Definition at line 119 of file OSGDistanceLOD.cpp. 00119 : 00120 Inherited() 00121 { 00122 }
|
|
|
Definition at line 124 of file OSGDistanceLOD.cpp. 00124 : 00125 Inherited(source) 00126 { 00127 }
|
|
|
Definition at line 132 of file OSGDistanceLOD.cpp.
|
|
||||||||||||
|
Reimplemented from osg::Group. Definition at line 102 of file OSGDistanceLOD.cpp. References osg::Group::changed(). 00103 { 00104 Inherited::changed(whichField, origin); 00105 }
|
|
||||||||||||
|
Reimplemented from osg::Group. Definition at line 110 of file OSGDistanceLOD.cpp. References SLOG. 00112 { 00113 SLOG << "Dump DistanceLOD NI" << std::endl; 00114 }
|
|
|
Definition at line 139 of file OSGDistanceLOD.cpp. References osg::Action::addNode(), osg::Action::Continue, osg::Action::getActNode(), osg::DrawActionBase::getCameraToWorld(), osg::DistanceLODBase::getCenter(), osg::NodePtr::getCPtr(), osg::DistanceLODBase::getMFRange(), osg::Action::getNNodes(), osg::Action::getNode(), osg::DrawActionBase::isVisible(), osg::TransformationMatrix< ValueTypeT >::mult(), osg::osgMin(), osg::osgsqrt(), osg::MField< FieldTypeT, fieldNameSpace >::size(), osg::RenderAction::top_matrix(), and osg::Action::useNodeList(). Referenced by initMethod(). 00140 { 00141 DrawActionBase *da = dynamic_cast<DrawActionBase *>(action); 00142 RenderAction *ra = dynamic_cast<RenderAction *>(action); 00143 00144 UInt32 numLevels = action->getNNodes(); 00145 UInt32 numRanges = getMFRange()->size(); 00146 00147 UInt32 limit = osgMin(numLevels, numRanges); 00148 00149 Int32 index = -1; 00150 00151 Pnt3f eyepos(0.f, 0.f, 0.f); 00152 Pnt3f objpos; 00153 00154 da->getCameraToWorld().mult(eyepos); 00155 00156 if(ra != NULL) 00157 { 00158 ra->top_matrix() .mult(getCenter(), objpos); 00159 } 00160 else 00161 { 00162 da->getActNode()->getToWorld().mult(getCenter(), objpos); 00163 } 00164 00165 Real32 dist = osgsqrt((eyepos[0] - objpos[0])*(eyepos[0] - objpos[0]) + 00166 (eyepos[1] - objpos[1])*(eyepos[1] - objpos[1]) + 00167 (eyepos[2] - objpos[2])*(eyepos[2] - objpos[2])); 00168 00169 da->useNodeList(); 00170 00171 if(numRanges != 0 && numLevels!=0 ) 00172 { 00173 if(dist < (*(getMFRange()))[0]) 00174 { 00175 index = 0; 00176 } 00177 else if(dist >= (*(getMFRange()))[numRanges-1]) 00178 { 00179 index = (numLevels > numRanges) ? numRanges : (limit-1); 00180 } 00181 else 00182 { 00183 UInt32 i = 1; 00184 00185 while( (i < numRanges) && 00186 !( ((*(getMFRange()))[i-1] <= dist) && 00187 (dist < (*(getMFRange()))[i] ) ) ) 00188 { 00189 i++; 00190 } 00191 00192 index = osgMin(i, limit-1); 00193 } 00194 00195 if(da->isVisible(action->getNode(index).getCPtr())) 00196 { 00197 da->addNode(action->getNode(index)); 00198 } 00199 } 00200 00201 return Action::Continue; 00202 }
|
|
|
Reimplemented from osg::Group. Definition at line 207 of file OSGDistanceLOD.cpp. References draw(), osg::DistanceLODBase::getClassType(), osg::osgTypedMethodFunctor2BaseCPtrRef(), osg::RenderAction::registerEnterDefault(), and osg::DrawAction::registerEnterDefault(). 00208 { 00209 DrawAction::registerEnterDefault( 00210 getClassType(), 00211 osgTypedMethodFunctor2BaseCPtrRef< 00212 Action::ResultE, 00213 DistanceLODPtr , 00214 CNodePtr , 00215 Action *>(&DistanceLOD::draw)); 00216 00217 RenderAction::registerEnterDefault( 00218 getClassType(), 00219 osgTypedMethodFunctor2BaseCPtrRef< 00220 Action::ResultE, 00221 DistanceLODPtr , 00222 CNodePtr , 00223 Action *>(&DistanceLOD::draw)); 00224 }
|
|
|
|
|
|
Reimplemented from osg::GroupBase. Definition at line 58 of file OSGDistanceLODBase.inl. References osg::DistanceLODBase::_type. Referenced by osg::DistanceLODBase::create(), initMethod(), osg::SplitGraphOp::isGroup(), and osg::MergeGraphOp::isGroup(). 00059 { 00060 return _type; 00061 }
|
|
|
Reimplemented from osg::GroupBase. Definition at line 65 of file OSGDistanceLODBase.inl. References osg::DistanceLODBase::_type, and osg::TypeBase::getId(). 00066 { 00067 return _type.getId(); 00068 }
|
|
|
Reimplemented from osg::GroupBase. Definition at line 117 of file OSGDistanceLODBase.cpp. References osg::DistanceLODBase::_type. 00118 { 00119 return _type; 00120 }
|
|
|
Reimplemented from osg::GroupBase. Definition at line 122 of file OSGDistanceLODBase.cpp. References osg::DistanceLODBase::_type. 00123 { 00124 return _type; 00125 }
|
|
|
Reimplemented from osg::GroupBase. Definition at line 137 of file OSGDistanceLODBase.cpp. 00138 { 00139 return sizeof(DistanceLOD); 00140 }
|
|
|
Definition at line 101 of file OSGDistanceLODBase.inl. References osg::DistanceLODBase::_sfCenter. 00102 { 00103 return &_sfCenter; 00104 }
|
|
|
Definition at line 108 of file OSGDistanceLODBase.inl. References osg::DistanceLODBase::_mfRange. Referenced by draw(). 00109 { 00110 return &_mfRange; 00111 }
|
|
|
Definition at line 116 of file OSGDistanceLODBase.inl. References osg::DistanceLODBase::_sfCenter, and osg::SField< FieldTypeT, fieldNameSpace >::getValue(). Referenced by draw(). 00117 { 00118 return _sfCenter.getValue(); 00119 }
|
|
|
Definition at line 123 of file OSGDistanceLODBase.inl. References osg::DistanceLODBase::_sfCenter, and osg::SField< FieldTypeT, fieldNameSpace >::getValue(). 00124 { 00125 return _sfCenter.getValue(); 00126 }
|
|
|
Definition at line 138 of file OSGDistanceLODBase.inl. References osg::DistanceLODBase::_mfRange. 00139 { 00140 return _mfRange[index]; 00141 }
|
|
|
Definition at line 145 of file OSGDistanceLODBase.inl. References osg::DistanceLODBase::_mfRange. 00146 { 00147 return _mfRange; 00148 }
|
|
|
Definition at line 152 of file OSGDistanceLODBase.inl. References osg::DistanceLODBase::_mfRange. 00153 { 00154 return _mfRange; 00155 }
|
|
|
Definition at line 130 of file OSGDistanceLODBase.inl. References osg::DistanceLODBase::_sfCenter, and osg::SField< FieldTypeT, fieldNameSpace >::setValue().
|
|
|
Reimplemented from osg::GroupBase. Definition at line 202 of file OSGDistanceLODBase.cpp. References osg::DistanceLODBase::_mfRange, osg::DistanceLODBase::_sfCenter, osg::DistanceLODBase::CenterFieldMask, osg::MField< FieldTypeT, fieldNameSpace >::getBinSize(), osg::SField< FieldTypeT, fieldNameSpace >::getBinSize(), osg::GroupBase::getBinSize(), osg::FieldBits::NoField, and osg::DistanceLODBase::RangeFieldMask. 00203 { 00204 UInt32 returnValue = Inherited::getBinSize(whichField); 00205 00206 if(FieldBits::NoField != (CenterFieldMask & whichField)) 00207 { 00208 returnValue += _sfCenter.getBinSize(); 00209 } 00210 00211 if(FieldBits::NoField != (RangeFieldMask & whichField)) 00212 { 00213 returnValue += _mfRange.getBinSize(); 00214 } 00215 00216 00217 return returnValue; 00218 }
|
|
||||||||||||
|
Reimplemented from osg::GroupBase. Definition at line 220 of file OSGDistanceLODBase.cpp. References osg::DistanceLODBase::_mfRange, osg::DistanceLODBase::_sfCenter, osg::DistanceLODBase::CenterFieldMask, osg::MField< FieldTypeT, fieldNameSpace >::copyToBin(), osg::SField< FieldTypeT, fieldNameSpace >::copyToBin(), osg::GroupBase::copyToBin(), osg::FieldBits::NoField, and osg::DistanceLODBase::RangeFieldMask. 00222 { 00223 Inherited::copyToBin(pMem, whichField); 00224 00225 if(FieldBits::NoField != (CenterFieldMask & whichField)) 00226 { 00227 _sfCenter.copyToBin(pMem); 00228 } 00229 00230 if(FieldBits::NoField != (RangeFieldMask & whichField)) 00231 { 00232 _mfRange.copyToBin(pMem); 00233 } 00234 00235 00236 }
|
|
||||||||||||
|
Reimplemented from osg::GroupBase. Definition at line 238 of file OSGDistanceLODBase.cpp. References osg::DistanceLODBase::_mfRange, osg::DistanceLODBase::_sfCenter, osg::DistanceLODBase::CenterFieldMask, osg::MField< FieldTypeT, fieldNameSpace >::copyFromBin(), osg::SField< FieldTypeT, fieldNameSpace >::copyFromBin(), osg::GroupBase::copyFromBin(), osg::FieldBits::NoField, and osg::DistanceLODBase::RangeFieldMask. 00240 { 00241 Inherited::copyFromBin(pMem, whichField); 00242 00243 if(FieldBits::NoField != (CenterFieldMask & whichField)) 00244 { 00245 _sfCenter.copyFromBin(pMem); 00246 } 00247 00248 if(FieldBits::NoField != (RangeFieldMask & whichField)) 00249 { 00250 _mfRange.copyFromBin(pMem); 00251 } 00252 00253 00254 }
|
|
|
Reimplemented from osg::GroupBase. Definition at line 72 of file OSGDistanceLODBase.inl. References osg::AttachmentContainerPtr::dcast(), osg::DistanceLODBase::getClassType(), osg::FieldContainerType::getPrototype(), osg::NullFC, and osg::DistanceLODBase::shallowCopy(). Referenced by osg::VRMLLODDesc::init(). 00073 { 00074 DistanceLODPtr fc; 00075 00076 if(getClassType().getPrototype() != OSG::NullFC) 00077 { 00078 fc = DistanceLODPtr::dcast( 00079 getClassType().getPrototype()-> shallowCopy()); 00080 } 00081 00082 return fc; 00083 }
|
|
|
Reimplemented from osg::GroupBase. Definition at line 87 of file OSGDistanceLODBase.inl. References osg::FieldContainer::newPtr(). 00088 { 00089 DistanceLODPtr returnValue; 00090 00091 newPtr(returnValue); 00092 00093 return returnValue; 00094 }
|
|
|
Reimplemented from osg::GroupBase. Definition at line 128 of file OSGDistanceLODBase.cpp. References osg::FieldContainer::newPtr(). Referenced by osg::DistanceLODBase::create(). 00129 { 00130 DistanceLODPtr returnValue; 00131 00132 newPtr(returnValue, dynamic_cast<const DistanceLOD *>(this)); 00133 00134 return returnValue; 00135 }
|
|
||||||||||||
|
Definition at line 257 of file OSGDistanceLODBase.cpp. References osg::DistanceLODBase::_mfRange, osg::DistanceLODBase::_sfCenter, osg::DistanceLODBase::CenterFieldMask, osg::GroupBase::executeSyncImpl(), osg::FieldBits::NoField, osg::DistanceLODBase::RangeFieldMask, osg::MField< FieldTypeT, fieldNameSpace >::syncWith(), and osg::SField< FieldTypeT, fieldNameSpace >::syncWith(). Referenced by osg::DistanceLODBase::executeSync(). 00259 { 00260 00261 Inherited::executeSyncImpl(pOther, whichField); 00262 00263 if(FieldBits::NoField != (CenterFieldMask & whichField)) 00264 _sfCenter.syncWith(pOther->_sfCenter); 00265 00266 if(FieldBits::NoField != (RangeFieldMask & whichField)) 00267 _mfRange.syncWith(pOther->_mfRange); 00268 00269 00270 }
|
|
||||||||||||
|
Definition at line 191 of file OSGGroupBase.cpp. References osg::NodeCore::executeSyncImpl(). Referenced by osg::GroupBase::executeSync(), osg::TransformBase::executeSyncImpl(), osg::SwitchBase::executeSyncImpl(), osg::ProxyGroupBase::executeSyncImpl(), osg::MaterialPoolBase::executeSyncImpl(), osg::MaterialGroupBase::executeSyncImpl(), osg::InverseTransformBase::executeSyncImpl(), osg::DistanceLODBase::executeSyncImpl(), and osg::BillboardBase::executeSyncImpl(). 00193 { 00194 00195 Inherited::executeSyncImpl(pOther, whichField); 00196 00197 00198 }
|
|
||||||||||||
|
Definition at line 180 of file OSGNodeCore.inl. References osg::NodeCore::_parents, osg::AttachmentContainer::executeSyncImpl(), osg::FieldBits::NoField, osg::NodeCore::ParentsFieldMask, and osg::MField< FieldTypeT, fieldNameSpace >::syncWith(). Referenced by osg::NodeCore::executeSync(), osg::StateSortingGroupBase::executeSyncImpl(), osg::LightEnvBase::executeSyncImpl(), osg::LightBase::executeSyncImpl(), osg::InlineBase::executeSyncImpl(), osg::GroupBase::executeSyncImpl(), osg::DVRVolumeBase::executeSyncImpl(), and osg::DrawableBase::executeSyncImpl(). 00182 { 00183 Inherited::executeSyncImpl(pOther, whichField); 00184 00185 if(FieldBits::NoField != (ParentsFieldMask & whichField)) 00186 { 00187 _parents.syncWith(pOther->_parents); 00188 } 00189 }
|
|
||||||||||||
|
||||||||||||
|
Definition at line 333 of file OSGFieldContainerImpl.inl. Referenced by osg::StateBase::executeSyncImpl(), osg::DVRShaderBase::executeSyncImpl(), osg::DVRClipGeometryBase::executeSyncImpl(), osg::AttachmentContainer::executeSyncImpl(), and osg::Attachment::executeSyncImpl().
|
|
||||||||||||
|
Reimplemented from osg::GroupBase. Definition at line 144 of file OSGDistanceLODBase.cpp. References osg::DistanceLODBase::executeSyncImpl(). 00146 { 00147 this->executeSyncImpl((DistanceLODBase *) &other, whichField); 00148 }
|
|
|
Reimplemented in osg::Billboard, osg::InverseTransform, osg::MaterialGroup, and osg::Transform. Definition at line 100 of file OSGGroup.cpp. References osg::Action::Continue, osg::DrawActionBase::selectVisibles(), and osg::Action::Skip. Referenced by osg::Group::initMethod(). 00101 { 00102 DrawActionBase *da = dynamic_cast<DrawActionBase *>(action); 00103 00104 if(da->selectVisibles() == 0) 00105 return Action::Skip; 00106 00107 return Action::Continue; 00108 }
|
|
|
Reimplemented in osg::Billboard, osg::InverseTransform, osg::MaterialGroup, and osg::Transform. Definition at line 110 of file OSGGroup.cpp. References osg::Action::Continue. Referenced by osg::Group::initMethod(). 00111 { 00112 return Action::Continue; 00113 }
|
|
|
Reimplemented in osg::Billboard, osg::InverseTransform, osg::MaterialGroup, and osg::Transform. Definition at line 118 of file OSGGroup.cpp. References osg::Action::Continue, and osg::RenderAction::pushVisibility(). Referenced by osg::Group::initMethod(), and osg::MaterialGroup::renderEnter(). 00119 { 00120 RenderAction *ra = dynamic_cast<RenderAction *>(action); 00121 00122 ra->pushVisibility(); 00123 00124 return Action::Continue; 00125 }
|
|
|
Reimplemented in osg::Billboard, osg::InverseTransform, osg::MaterialGroup, and osg::Transform. Definition at line 127 of file OSGGroup.cpp. References osg::Action::Continue, and osg::RenderAction::popVisibility(). Referenced by osg::Group::initMethod(), and osg::MaterialGroup::renderLeave(). 00128 { 00129 RenderAction *ra = dynamic_cast<RenderAction *>(action); 00130 00131 ra->popVisibility(); 00132 00133 return Action::Continue; 00134 }
|
|
|
Reimplemented in osg::Switch. Definition at line 139 of file OSGGroup.cpp. References osg::Action::Continue, osg::Action::getActNode(), osg::IntersectAction::getLine(), osg::DynamicVolume::intersect(), osg::Volume::isValid(), and osg::Action::Skip. Referenced by osg::Group::initMethod(). 00140 { 00141 IntersectAction *ia = dynamic_cast<IntersectAction *>(action); 00142 const DynamicVolume &dv = ia->getActNode()->getVolume(); 00143 00144 if(dv.isValid() && ! dv.intersect(ia->getLine())) 00145 { 00146 return Action::Skip; //bv missed -> can not hit children 00147 } 00148 00149 return Action::Continue; 00150 }
|
|
|
Definition at line 56 of file OSGNodeCore.inl. Referenced by osg::Surface::FindClosestPoint(). 00057 { 00058 return _parents; 00059 }
|
|
|
Definition at line 62 of file OSGNodeCore.inl. References osg::NodeCore::_parents. 00063 { 00064 return _parents; 00065 }
|
|
|
Definition at line 68 of file OSGNodeCore.inl. References osg::NodeCore::_parents. 00069 { 00070 return &_parents; 00071 }
|