C++ Вопрос [Решено] Rotate ImGui::Text

Начинающий
Статус
Оффлайн
Регистрация
26 Май 2019
Сообщения
114
Реакции[?]
21
Поинты[?]
4K
Привет. Вопрос таков.
К примеру у меня есть ImGui::Text("Aboba");
Как мне его повернуть на 90 градусов?

Есть пару решений (Нашёл на просторах интернета)
C++:
int rotation_start_index;
void ImRotateStart()
{
    rotation_start_index = ImGui::GetWindowDrawList()->VtxBuffer.Size;
}

ImVec2 ImRotationCenter()
{
    ImVec2 l(FLT_MAX, FLT_MAX), u(-FLT_MAX, -FLT_MAX); // bounds

    const auto& buf = ImGui::GetWindowDrawList()->VtxBuffer;
    for (int i = rotation_start_index; i < buf.Size; i++)
        l = ImMin(l, buf[i].pos), u = ImMax(u, buf[i].pos);

    return ImVec2((l.x+u.x)/2, (l.y+u.y)/2); // or use _ClipRectStack?
}

ImVec2 operator-(const ImVec2& l, const ImVec2& r) { return{ l.x - r.x, l.y - r.y }; }

void ImRotateEnd(float rad, ImVec2 center = ImRotationCenter())
{
    float s=sin(rad), c=cos(rad);
    center = ImRotate(center, s, c) - center;

    auto& buf = ImGui::GetWindowDrawList()->VtxBuffer;
    for (int i = rotation_start_index; i < buf.Size; i++)
        buf[i].pos = ImRotate(buf[i].pos, s, c) - center;
}

void ImRotateDemo()
{
ImRotateStart();
    ImGui::Text("Текст");
    ImRotateEnd(0.005f*::GetTickCount()*!ImGui::IsItemHovered());
}
Он постоянно поворачивает текст (вертит им как хочет). Я делал так чтобы он был фиксированным, но он считает не в градусах, а в радианах.
Если я через
C++:
void ImRotateEnd(float degrees, ImVec2 center = ImRotationCenter()) {
    float radians = degrees * (IM_PI / 180.0f);
    float s = sin(radians), c = cos(radians);
    center = ImRotate(center, s, c) - center;

    auto& buf = ImGui::GetWindowDrawList()->VtxBuffer;
    for (int i = rotation_start_index; i < buf.Size; i++)
        buf[i].pos = ImRotate(buf[i].pos, s, c) - center;
}
перевожу в градусы, то поворот текста в принципе перестаёт работать.

Подскажите, как же всё таки поворачивать текст именно в градусах...
 
Начинающий
Статус
Оффлайн
Регистрация
26 Май 2019
Сообщения
114
Реакции[?]
21
Поинты[?]
4K
Решение найдено:

Code:
#include <cmath>

constexpr float deg2rad(float degrees) {
    return degrees * (3.14159265358979323846f / 180.0f);
}

int rotation_start_index;
void ImRotateStart() {
    rotation_start_index = ImGui::GetWindowDrawList()->VtxBuffer.Size;
}

ImVec2 ImRotationCenter() {
    ImVec2 l(FLT_MAX, FLT_MAX), u(-FLT_MAX, -FLT_MAX);

    const auto& buf = ImGui::GetWindowDrawList()->VtxBuffer;
    for (int i = rotation_start_index; i < buf.Size; i++) {
        l = ImMin(l, buf[i].pos);
        u = ImMax(u, buf[i].pos);
    }

    return ImVec2((l.x + u.x) / 2, (l.y + u.y) / 2); // _ClipRectStack
}

ImVec2 ImRotates(const ImVec2& v, float s, float c) {
    return ImVec2(v.x * c - v.y * s, v.x * s + v.y * c);
}

ImVec2 operator-(const ImVec2& l, const ImVec2& r) {
    return ImVec2(l.x - r.x, l.y - r.y);
}

void ImRotateEnd(float rad, ImVec2 center = ImRotationCenter()) {
    float s = sinf(rad), c = cosf(rad);
    center = ImRotates(center, s, c) - center;

    auto& buf = ImGui::GetWindowDrawList()->VtxBuffer;
    for (int i = rotation_start_index; i < buf.Size; i++) {
        buf[i].pos = ImRotates(buf[i].pos, s, c) - center;
    }
}

void RenderFixedRotatedText(ImVec2 pos, const char* text, float angle_degrees) {
    ImDrawList* draw_list = ImGui::GetWindowDrawList();
    ImGui::SetCursorScreenPos(pos);
    ImRotateStart();
    draw_list->AddText(pos, IM_COL32(255, 255, 255, 255), text);
    ImRotateEnd(deg2rad(angle_degrees));
}

Used:
            ImVec2 pos = ImGui::GetCursorScreenPos();
            RenderFixedRotatedText(pos, "Aboba", 90.0f);
 
Сверху Снизу