22 inline float len(
float x,
float y)
24 return std::sqrt(x * x + y * y);
29 if (_points.size() < 2)
32 mResultVerticiesPos.clear();
33 mResultVerticiesUV.clear();
34 mLinePoints = _points;
39 finalPoints.reserve(_points.size());
43 finalPoints.push_back(point0);
45 for (
const auto& point : _points)
49 finalPoints.push_back(point);
50 mLineLength +=
len(point.left - point0.
left, point.top - point0.
top);
55 mLinePoints = finalPoints;
57#ifdef MYGUI_NO_POLYGONAL_SKIN_CROPPING
65 if (count > mVertexCount)
68 if (
nullptr != mRenderItem)
69 mRenderItem->reallockDrawItem(
this, mVertexCount);
93 mGeometryOutdated =
true;
96 mNode->outOfDate(mRenderItem);
102 mCurrentColour = (mCurrentColour & 0x00FFFFFF) | (alpha & 0xFF000000);
104 if (
nullptr != mNode)
105 mNode->outOfDate(mRenderItem);
110 mGeometryOutdated =
true;
112 if (
nullptr != mNode)
113 mNode->outOfDate(mRenderItem);
125 else if (
mAlign.isRight())
130 else if (
mAlign.isHCenter())
142 else if (
mAlign.isBottom())
147 else if (
mAlign.isVCenter())
163 mGeometryOutdated =
true;
178 if (
nullptr != mNode)
179 mNode->outOfDate(mRenderItem);
194 if (
nullptr != mNode)
195 mNode->outOfDate(mRenderItem);
200 MYGUI_ASSERT(!mRenderItem,
"mRenderItem must be nullptr");
209 MYGUI_ASSERT(mRenderItem,
"mRenderItem must be not nullptr");
212 mRenderItem->removeDrawItem(
this);
213 mRenderItem =
nullptr;
221 bool update = mRenderItem->getCurrentUpdate();
223 mGeometryOutdated =
true;
225 Vertex* verticies = mRenderItem->getCurrentVertexBuffer();
227 float vertex_z = mNode->getNodeDepth();
229 if (mGeometryOutdated)
234 size_t size = mResultVerticiesPos.size();
236 for (
size_t i = 0; i < size; ++i)
239 mResultVerticiesPos[i].left,
240 mResultVerticiesPos[i].top,
242 mResultVerticiesUV[i].left,
243 mResultVerticiesUV[i].top,
247 mRenderItem->setLastVertexCount(size);
253 mCurrentColour = (colour & 0x00FFFFFF) | (mCurrentColour & 0xFF000000);
255 if (
nullptr != mNode)
256 mNode->outOfDate(mRenderItem);
266 mCurrentTexture = _rect;
268 mGeometryOutdated =
true;
270 if (
nullptr != mNode)
271 mNode->outOfDate(mRenderItem);
276 if (mLinePoints.size() < 2)
278 if (!mRenderItem || !mRenderItem->getRenderTarget())
281 mGeometryOutdated =
false;
287 FloatPoint(mCurrentTexture.left, mCurrentTexture.top),
288 FloatPoint(mCurrentTexture.right, mCurrentTexture.top),
289 FloatPoint(mCurrentTexture.right, mCurrentTexture.bottom),
290 FloatPoint(mCurrentTexture.left, mCurrentTexture.bottom)};
293 FloatPoint vectorU = baseVerticiesUV[1] - baseVerticiesUV[0];
296 mResultVerticiesPos.
clear();
297 mResultVerticiesUV.clear();
301 FloatPoint points[2] = {mLinePoints[0] + normal, mLinePoints[0] - normal};
302 FloatPoint pointsUV[2] = {baseVerticiesUV[0], baseVerticiesUV[3]};
308 float currentLength = 0.0f;
309 for (
size_t i = 1; i < mLinePoints.size(); ++i)
311 if (mLineStroke != 0)
314 if (stroke == mLineStroke)
322 len(mLinePoints[i - 1].left - mLinePoints[i].left, mLinePoints[i - 1].top - mLinePoints[i].top);
325 if (i != mLinePoints.size() - 1)
326 normal =
_getMiddleLine(mLinePoints[i - 1], mLinePoints[i + 1], mLinePoints[i]);
337 else if (
len(normal.
left, normal.
top) > mLineWidth * 1.5f)
344 FloatPoint lineDir = mLinePoints[i] - mLinePoints[i - 1];
351 FloatPoint UVoffset(currentLength / mLineLength * vectorU.
left, currentLength / mLineLength * vectorU.
top);
355 mResultVerticiesPos.push_back(points[0]);
356 mResultVerticiesPos.push_back(points[1]);
357 mResultVerticiesPos.push_back(mLinePoints[i] + normal);
358 mResultVerticiesUV.push_back(pointsUV[0]);
359 mResultVerticiesUV.push_back(pointsUV[1]);
360 mResultVerticiesUV.push_back(baseVerticiesUV[0] + UVoffset);
362 mResultVerticiesPos.push_back(points[1]);
363 mResultVerticiesPos.push_back(mLinePoints[i] - normal);
364 mResultVerticiesPos.push_back(mLinePoints[i] + normal);
365 mResultVerticiesUV.push_back(pointsUV[1]);
366 mResultVerticiesUV.push_back(baseVerticiesUV[3] + UVoffset);
367 mResultVerticiesUV.push_back(baseVerticiesUV[0] + UVoffset);
370 points[edge ? 1 : 0] = mLinePoints[i] + normal;
371 points[edge ? 0 : 1] = mLinePoints[i] - normal;
372 pointsUV[0] = baseVerticiesUV[0] + UVoffset;
373 pointsUV[1] = baseVerticiesUV[3] + UVoffset;
377 normal =
_getMiddleLine(mLinePoints[i - 1], mLinePoints[i + 1], mLinePoints[i]);
379 float sharpness =
len(normal.left, normal.top) / mLineWidth;
381 float length =
len(normal.left, normal.top);
382 normal.left *= 2 * mLineWidth / length / (sharpness - 0.5f);
383 normal.top *= 2 * mLineWidth / length / (sharpness - 0.5f);
386 lineDir = mLinePoints[i] - mLinePoints[i - 1];
387 if (lineDir.
left * normal.top - lineDir.
top * normal.left < 0)
389 normal.left = -normal.left;
390 normal.top = -normal.top;
392 FloatPoint lineDir1 = mLinePoints[i] - mLinePoints[i - 1];
393 FloatPoint lineDir2 = mLinePoints[i + 1] - mLinePoints[i];
394 if (lineDir1.
left * lineDir2.
top - lineDir1.
top * lineDir2.
left > 0)
396 normal.left = -normal.left;
397 normal.top = -normal.top;
402 lineDir = mLinePoints[i - 1] - mLinePoints[i];
406 normal2.
top = -normal2.
top;
410 (baseVerticiesUV[0].left + baseVerticiesUV[3].left) / 2,
411 (baseVerticiesUV[0].top + baseVerticiesUV[3].top) / 2);
415 mResultVerticiesPos.push_back(points[0]);
416 mResultVerticiesPos.push_back(mLinePoints[i] + normal);
417 mResultVerticiesPos.push_back(mLinePoints[i]);
418 mResultVerticiesUV.push_back(pointsUV[0]);
419 mResultVerticiesUV.push_back(baseVerticiesUV[0] + UVoffset);
420 mResultVerticiesUV.push_back(UVcenter + UVoffset);
422 mResultVerticiesPos.push_back(mLinePoints[i] + normal);
423 mResultVerticiesPos.push_back(mLinePoints[i] + normal2);
424 mResultVerticiesPos.push_back(mLinePoints[i]);
425 mResultVerticiesUV.push_back(baseVerticiesUV[0] + UVoffset);
426 mResultVerticiesUV.push_back(baseVerticiesUV[0] + UVoffset);
427 mResultVerticiesUV.push_back(UVcenter + UVoffset);
430 points[0] = mLinePoints[i] + normal2;
431 points[1] = mLinePoints[i] - normal2;
432 pointsUV[0] = baseVerticiesUV[0] + UVoffset;
433 pointsUV[1] = baseVerticiesUV[3] + UVoffset;
438#ifndef MYGUI_NO_POLYGONAL_SKIN_CROPPING
440 IntCoord cropRectangle(mCurrentCoord.left, mCurrentCoord.top, mCurrentCoord.width, mCurrentCoord.height);
444 newResultVerticiesPos.reserve(mResultVerticiesPos.size());
445 newResultVerticiesUV.reserve(mResultVerticiesPos.size());
446 for (
size_t i = 0; i < mResultVerticiesPos.size(); i += 3)
449 if (!croppedTriangle.empty())
451 FloatPoint v0 = mResultVerticiesUV[i + 2] - mResultVerticiesUV[i];
452 FloatPoint v1 = mResultVerticiesUV[i + 1] - mResultVerticiesUV[i];
454 for (
size_t j = 1; j < croppedTriangle.size() - 1; ++j)
456 newResultVerticiesPos.push_back(croppedTriangle[0]);
457 newResultVerticiesPos.push_back(croppedTriangle[j]);
458 newResultVerticiesPos.push_back(croppedTriangle[j + 1]);
464 mResultVerticiesPos[i],
465 mResultVerticiesPos[i + 1],
466 mResultVerticiesPos[i + 2]);
467 newResultVerticiesUV.push_back(
471 mResultVerticiesPos[i],
472 mResultVerticiesPos[i + 1],
473 mResultVerticiesPos[i + 2]);
474 newResultVerticiesUV.push_back(
477 croppedTriangle[j + 1],
478 mResultVerticiesPos[i],
479 mResultVerticiesPos[i + 1],
480 mResultVerticiesPos[i + 2]);
481 newResultVerticiesUV.push_back(
486 std::swap(mResultVerticiesPos, newResultVerticiesPos);
487 std::swap(mResultVerticiesUV, newResultVerticiesUV);
494 float vertex_top_base =
497 for (
auto& pos : mResultVerticiesPos)
499 pos.left = vertex_left_base + pos.left * info.
pixScaleX * 2;
500 pos.top = vertex_top_base + pos.top * info.
pixScaleY * -2;
510 result.
left /= length;
511 result.
top /= length;
512 result.
left *= mLineWidth / 2;
513 result.
top *= mLineWidth / 2;
526 line1.
left /= length;
529 line2.
left /= length;
538 result.
left /= length;
539 result.
top /= length;
542 float angle = std::acos(cos);
545 if (std::fabs(angle) < 1e-6f )
548 float width = mLineWidth / 2 / std::sin(angle);
549 result.
left *= width;
#define MYGUI_ASSERT(exp, dest)
bool _checkOutside() const
ICroppedRectangle * mCroppedParent
int _getViewWidth() const
int _getViewHeight() const
virtual RenderItem * addToRenderItem(ITexture *_texture, bool _firstQueue, bool _separate)=0
Type * castType(bool _throw=true)
FloatPoint _getMiddleLine(const FloatPoint &_point1, const FloatPoint &_point2, const FloatPoint &_point3) const
void _correctView() override
void destroyDrawItem() override
void createDrawItem(ITexture *_texture, ILayerNode *_node) override
void _setAlign(const IntSize &_oldsize) override
FloatPoint _getPerpendicular(const FloatPoint &_point1, const FloatPoint &_point2) const
void setPoints(const std::vector< FloatPoint > &_points)
void setStateData(IStateInfo *_data) override
void setVisible(bool _visible) override
void setAlpha(float _alpha) override
void _setUVSet(const FloatRect &_rect) override
void setWidth(float _width)
void _updateView() override
void _setColour(const Colour &_value) override
void setStroke(size_t _value)
void addDrawItem(ISubWidget *_item, size_t _count)
virtual VertexColourType getVertexFormat() const =0
static RenderManager & getInstance()
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::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)