Вопрос 3d circle imgui

Пользователь
Статус
Оффлайн
Регистрация
26 Авг 2017
Сообщения
386
Реакции[?]
32
Поинты[?]
8K
Всем привет. Подскажите пожалуйста как правильно реализовать рендер 3д круга без костылей с draw_line (например в саунд есп когда слишком много игроков - краш с жалобой на большое количество вертексов), а с обычной draw_list->AddPolyline и залитый круг draw_list->AddConvexPolyFilled.

У меня есть функция:

C++:
void render::render_circle_3d(const Vector vecPosition, const int32_t iPointCount, const float_t flRadius, Color a_color, float width)
{
    float_t flStep = (float_t)(3.14159265358979323846f) * 2.0f / (float_t)(iPointCount);

    for (float a = 0; a < (3.14159265358979323846f * 2.0f); a += flStep)
    {
        Vector vecStart = Vector(flRadius * cosf(a) + vecPosition.x, flRadius * sinf(a) + vecPosition.y, vecPosition.z);
        Vector vecEnd = Vector(flRadius * cosf(a + flStep) + vecPosition.x, flRadius * sinf(a + flStep) + vecPosition.y, vecPosition.z);

        Vector vecStart2D, vecEnd2D;
        if (g_interfaces.m_debug_overlay->ScreenPosition(vecStart, vecStart2D) || g_interfaces.m_debug_overlay->ScreenPosition(vecEnd, vecEnd2D))
            return;
        render_line(vecStart2D.x, vecStart2D.y, vecEnd2D.x, vecEnd2D.y, a_color, width);
    }
}
Подскажите, как ее переделать под draw_list->AddPolyline, пожалуйста :)
 
Пользователь
Статус
Оффлайн
Регистрация
10 Авг 2022
Сообщения
78
Реакции[?]
105
Поинты[?]
1K
Так все просто, просчет позиций у тебя уже есть, собираешь массив ImVec2 и просто через draw->AddPolyline(<массив с ImVec2>, <количество элементов в массиве>, <цвет>, <флаги>, <толщина> )
 
Эксперт
Статус
Оффлайн
Регистрация
30 Дек 2019
Сообщения
1,970
Реакции[?]
958
Поинты[?]
19K
C++:
void render::render_circle_3d(const Vector vecPosition, const int32_t iPointCount, const float_t flRadius, Color a_color, float width)
{
    float_t flStep = (float_t)(3.14159265358979323846f) * 2.0f / (float_t)(iPointCount);
    std::vector<ImVec2> m_points;
    for (float a = 0; a < (3.14159265358979323846f * 2.0f); a += flStep)
    {
        Vector vecStart = Vector(flRadius * cosf(a) + vecPosition.x, flRadius * sinf(a) + vecPosition.y, vecPosition.z);
        Vector vecEnd = Vector(flRadius * cosf(a + flStep) + vecPosition.x, flRadius * sinf(a + flStep) + vecPosition.y, vecPosition.z);

        Vector vecStart2D, vecEnd2D;
        if (g_interfaces.m_debug_overlay->ScreenPosition(vecStart, vecStart2D) || g_interfaces.m_debug_overlay->ScreenPosition(vecEnd, vecEnd2D))
            return;
        
        m_points.push_back(vecEnd2D.x, vecEnd2D.y);
       }
    m_draw_list->AddPolyline(m_points.data(), m_points.size(), a_color.value())
}
 
Сверху Снизу