25 mGeometryOutdated =
true;
28 mNode->outOfDate(mRenderItem);
34 mGeometryOutdated =
true;
37 mNode->outOfDate(mRenderItem);
51 mGeometryOutdated =
true;
54 mNode->outOfDate(mRenderItem);
60 mCurrentColour = (mCurrentColour & 0x00FFFFFF) | (alpha & 0xFF000000);
63 mNode->outOfDate(mRenderItem);
68 mGeometryOutdated =
true;
71 mNode->outOfDate(mRenderItem);
88 else if (
mAlign.isHCenter())
100 else if (
mAlign.isBottom())
105 else if (
mAlign.isVCenter())
119 mGeometryOutdated =
true;
121 if (
nullptr != mNode)
122 mNode->outOfDate(mRenderItem);
127 MYGUI_ASSERT(!mRenderItem,
"mRenderItem must be nullptr");
131 mRenderItem->
addDrawItem(
this, (GEOMETRY_VERTICIES_TOTAL_COUNT - 2) * 3);
136 MYGUI_ASSERT(mRenderItem,
"mRenderItem must be not nullptr");
139 mRenderItem->removeDrawItem(
this);
140 mRenderItem =
nullptr;
148 Vertex* verticies = mRenderItem->getCurrentVertexBuffer();
150 float vertex_z = mNode->getNodeDepth();
152 if (mGeometryOutdated)
155 mGeometryOutdated =
false;
158 for (
int i = 1; i < GEOMETRY_VERTICIES_TOTAL_COUNT - 1; ++i)
160 verticies[3 * i - 3].
set(
161 mResultVerticiesPos[0].left,
162 mResultVerticiesPos[0].top,
164 mResultVerticiesUV[0].left,
165 mResultVerticiesUV[0].top,
167 verticies[3 * i - 2].
set(
168 mResultVerticiesPos[i].left,
169 mResultVerticiesPos[i].top,
171 mResultVerticiesUV[i].left,
172 mResultVerticiesUV[i].top,
174 verticies[3 * i - 1].
set(
175 mResultVerticiesPos[i + 1].left,
176 mResultVerticiesPos[i + 1].top,
178 mResultVerticiesUV[i + 1].left,
179 mResultVerticiesUV[i + 1].top,
183 mRenderItem->setLastVertexCount((GEOMETRY_VERTICIES_TOTAL_COUNT - 2) * 3);
189 mCurrentColour = (colour & 0x00FFFFFF) | (mCurrentColour & 0xFF000000);
191 if (
nullptr != mNode)
192 mNode->outOfDate(mRenderItem);
207 mCurrentTexture = _rect;
209 mGeometryOutdated =
true;
211 if (
nullptr != mNode)
212 mNode->outOfDate(mRenderItem);
215 inline float len(
float x,
float y)
217 return std::sqrt(x * x + y * y);
229 const float M_PI = 3.141593f;
231 float width_base = (float)mCurrentCoord.width;
232 float height_base = (float)mCurrentCoord.height;
235 float baseAngles[RECT_VERTICIES_COUNT];
236 baseAngles[0] = std::atan2((
float)mCenterPos.left, (
float)mCenterPos.top) +
M_PI / 2;
237 baseAngles[1] = std::atan2(-width_base + (
float)mCenterPos.left, (
float)mCenterPos.top) +
M_PI / 2;
239 std::atan2(-width_base + (
float)mCenterPos.left, -height_base + (
float)mCenterPos.top) +
M_PI / 2;
240 baseAngles[3] = std::atan2((
float)mCenterPos.left, -height_base + (
float)mCenterPos.top) +
M_PI / 2;
243 float baseDistances[RECT_VERTICIES_COUNT];
244 baseDistances[0] =
len((
float)mCenterPos.left, (
float)mCenterPos.top);
245 baseDistances[1] =
len(-width_base + (
float)mCenterPos.left, (
float)mCenterPos.top);
246 baseDistances[2] =
len(-width_base + (
float)mCenterPos.left, -height_base + (
float)mCenterPos.top);
247 baseDistances[3] =
len((
float)mCenterPos.left, -height_base + (
float)mCenterPos.top);
251 FloatPoint baseVerticiesPos[RECT_VERTICIES_COUNT];
253 int offsetX = mCenterPos.left;
254 int offsetY = mCenterPos.top;
256 for (
int i = 0; i < RECT_VERTICIES_COUNT; ++i)
258 baseVerticiesPos[i].
left = offsetX + std::cos(-mAngle + baseAngles[i]) * baseDistances[i];
259 baseVerticiesPos[i].
top = offsetY - std::sin(-mAngle + baseAngles[i]) * baseDistances[i];
263 FloatPoint baseVerticiesUV[RECT_VERTICIES_COUNT] = {
264 FloatPoint(mCurrentTexture.left, mCurrentTexture.top),
265 FloatPoint(mCurrentTexture.right, mCurrentTexture.top),
266 FloatPoint(mCurrentTexture.right, mCurrentTexture.bottom),
267 FloatPoint(mCurrentTexture.left, mCurrentTexture.bottom)};
276 size_t size = RECT_VERTICIES_COUNT;
279 for (
int i = 0; i < RECT_VERTICIES_COUNT; ++i)
281 mResultVerticiesPos[i] = baseVerticiesPos[i];
282 mResultVerticiesUV[i] = baseVerticiesUV[i];
291 RECT_VERTICIES_COUNT,
298 for (
size_t i = 0; i < resultVerticiesPos.size(); ++i)
300 mResultVerticiesPos[i] = resultVerticiesPos[i];
303 size = resultVerticiesPos.size();
306 FloatPoint v0 = baseVerticiesUV[3] - baseVerticiesUV[0];
307 FloatPoint v1 = baseVerticiesUV[1] - baseVerticiesUV[0];
308 for (
size_t i = 0; i < GEOMETRY_VERTICIES_TOTAL_COUNT; ++i)
313 mResultVerticiesPos[i],
316 baseVerticiesPos[3]);
317 mResultVerticiesUV[i] =
323 mResultVerticiesUV[i] = mResultVerticiesUV[size == 0 ? 0 : (size - 1)];
332 float vertex_top_base =
335 for (
size_t i = 0; i < GEOMETRY_VERTICIES_TOTAL_COUNT; ++i)
339 mResultVerticiesPos[i].left = vertex_left_base + mResultVerticiesPos[i].left * info.
pixScaleX * 2;
340 mResultVerticiesPos[i].top = vertex_top_base + mResultVerticiesPos[i].top * info.
pixScaleY * -2;
345 mResultVerticiesPos[i] = mResultVerticiesPos[size == 0 ? 0 : (size - 1)];
#define MYGUI_ASSERT(exp, dest)
ICroppedRectangle * mCroppedParent
int _getMarginLeft() const
int _getMarginTop() const
int _getViewWidth() const
int _getViewHeight() const
virtual RenderItem * addToRenderItem(ITexture *_texture, bool _firstQueue, bool _separate)=0
Type * castType(bool _throw=true)
void addDrawItem(ISubWidget *_item, size_t _count)
virtual VertexColourType getVertexFormat() const =0
static RenderManager & getInstance()
void setAlpha(float _alpha) override
void setAngle(float _angle)
void _setColour(const Colour &_value) override
void _setUVSet(const FloatRect &_rect) override
IntPoint getCenter(bool _local=true) const
void setStateData(IStateInfo *_data) override
void _correctView() override
void destroyDrawItem() override
void setVisible(bool _visible) override
void _updateView() override
void createDrawItem(ITexture *_texture, ILayerNode *_node) override
void setCenter(const IntPoint &_center)
void _setAlign(const IntSize &_oldsize) override
const IntPoint & getCenter() const
const FloatRect & getRect() const
FloatPoint getUVFromPositionInsideRect(const FloatPoint &_point, const FloatPoint &_v0, const FloatPoint &_v1, const FloatPoint &_baseUV)
FloatPoint getPositionInsideRect(const FloatPoint &_point, const FloatPoint &_corner0, const FloatPoint &_corner1, const FloatPoint &_corner2)
VectorFloatPoint cropPolygon(FloatPoint *_baseVerticiesPos, size_t _size, const IntCoord &_cropRectangle)
uint32 toNativeColour(const Colour &_colour, VertexColourType _format)
Convert Colour to 32-bit representation.
types::TPoint< int > IntPoint
types::TRect< float > FloatRect
types::TPoint< float > FloatPoint
std::vector< FloatPoint > VectorFloatPoint
types::TCoord< int > IntCoord
types::TSize< int > IntSize
float len(float x, float y)
void set(float _x, float _y, float _z, float _u, float _v, uint32 _colour)