• Ищем качественного (не новичок) разработчиков Xenforo для этого форума! В идеале, чтобы ты был фулл стек программистом. Если у тебя есть что показать, то свяжись с нами по контактным данным: https://t.me/DREDD

Вопрос 3d circle imgui

  • Автор темы Автор темы RedStar
  • Дата начала Дата начала
Пользователь
Пользователь
Статус
Оффлайн
Регистрация
26 Авг 2017
Сообщения
387
Реакции
33
Всем привет. Подскажите пожалуйста как правильно реализовать рендер 3д круга без костылей с draw_line (например в саунд есп когда слишком много игроков - краш с жалобой на большое количество вертексов), а с обычной draw_list->AddPolyline и залитый круг draw_list->AddConvexPolyFilled.

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

C++:
Expand Collapse Copy
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, пожалуйста :)
 
Так все просто, просчет позиций у тебя уже есть, собираешь массив ImVec2 и просто через draw->AddPolyline(<массив с ImVec2>, <количество элементов в массиве>, <цвет>, <флаги>, <толщина> )
 
C++:
Expand Collapse Copy
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())
}
 
Назад
Сверху Снизу