static bool writeRangeList( osgDB::OutputStream& os, const osg::LOD& node ) { const osg::LOD::RangeList& ranges = node.getRangeList(); os.writeSize(ranges.size()); os << os.BEGIN_BRACKET << std::endl; for ( osg::LOD::RangeList::const_iterator itr=ranges.begin(); itr!=ranges.end(); ++itr ) { os << itr->first << itr->second << std::endl; } os << os.END_BRACKET << std::endl; return true; }
void apply(osg::LOD& lod) { // find the highest LOD: int minIndex = 0; float minRange = FLT_MAX; for(unsigned i=0; i<lod.getNumRanges(); ++i) { if ( lod.getRangeList()[i].first < minRange ) { minRange = lod.getRangeList()[i].first; minIndex = i; } } //remove all but the highest: osg::ref_ptr<osg::Node> highestLOD = lod.getChild( minIndex ); lod.removeChildren( 0, lod.getNumChildren() ); //add it back with a full range. lod.addChild( highestLOD.get(), 0.0f, FLT_MAX ); traverse(lod); }
void daeWriter::apply( osg::LOD &node ) { debugPrint( node ); updateCurrentDaeNode(); lastDepth = _nodePath.size(); currentNode = daeSafeCast< domNode >(currentNode->add( COLLADA_ELEMENT_NODE ) ); currentNode->setId(getNodeName(node,"LOD").c_str()); if (writeExtras) { // Store LOD data as extra "LOD" data in the "OpenSceneGraph" technique // Adds the following to a node //<extra type="LOD"> // <technique profile="OpenSceneGraph"> // <Center>1 2 3</Center> (optional ) // <Radius>-1</Radius> (required if Center is available) // <RangeMode>0</RangeMode> // <RangeList> // <MinMax>0 300</MinMax> // <MinMax>300 600</MinMax> // </RangeList> // </technique> //</extra> domExtra *extra = daeSafeCast<domExtra>(currentNode->add( COLLADA_ELEMENT_EXTRA )); extra->setType("LOD"); domTechnique *teq = daeSafeCast<domTechnique>(extra->add( COLLADA_ELEMENT_TECHNIQUE ) ); teq->setProfile( "OpenSceneGraph" ); if (node.getCenterMode()==osg::LOD::USER_DEFINED_CENTER) { domAny *center = (domAny*)teq->add("Center"); center->setValue(toString(node.getCenter()).c_str()); domAny *radius = (domAny*)teq->add("Radius"); radius->setValue(toString<osg::LOD::value_type>(node.getRadius()).c_str()); } domAny *rangeMode = (domAny*)teq->add("RangeMode"); rangeMode->setValue(toString<osg::LOD::RangeMode>(node.getRangeMode()).c_str()); domAny *valueLists = (domAny*)teq->add("RangeList"); unsigned int pos = 0; const osg::LOD::RangeList& rangelist = node.getRangeList(); for(osg::LOD::RangeList::const_iterator sitr=rangelist.begin(); sitr!=rangelist.end(); ++sitr,++pos) { domAny *valueList = (domAny*)valueLists->add("MinMax"); std::stringstream fw; fw << sitr->first << " " << sitr->second; valueList->setValue(fw.str().c_str()); } } writeNodeExtra(node); // Process all children traverse( node ); }