MyGUI 3.0.1
|
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