278 if (mLinePoints.size() < 2)
283 mGeometryOutdated =
false;
297 FloatPoint vectorU = baseVerticiesUV[1] - baseVerticiesUV[0];
302 mResultVerticiesPos.clear();
303 mResultVerticiesUV.clear();
307 FloatPoint points[2] = {mLinePoints[0] + normal, mLinePoints[0] - normal};
308 FloatPoint pointsUV[2] = {baseVerticiesUV[0], baseVerticiesUV[3]};
314 float currentLength = 0.0f;
315 for (
size_t i = 1; i < mLinePoints.size(); ++i)
317 if (mLineStroke != 0)
320 if (stroke == mLineStroke)
327 currentLength +=
len(mLinePoints[i - 1].left - mLinePoints[i].left, mLinePoints[i - 1].top - mLinePoints[i].top);
330 if (i != mLinePoints.size() - 1)
331 normal =
_getMiddleLine(mLinePoints[i - 1], mLinePoints[i + 1], mLinePoints[i]);
342 else if (
len(normal.
left, normal.
top) > mLineWidth * 1.5f)
349 FloatPoint lineDir = mLinePoints[i] - mLinePoints[i - 1];
356 FloatPoint UVoffset(currentLength / mLineLength * vectorU.
left, currentLength / mLineLength * vectorU.
top);
360 mResultVerticiesPos.push_back(points[0]);
361 mResultVerticiesPos.push_back(points[1]);
362 mResultVerticiesPos.push_back(mLinePoints[i] + normal);
363 mResultVerticiesUV.push_back(pointsUV[0]);
364 mResultVerticiesUV.push_back(pointsUV[1]);
365 mResultVerticiesUV.push_back(baseVerticiesUV[0] + UVoffset);
367 mResultVerticiesPos.push_back(points[1]);
368 mResultVerticiesPos.push_back(mLinePoints[i] - normal);
369 mResultVerticiesPos.push_back(mLinePoints[i] + normal);
370 mResultVerticiesUV.push_back(pointsUV[1]);
371 mResultVerticiesUV.push_back(baseVerticiesUV[3] + UVoffset);
372 mResultVerticiesUV.push_back(baseVerticiesUV[0] + UVoffset);
375 points[edge ? 1 : 0] = mLinePoints[i] + normal;
376 points[edge ? 0 : 1] = mLinePoints[i] - normal;
377 pointsUV[0] = baseVerticiesUV[0] + UVoffset;
378 pointsUV[1] = baseVerticiesUV[3] + UVoffset;
382 normal =
_getMiddleLine(mLinePoints[i - 1], mLinePoints[i + 1], mLinePoints[i]);
384 float sharpness =
len(normal.left, normal.top) / mLineWidth;
386 float length =
len(normal.left, normal.top);
387 normal.left *= 2 * mLineWidth / length / (sharpness - 0.5f);
388 normal.top *= 2 * mLineWidth / length / (sharpness - 0.5f);
391 lineDir = mLinePoints[i] - mLinePoints[i - 1];
392 if (lineDir.
left * normal.top - lineDir.
top * normal.left < 0)
394 normal.left = -normal.left;
395 normal.top = -normal.top;
397 FloatPoint lineDir1 = mLinePoints[i] - mLinePoints[i - 1];
398 FloatPoint lineDir2 = mLinePoints[i + 1] - mLinePoints[i];
399 if (lineDir1.
left * lineDir2.
top - lineDir1.
top * lineDir2.
left > 0)
401 normal.left = -normal.left;
402 normal.top = -normal.top;
407 lineDir = mLinePoints[i - 1] - mLinePoints[i];
411 normal2.
top = -normal2.
top;
414 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);
433 points[0] = mLinePoints[i] + normal2;
434 points[1] = mLinePoints[i] - normal2;
435 pointsUV[0] = baseVerticiesUV[0] + UVoffset;
436 pointsUV[1] = baseVerticiesUV[3] + UVoffset;
441#ifndef MYGUI_NO_POLYGONAL_SKIN_CROPPING
452 newResultVerticiesPos.reserve(mResultVerticiesPos.size());
453 newResultVerticiesUV.reserve(mResultVerticiesPos.size());
454 for (
size_t i = 0; i < mResultVerticiesPos.size(); i += 3)
458 if (!croppedTriangle.empty())
460 FloatPoint v0 = mResultVerticiesUV[i + 2] - mResultVerticiesUV[i];
461 FloatPoint v1 = mResultVerticiesUV[i + 1] - mResultVerticiesUV[i];
463 for (
size_t j = 1; j < croppedTriangle.size() - 1; ++j)
465 newResultVerticiesPos.push_back(croppedTriangle[0]);
466 newResultVerticiesPos.push_back(croppedTriangle[j]);
467 newResultVerticiesPos.push_back(croppedTriangle[j + 1]);
480 std::swap(mResultVerticiesPos, newResultVerticiesPos);
481 std::swap(mResultVerticiesUV, newResultVerticiesUV);
490 for (
size_t i = 0; i < mResultVerticiesPos.size(); ++i)
492 mResultVerticiesPos[i].left = vertex_left_base + mResultVerticiesPos[i].left * info.
pixScaleX * 2;
493 mResultVerticiesPos[i].top = vertex_top_base + mResultVerticiesPos[i].top * info.
pixScaleY * -2;