MyGUI  3.2.1
MyGUI_TileRect.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_TileRect.h"
9 #include "MyGUI_RenderItem.h"
10 #include "MyGUI_SkinManager.h"
11 #include "MyGUI_LanguageManager.h"
12 #include "MyGUI_LayerNode.h"
13 #include "MyGUI_CommonStateInfo.h"
14 #include "MyGUI_RenderManager.h"
15 #include "MyGUI_TextureUtility.h"
16 
17 namespace MyGUI
18 {
19 
21 
23  mEmptyView(false),
24  mCurrentColour(0xFFFFFFFF),
25  mNode(nullptr),
26  mRenderItem(nullptr),
27  mCountVertex(TILERECT_COUNT_VERTEX),
28  mRealTileWidth(0),
29  mRealTileHeight(0),
30  mTextureHeightOne(0),
31  mTextureWidthOne(0),
32  mTileH(true),
33  mTileV(true)
34  {
36  }
37 
39  {
40  }
41 
42  void TileRect::setVisible(bool _visible)
43  {
44  if (mVisible == _visible)
45  return;
46  mVisible = _visible;
47 
48  if (nullptr != mNode)
50  }
51 
52  void TileRect::setAlpha(float _alpha)
53  {
54  uint32 alpha = ((uint8)(_alpha * 255) << 24);
55  mCurrentColour = (mCurrentColour & 0x00FFFFFF) | (alpha & 0xFF000000);
56 
57  if (nullptr != mNode)
59  }
60 
62  {
63  if (nullptr != mNode)
65  }
66 
67  void TileRect::_setAlign(const IntSize& _oldsize)
68  {
69  // необходимо разобраться
70  bool need_update = true;
71 
72  // первоначальное выравнивание
73  if (mAlign.isHStretch())
74  {
75  // растягиваем
76  mCoord.width = mCoord.width + (mCroppedParent->getWidth() - _oldsize.width);
77  need_update = true;
78  mIsMargin = true; // при изменении размеров все пересчитывать
79  }
80  else if (mAlign.isRight())
81  {
82  // двигаем по правому краю
83  mCoord.left = mCoord.left + (mCroppedParent->getWidth() - _oldsize.width);
84  need_update = true;
85  }
86  else if (mAlign.isHCenter())
87  {
88  // выравнивание по горизонтали без растяжения
90  need_update = true;
91  }
92 
93  if (mAlign.isVStretch())
94  {
95  // растягиваем
97  need_update = true;
98  mIsMargin = true; // при изменении размеров все пересчитывать
99  }
100  else if (mAlign.isBottom())
101  {
102  // двигаем по нижнему краю
103  mCoord.top = mCoord.top + (mCroppedParent->getHeight() - _oldsize.height);
104  need_update = true;
105  }
106  else if (mAlign.isVCenter())
107  {
108  // выравнивание по вертикали без растяжения
110  need_update = true;
111  }
112 
113  if (need_update)
114  {
118  _updateView();
119  }
120  }
121 
123  {
124  bool margin = _checkMargin();
125 
126  mEmptyView = ((0 >= _getViewWidth()) || (0 >= _getViewHeight()));
127 
132 
133  // подсчитываем необходимое колличество тайлов
134  if (!mEmptyView)
135  {
136  size_t count = 0;
137  if (!mTileSize.empty())
138  {
139  size_t count_x = mCoord.width / mTileSize.width;
140  if ((mCoord.width % mTileSize.width) > 0)
141  count_x ++;
142 
143  size_t count_y = mCoord.height / mTileSize.height;
144  if ((mCoord.height % mTileSize.height) > 0)
145  count_y ++;
146 
147  count = count_y * count_x * VertexQuad::VertexCount;
148  }
149 
150  // нужно больше вершин
151  if (count > mCountVertex)
152  {
154  if (nullptr != mRenderItem)
156  }
157  }
158 
159  // вьюпорт стал битым
160  if (margin)
161  {
162  // проверка на полный выход за границу
163  if (_checkOutside())
164  {
165  // запоминаем текущее состояние
166  mIsMargin = margin;
167 
168  // обновить перед выходом
169  if (nullptr != mNode)
171  return;
172  }
173  }
174 
175  // запоминаем текущее состояние
176  mIsMargin = margin;
177 
178  if (nullptr != mNode)
180  }
181 
182  void TileRect::_setUVSet(const FloatRect& _rect)
183  {
184  mCurrentTexture = _rect;
185  if (nullptr != mNode)
187  }
188 
190  {
191  if (!mVisible || mEmptyView || mTileSize.empty())
192  return;
193 
194  VertexQuad* quad = reinterpret_cast<VertexQuad*>(mRenderItem->getCurrentVertexBuffer());
195 
197 
198  // размер одного тайла
199  mRealTileWidth = info.pixScaleX * (float)(mTileSize.width) * 2;
200  mRealTileHeight = info.pixScaleY * (float)(mTileSize.height) * 2;
201 
204 
205  float vertex_z = mNode->getNodeDepth();
206 
207  // абсолютный размер окна
208  float window_left = ((info.pixScaleX * (float)(mCoord.left + mCroppedParent->getAbsoluteLeft() - info.leftOffset) + info.hOffset) * 2) - 1;
209  float window_top = -(((info.pixScaleY * (float)(mCoord.top + mCroppedParent->getAbsoluteTop() - info.topOffset) + info.vOffset) * 2) - 1);
210 
211  // размер вьюпорта
212  float real_left = ((info.pixScaleX * (float)(mCurrentCoord.left + mCroppedParent->getAbsoluteLeft() - info.leftOffset) + info.hOffset) * 2) - 1;
213  float real_right = real_left + (info.pixScaleX * (float)mCurrentCoord.width * 2);
214  float real_top = -(((info.pixScaleY * (float)(mCurrentCoord.top + mCroppedParent->getAbsoluteTop() - info.topOffset) + info.vOffset) * 2) - 1);
215  float real_bottom = real_top - (info.pixScaleY * (float)mCurrentCoord.height * 2);
216 
217  size_t count = 0;
218 
219  float left = window_left;
220  float right = window_left;
221  float top = window_top;
222  float bottom = window_top;
223 
224  for (int y = 0; y < mCoord.height; y += mTileSize.height)
225  {
226  top = bottom;
227  bottom -= mRealTileHeight;
228  right = window_left;
229 
230  float vertex_top = top;
231  float vertex_bottom = bottom;
232  bool texture_crop_height = false;
233 
234  if (vertex_top > real_top)
235  {
236  // проверка на полный выход
237  if (vertex_bottom > real_top)
238  {
239  continue;
240  }
241  // обрезаем
242  vertex_top = real_top;
243  texture_crop_height = true;
244  }
245  if (vertex_bottom < real_bottom)
246  {
247  // вообще вниз ушли
248  if (vertex_top < real_bottom)
249  {
250  continue;
251  }
252  // обрезаем
253  vertex_bottom = real_bottom;
254  texture_crop_height = true;
255  }
256 
257  for (int x = 0; x < mCoord.width; x += mTileSize.width)
258  {
259  left = right;
260  right += mRealTileWidth;
261 
262  float vertex_left = left;
263  float vertex_right = right;
264  bool texture_crop_width = false;
265 
266 
267  if (vertex_left < real_left)
268  {
269  // проверка на полный выход
270  if (vertex_right < real_left)
271  {
272  continue;
273  }
274  // обрезаем
275  vertex_left = real_left;
276  texture_crop_width = true;
277  }
278 
279  if (vertex_right > real_right)
280  {
281  // вообще строку до конца не нуна
282  if (vertex_left > real_right)
283  {
284  continue;
285  }
286  // обрезаем
287  vertex_right = real_right;
288  texture_crop_width = true;
289  }
290 
291  // текущие текстурные координаты
292  float texture_left = mCurrentTexture.left;
293  float texture_right = mCurrentTexture.right;
294  float texture_top = mCurrentTexture.top;
295  float texture_bottom = mCurrentTexture.bottom;
296 
297  // смещение текстуры по вертикили
298  if (texture_crop_height)
299  {
300  // прибавляем размер смещения в текстурных координатах
301  texture_top += (top - vertex_top) * mTextureHeightOne;
302  // отнимаем размер смещения в текстурных координатах
303  texture_bottom -= (vertex_bottom - bottom) * mTextureHeightOne;
304  }
305 
306  // смещение текстуры по горизонтали
307  if (texture_crop_width)
308  {
309  // прибавляем размер смещения в текстурных координатах
310  texture_left += (vertex_left - left) * mTextureWidthOne;
311  // отнимаем размер смещения в текстурных координатах
312  texture_right -= (right - vertex_right) * mTextureWidthOne;
313  }
314 
315  quad[count].set(
316  vertex_left,
317  vertex_top,
318  vertex_right,
319  vertex_bottom,
320  vertex_z,
321  texture_left,
322  texture_top,
323  texture_right,
324  texture_bottom,
326 
327  count ++;
328  }
329  }
330 
332  }
333 
335  {
336  MYGUI_ASSERT(!mRenderItem, "mRenderItem must be nullptr");
337 
338  mNode = _node;
339  mRenderItem = mNode->addToRenderItem(_texture, true, false);
341  }
342 
344  {
345  MYGUI_ASSERT(mRenderItem, "mRenderItem must be not nullptr");
346 
347  mNode = nullptr;
349  mRenderItem = nullptr;
350  }
351 
353  {
354  TileRectStateInfo* data = _data->castType<TileRectStateInfo>();
355 
356  mTileSize = data->getTileSize();
357  mTileH = data->getTileH();
358  mTileV = data->getTileV();
359  _setUVSet(data->getRect());
360  }
361 
362  void TileRect::_setColour(const Colour& _value)
363  {
364  uint32 colour = texture_utility::toColourARGB(_value);
366  mCurrentColour = (colour & 0x00FFFFFF) | (mCurrentColour & 0xFF000000);
367 
368  if (nullptr != mNode)
370  }
371 
372 } // namespace MyGUI