Исходник C++ Imgui Speedometer

get good, get zeus, for ever
Пользователь
Статус
Оффлайн
Регистрация
1 Июн 2018
Сообщения
598
Реакции[?]
115
Поинты[?]
16K
1736526569479.png
Код:
void AddSpeedometer(float target_speed, float radius = 150.0f, float max_speed = 340.0f, ImDrawList* draw_list = ImGui::GetWindowDrawList(), ImVec2 pos_offset = ImVec2(0, 0)) {
    ImVec2 center = ImGui::GetWindowPos() + ImGui::GetWindowSize() * 0.5f + pos_offset;
    float line_thickness = 3.0f;
    float start_angle = -IM_PI * 1.25f;
    float end_angle = IM_PI * 0.25f;

    static float current_speed = 0.0f;
    current_speed = ImLerp(current_speed, target_speed, 0.1f);

    // drawing circle around speedometer
    draw_list->AddCircle(center, radius, IM_COL32(150, 50, 50, 255), 100, line_thickness);

    // drawing marking and speeds
    for (int i = 0; i <= max_speed; i += 20) {
        float angle = start_angle + (end_angle - start_angle) * (i / max_speed);
        ImVec2 mark_start = center + ImVec2(cosf(angle) * (radius - 10), sinf(angle) * (radius - 10));
        ImVec2 mark_end = center + ImVec2(cosf(angle) * radius, sinf(angle) * radius);
        draw_list->AddLine(mark_start, mark_end, IM_COL32(200, 200, 200, 255), line_thickness * 0.5f);

        // drawing all the speeds in a circle
        char mark_buffer[16];
        snprintf(mark_buffer, sizeof(mark_buffer), "%d", i);
        ImVec2 text_pos = center + ImVec2(cosf(angle) * (radius - 25), sinf(angle) * (radius - 25));
        ImVec2 text_size = ImGui::CalcTextSize(mark_buffer);
        draw_list->AddText(ImGui::GetIO().Fonts->Fonts[8], ImGui::GetIO().Fonts->Fonts[8]->FontSize, text_pos - text_size * 0.5f, IM_COL32(255, 255, 255, 255), mark_buffer);
    }

    // drawing speedometer arrow
    float speed_angle = start_angle + (end_angle - start_angle) * (current_speed / max_speed);
    ImVec2 needle_end = center + ImVec2(cosf(speed_angle) * radius, sinf(speed_angle) * radius);
    float start_thickness = line_thickness;
    float end_thickness = line_thickness * 0.5f; // Thinner at the tip
    for (float t = 0.0f; t <= 1.0f; t += 0.05f) {
        ImVec2 segment_point = center + (needle_end - center) * t;
        float thickness = start_thickness + (end_thickness - start_thickness) * t;
        draw_list->AddLine(center, segment_point, IM_COL32(255, 55, 55, 255), thickness);
    }

    // draw a circle holding the arrow of the speedometer
    float circle_radius = line_thickness * 3.0f;
    draw_list->AddCircleFilled(center, circle_radius, IM_COL32(155, 155, 155, 255));


    // drawing speed
    char buffer[32];
    snprintf(buffer, sizeof(buffer), "%.0f km/h", current_speed);
    ImVec2 text_size = ImGui::CalcTextSize(buffer);
    draw_list->AddText(ImGui::GetIO().Fonts->Fonts[8], ImGui::GetIO().Fonts->Fonts[8]->FontSize, ImVec2(center.x - text_size.x * 0.5f, center.y + text_size.y * 4.5f), IM_COL32(255, 255, 255, 255), buffer);

    // drawing checkengine icon
    if (current_speed > 30.0f) {
        ImVec2 offset_for_sigma_text = ImVec2(0, 85);
        ImVec2 text_size_engine = ImVec2(-10, -10);//sigma
        draw_list->AddText(ImGui::GetIO().Fonts->Fonts[7], ImGui::GetIO().Fonts->Fonts[7]->FontSize, center + text_size_engine + offset_for_sigma_text, IM_COL32(255, 155, 16, 255), "\ue16e");
    }
}
 
Участник
Статус
Оффлайн
Регистрация
4 Дек 2022
Сообщения
798
Реакции[?]
235
Поинты[?]
13K
Посмотреть вложение 295610
Код:
void AddSpeedometer(float target_speed, float radius = 150.0f, float max_speed = 340.0f, ImDrawList* draw_list = ImGui::GetWindowDrawList(), ImVec2 pos_offset = ImVec2(0, 0)) {
    ImVec2 center = ImGui::GetWindowPos() + ImGui::GetWindowSize() * 0.5f + pos_offset;
    float line_thickness = 3.0f;
    float start_angle = -IM_PI * 1.25f;
    float end_angle = IM_PI * 0.25f;

    static float current_speed = 0.0f;
    current_speed = ImLerp(current_speed, target_speed, 0.1f);

    // drawing circle around speedometer
    draw_list->AddCircle(center, radius, IM_COL32(150, 50, 50, 255), 100, line_thickness);

    // drawing marking and speeds
    for (int i = 0; i <= max_speed; i += 20) {
        float angle = start_angle + (end_angle - start_angle) * (i / max_speed);
        ImVec2 mark_start = center + ImVec2(cosf(angle) * (radius - 10), sinf(angle) * (radius - 10));
        ImVec2 mark_end = center + ImVec2(cosf(angle) * radius, sinf(angle) * radius);
        draw_list->AddLine(mark_start, mark_end, IM_COL32(200, 200, 200, 255), line_thickness * 0.5f);

        // drawing all the speeds in a circle
        char mark_buffer[16];
        snprintf(mark_buffer, sizeof(mark_buffer), "%d", i);
        ImVec2 text_pos = center + ImVec2(cosf(angle) * (radius - 25), sinf(angle) * (radius - 25));
        ImVec2 text_size = ImGui::CalcTextSize(mark_buffer);
        draw_list->AddText(ImGui::GetIO().Fonts->Fonts[8], ImGui::GetIO().Fonts->Fonts[8]->FontSize, text_pos - text_size * 0.5f, IM_COL32(255, 255, 255, 255), mark_buffer);
    }

    // drawing speedometer arrow
    float speed_angle = start_angle + (end_angle - start_angle) * (current_speed / max_speed);
    ImVec2 needle_end = center + ImVec2(cosf(speed_angle) * radius, sinf(speed_angle) * radius);
    float start_thickness = line_thickness;
    float end_thickness = line_thickness * 0.5f; // Thinner at the tip
    for (float t = 0.0f; t <= 1.0f; t += 0.05f) {
        ImVec2 segment_point = center + (needle_end - center) * t;
        float thickness = start_thickness + (end_thickness - start_thickness) * t;
        draw_list->AddLine(center, segment_point, IM_COL32(255, 55, 55, 255), thickness);
    }

    // draw a circle holding the arrow of the speedometer
    float circle_radius = line_thickness * 3.0f;
    draw_list->AddCircleFilled(center, circle_radius, IM_COL32(155, 155, 155, 255));


    // drawing speed
    char buffer[32];
    snprintf(buffer, sizeof(buffer), "%.0f km/h", current_speed);
    ImVec2 text_size = ImGui::CalcTextSize(buffer);
    draw_list->AddText(ImGui::GetIO().Fonts->Fonts[8], ImGui::GetIO().Fonts->Fonts[8]->FontSize, ImVec2(center.x - text_size.x * 0.5f, center.y + text_size.y * 4.5f), IM_COL32(255, 255, 255, 255), buffer);

    // drawing checkengine icon
    if (current_speed > 30.0f) {
        ImVec2 offset_for_sigma_text = ImVec2(0, 85);
        ImVec2 text_size_engine = ImVec2(-10, -10);//sigma
        draw_list->AddText(ImGui::GetIO().Fonts->Fonts[7], ImGui::GetIO().Fonts->Fonts[7]->FontSize, center + text_size_engine + offset_for_sigma_text, IM_COL32(255, 155, 16, 255), "\ue16e");
    }
}
вот этого форуму не хватало
 
