MyGUI 3.0.1

MyGUI_RenderItem.cpp

Go to the documentation of this file.
00001 
00007 /*
00008     This file is part of MyGUI.
00009 
00010     MyGUI is free software: you can redistribute it and/or modify
00011     it under the terms of the GNU Lesser General Public License as published by
00012     the Free Software Foundation, either version 3 of the License, or
00013     (at your option) any later version.
00014 
00015     MyGUI is distributed in the hope that it will be useful,
00016     but WITHOUT ANY WARRANTY; without even the implied warranty of
00017     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00018     GNU Lesser General Public License for more details.
00019 
00020     You should have received a copy of the GNU Lesser General Public License
00021     along with MyGUI.  If not, see <http://www.gnu.org/licenses/>.
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         // хоть с 0 не выводиться батч, но все равно не будем дергать стейт и операцию
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 } // namespace MyGUI
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines