MyGUI
3.2.1
Main Page
Related Pages
Namespaces
Data Structures
Files
Examples
File List
Globals
mygui
MyGUIEngine
src
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
20
SubSkin::SubSkin
() :
21
ISubWidgetRect
(),
22
mEmptyView(false),
23
mCurrentColour(0xFFFFFFFF),
24
mNode(
nullptr
),
25
mRenderItem(
nullptr
),
26
mSeparate(false)
27
{
28
mVertexFormat
=
RenderManager::getInstance
().
getVertexFormat
();
29
}
30
31
SubSkin::~SubSkin
()
32
{
33
}
34
35
void
SubSkin::setVisible
(
bool
_visible)
36
{
37
if
(
mVisible
== _visible)
38
return
;
39
mVisible
= _visible;
40
41
if
(
nullptr
!=
mNode
)
42
mNode
->
outOfDate
(
mRenderItem
);
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
)
51
mNode
->
outOfDate
(
mRenderItem
);
52
}
53
54
void
SubSkin::_correctView
()
55
{
56
if
(
nullptr
!=
mNode
)
57
mNode
->
outOfDate
(
mRenderItem
);
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
// выравнивание по горизонтали без растяжения
82
mCoord
.
left
= (
mCroppedParent
->
getWidth
() -
mCoord
.
width
) / 2;
83
need_update =
true
;
84
}
85
86
if
(
mAlign
.
isVStretch
())
87
{
88
// растягиваем
89
mCoord
.
height
=
mCoord
.
height
+ (
mCroppedParent
->
getHeight
() - _oldsize.
height
);
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
// выравнивание по вертикали без растяжения
102
mCoord
.
top
= (
mCroppedParent
->
getHeight
() -
mCoord
.
height
) / 2;
103
need_update =
true
;
104
}
105
106
if
(need_update)
107
{
108
mCurrentCoord
=
mCoord
;
109
_updateView
();
110
}
111
}
112
113
void
SubSkin::_updateView
()
114
{
115
//mAbsolutePosition = mCroppedParent->getAbsolutePosition() + mCoord.point();
116
bool
margin =
_checkMargin
();
117
118
mEmptyView
= ((0 >=
_getViewWidth
()) || (0 >=
_getViewHeight
()));
119
120
mCurrentCoord
.
left
=
mCoord
.
left
+
mMargin
.
left
;
121
mCurrentCoord
.
top
=
mCoord
.
top
+
mMargin
.
top
;
122
123
// вьюпорт стал битым
124
if
(margin)
125
{
126
// проверка на полный выход за границу
127
if
(
_checkOutside
())
128
{
129
// запоминаем текущее состояние
130
mIsMargin
= margin;
131
132
// обновить перед выходом
133
if
(
nullptr
!=
mNode
)
134
mNode
->
outOfDate
(
mRenderItem
);
135
return
;
136
}
137
}
138
139
// мы обрезаны или были обрезаны
140
if
(
mIsMargin
|| margin)
141
{
142
mCurrentCoord
.
width
=
_getViewWidth
();
143
mCurrentCoord
.
height
=
_getViewHeight
();
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
// мы не обрезаны, но были, ставим базовые координаты
168
mCurrentTexture
=
mRectTexture
;
169
}
170
171
// запоминаем текущее состояние
172
mIsMargin
= margin;
173
174
if
(
nullptr
!=
mNode
)
175
mNode
->
outOfDate
(
mRenderItem
);
176
}
177
178
void
SubSkin::createDrawItem
(
ITexture
* _texture,
ILayerNode
* _node)
179
{
180
MYGUI_ASSERT
(!
mRenderItem
,
"mRenderItem must be nullptr"
);
181
182
mNode
= _node;
183
mRenderItem
=
mNode
->
addToRenderItem
(_texture,
true
,
mSeparate
);
184
mRenderItem
->
addDrawItem
(
this
,
VertexQuad::VertexCount
);
185
}
186
187
void
SubSkin::destroyDrawItem
()
188
{
189
MYGUI_ASSERT
(
mRenderItem
,
"mRenderItem must be not nullptr"
);
190
191
mNode
=
nullptr
;
192
mRenderItem
->
removeDrawItem
(
this
);
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
{
223
mCurrentTexture
=
mRectTexture
;
224
}
225
226
if
(
nullptr
!=
mNode
)
227
mNode
->
outOfDate
(
mRenderItem
);
228
}
229
230
void
SubSkin::doRender
()
231
{
232
if
(!
mVisible
||
mEmptyView
)
233
return
;
234
235
VertexQuad
* quad =
reinterpret_cast<
VertexQuad
*
>
(
mRenderItem
->
getCurrentVertexBuffer
());
236
237
const
RenderTargetInfo
& info =
mRenderItem
->
getRenderTarget
()->
getInfo
();
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,
252
mCurrentTexture
.
left
,
253
mCurrentTexture
.
top
,
254
mCurrentTexture
.
right
,
255
mCurrentTexture
.
bottom
,
256
mCurrentColour
);
257
258
mRenderItem
->
setLastVertexCount
(
VertexQuad::VertexCount
);
259
}
260
261
void
SubSkin::_setColour
(
const
Colour
& _value)
262
{
263
uint32
colour =
texture_utility::toColourARGB
(_value);
264
texture_utility::convertColour
(colour,
mVertexFormat
);
265
mCurrentColour
= (colour & 0x00FFFFFF) | (
mCurrentColour
& 0xFF000000);
266
267
if
(
nullptr
!=
mNode
)
268
mNode
->
outOfDate
(
mRenderItem
);
269
}
270
271
void
SubSkin::setStateData
(
IStateInfo
* _data)
272
{
273
_setUVSet
(_data->
castType
<
SubSkinStateInfo
>()->
getRect
());
274
}
275
276
}
// namespace MyGUI
Generated on Wed Aug 20 2014 00:03:33 for MyGUI by
1.8.3.1