MyGUI  3.2.0
MyGUI_RenderItem.cpp
Go to the documentation of this file.
1 
6 /*
7  This file is part of MyGUI.
8 
9  MyGUI is free software: you can redistribute it and/or modify
10  it under the terms of the GNU Lesser General Public License as published by
11  the Free Software Foundation, either version 3 of the License, or
12  (at your option) any later version.
13 
14  MyGUI is distributed in the hope that it will be useful,
15  but WITHOUT ANY WARRANTY; without even the implied warranty of
16  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17  GNU Lesser General Public License for more details.
18 
19  You should have received a copy of the GNU Lesser General Public License
20  along with MyGUI. If not, see <http://www.gnu.org/licenses/>.
21 */
22 #include "MyGUI_Precompiled.h"
23 #include "MyGUI_RenderItem.h"
24 #include "MyGUI_LayerNode.h"
25 #include "MyGUI_LayerManager.h"
26 #include "MyGUI_Gui.h"
27 #include "MyGUI_RenderManager.h"
28 #include "MyGUI_DataManager.h"
29 #include "MyGUI_RenderManager.h"
30 
31 namespace MyGUI
32 {
33 
35  mTexture(nullptr),
36  mNeedVertexCount(0),
37  mOutOfDate(false),
38  mCountVertex(0),
39  mCurrentUpdate(true),
40  mCurrentVertex(nullptr),
41  mLastVertexCount(0),
42  mVertexBuffer(nullptr),
43  mRenderTarget(nullptr),
44  mCompression(false),
45  mManualRender(false)
46  {
48  }
49 
51  {
53  mVertexBuffer = nullptr;
54  }
55 
56  void RenderItem::renderToTarget(IRenderTarget* _target, bool _update)
57  {
58  if (mTexture == nullptr)
59  return;
60 
61  mRenderTarget = _target;
62 
63  mCurrentUpdate = _update;
64 
65  if (mOutOfDate || _update)
66  {
67  mCountVertex = 0;
68  Vertex* buffer = (Vertex*)mVertexBuffer->lock();
69 
70  for (VectorDrawItem::iterator iter = mDrawItems.begin(); iter != mDrawItems.end(); ++iter)
71  {
72  // перед вызовом запоминаем позицию в буфере
73  mCurrentVertex = buffer;
74  mLastVertexCount = 0;
75 
76  (*iter).first->doRender();
77 
78  // колличество отрисованных вершин
79  MYGUI_DEBUG_ASSERT(mLastVertexCount <= (*iter).second, "It is too much vertexes");
80  buffer += mLastVertexCount;
81  mCountVertex += mLastVertexCount;
82  }
83 
84  mVertexBuffer->unlock();
85 
86  mOutOfDate = false;
87  }
88 
89  // хоть с 0 не выводиться батч, но все равно не будем дергать стейт и операцию
90  if (0 != mCountVertex)
91  {
92 #if MYGUI_DEBUG_MODE == 1
93  if (!RenderManager::getInstance().checkTexture(mTexture))
94  {
95  mTexture = nullptr;
96  MYGUI_EXCEPT("texture pointer is not valid, texture name '" << mTextureName << "'");
97  return;
98  }
99 #endif
100  // непосредственный рендринг
101  if (mManualRender)
102  {
103  for (VectorDrawItem::iterator iter = mDrawItems.begin(); iter != mDrawItems.end(); ++iter)
104  (*iter).first->doManualRender(mVertexBuffer, mTexture, mCountVertex);
105  }
106  else
107  {
108  _target->doRender(mVertexBuffer, mTexture, mCountVertex);
109  }
110  }
111  }
112 
114  {
115  for (VectorDrawItem::iterator iter = mDrawItems.begin(); iter != mDrawItems.end(); ++iter)
116  {
117  if ((*iter).first == _item)
118  {
119  mNeedVertexCount -= (*iter).second;
120  mDrawItems.erase(iter);
121  mOutOfDate = true;
122 
123  mVertexBuffer->setVertexCount(mNeedVertexCount);
124 
125  // если все отдетачились, расскажем отцу
126  if (mDrawItems.empty())
127  {
128  mTexture = nullptr;
129  mCompression = true;
130  }
131 
132  return;
133  }
134  }
135  MYGUI_EXCEPT("DrawItem not found");
136  }
137 
138  void RenderItem::addDrawItem(ISubWidget* _item, size_t _count)
139  {
140 
141 // проверяем только в дебаге
142 #if MYGUI_DEBUG_MODE == 1
143  for (VectorDrawItem::iterator iter = mDrawItems.begin(); iter != mDrawItems.end(); ++iter)
144  {
145  MYGUI_ASSERT((*iter).first != _item, "DrawItem exist");
146  }
147 #endif
148 
149  mDrawItems.push_back(DrawItemInfo(_item, _count));
150  mNeedVertexCount += _count;
151  mOutOfDate = true;
152 
153  mVertexBuffer->setVertexCount(mNeedVertexCount);
154  }
155 
156  void RenderItem::reallockDrawItem(ISubWidget* _item, size_t _count)
157  {
158  for (VectorDrawItem::iterator iter = mDrawItems.begin(); iter != mDrawItems.end(); ++iter)
159  {
160  if ((*iter).first == _item)
161  {
162  // если нужно меньше, то ниче не делаем
163  if ((*iter).second < _count)
164  {
165  mNeedVertexCount -= (*iter).second;
166  mNeedVertexCount += _count;
167  (*iter).second = _count;
168  mOutOfDate = true;
169 
170  mVertexBuffer->setVertexCount(mNeedVertexCount);
171  }
172  return;
173  }
174  }
175  MYGUI_EXCEPT("DrawItem not found");
176  }
177 
179  {
180  if (mTexture == _value)
181  return;
182 
183  //MYGUI_DEBUG_ASSERT(mVertexBuffer->getVertexCount() == 0, "change texture only empty buffer");
184  MYGUI_DEBUG_ASSERT(mNeedVertexCount == 0, "change texture only empty buffer");
185 
186  mTexture = _value;
187 
188 #if MYGUI_DEBUG_MODE == 1
189  mTextureName = mTexture == nullptr ? "" : mTexture->getName();
190 #endif
191  }
192 
194  {
195  return mTexture;
196  }
197 
199  {
200  bool result = mCompression;
201  mCompression = false;
202  return result;
203  }
204 
205  void RenderItem::setManualRender(bool _value)
206  {
207  mManualRender = _value;
208  }
209 
211  {
212  return mManualRender;
213  }
214 
216  {
217  mOutOfDate = true;
218  }
219 
221  {
222  return mOutOfDate;
223  }
224 
226  {
227  return mNeedVertexCount;
228  }
229 
231  {
232  return mCountVertex;
233  }
234 
236  {
237  return mCurrentUpdate;
238  }
239 
241  {
242  return mCurrentVertex;
243  }
244 
245  void RenderItem::setLastVertexCount(size_t _count)
246  {
247  mLastVertexCount = _count;
248  }
249 
251  {
252  return mRenderTarget;
253  }
254 
255 } // namespace MyGUI