00001
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include "MyGUI_Precompiled.h"
00024 #include "MyGUI_RenderItem.h"
00025 #include "MyGUI_LayerNode.h"
00026 #include "MyGUI_LayerManager.h"
00027 #include "MyGUI_Gui.h"
00028 #include "MyGUI_RenderManager.h"
00029 #include "MyGUI_DataManager.h"
00030 #include "MyGUI_RenderManager.h"
00031
00032 namespace MyGUI
00033 {
00034
00035
00036
00037
00038
00039
00040
00041
00042 RenderItem::RenderItem(const std::string& _texture) :
00043 mTextureName(_texture),
00044 mNeedVertexCount(0),
00045 mOutDate(false),
00046
00047 mCountVertex(0),
00048 mCurrentUpdate(true),
00049 mCurrentVertext(nullptr),
00050 mLastVertextCount(0),
00051 mVertexBuffer(nullptr),
00052 mRenderTarget(nullptr)
00053 {
00054
00055
00056 mVertexBuffer = RenderManager::getInstance().createVertexBuffer();
00057
00058
00059 }
00060
00061 RenderItem::~RenderItem()
00062 {
00063 RenderManager::getInstance().destroyVertexBuffer(mVertexBuffer);
00064 mVertexBuffer = nullptr;
00065 }
00066
00067 void RenderItem::renderToTarget(IRenderTarget* _target, bool _update)
00068 {
00069 if (mTextureName.empty()) return;
00070
00071 mRenderTarget = _target;
00072
00073 RenderManager& render = RenderManager::getInstance();
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091 mCurrentUpdate = _update;
00092
00093 if (mOutDate || _update)
00094 {
00095 mCountVertex = 0;
00096 Vertex * buffer = (Vertex*)mVertexBuffer->lock();
00097
00098 for (VectorDrawItem::iterator iter=mDrawItems.begin(); iter!=mDrawItems.end(); ++iter)
00099 {
00100
00101 mCurrentVertext = buffer;
00102 mLastVertextCount = 0;
00103
00104 (*iter).first->doRender();
00105
00106
00107 MYGUI_DEBUG_ASSERT(mLastVertextCount <= (*iter).second, "It is too much vertexes");
00108 buffer += mLastVertextCount;
00109 mCountVertex += mLastVertextCount;
00110 }
00111
00112 mVertexBuffer->unlock();
00113
00114 mOutDate = false;
00115 }
00116
00117
00118 if (0 != mCountVertex)
00119 {
00120
00121 ITexture* texture = RenderManager::getInstance().getTexture(mTextureName);
00122
00123
00124 _target->doRender(mVertexBuffer, texture, mCountVertex);
00125 }
00126 }
00127
00128 void RenderItem::removeDrawItem(ISubWidget* _item)
00129 {
00130 for (VectorDrawItem::iterator iter=mDrawItems.begin(); iter!=mDrawItems.end(); ++iter)
00131 {
00132 if ((*iter).first == _item)
00133 {
00134 mNeedVertexCount -= (*iter).second;
00135 mDrawItems.erase(iter);
00136 mOutDate = true;
00137
00138 mVertexBuffer->setVertextCount(mNeedVertexCount);
00139
00140
00141 if (mDrawItems.empty())
00142 {
00143 mTextureName.clear();
00144
00145 }
00146
00147 return;
00148 }
00149 }
00150 MYGUI_EXCEPT("DrawItem not found");
00151 }
00152
00153 void RenderItem::addDrawItem(ISubWidget* _item, size_t _count)
00154 {
00155
00156
00157 #if MYGUI_DEBUG_MODE == 1
00158 for (VectorDrawItem::iterator iter=mDrawItems.begin(); iter!=mDrawItems.end(); ++iter)
00159 {
00160 MYGUI_ASSERT((*iter).first != _item, "DrawItem exist");
00161 }
00162 #endif
00163
00164 mDrawItems.push_back(DrawItemInfo(_item, _count));
00165 mNeedVertexCount += _count;
00166 mOutDate = true;
00167
00168 mVertexBuffer->setVertextCount(mNeedVertexCount);
00169 }
00170
00171 void RenderItem::reallockDrawItem(ISubWidget* _item, size_t _count)
00172 {
00173 for (VectorDrawItem::iterator iter=mDrawItems.begin(); iter!=mDrawItems.end(); ++iter)
00174 {
00175 if ((*iter).first == _item)
00176 {
00177
00178 if ((*iter).second < _count)
00179 {
00180 mNeedVertexCount -= (*iter).second;
00181 mNeedVertexCount += _count;
00182 (*iter).second = _count;
00183 mOutDate = true;
00184
00185 mVertexBuffer->setVertextCount(mNeedVertexCount);
00186 }
00187 return;
00188 }
00189 }
00190 MYGUI_EXCEPT("DrawItem not found");
00191 }
00192
00193 void RenderItem::setTextureName(const std::string& _texture)
00194 {
00195 MYGUI_DEBUG_ASSERT(mVertexBuffer->getVertextCount() == 0, "change texture only empty buffer");
00196 MYGUI_DEBUG_ASSERT(mNeedVertexCount == 0, "change texture only empty buffer");
00197 mTextureName = _texture;
00198 }
00199
00200 }