276 if (mLinePoints.size() < 2)
281 mGeometryOutdated =
false;
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
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;