PoC Life
Пользователь
Статус
Онлайн
Регистрация
22 Авг 2022
Сообщения
461
Реакции[?]
54
Поинты[?]
46K
Посмотреть вложение 295610
Код:
void AddSpeedometer(float target_speed, float radius = 150.0f, float max_speed = 340.0f, ImDrawList* draw_list = ImGui::GetWindowDrawList(), ImVec2 pos_offset = ImVec2(0, 0)) {
    ImVec2 center = ImGui::GetWindowPos() + ImGui::GetWindowSize() * 0.5f + pos_offset;
    float line_thickness = 3.0f;
    float start_angle = -IM_PI * 1.25f;
    float end_angle = IM_PI * 0.25f;

    static float current_speed = 0.0f;
    current_speed = ImLerp(current_speed, target_speed, 0.1f);

    // drawing circle around speedometer
    draw_list->AddCircle(center, radius, IM_COL32(150, 50, 50, 255), 100, line_thickness);

    // drawing marking and speeds
    for (int i = 0; i <= max_speed; i += 20) {
        float angle = start_angle + (end_angle - start_angle) * (i / max_speed);
        ImVec2 mark_start = center + ImVec2(cosf(angle) * (radius - 10), sinf(angle) * (radius - 10));
        ImVec2 mark_end = center + ImVec2(cosf(angle) * radius, sinf(angle) * radius);
        draw_list->AddLine(mark_start, mark_end, IM_COL32(200, 200, 200, 255), line_thickness * 0.5f);

        // drawing all the speeds in a circle
        char mark_buffer[16];
        snprintf(mark_buffer, sizeof(mark_buffer), "%d", i);
        ImVec2 text_pos = center + ImVec2(cosf(angle) * (radius - 25), sinf(angle) * (radius - 25));
        ImVec2 text_size = ImGui::CalcTextSize(mark_buffer);
        draw_list->AddText(ImGui::GetIO().Fonts->Fonts[8], ImGui::GetIO().Fonts->Fonts[8]->FontSize, text_pos - text_size * 0.5f, IM_COL32(255, 255, 255, 255), mark_buffer);
    }

    // drawing speedometer arrow
    float speed_angle = start_angle + (end_angle - start_angle) * (current_speed / max_speed);
    ImVec2 needle_end = center + ImVec2(cosf(speed_angle) * radius, sinf(speed_angle) * radius);
    float start_thickness = line_thickness;
    float end_thickness = line_thickness * 0.5f; // Thinner at the tip
    for (float t = 0.0f; t <= 1.0f; t += 0.05f) {
        ImVec2 segment_point = center + (needle_end - center) * t;
        float thickness = start_thickness + (end_thickness - start_thickness) * t;
        draw_list->AddLine(center, segment_point, IM_COL32(255, 55, 55, 255), thickness);
    }

    // draw a circle holding the arrow of the speedometer
    float circle_radius = line_thickness * 3.0f;
    draw_list->AddCircleFilled(center, circle_radius, IM_COL32(155, 155, 155, 255));


    // drawing speed
    char buffer[32];
    snprintf(buffer, sizeof(buffer), "%.0f km/h", current_speed);
    ImVec2 text_size = ImGui::CalcTextSize(buffer);
    draw_list->AddText(ImGui::GetIO().Fonts->Fonts[8], ImGui::GetIO().Fonts->Fonts[8]->FontSize, ImVec2(center.x - text_size.x * 0.5f, center.y + text_size.y * 4.5f), IM_COL32(255, 255, 255, 255), buffer);

    // drawing checkengine icon
    if (current_speed > 30.0f) {
        ImVec2 offset_for_sigma_text = ImVec2(0, 85);
        ImVec2 text_size_engine = ImVec2(-10, -10);//sigma
        draw_list->AddText(ImGui::GetIO().Fonts->Fonts[7], ImGui::GetIO().Fonts->Fonts[7]->FontSize, center + text_size_engine + offset_for_sigma_text, IM_COL32(255, 155, 16, 255), "\ue16e");
    }
}
мне из чита на кс делать assetto corsa типа?
 
