|
osgEarth 2.1.1
|
Inheritance diagram for ParallelKeyNodeFactory:
Collaboration diagram for ParallelKeyNodeFactory:Public Member Functions | |
| ParallelKeyNodeFactory (TileBuilder *builder, const OSGTerrainOptions &options, const MapInfo &mapInfo, Terrain *terrain, UID engineUID) | |
| osg::Node * | createNode (const TileKey &key) |
Definition at line 27 of file ParallelKeyNodeFactory.
| ParallelKeyNodeFactory::ParallelKeyNodeFactory | ( | TileBuilder * | builder, |
| const OSGTerrainOptions & | options, | ||
| const MapInfo & | mapInfo, | ||
| Terrain * | terrain, | ||
| UID | engineUID | ||
| ) |
Definition at line 30 of file ParallelKeyNodeFactory.cpp.
: SerialKeyNodeFactory( builder, options, mapInfo, terrain, engineUID ) { //NOP }
| osg::Node * ParallelKeyNodeFactory::createNode | ( | const TileKey & | key | ) | [virtual] |
Reimplemented from SerialKeyNodeFactory.
Definition at line 42 of file ParallelKeyNodeFactory.cpp.
{
// An event for synchronizing the completion of all requests:
Threading::MultiEvent semaphore;
// Collect all the jobs that can run in parallel (from all 4 subtiles)
osg::ref_ptr<TileBuilder::Job> jobs[4];
unsigned numTasks = 0;
for( unsigned i=0; i<4; ++i )
{
jobs[i] = _builder->createJob( key.createChildKey(i), semaphore );
if ( jobs[i].valid() )
numTasks += jobs[i]->_tasks.size();
}
// Set up the sempahore to block for the correct number of tasks:
semaphore.reset( numTasks );
// Run all the tasks in parallel:
for( unsigned i=0; i<4; ++i )
if ( jobs[i].valid() )
_builder->runJob( jobs[i].get() );
// Wait for them to complete:
semaphore.wait();
// Now postprocess them and assemble into a tile group.
osg::Group* root = new osg::Group();
for( unsigned i=0; i<4; ++i )
{
if ( jobs[i].valid() )
{
osg::ref_ptr<Tile> tile;
bool hasRealData;
bool hasLodBlending;
_builder->finalizeJob( jobs[i].get(), tile, hasRealData, hasLodBlending );
if ( tile.valid() )
addTile( tile.get(), hasRealData, hasLodBlending, root );
}
}
//TODO: need to check to see if the group is empty, and do something different.
return root;
}
Here is the call graph for this function:
1.7.3