Исходник Radial Gradient 2D

Пользователь
Статус
Оффлайн
Регистрация
25 Мар 2021
Сообщения
161
Реакции[?]
70
Поинты[?]
27K
C++:
void CRender::CircleGlow(const Vector& center, Color outerColor, Color innerColor, float radius) {
    int num_verts = radius * 6;
    float step = 6.283185f / num_verts;

    draw_list->PrimReserve(num_verts * 3, num_verts + 2);
    auto uv = draw_list->_Data->TexUvWhitePixel;
    auto o_c = outerColor.im();
    auto i_c = innerColor.im();

    unsigned int vtx_base = draw_list->_VtxCurrentIdx;

    for (int i = 0; i < num_verts + 1; i++)
        draw_list->PrimWriteVtx(ImVec2(std::cos(step * i) * radius + center.x, std::sin(step * i) * radius + center.x), uv, o_c);
    draw_list->PrimWriteVtx(center.im(), uv, i_c);

    for (int i = 0; i < num_verts; i++) {
        draw_list->PrimWriteIdx(vtx_base + i);
        draw_list->PrimWriteIdx(vtx_base + i + 1);
        draw_list->PrimWriteIdx(vtx_base + num_verts + 1); // center vertex
    }
}
Enjoy
 
Забаненный
Статус
Оффлайн
Регистрация
3 Авг 2022
Сообщения
37
Реакции[?]
15
Поинты[?]
14K
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
+rep лучше чем у потрошителя
 
Эксперт
Статус
Оффлайн
Регистрация
30 Дек 2019
Сообщения
1,967
Реакции[?]
958
Поинты[?]
19K
C++:
void CRender::CircleGlow(const Vector& center, Color outerColor, Color innerColor, float radius) {
    int num_verts = radius * 6;
    float step = 6.283185f / num_verts;

    draw_list->PrimReserve(num_verts * 3, num_verts + 2);
    auto uv = draw_list->_Data->TexUvWhitePixel;
    auto o_c = outerColor.im();
    auto i_c = innerColor.im();

    unsigned int vtx_base = draw_list->_VtxCurrentIdx;

    for (int i = 0; i < num_verts + 1; i++)
        draw_list->PrimWriteVtx(ImVec2(std::cos(step * i) * radius + center.x, std::sin(step * i) * radius + center.x), uv, o_c);
    draw_list->PrimWriteVtx(center.im(), uv, i_c);

    for (int i = 0; i < num_verts; i++) {
        draw_list->PrimWriteIdx(vtx_base + i);
        draw_list->PrimWriteIdx(vtx_base + i + 1);
        draw_list->PrimWriteIdx(vtx_base + num_verts + 1); // center vertex
    }
}
Enjoy
Ура, люди научились гуглить, спасибо за репост кода 22 года!
когда 3д ждать?
 
mindset studio — yougame.biz/threads/284270
Дизайнер
Статус
Оффлайн
Регистрация
26 Дек 2018
Сообщения
280
Реакции[?]
266
Поинты[?]
86K
бля
3d:
void render::world_circle_gradient(vector pos, float radius, clr color_in, clr color_out)
{
    im_vec2 center; vector global_pos;

    Math::w2s(vector(pos), global_pos);
    center = im_vec2(global_pos.x, global_pos.y);
    drawlist->PathArcToFast(center, radius, 0, 48);

    const int count = drawlist->_Path.Size - 1;
    float step = (pi * 2.0f) / (count + 1);
    std::vector<im_vec2> point;

    for (float lat = 0.f; lat <= pi * 2.0f; lat += step)
    {
        const auto& point_3d = vector(sin(lat), cos(lat), 0.f) * radius;
        vector point_2d;

        if (Math::w2s(vector(pos) + point_3d, point_2d))
            point.push_back(im_vec2(point_2d.x, point_2d.y));
    }

    if (color_in.a() == 0 && color_out.a() == 0 || radius < 0.5f || point.size() < count + 1)
        return;

    unsigned int vtx_base = drawlist->_VtxCurrentIdx;
    drawlist->PrimReserve(count * 3, count + 1);

    const im_vec2 uv = drawlist->_Data->TexUvWhitePixel;
    drawlist->PrimWriteVtx(center, uv, u32(color_in));

    for (int n = 0; n < count; n++)
        drawlist->PrimWriteVtx(point[n + 1], uv, u32(color_out));

    for (int n = 0; n < count; n++)
    {
        drawlist->PrimWriteIdx((ImDrawIdx)(vtx_base));
        drawlist->PrimWriteIdx((ImDrawIdx)(vtx_base + 1 + n));
        drawlist->PrimWriteIdx((ImDrawIdx)(vtx_base + 1 + ((n + 1) % count)));
    }

    drawlist->_Path.Size = 0;
}
 
ЧВК EB_LAN
Забаненный
Статус
Оффлайн
Регистрация
12 Сен 2021
Сообщения
425
Реакции[?]
121
Поинты[?]
162K
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
бля
3d:
void render::world_circle_gradient(vector pos, float radius, clr color_in, clr color_out)
{
    im_vec2 center; vector global_pos;

    Math::w2s(vector(pos), global_pos);
    center = im_vec2(global_pos.x, global_pos.y);
    drawlist->PathArcToFast(center, radius, 0, 48);

    const int count = drawlist->_Path.Size - 1;
    float step = (pi * 2.0f) / (count + 1);
    std::vector<im_vec2> point;

    for (float lat = 0.f; lat <= pi * 2.0f; lat += step)
    {
        const auto& point_3d = vector(sin(lat), cos(lat), 0.f) * radius;
        vector point_2d;

        if (Math::w2s(vector(pos) + point_3d, point_2d))
            point.push_back(im_vec2(point_2d.x, point_2d.y));
    }

    if (color_in.a() == 0 && color_out.a() == 0 || radius < 0.5f || point.size() < count + 1)
        return;

    unsigned int vtx_base = drawlist->_VtxCurrentIdx;
    drawlist->PrimReserve(count * 3, count + 1);

    const im_vec2 uv = drawlist->_Data->TexUvWhitePixel;
    drawlist->PrimWriteVtx(center, uv, u32(color_in));

    for (int n = 0; n < count; n++)
        drawlist->PrimWriteVtx(point[n + 1], uv, u32(color_out));

    for (int n = 0; n < count; n++)
    {
        drawlist->PrimWriteIdx((ImDrawIdx)(vtx_base));
        drawlist->PrimWriteIdx((ImDrawIdx)(vtx_base + 1 + n));
        drawlist->PrimWriteIdx((ImDrawIdx)(vtx_base + 1 + ((n + 1) % count)));
    }

    drawlist->_Path.Size = 0;
}
спасибо за code style snake_case
 
Сверху Снизу