fuck switch all my homies use else if
Пользователь
Статус
Оффлайн
Регистрация
9 Сен 2023
Сообщения
251
Реакции[?]
56
Поинты[?]
68K
Посмотреть вложение 295610
Код:
void AddSpeedometer(float target_speed, float radius = 150.0f, float max_speed = 340.0f, ImDrawList* draw_list = ImGui::GetWindowDrawList(), ImVec2 pos_offset = ImVec2(0, 0)) {
    ImVec2 center = ImGui::GetWindowPos() + ImGui::GetWindowSize() * 0.5f + pos_offset;
    float line_thickness = 3.0f;
    float start_angle = -IM_PI * 1.25f;
    float end_angle = IM_PI * 0.25f;

    static float current_speed = 0.0f;
    current_speed = ImLerp(current_speed, target_speed, 0.1f);

    // drawing circle around speedometer
    draw_list->AddCircle(center, radius, IM_COL32(150, 50, 50, 255), 100, line_thickness);

    // drawing marking and speeds
    for (int i = 0; i <= max_speed; i += 20) {
        float angle = start_angle + (end_angle - start_angle) * (i / max_speed);
        ImVec2 mark_start = center + ImVec2(cosf(angle) * (radius - 10), sinf(angle) * (radius - 10));
        ImVec2 mark_end = center + ImVec2(cosf(angle) * radius, sinf(angle) * radius);
        draw_list->AddLine(mark_start, mark_end, IM_COL32(200, 200, 200, 255), line_thickness * 0.5f);

        // drawing all the speeds in a circle
        char mark_buffer[16];
        snprintf(mark_buffer, sizeof(mark_buffer), "%d", i);
        ImVec2 text_pos = center + ImVec2(cosf(angle) * (radius - 25), sinf(angle) * (radius - 25));
        ImVec2 text_size = ImGui::CalcTextSize(mark_buffer);
        draw_list->AddText(ImGui::GetIO().Fonts->Fonts[8], ImGui::GetIO().Fonts->Fonts[8]->FontSize, text_pos - text_size * 0.5f, IM_COL32(255, 255, 255, 255), mark_buffer);
    }

    // drawing speedometer arrow
    float speed_angle = start_angle + (end_angle - start_angle) * (current_speed / max_speed);
    ImVec2 needle_end = center + ImVec2(cosf(speed_angle) * radius, sinf(speed_angle) * radius);
    float start_thickness = line_thickness;
    float end_thickness = line_thickness * 0.5f; // Thinner at the tip
    for (float t = 0.0f; t <= 1.0f; t += 0.05f) {
        ImVec2 segment_point = center + (needle_end - center) * t;
        float thickness = start_thickness + (end_thickness - start_thickness) * t;
        draw_list->AddLine(center, segment_point, IM_COL32(255, 55, 55, 255), thickness);
    }

    // draw a circle holding the arrow of the speedometer
    float circle_radius = line_thickness * 3.0f;
    draw_list->AddCircleFilled(center, circle_radius, IM_COL32(155, 155, 155, 255));


    // drawing speed
    char buffer[32];
    snprintf(buffer, sizeof(buffer), "%.0f km/h", current_speed);
    ImVec2 text_size = ImGui::CalcTextSize(buffer);
    draw_list->AddText(ImGui::GetIO().Fonts->Fonts[8], ImGui::GetIO().Fonts->Fonts[8]->FontSize, ImVec2(center.x - text_size.x * 0.5f, center.y + text_size.y * 4.5f), IM_COL32(255, 255, 255, 255), buffer);

    // drawing checkengine icon
    if (current_speed > 30.0f) {
        ImVec2 offset_for_sigma_text = ImVec2(0, 85);
        ImVec2 text_size_engine = ImVec2(-10, -10);//sigma
        draw_list->AddText(ImGui::GetIO().Fonts->Fonts[7], ImGui::GetIO().Fonts->Fonts[7]->FontSize, center + text_size_engine + offset_for_sigma_text, IM_COL32(255, 155, 16, 255), "\ue16e");
    }
}
брат спасибо щя в раст себе добавлю чтоб когда в машину сел сразу понял что это лаборгини авентадор
 
Сверху Снизу