void TileNode::createChildren(EngineContext* context) { // NOTE: Ensure that _mutex is locked before calling this function! //OE_WARN << "Creating children for " << _key.str() << std::endl; // Create the four child nodes. for(unsigned quadrant=0; quadrant<4; ++quadrant) { TileNode* node = new TileNode(); if (context->getOptions().minExpiryFrames().isSet()) { node->setMinimumExpirationFrames( *context->getOptions().minExpiryFrames() ); } if (context->getOptions().minExpiryTime().isSet()) { node->setMinimumExpirationTime( *context->getOptions().minExpiryTime() ); } // Build the surface geometry: node->create( getKey().createChildKey(quadrant), this, context ); // Add to the scene graph. addChild( node ); } }
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(); } // Calculate the LOD morphing parameters: unsigned maxLOD = _terrainOptions.maxLOD().getOrUse(DEFAULT_MAX_LOD); _selectionInfo.initialize( 0u, // always zero, not the terrain options firstLOD std::min( _terrainOptions.maxLOD().get(), maxLOD ), _terrainOptions.tileSize().get(), _update_mapf->getMapInfo().getProfile(), _terrainOptions.minTileRangeFactor().get() ); // clear out the tile registry: if ( _liveTiles.valid() ) { _liveTiles->releaseAll(_releaser.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->setMinimumExpirationFrames( *context->getOptions().minExpiryFrames() ); } if (context->getOptions().minExpiryTime().isSet()) { tileNode->setMinimumExpirationTime( *context->getOptions().minExpiryTime() ); } // Next, build the surface geometry for the node. tileNode->create( keys[i], 0L, context ); // Add it to the scene graph _terrain->addChild( tileNode ); // And load the tile's data synchronously (only for root tiles). tileNode->loadSync( context ); } updateState(); // Call the base class TerrainEngineNode::dirtyTerrain(); }
void RexTerrainEngineNode::dirtyTerrain() { if ( _terrain ) { this->removeChild( _terrain ); } // clear the loader: _loader->clear(); // clear out the tile registry: if ( _liveTiles.valid() ) { _liveTiles->releaseAll(_releaser.get()); } // scrub the geometry pool: _geometryPool->clear(); // New terrain _terrain = new osg::Group(); this->addChild( _terrain ); // Build the first level of the terrain. // Collect the tile keys comprising the root tiles of the terrain. std::vector<TileKey> keys; _mapFrame.getProfile()->getAllKeysAtLOD( *_terrainOptions.firstLOD(), keys ); // create a root node for each root tile key. OE_DEBUG << LC << "Creating " << keys.size() << " root keys." << std::endl; // We need to take a self-ref here to ensure that the TileNode's data loader // can use its observer_ptr back to the terrain engine. this->ref(); for( unsigned i=0; i<keys.size(); ++i ) { TileNode* tileNode = new TileNode(); if (_terrainOptions.minExpiryFrames().isSet()) { tileNode->setMinimumExpirationFrames(_terrainOptions.minExpiryFrames().get()); } if (_terrainOptions.minExpiryTime().isSet()) { tileNode->setMinimumExpirationTime(_terrainOptions.minExpiryTime().get()); } // Next, build the surface geometry for the node. tileNode->create( keys[i], 0L, _engineContext.get() ); // Add it to the scene graph _terrain->addChild( tileNode ); // And load the tile's data synchronously (only for root tiles). tileNode->loadSync(); } // release the self-ref. this->unref_nodelete(); // Set up the state sets. updateState(); // Call the base class TerrainEngineNode::dirtyTerrain(); }