1. 程式人生 > >osgEarth的Rex引擎原理分析(十一)如何根據earth檔案options建立不同的地理資訊引擎節點

osgEarth的Rex引擎原理分析(十一)如何根據earth檔案options建立不同的地理資訊引擎節點

目標:問題(九)中10

在對MapNode做初始化時,需要建立地理資訊引擎節點。

void
MapNode::init()
{
    _terrainEngine = TerrainEngineNodeFactory::create( terrainOptions );
}

osgEarth::TerrainEngineNodeFactory建立地理資訊引擎節點的過程如下:

osgEarth/TerrainEngineNode.cpp
TerrainEngineNode*
TerrainEngineNodeFactory::create(const TerrainOptions& options )
{
    osg::ref_ptr<TerrainEngineNode> node;

    std::string driver =
        Registry::instance()->overrideTerrainEngineDriverName().getOrUse(options.getDriver());

    if ( driver.empty() )
        driver = Registry::instance()->getDefaultTerrainEngineDriverName();

    std::string driverExt = std::string( ".osgearth_engine_" ) + driver;
    osg::ref_ptr<osg::Object> object = osgDB::readRefObjectFile( driverExt );
    node = dynamic_cast<TerrainEngineNode*>( object.release() );
    if ( !node )
    {
        OE_WARN << "WARNING: Failed to load terrain engine driver for \"" << driver << "\"" << std::endl;
    }

    return node.release();
}

TerrainEngineNodeFactory會根據earth檔案中配置的地理資訊引擎驅動的名字載入相應的驅動來建立具體的地理資訊引擎節點(具體過程可以參考osgEarth的Rex引擎原理分析(三)載入動態庫外掛的過程是什麼),在osgEarth2.9中有mp、rex兩種驅動,如果在earth檔案中沒有指定驅動,預設是mp,在以後的版本中會逐漸淘汰mp驅動。對於rex,最終由osgEarth::Drivers::RexTerrainEngine::RexTerrainEngineDriver創建出地理資訊引擎節點。

osgEarthDrivers/engine_rex/RexTerrainEngineDriver.cpp
virtual ReadResult readObject(const std::string& uri, const Options* options) const
        {
            if ( "osgearth_engine_rex" == osgDB::getFileExtension( uri ) )
            {
                OE_INFO << LC << "Activated!" << std::endl;
                return ReadResult( new RexTerrainEngineNode() );
            }
            else
            {
                return ReadResult::FILE_NOT_HANDLED;
            }
        } 

 

 

 

待繼續分析列表:

9、earth檔案中都有哪些options((九)中問題)

10、如何根據earth檔案options建立不同的地理資訊引擎節點((九)中問題)

11、rex地理資訊引擎的四樑八柱((九)中問題)