typedef std::vector<DrawItemInfo> VectorDrawItem;
而DrawItemInfo 为:
typedef std::pair<ISubWidget*, size_t> DrawItemInfo;
这里明显看出ISubWidget为Widget的渲染信息单元
RenderItem的数据结构:
private:
#if MYGUI_DEBUG_MODE == 1
std::string mTextureName;
#endif
// 渲染纹理
ITexture* mTexture;
// 需要渲染的顶点数
size_t mNeedVertexCount;
// 渲染时候时机??
bool mOutDate;
// 需要渲染的SubWidget的列,
//ISubWidget不是Widget 只是用来保存渲染的信息。
VectorDrawItem mDrawItems;
// 俄文看不懂, 顶点渲染数? 与 size_t mNeedVertexCount
// 有何区别???
size_t mCountVertex;
// 与 bool mOutDate 又是什么关系???
bool mCurrentUpdate;
// current vertex
Vertex* mCurrentVertext;
// ???
size_t mLastVertextCount;
IVertexBuffer* mVertexBuffer;
IRenderTarget* mRenderTarget;
// Compression的作用?
// 压缩那些信息?
bool mCompression;
renderToTarget 成员函数与RenderManager进行交流
void RenderItem::renderToTarget(IRenderTarget* _target, bool _update)
{
if (mTexture == nullptr)
return;
mRenderTarget = _target;
mCurrentUpdate = _update;
if (mOutDate || _update)
{
mCountVertex = 0;
Vertex * buffer = (Vertex*)mVertexBuffer->lock();
for (VectorDrawItem::iterator iter=mDrawItems.begin(); iter!=mDrawItems.end(); ++iter)
{
// перед вызовом запоминаем позицию в буфере
mCurrentVertext = buffer;
mLastVertextCount = 0;
(*iter).first->doRender();
// колличество отрисованных вершин
MYGUI_DEBUG_ASSERT(mLastVertextCount <= (*iter).second, "It is too much vertexes");
buffer += mLastVertextCount;
mCountVertex += mLastVertextCount;
}
mVertexBuffer->unlock();
mOutDate = false;
}
// хоть с 0 не выводиться батч, но все равно не будем дергать стейт и операцию
if (0 != mCountVertex)
{
#if MYGUI_DEBUG_MODE == 1
if (!RenderManager::getInstance().checkTexture(mTexture))
{
mTexture = nullptr;
MYGUI_EXCEPT("texture pointer is not valid, texture name '" << mTextureName << "'");
return;
}
#endif
// непосредственный рендринг
_target->doRender(mVertexBuffer, mTexture, mCountVertex);
}
}