void TileNode::create(const TileKey& key, EngineContext* context) { _key = key; // Create mask records osg::ref_ptr<MaskGenerator> masks = context ? new MaskGenerator(key, context->getOptions().tileSize().get(), context->getMapFrame()) : 0L; // Get a shared geometry from the pool that corresponds to this tile key: osg::ref_ptr<osg::Geometry> geom; context->getGeometryPool()->getPooledGeometry(key, context->getMapFrame().getMapInfo(), geom, masks.get()); // Create the drawable for the terrain surface: TileDrawable* surfaceDrawable = new TileDrawable( key, context->getRenderBindings(), geom.get(), context->getOptions().tileSize().get(), context->getGeometryPool()->getNumSkirtElements() ); surfaceDrawable->setDrawAsPatches(false); // Create the node to house the tile drawable: _surface = new SurfaceNode( key, context->getMapFrame().getMapInfo(), context->getRenderBindings(), surfaceDrawable ); //_surface->setNodeMask( OSGEARTH_MASK_TERRAIN_SURFACE ); // Slot it into the proper render bin: //osg::StateSet* surfaceSS = _surface->getOrCreateStateSet(); //surfaceSS->setRenderBinDetails(0, "oe.SurfaceBin"); //surfaceSS->setNestRenderBins(false); // Create a drawable for land cover geometry. // Land cover will be rendered as patch data instead of triangles. TileDrawable* patchDrawable = new TileDrawable( key, context->getRenderBindings(), geom.get(), context->getOptions().tileSize().get(), context->getGeometryPool()->getNumSkirtElements() ); patchDrawable->setDrawAsPatches(true); // And a node to house that as well: _landCover = new SurfaceNode( key, context->getMapFrame().getMapInfo(), context->getRenderBindings(), patchDrawable ); //_landCover->setNodeMask( OSGEARTH_MASK_TERRAIN_LAND_COVER ); // PPP: Better way to do this rather than here? // Can't do it at RexTerrainEngineNode level, because the SurfaceNode is not valid yet if (context->getSelectionInfo().initialized()==false) { static Threading::Mutex s_selInfoMutex; Threading::ScopedMutexLock lock(s_selInfoMutex); if ( context->getSelectionInfo().initialized()==false) { SelectionInfo& selectionInfo = const_cast<SelectionInfo&>(context->getSelectionInfo()); unsigned uiFirstLOD = *(context->_options.firstLOD()); unsigned uiMaxLod = std::min( context->_options.maxLOD().get(), 19u ); // beyond LOD 19 or 20, morphing starts to lose precision. unsigned uiTileSize = *(context->_options.tileSize()); selectionInfo.initialize(uiFirstLOD, uiMaxLod, uiTileSize, getVisibilityRangeHint(context)); //uiFirstLOD)); } } // initialize all the per-tile uniforms the shaders will need: createTileUniforms(); updateTileUniforms(context->getSelectionInfo()); // Set up a data container for multipass layer rendering: _mptex = new MPTexture(); surfaceDrawable->setMPTexture( _mptex.get() ); // need to recompute the bounds after adding payload: dirtyBound(); // signal the tile to start loading data: setDirty( true ); // register me. context->liveTiles()->add( this ); }
void TileNode::create(const TileKey& key, EngineContext* context) { if (!context) return; _key = key; // Create mask records osg::ref_ptr<MaskGenerator> masks = new MaskGenerator(key, context->getOptions().tileSize().get(), context->getMapFrame()); // Get a shared geometry from the pool that corresponds to this tile key: osg::ref_ptr<osg::Geometry> geom; context->getGeometryPool()->getPooledGeometry(key, context->getMapFrame().getMapInfo(), geom, masks.get()); // Create the drawable for the terrain surface: TileDrawable* surfaceDrawable = new TileDrawable( key, context->getRenderBindings(), geom.get(), context->getOptions().tileSize().get(), context->getGeometryPool()->getNumSkirtElements() ); surfaceDrawable->setDrawAsPatches(false); // Create the node to house the tile drawable: _surface = new SurfaceNode( key, context->getMapFrame().getMapInfo(), context->getRenderBindings(), surfaceDrawable ); // Create a drawable for "patch" geometry, which is rendered as GL patches, not triangles. // Patch geometry can be used to place land cover or render other tile-specific data. TileDrawable* patchDrawable = new TileDrawable( key, context->getRenderBindings(), geom.get(), context->getOptions().tileSize().get(), context->getGeometryPool()->getNumSkirtElements() ); patchDrawable->setDrawAsPatches(true); // And a node to house that as well: _patch = new SurfaceNode( key, context->getMapFrame().getMapInfo(), context->getRenderBindings(), patchDrawable ); // initialize all the per-tile uniforms the shaders will need: createPayloadStateSet(context); updateTileUniforms(context->getSelectionInfo()); // Set up a data container for multipass layer rendering: _mptex = new MPTexture(); surfaceDrawable->setMPTexture( _mptex.get() ); // need to recompute the bounds after adding payload: dirtyBound(); // signal the tile to start loading data: setDirty( true ); // register me. context->liveTiles()->add( this ); }
void TileNode::create(const TileKey& key, EngineContext* context) { _key = key; // Get a shared geometry from the pool that corresponds to this tile key: osg::ref_ptr<osg::Geometry> geom; context->getGeometryPool()->getPooledGeometry(key, context->getMapFrame().getMapInfo(), geom); // Create the drawable for the terrain surface: TileDrawable* surfaceDrawable = new TileDrawable( key, context->getRenderBindings(), geom.get(), context->getOptions().tileSize().get() ); surfaceDrawable->setDrawAsPatches(false); // Create the node to house the tile drawable: _surface = new SurfaceNode( key, context->getMapFrame().getMapInfo(), context->getRenderBindings(), surfaceDrawable ); // Slot it into the proper render bin: osg::StateSet* surfaceSS = _surface->getOrCreateStateSet(); surfaceSS->setRenderBinDetails(0, "oe.SurfaceBin"); surfaceSS->setNestRenderBins(false); // Create a drawable for land cover geometry. // Land cover will be rendered as patch data instead of triangles. TileDrawable* patchDrawable = new TileDrawable( key, context->getRenderBindings(), geom.get(), context->getOptions().tileSize().get() ); patchDrawable->setDrawAsPatches(true); // And a node to house that as well: _landCover = new SurfaceNode( key, context->getMapFrame().getMapInfo(), context->getRenderBindings(), patchDrawable ); // PPP: Better way to do this rather than here? // Can't do it at RexTerrainEngineNode level, because the SurfaceNode is not valid yet if (context->getSelectionInfo().initialized()==false) { SelectionInfo& selectionInfo = const_cast<SelectionInfo&>(context->getSelectionInfo()); unsigned uiFirstLOD = *(context->_options.firstLOD()); unsigned uiMaxLod = *(context->_options.maxLOD()); unsigned uiTileSize = *(context->_options.tileSize()); selectionInfo.initialize(uiFirstLOD, uiMaxLod, uiTileSize, getVisibilityRangeHint(uiFirstLOD)); } // initialize all the per-tile uniforms the shaders will need: createTileUniforms(); updateTileUniforms(context->getSelectionInfo()); // Set up a data container for multipass layer rendering: _mptex = new MPTexture(); surfaceDrawable->setMPTexture( _mptex.get() ); // need to recompute the bounds after adding payload: dirtyBound(); // signal the tile to start loading data: setDirty( true ); // register me. context->liveTiles()->add( this ); }
void TileNode::create(const TileKey& key, EngineContext* context) { if (!context) return; _key = key; // Create mask records osg::ref_ptr<MaskGenerator> masks = new MaskGenerator(key, context->getOptions().tileSize().get(), context->getMapFrame()); // Get a shared geometry from the pool that corresponds to this tile key: osg::ref_ptr<osg::Geometry> geom; context->getGeometryPool()->getPooledGeometry(key, context->getMapFrame().getMapInfo(), geom, masks.get()); // Create the drawable for the terrain surface: TileDrawable* surfaceDrawable = new TileDrawable( key, context->getRenderBindings(), geom.get(), context->getOptions().tileSize().get(), context->getGeometryPool()->getNumSkirtElements() ); surfaceDrawable->setDrawAsPatches(false); // Create the node to house the tile drawable: _surface = new SurfaceNode( key, context->getMapFrame().getMapInfo(), context->getRenderBindings(), surfaceDrawable ); // Create a drawable for "patch" geometry, which is rendered as GL patches, not triangles. // Patch geometry can be used to place land cover or render other tile-specific data. TileDrawable* patchDrawable = new TileDrawable( key, context->getRenderBindings(), geom.get(), context->getOptions().tileSize().get(), context->getGeometryPool()->getNumSkirtElements() ); patchDrawable->setDrawAsPatches(true); // And a node to house that as well: _patch = new SurfaceNode( key, context->getMapFrame().getMapInfo(), context->getRenderBindings(), patchDrawable ); // PPP: Better way to do this rather than here? // Can't do it at RexTerrainEngineNode level, because the SurfaceNode is not valid yet if (context->getSelectionInfo().initialized()==false) { static Threading::Mutex s_selInfoMutex; Threading::ScopedMutexLock lock(s_selInfoMutex); if ( context->getSelectionInfo().initialized()==false) { SelectionInfo& selectionInfo = const_cast<SelectionInfo&>(context->getSelectionInfo()); unsigned uiFirstLOD = *(context->_options.firstLOD()); unsigned uiMaxLod = std::min( context->_options.maxLOD().get(), 19u ); // beyond LOD 19 or 20, morphing starts to lose precision. unsigned uiTileSize = *(context->_options.tileSize()); selectionInfo.initialize(uiFirstLOD, uiMaxLod, uiTileSize, getVisibilityRangeHint(context)); } } // initialize all the per-tile uniforms the shaders will need: createPayloadStateSet(context); updateTileUniforms(context->getSelectionInfo()); // Set up a data container for multipass layer rendering: _mptex = new MPTexture(); surfaceDrawable->setMPTexture( _mptex.get() ); // need to recompute the bounds after adding payload: dirtyBound(); // signal the tile to start loading data: setDirty( true ); // register me. context->liveTiles()->add( this ); }