void TerrainRenderData::setup(const Map* map, const RenderBindings& bindings, unsigned frameNum, osgUtil::CullVisitor* cv) { _bindings = &bindings; // Create a new State object to track sampler and uniform settings _drawState = new DrawState(); _drawState->_frame = frameNum; _drawState->_bindings = &bindings; // Is this a depth camera? Because if it is, we don't need any color layers. const osg::Camera* cam = cv->getCurrentCamera(); bool isDepthCamera = ClampableNode::isDepthCamera(cam); // Make a drawable for each rendering pass (i.e. each render-able map layer). LayerVector layers; map->getLayers(layers); for (LayerVector::const_iterator i = layers.begin(); i != layers.end(); ++i) { Layer* layer = i->get(); if (layer->getEnabled()) { bool render = (layer->getRenderType() == Layer::RENDERTYPE_TERRAIN_SURFACE) || // && !isDepthCamera) || (layer->getRenderType() == Layer::RENDERTYPE_TERRAIN_PATCH); if ( render ) { // If this is an image layer, check the enabled/visible states. VisibleLayer* visLayer = dynamic_cast<VisibleLayer*>(layer); if (visLayer) { render = visLayer->getVisible(); } if (render) { if (layer->getRenderType() == Layer::RENDERTYPE_TERRAIN_SURFACE) { LayerDrawable* ld = addLayerDrawable(layer); // If the current camera is depth-only, leave this layer in the set // but mark it as no-draw. We keep it in the set so the culler doesn't // inadvertently think it's an orphaned layer. if (isDepthCamera) { ld->_draw = false; } } else // if (layer->getRenderType() == Layer::RENDERTYPE_TERRAIN_PATCH) { PatchLayer* patchLayer = static_cast<PatchLayer*>(layer); // asumption! if (patchLayer->getAcceptCallback() != 0L && patchLayer->getAcceptCallback()->acceptLayer(*cv, cv->getCurrentCamera())) { patchLayers().push_back(dynamic_cast<PatchLayer*>(layer)); addLayerDrawable(layer); } } } } } } // Include a "blank" layer for missing data. LayerDrawable* blank = addLayerDrawable(0L); }
void TerrainRenderData::setup(const MapFrame& frame, const RenderBindings& bindings, unsigned frameNum, osgUtil::CullVisitor* cv) { _bindings = &bindings; // Create a new State object to track sampler and uniform settings _drawState = new DrawState(); _drawState->_frame = frameNum; _drawState->_bindings = &bindings; // Make a drawable for each rendering pass (i.e. each render-able map layer). for(LayerVector::const_iterator i = frame.layers().begin(); i != frame.layers().end(); ++i) { Layer* layer = i->get(); if (layer->getEnabled()) { if (layer->getRenderType() == Layer::RENDERTYPE_TILE || layer->getRenderType() == Layer::RENDERTYPE_PATCH) { bool render = true; // If this is an image layer, check the enabled/visible states. VisibleLayer* visLayer = dynamic_cast<VisibleLayer*>(layer); if (visLayer) { render = visLayer->getVisible(); } if (render) { ImageLayer* imgLayer = dynamic_cast<ImageLayer*>(layer); // Make a list of "global" layers. There are layers whose data is not // represented in the TerrainTileModel, like a splatting layer or a patch // layer. The data for these is dynamic and not based on data fetched. if (imgLayer == 0L && layer->getRenderType() == Layer::RENDERTYPE_TILE) { tileLayers().push_back(layer); addLayerDrawable(layer); } else if (layer->getRenderType() == Layer::RENDERTYPE_PATCH) { PatchLayer* patchLayer = static_cast<PatchLayer*>(layer); // asumption! if (patchLayer->getAcceptCallback() != 0L && patchLayer->getAcceptCallback()->acceptLayer(*cv, cv->getCurrentCamera())) { patchLayers().push_back(dynamic_cast<PatchLayer*>(layer)); addLayerDrawable(layer); } } else { addLayerDrawable(layer); } } } } } // Include a "blank" layer for missing data. LayerDrawable* blank = addLayerDrawable(0L); blank->getOrCreateStateSet()->setDefine("OE_TERRAIN_RENDER_IMAGERY", osg::StateAttribute::OFF); }
void addLayerItem( Grid* grid, int layerIndex, int numLayers, Layer* layer, bool isActive ) { int gridCol = 0; int gridRow = grid->getNumRows(); VisibleLayer* visibleLayer = dynamic_cast<VisibleLayer*>(layer); // only show layers that derive from VisibleLayer if (!visibleLayer) return; ImageLayer* imageLayer = dynamic_cast<ImageLayer*>(layer); // don't show hidden coverage layers if (imageLayer && imageLayer->isCoverage() && !imageLayer->getVisible()) return; ElevationLayer* elevationLayer = dynamic_cast<ElevationLayer*>(layer); // a checkbox to toggle the layer's visibility: if (visibleLayer && layer->getEnabled() && !(imageLayer && imageLayer->isCoverage())) { CheckBoxControl* visibility = new CheckBoxControl( visibleLayer->getVisible() ); visibility->addEventHandler( new ToggleLayerVisibility(visibleLayer) ); grid->setControl( gridCol, gridRow, visibility ); } gridCol++; // the layer name LabelControl* name = new LabelControl( layer->getName() ); if (!layer->getEnabled()) name->setForeColor(osg::Vec4f(1,1,1,0.35)); grid->setControl( gridCol, gridRow, name ); gridCol++; // layer type std::string typeName = typeid(*layer).name(); typeName = typeName.substr(typeName.find_last_of(":")+1); LabelControl* typeLabel = new LabelControl(typeName, osg::Vec4(.5,.7,.5,1)); grid->setControl( gridCol, gridRow, typeLabel ); gridCol++; // status indicator LabelControl* statusLabel = layer->getStatus().isError() ? new LabelControl("[error]", osg::Vec4(1,0,0,1)) : !layer->getEnabled()? new LabelControl("[disabled]", osg::Vec4(1,1,1,0.35)) : new LabelControl("[ok]", osg::Vec4(0,1,0,1)) ; grid->setControl( gridCol, gridRow, statusLabel ); gridCol++; if (visibleLayer && !elevationLayer && visibleLayer->getEnabled()) { // an opacity slider HSliderControl* opacity = new HSliderControl( 0.0f, 1.0f, visibleLayer->getOpacity() ); opacity->setWidth( 125 ); opacity->setHeight( 12 ); opacity->addEventHandler( new LayerOpacityHandler(visibleLayer) ); grid->setControl( gridCol, gridRow, opacity ); } gridCol++; // zoom button if (layer->getExtent().isValid()) { LabelControl* zoomButton = new LabelControl("GO", 14); zoomButton->setBackColor( .4,.4,.4,1 ); zoomButton->setActiveColor( .8,0,0,1 ); zoomButton->addEventHandler( new ZoomLayerHandler(layer) ); grid->setControl( gridCol, gridRow, zoomButton ); } gridCol++; // move buttons if ( layerIndex < numLayers-1 && isActive ) { LabelControl* upButton = new LabelControl( "UP", 14 ); upButton->setBackColor( .4,.4,.4,1 ); upButton->setActiveColor( .8,0,0,1 ); upButton->addEventHandler( new MoveLayerHandler( layer, layerIndex+1 ) ); grid->setControl( gridCol, gridRow, upButton ); } gridCol++; if ( layerIndex > 0 && isActive) { LabelControl* upButton = new LabelControl( "DOWN", 14 ); upButton->setBackColor( .4,.4,.4,1 ); upButton->setActiveColor( .8,0,0,1 ); upButton->addEventHandler( new MoveLayerHandler( layer, layerIndex-1 ) ); grid->setControl( gridCol, gridRow, upButton ); } gridCol++; // add/remove button: LabelControl* addRemove = new LabelControl( isActive? "REMOVE" : "ADD", 14 ); addRemove->setHorizAlign( Control::ALIGN_CENTER ); addRemove->setBackColor( .4,.4,.4,1 ); addRemove->setActiveColor( .8,0,0,1 ); addRemove->addEventHandler( new RemoveLayerHandler(layer) ); grid->setControl( gridCol, gridRow, addRemove ); gridCol++; // enable/disable button LabelControl* enableDisable = new LabelControl(layer->getEnabled() ? "DISABLE" : "ENABLE", 14); enableDisable->setHorizAlign( Control::ALIGN_CENTER ); enableDisable->setBackColor( .4,.4,.4,1 ); enableDisable->setActiveColor( .8,0,0,1 ); enableDisable->addEventHandler( new EnableDisableHandler(layer) ); grid->setControl( gridCol, gridRow, enableDisable ); gridCol++; if (layer->getStatus().isError()) { grid->setControl(gridCol, gridRow, new LabelControl(layer->getStatus().message(), osg::Vec4(1,.2,.2,1))); } }