目标:(四十五)中的110
每帧都会创建一个DrawState
创建在TerrainRenderData::setup(这里存在内存泄漏的问题,因为只有new没有delete,不存在的,_drawState是智能指针,超出范围时会自动销毁,也就是在TerrainRenderData销毁时销毁)
osgEarthDrivers/engine_rex/TerrainRenderData.cpp
void
TerrainRenderData::setup(const MapFrame& frame,
const RenderBindings& bindings,
unsigned frameNum,
osgUtil::CullVisitor* cv)
{
_drawState = new DrawState();
_drawState->_frame = frameNum;
_drawState->_bindings = &bindings;
}
在addLayerDrawable时传递
osgEarthDrivers/engine_rex/TerrainRenderData.cpp
LayerDrawable*
TerrainRenderData::addLayerDrawable(const Layer* layer, const MapFrame& frame)
{
LayerDrawable* ld = new LayerDrawable();
ld->_drawState = _drawState.get();
}
更新赋值的时机,其实是每次遍历时都会创建出一个新的DrawState
osgEarthDrivers/engine_rex/RexTerrainEngineNode.cpp
void
RexTerrainEngineNode::traverse(osg::NodeVisitor& nv)
{
else if ( nv.getVisitorType() == nv.CULL_VISITOR )
{
TerrainCuller culler(cv, this->getEngineContext());
culler.setup(_mapFrame, _cachedLayerExtents, this->getEngineContext()->getRenderBindings());
}
}
在绘制时复制和使用
osgEarthDrivers/engine_rex/LayerDrawable.cpp
void
LayerDrawable::drawImplementation(osg::RenderInfo& ri) const
{
PerContextDrawState& ds = _drawState->getPCDS(ri.getContextID());
ds.refresh(ri, _drawState->_bindings);
for (DrawTileCommands::const_iterator tile = _tiles.begin(); tile != _tiles.end(); ++tile)
{
tile->draw(ri, *_drawState, 0L);
}
}
osgEarthDrivers/engine_rex/DrawState.cpp
void
PerContextDrawState::refresh(osg::RenderInfo& ri, const RenderBindings* bindings)
{
// Establish a GL Extensions handle:
if (!_ext.valid())
{
_ext = osg::GLExtensions::Get(ri.getContextID(), true);
}
// Size the sampler states property:
if (_samplerState._samplers.size() < bindings->size())
{
_samplerState._samplers.resize(bindings->size());
}
const osg::Program::PerContextProgram* pcp = ri.getState()->getLastAppliedProgramObject();
if (pcp && (pcp != _pcp))
{
// Reset all sampler matrix states since their uniform locations are