目标:(三十七)中的104
1、生成图形信息,具体参看 osgEarth的Rex引擎原理分析(十七)瓦片请求的生成到处理过程详解
2、生成RenderLeaf,在cull中做,生成可绘制的DrawTileCommand
osgEarthDrivers/engine_rex/TileNode.cpp
bool
TileNode::cull(TerrainCuller* culler)
{
_surface->accept( *culler );
}
osgEarthDrivers/engine_rex/TerrainCuller.cpp
void
TerrainCuller::apply(osg::Node& node)
{
DrawTileCommand* cmd = addDrawCommand(pass.sourceUID(), &renderModel, &pass, _currentTileNode);
}
DrawTileCommand*
TerrainCuller::addDrawCommand(UID uid, const TileRenderModel* model, const RenderingPass* pass, TileNode* tileNode)
{
osg::ref_ptr<LayerDrawable> drawable = _terrain.layer(uid);
drawable->_tiles.push_back(DrawTileCommand());
DrawTileCommand* tile = &drawable->_tiles.back();
// install everything we need in the Draw Command:
tile->_colorSamplers = pass ? &(pass->samplers()) : 0L;
tile->_sharedSamplers = &model->_sharedSamplers;
tile->_modelViewMatrix = this->getModelViewMatrix();
tile->_keyValue = tileNode->getTileKeyValue();
tile->_geom = surface->getDrawable()->_geom.get();
tile->_morphConstants = tileNode->getMorphConstants();
tile->_key = &tileNode->getKey();
//tile->_order = (int)orderInTile;
tile->_order = drawable->_order; // layer order in map tile.
osg::Vec3 c = surface->getBound().center() * surface->getInverseMatrix();
tile->_range = getDistanceToViewPoint(c, true);
}
3、绘制,在绘制阶段对DrawTileCommand进行draw
osgEarthDrivers/engine_rex/DrawTileCommand.cpp
void
DrawTileCommand::draw(osg::RenderInfo& ri, DrawState& dsMaster, osg::Referenced* layerData) const
{
_geom->render(ptype, ri);
}
osgEarthDrivers/engine_rex/GeometryPool.cpp
void SharedGeometry::render(GLenum primitiveType, osg::RenderInfo& renderInfo) const
{
glDrawElements(primitiveType, _maskElement