7
This file is part of MyGUI.
9
MyGUI is free software: you can redistribute it and/or modify
10
it under the terms of the GNU Lesser General Public License as published by
11
the Free Software Foundation, either version 3 of the License, or
12
(at your option) any later version.
14
MyGUI is distributed in the hope that it will be useful,
15
but WITHOUT ANY WARRANTY; without even the implied warranty of
16
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17
GNU Lesser General Public License for more details.
19
You should have received a copy of the GNU Lesser General Public License
20
along with MyGUI. If not, see <http://www.gnu.org/licenses/>.
22
#include "MyGUI_Precompiled.h"
23
#include "MyGUI_TileRect.h"
24
#include "MyGUI_RenderItem.h"
25
#include "MyGUI_SkinManager.h"
26
#include "MyGUI_LanguageManager.h"
27
#include "MyGUI_LayerNode.h"
28
#include "MyGUI_CommonStateInfo.h"
29
#include "MyGUI_RenderManager.h"
30
#include "MyGUI_TextureUtility.h"
35
const size_t TILERECT_COUNT_VERTEX = 16 * VertexQuad::VertexCount;
37
TileRect::TileRect() :
39
mCurrentColour(0xFFFFFFFF),
42
mCountVertex(TILERECT_COUNT_VERTEX),
50
mVertexFormat = RenderManager::getInstance().getVertexFormat();
57
void TileRect::setVisible(bool _visible)
59
if (mVisible == _visible) return;
62
if (nullptr != mNode) mNode->outOfDate(mRenderItem);
65
void TileRect::setAlpha(float _alpha)
67
uint32 alpha = ((uint8)(_alpha * 255) << 24);
68
mCurrentColour = (mCurrentColour & 0x00FFFFFF) | (alpha & 0xFF000000);
71
mNode->outOfDate(mRenderItem);
74
void TileRect::_correctView()
76
if (nullptr != mNode) mNode->outOfDate(mRenderItem);
79
void TileRect::_setAlign(const IntSize& _oldsize)
81
// необходимо разобраться
82
bool need_update = true;
84
// первоначальное выравнивание
85
if (mAlign.isHStretch())
88
mCoord.width = mCoord.width + (mCroppedParent->getWidth() - _oldsize.width);
90
mIsMargin = true; // при изменении размеров все пересчитывать
92
else if (mAlign.isRight())
94
// двигаем по правому краю
95
mCoord.left = mCoord.left + (mCroppedParent->getWidth() - _oldsize.width);
98
else if (mAlign.isHCenter())
100
// выравнивание по горизонтали без растяжения
101
mCoord.left = (mCroppedParent->getWidth() - mCoord.width) / 2;
105
if (mAlign.isVStretch())
108
mCoord.height = mCoord.height + (mCroppedParent->getHeight() - _oldsize.height);
110
mIsMargin = true; // при изменении размеров все пересчитывать
112
else if (mAlign.isBottom())
114
// двигаем по нижнему краю
115
mCoord.top = mCoord.top + (mCroppedParent->getHeight() - _oldsize.height);
118
else if (mAlign.isVCenter())
120
// выравнивание по вертикали без растяжения
121
mCoord.top = (mCroppedParent->getHeight() - mCoord.height) / 2;
127
mCurrentCoord = mCoord;
128
if (!mTileH) mTileSize.width = mCoord.width;
129
if (!mTileV) mTileSize.height = mCoord.height;
135
void TileRect::_updateView()
137
bool margin = _checkMargin();
139
mEmptyView = ((0 >= _getViewWidth()) || (0 >= _getViewHeight()));
141
mCurrentCoord.left = mCoord.left + mMargin.left;
142
mCurrentCoord.top = mCoord.top + mMargin.top;
143
mCurrentCoord.width = _getViewWidth();
144
mCurrentCoord.height = _getViewHeight();
146
// подсчитываем необходимое колличество тайлов
150
if (!mTileSize.empty())
152
size_t count_x = mCoord.width / mTileSize.width;
153
if ((mCoord.width % mTileSize.width) > 0) count_x ++;
154
size_t count_y = mCoord.height / mTileSize.height;
155
if ((mCoord.height % mTileSize.height) > 0) count_y ++;
156
count = count_y * count_x * VertexQuad::VertexCount;
159
// нужно больше вершин
160
if (count > mCountVertex)
162
mCountVertex = count + TILERECT_COUNT_VERTEX;
163
if (nullptr != mRenderItem) mRenderItem->reallockDrawItem(this, mCountVertex);
167
// вьюпорт стал битым
170
// проверка на полный выход за границу
173
// запоминаем текущее состояние
176
// обновить перед выходом
177
if (nullptr != mNode) mNode->outOfDate(mRenderItem);
182
// запоминаем текущее состояние
185
if (nullptr != mNode) mNode->outOfDate(mRenderItem);
188
void TileRect::_setUVSet(const FloatRect& _rect)
190
mCurrentTexture = _rect;
191
if (nullptr != mNode) mNode->outOfDate(mRenderItem);
194
void TileRect::doRender()
196
if (!mVisible || mEmptyView || mTileSize.empty()) return;
198
VertexQuad* quad = (VertexQuad*)mRenderItem->getCurrentVertexBuffer();
200
const RenderTargetInfo& info = mRenderItem->getRenderTarget()->getInfo();
202
// размер одного тайла
203
mRealTileWidth = info.pixScaleX * (float)(mTileSize.width) * 2;
204
mRealTileHeight = info.pixScaleY * (float)(mTileSize.height) * 2;
206
mTextureHeightOne = (mCurrentTexture.bottom - mCurrentTexture.top) / mRealTileHeight;
207
mTextureWidthOne = (mCurrentTexture.right - mCurrentTexture.left) / mRealTileWidth;
209
float vertex_z = info.maximumDepth;
211
// абсолютный размер окна
212
float window_left = ((info.pixScaleX * (float)(mCoord.left + mCroppedParent->getAbsoluteLeft() - info.leftOffset) + info.hOffset) * 2) - 1;
213
float window_top = -(((info.pixScaleY * (float)(mCoord.top + mCroppedParent->getAbsoluteTop() - info.topOffset) + info.vOffset) * 2) - 1);
216
float real_left = ((info.pixScaleX * (float)(mCurrentCoord.left + mCroppedParent->getAbsoluteLeft() - info.leftOffset) + info.hOffset) * 2) - 1;
217
float real_right = real_left + (info.pixScaleX * (float)mCurrentCoord.width * 2);
218
float real_top = -(((info.pixScaleY * (float)(mCurrentCoord.top + mCroppedParent->getAbsoluteTop() - info.topOffset) + info.vOffset) * 2) - 1);
219
float real_bottom = real_top - (info.pixScaleY * (float)mCurrentCoord.height * 2);
223
float left = window_left;
224
float right = window_left;
225
float top = window_top;
226
float bottom = window_top;
228
for (int y = 0; y < mCoord.height; y += mTileSize.height)
231
bottom -= mRealTileHeight;
234
float vertex_top = top;
235
float vertex_bottom = bottom;
236
bool texture_crop_height = false;
238
if (vertex_top > real_top)
240
// проверка на полный выход
241
if (vertex_bottom > real_top)
246
vertex_top = real_top;
247
texture_crop_height = true;
249
if (vertex_bottom < real_bottom)
252
if (vertex_top < real_bottom)
257
vertex_bottom = real_bottom;
258
texture_crop_height = true;
261
for (int x = 0; x < mCoord.width; x += mTileSize.width)
264
right += mRealTileWidth;
266
float vertex_left = left;
267
float vertex_right = right;
268
bool texture_crop_width = false;
271
if (vertex_left < real_left)
273
// проверка на полный выход
274
if (vertex_right < real_left)
279
vertex_left = real_left;
280
texture_crop_width = true;
283
if (vertex_right > real_right)
285
// вообще строку до конца не нуна
286
if (vertex_left > real_right)
291
vertex_right = real_right;
292
texture_crop_width = true;
295
// текущие текстурные координаты
296
float texture_left = mCurrentTexture.left;
297
float texture_right = mCurrentTexture.right;
298
float texture_top = mCurrentTexture.top;
299
float texture_bottom = mCurrentTexture.bottom;
301
// смещение текстуры по вертикили
302
if (texture_crop_height)
304
// прибавляем размер смещения в текстурных координатах
305
texture_top += (top - vertex_top) * mTextureHeightOne;
306
// отнимаем размер смещения в текстурных координатах
307
texture_bottom -= (vertex_bottom - bottom) * mTextureHeightOne;
310
// смещение текстуры по горизонтали
311
if (texture_crop_width)
313
// прибавляем размер смещения в текстурных координатах
314
texture_left += (vertex_left - left) * mTextureWidthOne;
315
// отнимаем размер смещения в текстурных координатах
316
texture_right -= (right - vertex_right) * mTextureWidthOne;
336
mRenderItem->setLastVertexCount(VertexQuad::VertexCount * count);
339
void TileRect::createDrawItem(ITexture* _texture, ILayerNode* _node)
341
MYGUI_ASSERT(!mRenderItem, "mRenderItem must be nullptr");
344
mRenderItem = mNode->addToRenderItem(_texture, true, false);
345
mRenderItem->addDrawItem(this, mCountVertex);
348
void TileRect::destroyDrawItem()
350
MYGUI_ASSERT(mRenderItem, "mRenderItem must be not nullptr");
353
mRenderItem->removeDrawItem(this);
354
mRenderItem = nullptr;
357
void TileRect::setStateData(IStateInfo* _data)
359
TileRectStateInfo* data = _data->castType<TileRectStateInfo>();
361
mTileSize = data->getTileSize();
362
mTileH = data->getTileH();
363
mTileV = data->getTileV();
364
_setUVSet(data->getRect());
367
void TileRect::_setColour(const Colour& _value)
369
uint32 colour = texture_utility::toColourARGB(_value);
370
texture_utility::convertColour(colour, mVertexFormat);
371
mCurrentColour = (colour & 0x00FFFFFF) | (mCurrentColour & 0xFF000000);
373
if (nullptr != mNode)
374
mNode->outOfDate(mRenderItem);
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)
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"
20
const size_t TILERECT_COUNT_VERTEX = 16 * VertexQuad::VertexCount;
22
TileRect::TileRect() :
24
mCurrentColour(0xFFFFFFFF),
27
mCountVertex(TILERECT_COUNT_VERTEX),
35
mVertexFormat = RenderManager::getInstance().getVertexFormat();
42
void TileRect::setVisible(bool _visible)
44
if (mVisible == _visible)
49
mNode->outOfDate(mRenderItem);
52
void TileRect::setAlpha(float _alpha)
54
uint32 alpha = ((uint8)(_alpha * 255) << 24);
55
mCurrentColour = (mCurrentColour & 0x00FFFFFF) | (alpha & 0xFF000000);
58
mNode->outOfDate(mRenderItem);
61
void TileRect::_correctView()
64
mNode->outOfDate(mRenderItem);
67
void TileRect::_setAlign(const IntSize& _oldsize)
69
// необходимо разобраться
70
bool need_update = true;
72
// первоначальное выравнивание
73
if (mAlign.isHStretch())
76
mCoord.width = mCoord.width + (mCroppedParent->getWidth() - _oldsize.width);
78
mIsMargin = true; // при изменении размеров все пересчитывать
80
else if (mAlign.isRight())
82
// двигаем по правому краю
83
mCoord.left = mCoord.left + (mCroppedParent->getWidth() - _oldsize.width);
86
else if (mAlign.isHCenter())
88
// выравнивание по горизонтали без растяжения
89
mCoord.left = (mCroppedParent->getWidth() - mCoord.width) / 2;
93
if (mAlign.isVStretch())
96
mCoord.height = mCoord.height + (mCroppedParent->getHeight() - _oldsize.height);
98
mIsMargin = true; // при изменении размеров все пересчитывать
100
else if (mAlign.isBottom())
102
// двигаем по нижнему краю
103
mCoord.top = mCoord.top + (mCroppedParent->getHeight() - _oldsize.height);
106
else if (mAlign.isVCenter())
108
// выравнивание по вертикали без растяжения
109
mCoord.top = (mCroppedParent->getHeight() - mCoord.height) / 2;
115
mCurrentCoord = mCoord;
116
if (!mTileH) mTileSize.width = mCoord.width;
117
if (!mTileV) mTileSize.height = mCoord.height;
122
void TileRect::_updateView()
124
bool margin = _checkMargin();
126
mEmptyView = ((0 >= _getViewWidth()) || (0 >= _getViewHeight()));
128
mCurrentCoord.left = mCoord.left + mMargin.left;
129
mCurrentCoord.top = mCoord.top + mMargin.top;
130
mCurrentCoord.width = _getViewWidth();
131
mCurrentCoord.height = _getViewHeight();
133
// подсчитываем необходимое колличество тайлов
137
if (!mTileSize.empty())
139
size_t count_x = mCoord.width / mTileSize.width;
140
if ((mCoord.width % mTileSize.width) > 0)
143
size_t count_y = mCoord.height / mTileSize.height;
144
if ((mCoord.height % mTileSize.height) > 0)
147
count = count_y * count_x * VertexQuad::VertexCount;
150
// нужно больше вершин
151
if (count > mCountVertex)
153
mCountVertex = count + TILERECT_COUNT_VERTEX;
154
if (nullptr != mRenderItem)
155
mRenderItem->reallockDrawItem(this, mCountVertex);
159
// вьюпорт стал битым
162
// проверка на полный выход за границу
165
// запоминаем текущее состояние
168
// обновить перед выходом
169
if (nullptr != mNode)
170
mNode->outOfDate(mRenderItem);
175
// запоминаем текущее состояние
178
if (nullptr != mNode)
179
mNode->outOfDate(mRenderItem);
182
void TileRect::_setUVSet(const FloatRect& _rect)
184
mCurrentTexture = _rect;
185
if (nullptr != mNode)
186
mNode->outOfDate(mRenderItem);
189
void TileRect::doRender()
191
if (!mVisible || mEmptyView || mTileSize.empty())
194
VertexQuad* quad = reinterpret_cast<VertexQuad*>(mRenderItem->getCurrentVertexBuffer());
196
const RenderTargetInfo& info = mRenderItem->getRenderTarget()->getInfo();
198
// размер одного тайла
199
mRealTileWidth = info.pixScaleX * (float)(mTileSize.width) * 2;
200
mRealTileHeight = info.pixScaleY * (float)(mTileSize.height) * 2;
202
mTextureHeightOne = (mCurrentTexture.bottom - mCurrentTexture.top) / mRealTileHeight;
203
mTextureWidthOne = (mCurrentTexture.right - mCurrentTexture.left) / mRealTileWidth;
205
float vertex_z = mNode->getNodeDepth();
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);
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);
219
float left = window_left;
220
float right = window_left;
221
float top = window_top;
222
float bottom = window_top;
224
for (int y = 0; y < mCoord.height; y += mTileSize.height)
227
bottom -= mRealTileHeight;
230
float vertex_top = top;
231
float vertex_bottom = bottom;
232
bool texture_crop_height = false;
234
if (vertex_top > real_top)
236
// проверка на полный выход
237
if (vertex_bottom > real_top)
242
vertex_top = real_top;
243
texture_crop_height = true;
245
if (vertex_bottom < real_bottom)
248
if (vertex_top < real_bottom)
253
vertex_bottom = real_bottom;
254
texture_crop_height = true;
257
for (int x = 0; x < mCoord.width; x += mTileSize.width)
260
right += mRealTileWidth;
262
float vertex_left = left;
263
float vertex_right = right;
264
bool texture_crop_width = false;
267
if (vertex_left < real_left)
269
// проверка на полный выход
270
if (vertex_right < real_left)
275
vertex_left = real_left;
276
texture_crop_width = true;
279
if (vertex_right > real_right)
281
// вообще строку до конца не нуна
282
if (vertex_left > real_right)
287
vertex_right = real_right;
288
texture_crop_width = true;
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;
297
// смещение текстуры по вертикили
298
if (texture_crop_height)
300
// прибавляем размер смещения в текстурных координатах
301
texture_top += (top - vertex_top) * mTextureHeightOne;
302
// отнимаем размер смещения в текстурных координатах
303
texture_bottom -= (vertex_bottom - bottom) * mTextureHeightOne;
306
// смещение текстуры по горизонтали
307
if (texture_crop_width)
309
// прибавляем размер смещения в текстурных координатах
310
texture_left += (vertex_left - left) * mTextureWidthOne;
311
// отнимаем размер смещения в текстурных координатах
312
texture_right -= (right - vertex_right) * mTextureWidthOne;
331
mRenderItem->setLastVertexCount(VertexQuad::VertexCount * count);
334
void TileRect::createDrawItem(ITexture* _texture, ILayerNode* _node)
336
MYGUI_ASSERT(!mRenderItem, "mRenderItem must be nullptr");
339
mRenderItem = mNode->addToRenderItem(_texture, true, false);
340
mRenderItem->addDrawItem(this, mCountVertex);
343
void TileRect::destroyDrawItem()
345
MYGUI_ASSERT(mRenderItem, "mRenderItem must be not nullptr");
348
mRenderItem->removeDrawItem(this);
349
mRenderItem = nullptr;
352
void TileRect::setStateData(IStateInfo* _data)
354
TileRectStateInfo* data = _data->castType<TileRectStateInfo>();
356
mTileSize = data->getTileSize();
357
mTileH = data->getTileH();
358
mTileV = data->getTileV();
359
_setUVSet(data->getRect());
362
void TileRect::_setColour(const Colour& _value)
364
uint32 colour = texture_utility::toColourARGB(_value);
365
texture_utility::convertColour(colour, mVertexFormat);
366
mCurrentColour = (colour & 0x00FFFFFF) | (mCurrentColour & 0xFF000000);
368
if (nullptr != mNode)
369
mNode->outOfDate(mRenderItem);