-
Автор темы
- #1
C++:
void ImDrawList::AddRectRadial(const ImVec2& p_min, const ImVec2& p_max, ImU32 center, ImU32 edge, float rounding, ImU32 background, ImDrawFlags flags)
{
rounding = ImMin(rounding, ImFabs(p_max.x - p_min.x) * (((flags & ImDrawCornerFlags_Top) == ImDrawCornerFlags_Top) || ((flags & ImDrawCornerFlags_Bot) == ImDrawCornerFlags_Bot) ? 0.5f : 1.0f) - 1.0f);
rounding = ImMin(rounding, ImFabs(p_max.y - p_min.y) * (((flags & ImDrawCornerFlags_Left) == ImDrawCornerFlags_Left) || ((flags & ImDrawCornerFlags_Right) == ImDrawCornerFlags_Right) ? 0.5f : 1.0f) - 1.0f);
PushClipRect(p_min, p_max);
float raduis = (p_max.x - p_min.x) / 2 > (p_max.y - p_min.y) / 2 ? (p_max.x - p_min.x) / 2 * 1.5f : (p_max.y - p_min.y) / 2 * 1.5f;
_PathArcToFastEx(ImVec2((p_min.x + p_max.x) / 2, (p_min.y + p_max.y) / 2), raduis, 0, IM_DRAWLIST_ARCFAST_SAMPLE_MAX, 0);
const int count = _Path.Size - 1;
unsigned int vtx_base = _VtxCurrentIdx;
PrimReserve(count * 3, count + 1);
const ImVec2 uv = _Data->TexUvWhitePixel;
PrimWriteVtx(ImVec2((p_min.x + p_max.x) / 2, (p_min.y + p_max.y) / 2), uv, center);
for (int n = 0; n < count; n++)
PrimWriteVtx(_Path[n], uv, edge);
for (int n = 0; n < count; n++)
{
PrimWriteIdx((ImDrawIdx)(vtx_base));
PrimWriteIdx((ImDrawIdx)(vtx_base + 1 + n));
PrimWriteIdx((ImDrawIdx)(vtx_base + 1 + ((n + 1) % count)));
}
_Path.Size = 0;
PopClipRect();
if (rounding > 0.0f)
{
const float rounding_tl = (flags & ImDrawCornerFlags_TopLeft) ? rounding : 0.0f;
const float rounding_tr = (flags & ImDrawCornerFlags_TopRight) ? rounding : 0.0f;
const float rounding_br = (flags & ImDrawCornerFlags_BotRight) ? rounding : 0.0f;
const float rounding_bl = (flags & ImDrawCornerFlags_BotLeft) ? rounding : 0.0f;
PathLineTo(p_min);
PathArcTo(ImVec2(p_min.x + rounding_tl, p_min.y + rounding_tl), rounding_tl, 4.820f, 3.100f);
PathFillConvex(background);
PathLineTo(ImVec2(p_max.x, p_min.y));
PathArcTo(ImVec2(p_max.x - rounding_tr, p_min.y + rounding_tr), rounding_tr, 6.3400f, 4.620f);
PathFillConvex(background);
PathLineTo(ImVec2(p_max.x, p_max.y));
PathArcTo(ImVec2(p_max.x - rounding_br, p_max.y - rounding_br), rounding_br, 7.960f, 6.240f);
PathFillConvex(background);
PathLineTo(ImVec2(p_min.x, p_max.y));
PathArcTo(ImVec2(p_min.x + rounding_bl, p_max.y - rounding_bl), rounding_bl, 9.5f, 7.770f);
PathFillConvex(background);
}
}
Последнее редактирование: