MyGUI  3.2.1
MyGUI_SubSkin.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_SubSkin.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 
22  mEmptyView(false),
23  mCurrentColour(0xFFFFFFFF),
24  mNode(nullptr),
25  mRenderItem(nullptr),
26  mSeparate(false)
27  {
29  }
30 
32  {
33  }
34 
35  void SubSkin::setVisible(bool _visible)
36  {
37  if (mVisible == _visible)
38  return;
39  mVisible = _visible;
40 
41  if (nullptr != mNode)
43  }
44 
45  void SubSkin::setAlpha(float _alpha)
46  {
47  uint32 alpha = ((uint8)(_alpha * 255) << 24);
48  mCurrentColour = (mCurrentColour & 0x00FFFFFF) | (alpha & 0xFF000000);
49 
50  if (nullptr != mNode)
52  }
53 
55  {
56  if (nullptr != mNode)
58  }
59 
60  void SubSkin::_setAlign(const IntSize& _oldsize)
61  {
62  // необходимо разобраться
63  bool need_update = true;//_update;
64 
65  // первоначальное выравнивание
66  if (mAlign.isHStretch())
67  {
68  // растягиваем
69  mCoord.width = mCoord.width + (mCroppedParent->getWidth() - _oldsize.width);
70  need_update = true;
71  mIsMargin = true; // при изменении размеров все пересчитывать
72  }
73  else if (mAlign.isRight())
74  {
75  // двигаем по правому краю
76  mCoord.left = mCoord.left + (mCroppedParent->getWidth() - _oldsize.width);
77  need_update = true;
78  }
79  else if (mAlign.isHCenter())
80  {
81  // выравнивание по горизонтали без растяжения
83  need_update = true;
84  }
85 
86  if (mAlign.isVStretch())
87  {
88  // растягиваем
90  need_update = true;
91  mIsMargin = true; // при изменении размеров все пересчитывать
92  }
93  else if (mAlign.isBottom())
94  {
95  // двигаем по нижнему краю
96  mCoord.top = mCoord.top + (mCroppedParent->getHeight() - _oldsize.height);
97  need_update = true;
98  }
99  else if (mAlign.isVCenter())
100  {
101  // выравнивание по вертикали без растяжения
103  need_update = true;
104  }
105 
106  if (need_update)
107  {
109  _updateView();
110  }
111  }
112 
114  {
115  //mAbsolutePosition = mCroppedParent->getAbsolutePosition() + mCoord.point();
116  bool margin = _checkMargin();
117 
118  mEmptyView = ((0 >= _getViewWidth()) || (0 >= _getViewHeight()));
119 
122 
123  // вьюпорт стал битым
124  if (margin)
125  {
126  // проверка на полный выход за границу
127  if (_checkOutside())
128  {
129  // запоминаем текущее состояние
130  mIsMargin = margin;
131 
132  // обновить перед выходом
133  if (nullptr != mNode)
135  return;
136  }
137  }
138 
139  // мы обрезаны или были обрезаны
140  if (mIsMargin || margin)
141  {
144 
145  if ((mCurrentCoord.width > 0) && (mCurrentCoord.height > 0))
146  {
147  // теперь смещаем текстуру
148  float UV_lft = mMargin.left / (float)mCoord.width;
149  float UV_top = mMargin.top / (float)mCoord.height;
150  float UV_rgt = (mCoord.width - mMargin.right) / (float)mCoord.width;
151  float UV_btm = (mCoord.height - mMargin.bottom) / (float)mCoord.height;
152 
153  float UV_sizeX = mRectTexture.right - mRectTexture.left;
154  float UV_sizeY = mRectTexture.bottom - mRectTexture.top;
155 
156  float UV_lft_total = mRectTexture.left + UV_lft * UV_sizeX;
157  float UV_top_total = mRectTexture.top + UV_top * UV_sizeY;
158  float UV_rgt_total = mRectTexture.right - (1 - UV_rgt) * UV_sizeX;
159  float UV_btm_total = mRectTexture.bottom - (1 - UV_btm) * UV_sizeY;
160 
161  mCurrentTexture.set(UV_lft_total, UV_top_total, UV_rgt_total, UV_btm_total);
162  }
163  }
164 
165  if (mIsMargin && !margin)
166  {
167  // мы не обрезаны, но были, ставим базовые координаты
169  }
170 
171  // запоминаем текущее состояние
172  mIsMargin = margin;
173 
174  if (nullptr != mNode)
176  }
177 
179  {
180  MYGUI_ASSERT(!mRenderItem, "mRenderItem must be nullptr");
181 
182  mNode = _node;
183  mRenderItem = mNode->addToRenderItem(_texture, true, mSeparate);
185  }
186 
188  {
189  MYGUI_ASSERT(mRenderItem, "mRenderItem must be not nullptr");
190 
191  mNode = nullptr;
193  mRenderItem = nullptr;
194  }
195 
196  void SubSkin::_setUVSet(const FloatRect& _rect)
197  {
198  if (mRectTexture == _rect)
199  return;
200  mRectTexture = _rect;
201 
202  // если обрезаны, то просчитываем с учето обрезки
203  if (mIsMargin)
204  {
205  float UV_lft = mMargin.left / (float)mCoord.width;
206  float UV_top = mMargin.top / (float)mCoord.height;
207  float UV_rgt = (mCoord.width - mMargin.right) / (float)mCoord.width;
208  float UV_btm = (mCoord.height - mMargin.bottom) / (float)mCoord.height;
209 
210  float UV_sizeX = mRectTexture.right - mRectTexture.left;
211  float UV_sizeY = mRectTexture.bottom - mRectTexture.top;
212 
213  float UV_lft_total = mRectTexture.left + UV_lft * UV_sizeX;
214  float UV_top_total = mRectTexture.top + UV_top * UV_sizeY;
215  float UV_rgt_total = mRectTexture.right - (1 - UV_rgt) * UV_sizeX;
216  float UV_btm_total = mRectTexture.bottom - (1 - UV_btm) * UV_sizeY;
217 
218  mCurrentTexture.set(UV_lft_total, UV_top_total, UV_rgt_total, UV_btm_total);
219  }
220  // мы не обрезаны, базовые координаты
221  else
222  {
224  }
225 
226  if (nullptr != mNode)
228  }
229 
231  {
232  if (!mVisible || mEmptyView)
233  return;
234 
235  VertexQuad* quad = reinterpret_cast<VertexQuad*>(mRenderItem->getCurrentVertexBuffer());
236 
238 
239  float vertex_z = mNode->getNodeDepth();
240 
241  float vertex_left = ((info.pixScaleX * (float)(mCurrentCoord.left + mCroppedParent->getAbsoluteLeft() - info.leftOffset) + info.hOffset) * 2) - 1;
242  float vertex_right = vertex_left + (info.pixScaleX * (float)mCurrentCoord.width * 2);
243  float vertex_top = -(((info.pixScaleY * (float)(mCurrentCoord.top + mCroppedParent->getAbsoluteTop() - info.topOffset) + info.vOffset) * 2) - 1);
244  float vertex_bottom = vertex_top - (info.pixScaleY * (float)mCurrentCoord.height * 2);
245 
246  quad->set(
247  vertex_left,
248  vertex_top,
249  vertex_right,
250  vertex_bottom,
251  vertex_z,
257 
259  }
260 
261  void SubSkin::_setColour(const Colour& _value)
262  {
263  uint32 colour = texture_utility::toColourARGB(_value);
265  mCurrentColour = (colour & 0x00FFFFFF) | (mCurrentColour & 0xFF000000);
266 
267  if (nullptr != mNode)
269  }
270 
272  {
274  }
275 
276 } // namespace MyGUI