MyGUI  3.4.0
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 
38  void TileRect::setVisible(bool _visible)
39  {
40  if (mVisible == _visible)
41  return;
42  mVisible = _visible;
43 
44  if (nullptr != mNode)
46  }
47 
48  void TileRect::setAlpha(float _alpha)
49  {
50  uint32 alpha = ((uint8)(_alpha * 255) << 24);
51  mCurrentColour = (mCurrentColour & 0x00FFFFFF) | (alpha & 0xFF000000);
52 
53  if (nullptr != mNode)
55  }
56 
58  {
59  if (nullptr != mNode)
61  }
62 
63  void TileRect::_setAlign(const IntSize& _oldsize)
64  {
65  // необходимо разобраться
66  bool need_update = true;
67 
68  // первоначальное выравнивание
69  if (mAlign.isHStretch())
70  {
71  // растягиваем
72  mCoord.width = mCoord.width + (mCroppedParent->getWidth() - _oldsize.width);
73  need_update = true;
74  mIsMargin = true; // при изменении размеров все пересчитывать
75  }
76  else if (mAlign.isRight())
77  {
78  // двигаем по правому краю
79  mCoord.left = mCoord.left + (mCroppedParent->getWidth() - _oldsize.width);
80  need_update = true;
81  }
82  else if (mAlign.isHCenter())
83  {
84  // выравнивание по горизонтали без растяжения
86  need_update = true;
87  }
88 
89  if (mAlign.isVStretch())
90  {
91  // растягиваем
93  need_update = true;
94  mIsMargin = true; // при изменении размеров все пересчитывать
95  }
96  else if (mAlign.isBottom())
97  {
98  // двигаем по нижнему краю
99  mCoord.top = mCoord.top + (mCroppedParent->getHeight() - _oldsize.height);
100  need_update = true;
101  }
102  else if (mAlign.isVCenter())
103  {
104  // выравнивание по вертикали без растяжения
106  need_update = true;
107  }
108 
109  if (need_update)
110  {
114  _updateView();
115  }
116  }
117 
119  {
120  bool margin = _checkMargin();
121 
122  mEmptyView = ((0 >= _getViewWidth()) || (0 >= _getViewHeight()));
123 
128 
129  // подсчитываем необходимое колличество тайлов
130  if (!mEmptyView)
131  {
132  size_t count = 0;
133  if (!mTileSize.empty())
134  {
135  size_t count_x = mCoord.width / mTileSize.width;
136  if ((mCoord.width % mTileSize.width) > 0)
137  count_x ++;
138 
139  size_t count_y = mCoord.height / mTileSize.height;
140  if ((mCoord.height % mTileSize.height) > 0)
141  count_y ++;
142 
143  count = count_y * count_x * VertexQuad::VertexCount;
144  }
145 
146  // нужно больше вершин
147  if (count > mCountVertex)
148  {
150  if (nullptr != mRenderItem)
152  }
153  }
154 
155  // вьюпорт стал битым
156  if (margin)
157  {
158  // проверка на полный выход за границу
159  if (_checkOutside())
160  {
161  // запоминаем текущее состояние
162  mIsMargin = margin;
163 
164  // обновить перед выходом
165  if (nullptr != mNode)
167  return;
168  }
169  }
170 
171  // запоминаем текущее состояние
172  mIsMargin = margin;
173 
174  if (nullptr != mNode)
176  }
177 
178  void TileRect::_setUVSet(const FloatRect& _rect)
179  {
180  mCurrentTexture = _rect;
181  if (nullptr != mNode)
183  }
184 
186  {
187  if (!mVisible || mEmptyView || mTileSize.empty())
188  return;
189 
190  VertexQuad* quad = reinterpret_cast<VertexQuad*>(mRenderItem->getCurrentVertexBuffer());
191 
193 
194  // размер одного тайла
195  mRealTileWidth = info.pixScaleX * (float)(mTileSize.width) * 2;
196  mRealTileHeight = info.pixScaleY * (float)(mTileSize.height) * 2;
197 
200 
201  float vertex_z = mNode->getNodeDepth();
202 
203  // абсолютный размер окна
204  float window_left = ((info.pixScaleX * (float)(mCoord.left + mCroppedParent->getAbsoluteLeft() - info.leftOffset) + info.hOffset) * 2) - 1;
205  float window_top = -(((info.pixScaleY * (float)(mCoord.top + mCroppedParent->getAbsoluteTop() - info.topOffset) + info.vOffset) * 2) - 1);
206 
207  // размер вьюпорта
208  float real_left = ((info.pixScaleX * (float)(mCurrentCoord.left + mCroppedParent->getAbsoluteLeft() - info.leftOffset) + info.hOffset) * 2) - 1;
209  float real_right = real_left + (info.pixScaleX * (float)mCurrentCoord.width * 2);
210  float real_top = -(((info.pixScaleY * (float)(mCurrentCoord.top + mCroppedParent->getAbsoluteTop() - info.topOffset) + info.vOffset) * 2) - 1);
211  float real_bottom = real_top - (info.pixScaleY * (float)mCurrentCoord.height * 2);
212 
213  size_t count = 0;
214 
215  float left = window_left;
216  float right = window_left;
217  float top = window_top;
218  float bottom = window_top;
219 
220  for (int y = 0; y < mCoord.height; y += mTileSize.height)
221  {
222  top = bottom;
223  bottom -= mRealTileHeight;
224  right = window_left;
225 
226  float vertex_top = top;
227  float vertex_bottom = bottom;
228  bool texture_crop_height = false;
229 
230  if (vertex_top > real_top)
231  {
232  // проверка на полный выход
233  if (vertex_bottom > real_top)
234  {
235  continue;
236  }
237  // обрезаем
238  vertex_top = real_top;
239  texture_crop_height = true;
240  }
241  if (vertex_bottom < real_bottom)
242  {
243  // вообще вниз ушли
244  if (vertex_top < real_bottom)
245  {
246  continue;
247  }
248  // обрезаем
249  vertex_bottom = real_bottom;
250  texture_crop_height = true;
251  }
252 
253  for (int x = 0; x < mCoord.width; x += mTileSize.width)
254  {
255  left = right;
256  right += mRealTileWidth;
257 
258  float vertex_left = left;
259  float vertex_right = right;
260  bool texture_crop_width = false;
261 
262 
263  if (vertex_left < real_left)
264  {
265  // проверка на полный выход
266  if (vertex_right < real_left)
267  {
268  continue;
269  }
270  // обрезаем
271  vertex_left = real_left;
272  texture_crop_width = true;
273  }
274 
275  if (vertex_right > real_right)
276  {
277  // вообще строку до конца не нуна
278  if (vertex_left > real_right)
279  {
280  continue;
281  }
282  // обрезаем
283  vertex_right = real_right;
284  texture_crop_width = true;
285  }
286 
287  // текущие текстурные координаты
288  float texture_left = mCurrentTexture.left;
289  float texture_right = mCurrentTexture.right;
290  float texture_top = mCurrentTexture.top;
291  float texture_bottom = mCurrentTexture.bottom;
292 
293  // смещение текстуры по вертикили
294  if (texture_crop_height)
295  {
296  // прибавляем размер смещения в текстурных координатах
297  texture_top += (top - vertex_top) * mTextureHeightOne;
298  // отнимаем размер смещения в текстурных координатах
299  texture_bottom -= (vertex_bottom - bottom) * mTextureHeightOne;
300  }
301 
302  // смещение текстуры по горизонтали
303  if (texture_crop_width)
304  {
305  // прибавляем размер смещения в текстурных координатах
306  texture_left += (vertex_left - left) * mTextureWidthOne;
307  // отнимаем размер смещения в текстурных координатах
308  texture_right -= (right - vertex_right) * mTextureWidthOne;
309  }
310 
311  quad[count].set(
312  vertex_left,
313  vertex_top,
314  vertex_right,
315  vertex_bottom,
316  vertex_z,
317  texture_left,
318  texture_top,
319  texture_right,
320  texture_bottom,
322 
323  count ++;
324  }
325  }
326 
328  }
329 
331  {
332  MYGUI_ASSERT(!mRenderItem, "mRenderItem must be nullptr");
333 
334  mNode = _node;
335  mRenderItem = mNode->addToRenderItem(_texture, true, false);
337  }
338 
340  {
341  MYGUI_ASSERT(mRenderItem, "mRenderItem must be not nullptr");
342 
343  mNode = nullptr;
345  mRenderItem = nullptr;
346  }
347 
349  {
350  TileRectStateInfo* data = _data->castType<TileRectStateInfo>();
351 
352  mTileSize = data->getTileSize();
353  mTileH = data->getTileH();
354  mTileV = data->getTileV();
355  _setUVSet(data->getRect());
356  }
357 
358  void TileRect::_setColour(const Colour& _value)
359  {
360  uint32 colour = texture_utility::toColourARGB(_value);
362  mCurrentColour = (colour & 0x00FFFFFF) | (mCurrentColour & 0xFF000000);
363 
364  if (nullptr != mNode)
366  }
367 
368 } // namespace MyGUI
MyGUI::TileRect::setAlpha
void setAlpha(float _alpha) override
Definition: MyGUI_TileRect.cpp:48
MyGUI::Singleton< RenderManager >::getInstance
static RenderManager & getInstance()
Definition: MyGUI_Singleton.h:44
MyGUI::types::TRect::bottom
T bottom
Definition: MyGUI_TRect.h:23
MyGUI::RenderItem::setLastVertexCount
void setLastVertexCount(size_t _count)
Definition: MyGUI_RenderItem.cpp:235
MyGUI::RenderTargetInfo::vOffset
float vOffset
Definition: MyGUI_RenderTargetInfo.h:41
MyGUI::RenderTargetInfo::leftOffset
int leftOffset
Definition: MyGUI_RenderTargetInfo.h:44
MyGUI::Align::isHCenter
bool isHCenter() const
Definition: MyGUI_Align.h:44
MyGUI::TileRect::_updateView
void _updateView() override
Definition: MyGUI_TileRect.cpp:118
MyGUI::RenderTargetInfo::topOffset
int topOffset
Definition: MyGUI_RenderTargetInfo.h:45
MyGUI::types::TSize::height
T height
Definition: MyGUI_TSize.h:21
MyGUI::RenderItem::reallockDrawItem
void reallockDrawItem(ISubWidget *_item, size_t _count)
Definition: MyGUI_RenderItem.cpp:143
MyGUI::VertexQuad::set
void set(float _l, float _t, float _r, float _b, float _z, float _u1, float _v1, float _u2, float _v2, uint32 _colour)
Definition: MyGUI_VertexData.h:46
MyGUI::types::TCoord::left
T left
Definition: MyGUI_TCoord.h:22
MyGUI::ICroppedRectangle::mIsMargin
bool mIsMargin
Definition: MyGUI_ICroppedRectangle.h:248
MyGUI::TileRect::mTileSize
IntSize mTileSize
Definition: MyGUI_TileRect.h:63
MyGUI::TileRect::mVertexFormat
VertexColourType mVertexFormat
Definition: MyGUI_TileRect.h:54
MyGUI::TileRect::mCurrentColour
uint32 mCurrentColour
Definition: MyGUI_TileRect.h:55
MyGUI::texture_utility::convertColour
void convertColour(uint32 &_colour, VertexColourType _format)
Definition: MyGUI_TextureUtility.h:23
MyGUI::ICroppedRectangle::_getViewHeight
int _getViewHeight() const
Definition: MyGUI_ICroppedRectangle.h:153
MyGUI::types::TCoord::top
T top
Definition: MyGUI_TCoord.h:23
MyGUI::ICroppedRectangle::getAbsoluteTop
int getAbsoluteTop() const
Definition: MyGUI_ICroppedRectangle.h:88
MyGUI::uint8
unsigned char uint8
Definition: MyGUI_Types.h:44
MyGUI::types::TRect< float >
MyGUI::ILayerNode::addToRenderItem
virtual RenderItem * addToRenderItem(ITexture *_texture, bool _firstQueue, bool _separate)=0
MyGUI::TileRect::mRealTileWidth
float mRealTileWidth
Definition: MyGUI_TileRect.h:66
MyGUI::TileRect::doRender
void doRender() override
Definition: MyGUI_TileRect.cpp:185
MyGUI::ILayerNode::outOfDate
virtual void outOfDate(RenderItem *_item)=0
MyGUI::types::TRect::right
T right
Definition: MyGUI_TRect.h:22
MyGUI::TileRect::mTileV
bool mTileV
Definition: MyGUI_TileRect.h:73
MyGUI::ILayerNode
Definition: MyGUI_ILayerNode.h:30
MyGUI::ICroppedRectangle::getAbsoluteLeft
int getAbsoluteLeft() const
Definition: MyGUI_ICroppedRectangle.h:83
MyGUI::TileRectStateInfo::getTileH
bool getTileH() const
Definition: MyGUI_CommonStateInfo.h:72
MyGUI::ICroppedRectangle::mMargin
IntRect mMargin
Definition: MyGUI_ICroppedRectangle.h:244
MyGUI::Align::isVCenter
bool isVCenter() const
Definition: MyGUI_Align.h:49
MyGUI_CommonStateInfo.h
MyGUI::RenderTargetInfo::hOffset
float hOffset
Definition: MyGUI_RenderTargetInfo.h:40
MyGUI::types::TSize::width
T width
Definition: MyGUI_TSize.h:20
MyGUI::TileRect::TileRect
TileRect()
Definition: MyGUI_TileRect.cpp:22
MyGUI_LayerNode.h
MyGUI::types::TRect::left
T left
Definition: MyGUI_TRect.h:20
MyGUI::types::TSize::empty
bool empty() const
Definition: MyGUI_TSize.h:108
MyGUI::ISubWidget::mVisible
bool mVisible
Definition: MyGUI_ISubWidget.h:60
MyGUI::TileRect::mRealTileHeight
float mRealTileHeight
Definition: MyGUI_TileRect.h:67
MyGUI::ILayerNode::getNodeDepth
virtual float getNodeDepth()=0
MyGUI::TileRectStateInfo::getTileV
bool getTileV() const
Definition: MyGUI_CommonStateInfo.h:77
MyGUI::TileRect::mCountVertex
size_t mCountVertex
Definition: MyGUI_TileRect.h:64
MyGUI::IStateInfo
Definition: MyGUI_IStateInfo.h:18
MyGUI_Precompiled.h
MyGUI::ICroppedRectangle::_checkOutside
bool _checkOutside() const
Definition: MyGUI_ICroppedRectangle.h:235
MyGUI::TileRect::_setColour
void _setColour(const Colour &_value) override
Definition: MyGUI_TileRect.cpp:358
MyGUI::TileRect::createDrawItem
void createDrawItem(ITexture *_texture, ILayerNode *_node) override
Definition: MyGUI_TileRect.cpp:330
MyGUI::TileRect::mNode
ILayerNode * mNode
Definition: MyGUI_TileRect.h:60
MyGUI::TILERECT_COUNT_VERTEX
const size_t TILERECT_COUNT_VERTEX
Definition: MyGUI_TileRect.cpp:20
MyGUI::ICroppedRectangle::mCroppedParent
ICroppedRectangle * mCroppedParent
Definition: MyGUI_ICroppedRectangle.h:249
MyGUI::ICroppedRectangle::mCoord
IntCoord mCoord
Definition: MyGUI_ICroppedRectangle.h:245
MyGUI::TileRect::mTileH
bool mTileH
Definition: MyGUI_TileRect.h:72
MyGUI::TileRect::mEmptyView
bool mEmptyView
Definition: MyGUI_TileRect.h:52
MyGUI::uint32
unsigned int uint32
Definition: MyGUI_Types.h:46
MyGUI::TileRect::_setAlign
void _setAlign(const IntSize &_oldsize) override
Definition: MyGUI_TileRect.cpp:63
MyGUI::RenderTargetInfo::pixScaleX
float pixScaleX
Definition: MyGUI_RenderTargetInfo.h:38
MyGUI::IRenderTarget::getInfo
virtual const RenderTargetInfo & getInfo()=0
MYGUI_ASSERT
#define MYGUI_ASSERT(exp, dest)
Definition: MyGUI_Diagnostic.h:34
MyGUI::IObject::castType
Type * castType(bool _throw=true)
Definition: MyGUI_IObject.h:18
MyGUI::VertexQuad::VertexCount
@ VertexCount
Definition: MyGUI_VertexData.h:43
MyGUI::TileRect::mCurrentTexture
FloatRect mCurrentTexture
Definition: MyGUI_TileRect.h:57
MyGUI::Align::isVStretch
bool isVStretch() const
Definition: MyGUI_Align.h:84
MyGUI::TileRect::destroyDrawItem
void destroyDrawItem() override
Definition: MyGUI_TileRect.cpp:339
MyGUI::RenderItem::getRenderTarget
IRenderTarget * getRenderTarget()
Definition: MyGUI_RenderItem.cpp:240
MyGUI::TileRectStateInfo::getTileSize
const IntSize & getTileSize() const
Definition: MyGUI_CommonStateInfo.h:67
MyGUI::VertexQuad
Definition: MyGUI_VertexData.h:34
MyGUI_LanguageManager.h
MyGUI::RenderTargetInfo::pixScaleY
float pixScaleY
Definition: MyGUI_RenderTargetInfo.h:39
MyGUI_TextureUtility.h
MyGUI::types::TSize< int >
MyGUI::TileRect::setStateData
void setStateData(IStateInfo *_data) override
Definition: MyGUI_TileRect.cpp:348
MyGUI_RenderItem.h
MyGUI::ISubWidget::mAlign
Align mAlign
Definition: MyGUI_ISubWidget.h:59
MyGUI::TileRect::setVisible
void setVisible(bool _visible) override
Definition: MyGUI_TileRect.cpp:38
MyGUI::Align::isRight
bool isRight() const
Definition: MyGUI_Align.h:64
MyGUI::ITexture
Definition: MyGUI_ITexture.h:28
MyGUI::Colour
Definition: MyGUI_Colour.h:17
MyGUI::types::TRect::top
T top
Definition: MyGUI_TRect.h:21
MyGUI::TileRect::_setUVSet
void _setUVSet(const FloatRect &_rect) override
Definition: MyGUI_TileRect.cpp:178
MyGUI::RenderTargetInfo
Definition: MyGUI_RenderTargetInfo.h:16
MyGUI_RenderManager.h
MyGUI::Align::isBottom
bool isBottom() const
Definition: MyGUI_Align.h:79
MyGUI::types::TCoord::width
T width
Definition: MyGUI_TCoord.h:24
MyGUI_SkinManager.h
MyGUI::RenderItem::removeDrawItem
void removeDrawItem(ISubWidget *_item)
Definition: MyGUI_RenderItem.cpp:100
MyGUI::ICroppedRectangle::_checkMargin
bool _checkMargin()
Definition: MyGUI_ICroppedRectangle.h:185
MyGUI::ICroppedRectangle::_getViewWidth
int _getViewWidth() const
Definition: MyGUI_ICroppedRectangle.h:149
MyGUI::RenderManager::getVertexFormat
virtual VertexColourType getVertexFormat()=0
MyGUI::ICroppedRectangle::getHeight
int getHeight() const
Definition: MyGUI_ICroppedRectangle.h:119
MyGUI::RenderItem::addDrawItem
void addDrawItem(ISubWidget *_item, size_t _count)
Definition: MyGUI_RenderItem.cpp:125
MyGUI_TileRect.h
MyGUI::RenderItem::getCurrentVertexBuffer
Vertex * getCurrentVertexBuffer() const
Definition: MyGUI_RenderItem.cpp:230
MyGUI::ICroppedRectangle::getWidth
int getWidth() const
Definition: MyGUI_ICroppedRectangle.h:114
MyGUI::TileRectStateInfo::getRect
const FloatRect & getRect() const
Definition: MyGUI_CommonStateInfo.h:62
MyGUI::TileRectStateInfo
Definition: MyGUI_CommonStateInfo.h:52
MyGUI::TileRect::_correctView
void _correctView() override
Definition: MyGUI_TileRect.cpp:57
MyGUI::TileRect::mCurrentCoord
IntCoord mCurrentCoord
Definition: MyGUI_TileRect.h:58
MyGUI::types::TCoord::height
T height
Definition: MyGUI_TCoord.h:25
MyGUI
Definition: MyGUI_ActionController.h:15
MyGUI::Align::isHStretch
bool isHStretch() const
Definition: MyGUI_Align.h:69
MyGUI::texture_utility::toColourARGB
uint32 toColourARGB(const Colour &_colour)
Definition: MyGUI_TextureUtility.cpp:68
MyGUI::TileRect::mTextureHeightOne
float mTextureHeightOne
Definition: MyGUI_TileRect.h:69
MyGUI::TileRect::mTextureWidthOne
float mTextureWidthOne
Definition: MyGUI_TileRect.h:70
MyGUI::TileRect::mRenderItem
RenderItem * mRenderItem
Definition: MyGUI_TileRect.h:61