get good, get zeus, for ever
-
Автор темы
- #1

Код:
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");
}
}