static bool readUserCenter( osgDB::InputStream& is, osg::LOD& node ) { osg::Vec3d center; double radius; is >> center >> radius; node.setCenter( center ); node.setRadius( radius ); return true; }
void StatsVisitor::apply(osg::LOD& node) { if (node.getStateSet()) { apply(*node.getStateSet()); } ++_numInstancedLOD; _lodSet.insert(&node); traverse(node); }
void CVRCullVisitor::apply(osg::LOD& node) { bool status = _cullingStatus; bool firstStatus = _firstCullStatus; if(isCulled(node)) { _firstCullStatus = firstStatus; _cullingStatus = status; return; } // push the culling mode. pushCurrentMask(); // push the node's state. StateSet* node_state = node.getStateSet(); if(node_state) pushStateSet(node_state); handle_cull_callbacks_and_traverse(node); // pop the node's state off the render graph stack. if(node_state) popStateSet(); // pop the culling mode. popCurrentMask(); _firstCullStatus = firstStatus; _cullingStatus = status; }
void FltExportVisitor::apply( osg::LOD& lodNode ) { _firstNode = false; ScopedStatePushPop guard( this, lodNode.getStateSet() ); // LOD center - same for all children osg::Vec3d center = lodNode.getCenter(); // Iterate children of the LOD and write a separate LOD record for each, // with that child's individual switchIn and switchOut properties for ( size_t i = 0; i < lodNode.getNumChildren(); ++i ) { osg::Node* lodChild = lodNode.getChild(i); // Switch-in/switch-out distances may vary per child double switchInDist = lodNode.getMaxRange(i); double switchOutDist = lodNode.getMinRange(i); writeLevelOfDetail( lodNode, center, switchInDist, switchOutDist); writeMatrix( lodNode.getUserData() ); writeComment( lodNode ); // Traverse each child of the LOD writePushTraverseWritePop( *lodChild ); } }
void CountsVisitor::apply(osg::LOD& node) { pushStateSet(node.getStateSet()); _lods++; osg::ref_ptr<osg::Object> rp = (osg::Object*)&node; _uLods.insert(rp); _totalChildren += node.getNumChildren(); apply(node.getStateSet()); if (++_depth > _maxDepth) _maxDepth = _depth; traverse((osg::Node&)node); _depth--; popStateSet(); }
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; }
static bool readRangeList( osgDB::InputStream& is, osg::LOD& node ) { unsigned int size = is.readSize(); is >> is.BEGIN_BRACKET; for ( unsigned int i=0; i<size; ++i ) { float min, max; is >> min >> max; node.setRange( i, min, max ); } is >> is.END_BRACKET; return true; }
void FltExportVisitor::writeLevelOfDetail(const osg::LOD &lod, osg::Vec3d const ¢er, double switchInDist, double switchOutDist) { uint16 length(80); IdHelper id(*this, lod.getName()); _records->writeInt16((int16) LOD_OP); _records->writeInt16(length); _records->writeID(id); _records->writeInt32(0); // 'Reserved' field _records->writeFloat64(switchInDist); _records->writeFloat64(switchOutDist); // Switch-out distance _records->writeInt16(0); // Special Effect ID1 _records->writeInt16(0); // Special Effect ID2 _records->writeInt32(0); // Flags _records->writeFloat64(center.x()); _records->writeFloat64(center.y()); _records->writeFloat64(center.z()); _records->writeFloat64(0); // Transition range _records->writeFloat64(0); // Significant size }
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); }
// _userDefinedCenter, _radius static bool checkUserCenter( const osg::LOD& node ) { return (node.getCenterMode()==osg::LOD::USER_DEFINED_CENTER)||(node.getCenterMode()==osg::LOD::UNION_OF_BOUNDING_SPHERE_AND_USER_DEFINED); }
// _rangeList static bool checkRangeList( const osg::LOD& node ) { return node.getNumRanges()>0; }
static bool writeUserCenter( osgDB::OutputStream& os, const osg::LOD& node ) { os << osg::Vec3d(node.getCenter()) << (double)node.getRadius() << std::endl; return true; }
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 ); }