void TileNode::createChildren(EngineContext* context) { // NOTE: Ensure that _mutex is locked before calling this fucntion! // Create the four child nodes. for(unsigned quadrant=0; quadrant<4; ++quadrant) { TileNode* node = new TileNode(); if (context->getOptions().minExpiryFrames().isSet()) { node->setMinimumExpiryFrames( *context->getOptions().minExpiryFrames() ); } if (context->getOptions().minExpiryTime().isSet()) { node->setMinimumExpiryTime( *context->getOptions().minExpiryTime() ); } // Build the surface geometry: node->create( getTileKey().createChildKey(quadrant), context ); // Add to the scene graph. addChild( node ); // Inherit the samplers with new scale/bias information. node->inheritState( context ); } }
void RexTerrainEngineNode::dirtyTerrain() { //TODO: scrub the geometry pool? // clear the loader: _loader->clear(); if ( _terrain ) { this->removeChild( _terrain ); } // New terrain _terrain = new osg::Group(); this->addChild( _terrain ); // are we LOD blending? bool setupParentData = _terrainOptions.morphImagery() == true || // gw: redundant? this->parentTexturesRequired(); // reserve GPU unit for the main color texture: if ( _renderBindings.empty() ) { setupRenderBindings(); } // recalculate the LOD morphing parameters: //destroySelectionInfo(); //buildSelectionInfo(); // clear out the tile registry: if ( _liveTiles.valid() ) { _liveTiles->moveAll( _deadTiles.get() ); } // Factory to create the root keys: EngineContext* context = getEngineContext(); // Build the first level of the terrain. // Collect the tile keys comprising the root tiles of the terrain. std::vector<TileKey> keys; _update_mapf->getProfile()->getAllKeysAtLOD( *_terrainOptions.firstLOD(), keys ); // create a root node for each root tile key. OE_INFO << LC << "Creating " << keys.size() << " root keys.." << std::endl; unsigned child = 0; for( unsigned i=0; i<keys.size(); ++i ) { TileNode* tileNode = new TileNode(); if (context->getOptions().minExpiryFrames().isSet()) { tileNode->setMinimumExpiryFrames( *context->getOptions().minExpiryFrames() ); } if (context->getOptions().minExpiryTime().isSet()) { tileNode->setMinimumExpiryTime( *context->getOptions().minExpiryTime() ); } // Next, build the surface geometry for the node. tileNode->create( keys[i], context ); _terrain->addChild( tileNode ); } updateState(); // Call the base class TerrainEngineNode::dirtyTerrain(); }