TileNode* TileGroup::getTileNode(unsigned q) { osg::Node* child = getChild(q); TilePagedLOD* plod = dynamic_cast<TilePagedLOD*>( child ); if ( plod ) return plod->getTileNode(); return static_cast<TileNode*>( child ); }
void TileGroup::applyUpdate(osg::Node* node) { if ( node ) { OE_DEBUG << LC << "Update received for tile " << _key.str() << std::endl; TileGroup* update = dynamic_cast<TileGroup*>( node ); if ( !update ) { OE_WARN << LC << "Internal error: update was not a TileGroup" << std::endl; return; } if ( update->getNumChildren() < 4 ) { OE_WARN << LC << "Internal error: update did not have 4 children" << std::endl; return; } for(unsigned i=0; i<4; ++i) { TileNode* newTileNode = dynamic_cast<TileNode*>( update->getChild(i) ); if ( !newTileNode ) { OE_WARN << LC << "Internal error; update child was not a TileNode" << std::endl; return; } osg::ref_ptr<TileNode> oldTileNode = 0L; TilePagedLOD* plod = dynamic_cast<TilePagedLOD*>(_children[i].get()); if ( plod ) { oldTileNode = plod->getTileNode(); plod->setTileNode( newTileNode ); if ( _live.valid() ) _live->move( oldTileNode.get(), _dead.get() ); } else { // must be a TileNode leaf, so replace it here. oldTileNode = dynamic_cast<TileNode*>(_children[i].get()); if ( !oldTileNode.valid() ) { OE_WARN << LC << "Internal error; existing child was not a TilePagedLOD or a TileNode" << std::endl; return; } this->setChild( i, newTileNode ); if ( _live.valid() ) _live->move( oldTileNode.get(), _dead.get() ); } if ( _live.valid() ) _live->add( newTileNode ); } } // deactivate the update agent _updateAgent = 0L; }