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 RenderItem::RenderItem() :
00036 mTexture(nullptr),
00037 mNeedVertexCount(0),
00038 mOutDate(false),
00039 mCountVertex(0),
00040 mCurrentUpdate(true),
00041 mCurrentVertext(nullptr),
00042 mLastVertextCount(0),
00043 mVertexBuffer(nullptr),
00044 mRenderTarget(nullptr),
00045 mCompression(false)
00046 {
00047 mVertexBuffer = RenderManager::getInstance().createVertexBuffer();
00048 }
00049
00050 RenderItem::~RenderItem()
00051 {
00052 RenderManager::getInstance().destroyVertexBuffer(mVertexBuffer);
00053 mVertexBuffer = nullptr;
00054 }
00055
00056 void RenderItem::renderToTarget(IRenderTarget* _target, bool _update)
00057 {
00058 if (mTexture == nullptr)
00059 return;
00060
00061 mRenderTarget = _target;
00062
00063 mCurrentUpdate = _update;
00064
00065 if (mOutDate || _update)
00066 {
00067 mCountVertex = 0;
00068 Vertex * buffer = (Vertex*)mVertexBuffer->lock();
00069
00070 for (VectorDrawItem::iterator iter=mDrawItems.begin(); iter!=mDrawItems.end(); ++iter)
00071 {
00072
00073 mCurrentVertext = buffer;
00074 mLastVertextCount = 0;
00075
00076 (*iter).first->doRender();
00077
00078
00079 MYGUI_DEBUG_ASSERT(mLastVertextCount <= (*iter).second, "It is too much vertexes");
00080 buffer += mLastVertextCount;
00081 mCountVertex += mLastVertextCount;
00082 }
00083
00084 mVertexBuffer->unlock();
00085
00086 mOutDate = false;
00087 }
00088
00089
00090 if (0 != mCountVertex)
00091 {
00092 #if MYGUI_DEBUG_MODE == 1
00093 if (!RenderManager::getInstance().checkTexture(mTexture))
00094 {
00095 mTexture = nullptr;
00096 MYGUI_EXCEPT("texture pointer is not valid, texture name '" << mTextureName << "'");
00097 return;
00098 }
00099 #endif
00100
00101 _target->doRender(mVertexBuffer, mTexture, mCountVertex);
00102 }
00103 }
00104
00105 void RenderItem::removeDrawItem(ISubWidget* _item)
00106 {
00107 for (VectorDrawItem::iterator iter=mDrawItems.begin(); iter!=mDrawItems.end(); ++iter)
00108 {
00109 if ((*iter).first == _item)
00110 {
00111 mNeedVertexCount -= (*iter).second;
00112 mDrawItems.erase(iter);
00113 mOutDate = true;
00114
00115 mVertexBuffer->setVertextCount(mNeedVertexCount);
00116
00117
00118 if (mDrawItems.empty())
00119 {
00120 mTexture = nullptr;
00121 mCompression = true;
00122 }
00123
00124 return;
00125 }
00126 }
00127 MYGUI_EXCEPT("DrawItem not found");
00128 }
00129
00130 void RenderItem::addDrawItem(ISubWidget* _item, size_t _count)
00131 {
00132
00133
00134 #if MYGUI_DEBUG_MODE == 1
00135 for (VectorDrawItem::iterator iter=mDrawItems.begin(); iter!=mDrawItems.end(); ++iter)
00136 {
00137 MYGUI_ASSERT((*iter).first != _item, "DrawItem exist");
00138 }
00139 #endif
00140
00141 mDrawItems.push_back(DrawItemInfo(_item, _count));
00142 mNeedVertexCount += _count;
00143 mOutDate = true;
00144
00145 mVertexBuffer->setVertextCount(mNeedVertexCount);
00146 }
00147
00148 void RenderItem::reallockDrawItem(ISubWidget* _item, size_t _count)
00149 {
00150 for (VectorDrawItem::iterator iter=mDrawItems.begin(); iter!=mDrawItems.end(); ++iter)
00151 {
00152 if ((*iter).first == _item)
00153 {
00154
00155 if ((*iter).second < _count)
00156 {
00157 mNeedVertexCount -= (*iter).second;
00158 mNeedVertexCount += _count;
00159 (*iter).second = _count;
00160 mOutDate = true;
00161
00162 mVertexBuffer->setVertextCount(mNeedVertexCount);
00163 }
00164 return;
00165 }
00166 }
00167 MYGUI_EXCEPT("DrawItem not found");
00168 }
00169
00170 void RenderItem::setTexture(ITexture* _value)
00171 {
00172 MYGUI_DEBUG_ASSERT(mVertexBuffer->getVertextCount() == 0, "change texture only empty buffer");
00173 MYGUI_DEBUG_ASSERT(mNeedVertexCount == 0, "change texture only empty buffer");
00174
00175 mTexture = _value;
00176
00177 #if MYGUI_DEBUG_MODE == 1
00178 mTextureName = mTexture == nullptr ? "" : mTexture->getName();
00179 #endif
00180 }
00181
00182 ITexture* RenderItem::getTexture()
00183 {
00184 return mTexture;
00185 }
00186
00187 bool RenderItem::getCompression()
00188 {
00189 bool result = mCompression;
00190 mCompression = false;
00191 return result;
00192 }
00193
00194 }