33 mGeometryOutdated(false),
38 mCurrentColour(0xFFFFFFFF),
49 inline float len(
float x,
float y)
51 return sqrt(x * x + y * y);
56 if (_points.size() < 2)
59 mResultVerticiesPos.clear();
60 mResultVerticiesUV.clear();
61 mLinePoints = _points;
66 finalPoints.reserve(_points.size());
70 finalPoints.push_back(point);
72 for (std::vector<FloatPoint>::const_iterator iter = _points.begin() + 1; iter != _points.end(); ++iter)
76 finalPoints.push_back(*iter);
77 mLineLength +=
len(iter->left - point.
left, iter->top - point.
top);
82 mLinePoints = finalPoints;
84 #ifdef MYGUI_NO_POLYGONAL_SKIN_CROPPING
92 if (count > mVertexCount)
95 if (
nullptr != mRenderItem) mRenderItem->
reallockDrawItem(
this, mVertexCount);
113 mGeometryOutdated =
true;
115 if (
nullptr != mNode)
122 mCurrentColour = (mCurrentColour & 0x00FFFFFF) | (alpha & 0xFF000000);
124 if (
nullptr != mNode)
130 mGeometryOutdated =
true;
132 if (
nullptr != mNode)
139 bool need_update =
true;
195 mGeometryOutdated =
true;
210 if (
nullptr != mNode) mNode->
outOfDate(mRenderItem);
225 if (
nullptr != mNode)
231 MYGUI_ASSERT(!mRenderItem,
"mRenderItem must be nullptr");
240 MYGUI_ASSERT(mRenderItem,
"mRenderItem must be not nullptr");
244 mRenderItem =
nullptr;
258 if (mGeometryOutdated)
263 size_t size = mResultVerticiesPos.size();
265 for (
size_t i = 0; i < size; ++i)
267 verticies[i].
set(mResultVerticiesPos[i].left, mResultVerticiesPos[i].top, vertex_z, mResultVerticiesUV[i].left, mResultVerticiesUV[i].top, mCurrentColour);
277 mCurrentColour = (colour & 0x00FFFFFF) | (mCurrentColour & 0xFF000000);
279 if (
nullptr != mNode)
290 mCurrentTexture = _rect;
292 mGeometryOutdated =
true;
294 if (
nullptr != mNode)
300 if (mLinePoints.size() < 2)
return;
303 mGeometryOutdated =
false;
317 FloatPoint vectorU = baseVerticiesUV[1] - baseVerticiesUV[0];
318 FloatPoint vectorV = baseVerticiesUV[3] - baseVerticiesUV[0];
322 mResultVerticiesPos.clear();
323 mResultVerticiesUV.clear();
327 FloatPoint points[2] = {mLinePoints[0] + normal, mLinePoints[0] - normal};
328 FloatPoint pointsUV[2] = {baseVerticiesUV[0], baseVerticiesUV[3]};
330 float currentLength = 0.0f;
331 for (
size_t i = 1; i < mLinePoints.size(); ++i)
333 currentLength +=
len(mLinePoints[i - 1].left - mLinePoints[i].left, mLinePoints[i - 1].top - mLinePoints[i].top);
336 if (i != mLinePoints.size() - 1)
337 normal =
_getMiddleLine(mLinePoints[i - 1], mLinePoints[i + 1], mLinePoints[i]);
348 else if (
len(normal.
left, normal.
top) > mLineWidth * 1.5)
355 FloatPoint lineDir = mLinePoints[i] - mLinePoints[i - 1];
362 FloatPoint UVoffset(currentLength / mLineLength * vectorU.
left, currentLength / mLineLength * vectorU.
top);
364 mResultVerticiesPos.push_back(points[0]);
365 mResultVerticiesPos.push_back(points[1]);
366 mResultVerticiesPos.push_back(mLinePoints[i] + normal);
367 mResultVerticiesUV.push_back(pointsUV[0]);
368 mResultVerticiesUV.push_back(pointsUV[1]);
369 mResultVerticiesUV.push_back(baseVerticiesUV[0] + UVoffset);
371 mResultVerticiesPos.push_back(points[1]);
372 mResultVerticiesPos.push_back(mLinePoints[i] - normal);
373 mResultVerticiesPos.push_back(mLinePoints[i] + normal);
374 mResultVerticiesUV.push_back(pointsUV[1]);
375 mResultVerticiesUV.push_back(baseVerticiesUV[3] + UVoffset);
376 mResultVerticiesUV.push_back(baseVerticiesUV[0] + UVoffset);
378 points[edge ? 1 : 0] = mLinePoints[i] + normal;
379 points[edge ? 0 : 1] = mLinePoints[i] - normal;
380 pointsUV[0] = baseVerticiesUV[0] + UVoffset;
381 pointsUV[1] = baseVerticiesUV[3] + UVoffset;
385 normal =
_getMiddleLine(mLinePoints[i - 1], mLinePoints[i + 1], mLinePoints[i]);
387 float sharpness =
len(normal.left, normal.top) / mLineWidth;
389 float length =
len(normal.left, normal.top);
390 normal.left *= 2 * mLineWidth / length / (sharpness - 0.5f);
391 normal.top *= 2 * mLineWidth / length / (sharpness - 0.5f);
394 lineDir = mLinePoints[i] - mLinePoints[i - 1];
395 if (lineDir.
left * normal.top - lineDir.
top * normal.left < 0)
397 normal.
left = -normal.left;
398 normal.top = -normal.top;
400 FloatPoint lineDir1 = mLinePoints[i] - mLinePoints[i - 1];
401 FloatPoint lineDir2 = mLinePoints[i + 1] - mLinePoints[i];
402 if (lineDir1.
left * lineDir2.
top - lineDir1.
top * lineDir2.
left > 0)
404 normal.
left = -normal.left;
405 normal.top = -normal.top;
410 lineDir = mLinePoints[i - 1] - mLinePoints[i];
411 if ((lineDir.
left * normal2.
top - lineDir.
top * normal2.
left < 0))
414 normal2.
top = -normal2.
top;
417 FloatPoint UVcenter((baseVerticiesUV[0].left + baseVerticiesUV[3].left) / 2, (baseVerticiesUV[0].top + baseVerticiesUV[3].top) / 2);
418 mResultVerticiesPos.push_back(points[0]);
419 mResultVerticiesPos.push_back(mLinePoints[i] + normal);
420 mResultVerticiesPos.push_back(mLinePoints[i]);
421 mResultVerticiesUV.push_back(pointsUV[0]);
422 mResultVerticiesUV.push_back(baseVerticiesUV[0] + UVoffset);
423 mResultVerticiesUV.push_back(UVcenter + UVoffset);
425 mResultVerticiesPos.push_back(mLinePoints[i] + normal);
426 mResultVerticiesPos.push_back(mLinePoints[i] + normal2);
427 mResultVerticiesPos.push_back(mLinePoints[i]);
428 mResultVerticiesUV.push_back(baseVerticiesUV[0] + UVoffset);
429 mResultVerticiesUV.push_back(baseVerticiesUV[0] + UVoffset);
430 mResultVerticiesUV.push_back(UVcenter + UVoffset);
432 points[0] = mLinePoints[i] + normal2;
433 points[1] = mLinePoints[i] - normal2;
434 pointsUV[0] = baseVerticiesUV[0] + UVoffset;
435 pointsUV[1] = baseVerticiesUV[3] + UVoffset;
440 #ifndef MYGUI_NO_POLYGONAL_SKIN_CROPPING
451 newResultVerticiesPos.reserve(mResultVerticiesPos.size());
452 newResultVerticiesUV.reserve(mResultVerticiesPos.size());
453 for (
size_t i = 0; i < mResultVerticiesPos.size(); i += 3)
457 if (!croppedTriangle.empty())
459 FloatPoint v0 = mResultVerticiesUV[i + 2] - mResultVerticiesUV[i];
460 FloatPoint v1 = mResultVerticiesUV[i + 1] - mResultVerticiesUV[i];
462 for (
size_t j = 1; j < croppedTriangle.size() - 1; ++j)
464 newResultVerticiesPos.push_back(croppedTriangle[0]);
465 newResultVerticiesPos.push_back(croppedTriangle[j]);
466 newResultVerticiesPos.push_back(croppedTriangle[j + 1]);
479 std::swap(mResultVerticiesPos, newResultVerticiesPos);
480 std::swap(mResultVerticiesUV, newResultVerticiesUV);
489 for (
size_t i = 0; i < mResultVerticiesPos.size(); ++i)
491 mResultVerticiesPos[i].left = vertex_left_base + mResultVerticiesPos[i].left * info.
pixScaleX * 2;
492 mResultVerticiesPos[i].top = vertex_top_base + mResultVerticiesPos[i].top * info.
pixScaleY * -2;
502 result.
left /= length;
503 result.
top /= length;
504 result.
left *= mLineWidth / 2;
505 result.
top *= mLineWidth / 2;
515 line1.
left /= length;
518 line2.
left /= length;
527 result.
left /= length;
528 result.
top /= length;
531 float angle = acos(cos);
534 if (fabs(angle) < 1e-6 )
537 float width = mLineWidth / 2 / sin(angle);
538 result.
left *= width;