18 mGeometryOutdated(false),
24 mCurrentColour(0xFFFFFFFF),
31 inline float len(
float x,
float y)
33 return std::sqrt(x * x + y * y);
38 if (_points.size() < 2)
41 mResultVerticiesPos.clear();
42 mResultVerticiesUV.clear();
43 mLinePoints = _points;
48 finalPoints.reserve(_points.size());
52 finalPoints.push_back(point);
54 for (std::vector<FloatPoint>::const_iterator iter = _points.begin() + 1; iter != _points.end(); ++iter)
58 finalPoints.push_back(*iter);
59 mLineLength +=
len(iter->left - point.
left, iter->top - point.
top);
64 mLinePoints = finalPoints;
66 #ifdef MYGUI_NO_POLYGONAL_SKIN_CROPPING
74 if (count > mVertexCount)
77 if (
nullptr != mRenderItem) mRenderItem->
reallockDrawItem(
this, mVertexCount);
101 mGeometryOutdated =
true;
103 if (
nullptr != mNode)
110 mCurrentColour = (mCurrentColour & 0x00FFFFFF) | (alpha & 0xFF000000);
112 if (
nullptr != mNode)
118 mGeometryOutdated =
true;
120 if (
nullptr != mNode)
127 bool need_update =
true;
183 mGeometryOutdated =
true;
198 if (
nullptr != mNode)
214 if (
nullptr != mNode)
220 MYGUI_ASSERT(!mRenderItem,
"mRenderItem must be nullptr");
229 MYGUI_ASSERT(mRenderItem,
"mRenderItem must be not nullptr");
233 mRenderItem =
nullptr;
243 mGeometryOutdated =
true;
249 if (mGeometryOutdated)
254 size_t size = mResultVerticiesPos.size();
256 for (
size_t i = 0; i < size; ++i)
258 verticies[i].
set(mResultVerticiesPos[i].left, mResultVerticiesPos[i].top, vertex_z, mResultVerticiesUV[i].left, mResultVerticiesUV[i].top, mCurrentColour);
268 mCurrentColour = (colour & 0x00FFFFFF) | (mCurrentColour & 0xFF000000);
270 if (
nullptr != mNode)
281 mCurrentTexture = _rect;
283 mGeometryOutdated =
true;
285 if (
nullptr != mNode)
291 if (mLinePoints.size() < 2)
296 mGeometryOutdated =
false;
310 FloatPoint vectorU = baseVerticiesUV[1] - baseVerticiesUV[0];
315 mResultVerticiesPos.clear();
316 mResultVerticiesUV.clear();
320 FloatPoint points[2] = {mLinePoints[0] + normal, mLinePoints[0] - normal};
321 FloatPoint pointsUV[2] = {baseVerticiesUV[0], baseVerticiesUV[3]};
327 float currentLength = 0.0f;
328 for (
size_t i = 1; i < mLinePoints.size(); ++i)
330 if (mLineStroke != 0)
333 if (stroke == mLineStroke)
340 currentLength +=
len(mLinePoints[i - 1].left - mLinePoints[i].left, mLinePoints[i - 1].top - mLinePoints[i].top);
343 if (i != mLinePoints.size() - 1)
344 normal =
_getMiddleLine(mLinePoints[i - 1], mLinePoints[i + 1], mLinePoints[i]);
355 else if (
len(normal.
left, normal.
top) > mLineWidth * 1.5f)
362 FloatPoint lineDir = mLinePoints[i] - mLinePoints[i - 1];
369 FloatPoint UVoffset(currentLength / mLineLength * vectorU.
left, currentLength / mLineLength * vectorU.
top);
373 mResultVerticiesPos.push_back(points[0]);
374 mResultVerticiesPos.push_back(points[1]);
375 mResultVerticiesPos.push_back(mLinePoints[i] + normal);
376 mResultVerticiesUV.push_back(pointsUV[0]);
377 mResultVerticiesUV.push_back(pointsUV[1]);
378 mResultVerticiesUV.push_back(baseVerticiesUV[0] + UVoffset);
380 mResultVerticiesPos.push_back(points[1]);
381 mResultVerticiesPos.push_back(mLinePoints[i] - normal);
382 mResultVerticiesPos.push_back(mLinePoints[i] + normal);
383 mResultVerticiesUV.push_back(pointsUV[1]);
384 mResultVerticiesUV.push_back(baseVerticiesUV[3] + UVoffset);
385 mResultVerticiesUV.push_back(baseVerticiesUV[0] + UVoffset);
388 points[edge ? 1 : 0] = mLinePoints[i] + normal;
389 points[edge ? 0 : 1] = mLinePoints[i] - normal;
390 pointsUV[0] = baseVerticiesUV[0] + UVoffset;
391 pointsUV[1] = baseVerticiesUV[3] + UVoffset;
395 normal =
_getMiddleLine(mLinePoints[i - 1], mLinePoints[i + 1], mLinePoints[i]);
397 float sharpness =
len(normal.left, normal.top) / mLineWidth;
399 float length =
len(normal.left, normal.top);
400 normal.left *= 2 * mLineWidth / length / (sharpness - 0.5f);
401 normal.top *= 2 * mLineWidth / length / (sharpness - 0.5f);
404 lineDir = mLinePoints[i] - mLinePoints[i - 1];
405 if (lineDir.
left * normal.top - lineDir.
top * normal.left < 0)
407 normal.
left = -normal.left;
408 normal.top = -normal.top;
410 FloatPoint lineDir1 = mLinePoints[i] - mLinePoints[i - 1];
411 FloatPoint lineDir2 = mLinePoints[i + 1] - mLinePoints[i];
412 if (lineDir1.
left * lineDir2.
top - lineDir1.
top * lineDir2.
left > 0)
414 normal.
left = -normal.left;
415 normal.top = -normal.top;
420 lineDir = mLinePoints[i - 1] - mLinePoints[i];
424 normal2.
top = -normal2.
top;
427 FloatPoint UVcenter((baseVerticiesUV[0].left + baseVerticiesUV[3].left) / 2, (baseVerticiesUV[0].top + baseVerticiesUV[3].top) / 2);
431 mResultVerticiesPos.push_back(points[0]);
432 mResultVerticiesPos.push_back(mLinePoints[i] + normal);
433 mResultVerticiesPos.push_back(mLinePoints[i]);
434 mResultVerticiesUV.push_back(pointsUV[0]);
435 mResultVerticiesUV.push_back(baseVerticiesUV[0] + UVoffset);
436 mResultVerticiesUV.push_back(UVcenter + UVoffset);
438 mResultVerticiesPos.push_back(mLinePoints[i] + normal);
439 mResultVerticiesPos.push_back(mLinePoints[i] + normal2);
440 mResultVerticiesPos.push_back(mLinePoints[i]);
441 mResultVerticiesUV.push_back(baseVerticiesUV[0] + UVoffset);
442 mResultVerticiesUV.push_back(baseVerticiesUV[0] + UVoffset);
443 mResultVerticiesUV.push_back(UVcenter + UVoffset);
446 points[0] = mLinePoints[i] + normal2;
447 points[1] = mLinePoints[i] - normal2;
448 pointsUV[0] = baseVerticiesUV[0] + UVoffset;
449 pointsUV[1] = baseVerticiesUV[3] + UVoffset;
454 #ifndef MYGUI_NO_POLYGONAL_SKIN_CROPPING
465 newResultVerticiesPos.reserve(mResultVerticiesPos.size());
466 newResultVerticiesUV.reserve(mResultVerticiesPos.size());
467 for (
size_t i = 0; i < mResultVerticiesPos.size(); i += 3)
471 if (!croppedTriangle.empty())
473 FloatPoint v0 = mResultVerticiesUV[i + 2] - mResultVerticiesUV[i];
474 FloatPoint v1 = mResultVerticiesUV[i + 1] - mResultVerticiesUV[i];
476 for (
size_t j = 1; j < croppedTriangle.size() - 1; ++j)
478 newResultVerticiesPos.push_back(croppedTriangle[0]);
479 newResultVerticiesPos.push_back(croppedTriangle[j]);
480 newResultVerticiesPos.push_back(croppedTriangle[j + 1]);
493 std::swap(mResultVerticiesPos, newResultVerticiesPos);
494 std::swap(mResultVerticiesUV, newResultVerticiesUV);
503 for (
size_t i = 0; i < mResultVerticiesPos.size(); ++i)
505 mResultVerticiesPos[i].left = vertex_left_base + mResultVerticiesPos[i].left * info.
pixScaleX * 2;
506 mResultVerticiesPos[i].top = vertex_top_base + mResultVerticiesPos[i].top * info.
pixScaleY * -2;
516 result.
left /= length;
517 result.
top /= length;
518 result.
left *= mLineWidth / 2;
519 result.
top *= mLineWidth / 2;
529 line1.
left /= length;
532 line2.
left /= length;
541 result.
left /= length;
542 result.
top /= length;
545 float angle = std::acos(cos);
548 if (std::fabs(angle) < 1e-6f )
551 float width = mLineWidth / 2 / std::sin(angle);
552 result.
left *= width;