MyGUI  3.2.1
MyGUI_RenderItem.cpp
Go to the documentation of this file.
1 /*
2  * This source file is part of MyGUI. For the latest info, see http://mygui.info/
3  * Distributed under the MIT License
4  * (See accompanying file COPYING.MIT or copy at http://opensource.org/licenses/MIT)
5  */
6 
7 #include "MyGUI_Precompiled.h"
8 #include "MyGUI_RenderItem.h"
9 #include "MyGUI_LayerNode.h"
10 #include "MyGUI_LayerManager.h"
11 #include "MyGUI_Gui.h"
12 #include "MyGUI_RenderManager.h"
13 #include "MyGUI_DataManager.h"
14 #include "MyGUI_RenderManager.h"
15 
16 namespace MyGUI
17 {
18 
20  mTexture(nullptr),
21  mNeedVertexCount(0),
22  mOutOfDate(false),
23  mCountVertex(0),
24  mCurrentUpdate(true),
25  mCurrentVertex(nullptr),
26  mLastVertexCount(0),
27  mVertexBuffer(nullptr),
28  mRenderTarget(nullptr),
29  mCompression(false),
30  mManualRender(false)
31  {
33  }
34 
36  {
38  mVertexBuffer = nullptr;
39  }
40 
41  void RenderItem::renderToTarget(IRenderTarget* _target, bool _update)
42  {
43  if (mTexture == nullptr)
44  return;
45 
46  mRenderTarget = _target;
47 
48  mCurrentUpdate = _update;
49 
50  if (mOutOfDate || _update)
51  {
52  mCountVertex = 0;
53  Vertex* buffer = mVertexBuffer->lock();
54  if (buffer != nullptr)
55  {
56  for (VectorDrawItem::iterator iter = mDrawItems.begin(); iter != mDrawItems.end(); ++iter)
57  {
58  // перед вызовом запоминаем позицию в буфере
59  mCurrentVertex = buffer;
60  mLastVertexCount = 0;
61 
62  (*iter).first->doRender();
63 
64  // колличество отрисованных вершин
65  MYGUI_DEBUG_ASSERT(mLastVertexCount <= (*iter).second, "It is too much vertexes");
66  buffer += mLastVertexCount;
67  mCountVertex += mLastVertexCount;
68  }
69 
70  mVertexBuffer->unlock();
71  }
72 
73  mOutOfDate = false;
74  }
75 
76  // хоть с 0 не выводиться батч, но все равно не будем дергать стейт и операцию
77  if (0 != mCountVertex)
78  {
79 #if MYGUI_DEBUG_MODE == 1
80  if (!RenderManager::getInstance().checkTexture(mTexture))
81  {
82  mTexture = nullptr;
83  MYGUI_EXCEPT("texture pointer is not valid, texture name '" << mTextureName << "'");
84  return;
85  }
86 #endif
87  // непосредственный рендринг
88  if (mManualRender)
89  {
90  for (VectorDrawItem::iterator iter = mDrawItems.begin(); iter != mDrawItems.end(); ++iter)
91  (*iter).first->doManualRender(mVertexBuffer, mTexture, mCountVertex);
92  }
93  else
94  {
95  _target->doRender(mVertexBuffer, mTexture, mCountVertex);
96  }
97  }
98  }
99 
101  {
102  for (VectorDrawItem::iterator iter = mDrawItems.begin(); iter != mDrawItems.end(); ++iter)
103  {
104  if ((*iter).first == _item)
105  {
106  mNeedVertexCount -= (*iter).second;
107  mDrawItems.erase(iter);
108  mOutOfDate = true;
109 
110  mVertexBuffer->setVertexCount(mNeedVertexCount);
111 
112  // если все отдетачились, расскажем отцу
113  if (mDrawItems.empty())
114  {
115  mTexture = nullptr;
116  mCompression = true;
117  }
118 
119  return;
120  }
121  }
122  MYGUI_EXCEPT("DrawItem not found");
123  }
124 
125  void RenderItem::addDrawItem(ISubWidget* _item, size_t _count)
126  {
127 
128 // проверяем только в дебаге
129 #if MYGUI_DEBUG_MODE == 1
130  for (VectorDrawItem::iterator iter = mDrawItems.begin(); iter != mDrawItems.end(); ++iter)
131  {
132  MYGUI_ASSERT((*iter).first != _item, "DrawItem exist");
133  }
134 #endif
135 
136  mDrawItems.push_back(DrawItemInfo(_item, _count));
137  mNeedVertexCount += _count;
138  mOutOfDate = true;
139 
140  mVertexBuffer->setVertexCount(mNeedVertexCount);
141  }
142 
143  void RenderItem::reallockDrawItem(ISubWidget* _item, size_t _count)
144  {
145  for (VectorDrawItem::iterator iter = mDrawItems.begin(); iter != mDrawItems.end(); ++iter)
146  {
147  if ((*iter).first == _item)
148  {
149  // если нужно меньше, то ниче не делаем
150  if ((*iter).second < _count)
151  {
152  mNeedVertexCount -= (*iter).second;
153  mNeedVertexCount += _count;
154  (*iter).second = _count;
155  mOutOfDate = true;
156 
157  mVertexBuffer->setVertexCount(mNeedVertexCount);
158  }
159  return;
160  }
161  }
162  MYGUI_EXCEPT("DrawItem not found");
163  }
164 
166  {
167  if (mTexture == _value)
168  return;
169 
170  //MYGUI_DEBUG_ASSERT(mVertexBuffer->getVertexCount() == 0, "change texture only empty buffer");
171  MYGUI_DEBUG_ASSERT(mNeedVertexCount == 0, "change texture only empty buffer");
172 
173  mTexture = _value;
174 
175 #if MYGUI_DEBUG_MODE == 1
176  mTextureName = mTexture == nullptr ? "" : mTexture->getName();
177 #endif
178  }
179 
181  {
182  return mTexture;
183  }
184 
186  {
187  bool result = mCompression;
188  mCompression = false;
189  return result;
190  }
191 
192  void RenderItem::setManualRender(bool _value)
193  {
194  mManualRender = _value;
195  }
196 
198  {
199  return mManualRender;
200  }
201 
203  {
204  mOutOfDate = true;
205  }
206 
208  {
209  return mOutOfDate;
210  }
211 
213  {
214  return mNeedVertexCount;
215  }
216 
218  {
219  return mCountVertex;
220  }
221 
223  {
224  return mCurrentUpdate;
225  }
226 
228  {
229  return mCurrentVertex;
230  }
231 
232  void RenderItem::setLastVertexCount(size_t _count)
233  {
234  mLastVertexCount = _count;
235  }
236 
238  {
239  return mRenderTarget;
240  }
241 
242 } // namespace MyGUI