• Main Page
  • Related Pages
  • Namespaces
  • Data Structures
  • Files
  • Examples
  • File List
  • Globals

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     //float RenderItem::mMaximumDepth = 0;
00036     //float RenderItem::mPixScaleX = 1;
00037     //float RenderItem::mPixScaleY = 1;
00038     //float RenderItem::mHOffset = 0;
00039     //float RenderItem::mVOffset = 0;
00040     //float RenderItem::mAspectCoef = 1;
00041 
00042     RenderItem::RenderItem(const std::string& _texture/*, LayerNode * _parent*/) :
00043         mTextureName(_texture),
00044         mNeedVertexCount(0),
00045         mOutDate(false),
00046         //mParent(_parent),
00047         mCountVertex(0),
00048         mCurrentUpdate(true),
00049         mCurrentVertext(nullptr),
00050         mLastVertextCount(0),
00051         mVertexBuffer(nullptr),
00052         mRenderTarget(nullptr)
00053     {
00054         //mLayerManager = LayerManager::getInstancePtr();
00055 
00056         mVertexBuffer = RenderManager::getInstance().createVertexBuffer();
00057 
00058         //mMaximumDepth = RenderManager::getInstance().getMaximumDepth();
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         //if (_update)
00076         //{
00077             //mViewSize = render.getViewSize();
00078             //mMaximumDepth = render.getMaximumDepth();
00079 
00080             // новый размер
00081             //mPixScaleX = 1.0 / float(mViewSize.width);
00082             //mPixScaleY = 1.0 / float(mViewSize.height);
00083             //mAspectCoef = float(mViewSize.height) / float(mViewSize.width);
00084 
00085             //const FloatSize& size_offset = render.getTexelOffset();
00086 
00087             //mHOffset = size_offset.width / mViewSize.width;
00088             //mVOffset = size_offset.height / mViewSize.height;
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         // хоть с 0 не выводиться батч, но все равно не будем дергать стейт и операцию
00118         if (0 != mCountVertex)
00119         {
00120             // FIXME текстуру сразу брать
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                     //mParent->_update();
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 } // namespace MyGUI

Generated on Sun Jan 30 2011 for MyGUI by  doxygen 1.7.1