Исходник Imgui gradient text

I Want to Die in New Orleans
Участник
Статус
Оффлайн
Регистрация
10 Окт 2020
Сообщения
511
Реакции[?]
493
Поинты[?]
82K
чото ударило в голову и наебашил это пока пил кофе и ел булку с маком, может кому пригодится
video:
ss:1664962812472.png

upd for 10.10.22:
imgui_widgets.cpp:
void ImGui::TextGradiented(const char* text, ImU32 leftcolor, ImU32 rightcolor, float smooth = 175) {

   
ImGuiWindow* window = GetCurrentWindow();
    if (window->SkipItems)
        return;

    const ImVec2 pos = window->DC.CursorPos;
    ImDrawList* draw_list = window->DrawList;

    ImGuiContext& g = *GImGui;
    const ImGuiStyle& style = g.Style;
    const ImGuiID id = window->GetID(text);
    const ImVec2 size = CalcTextSize(text);

    const ImRect bb(pos, ImVec2(pos.x + size.x, pos.y + size.y));
    ItemSize(bb, style.FramePadding.y);
    if (!ItemAdd(bb, id))
        return;


    const ImU32 col_white = IM_COL32(255, 255, 255, 255);
    float centeredvertex = ImMax((int)smooth, 35);
    float vertex_out = centeredvertex * 0.50f;
    float text_inner = vertex_out - centeredvertex;
    const int vert_start_idx = draw_list->VtxBuffer.Size;
    draw_list->AddText(pos, col_white, text);
    const int vert_end_idx = draw_list->VtxBuffer.Size;
    for (int n = 0; n < 1; n++)
    {
        const ImU32 col_hues[2] = { leftcolor, rightcolor };
        ImVec2 textcenter(pos.x + (size.x / 2), pos.y + (size.y / 2));

        const float a0 = (n) / 6.0f * 2.0f * IM_PI - (0.5f / vertex_out);
        const float a1 = (n + 1.0f) / 6.0f * 2.0f * IM_PI + (0.5f / vertex_out);


        ImVec2 gradient_p0(textcenter.x + ImCos(a0) * text_inner, textcenter.y + ImSin(a0) * text_inner);
        ImVec2 gradient_p1(textcenter.x + ImCos(a1) * text_inner, textcenter.y + ImSin(a1) * text_inner);
        ShadeVertsLinearColorGradientKeepAlpha(draw_list, vert_start_idx, vert_end_idx, gradient_p0, gradient_p1, col_hues[n], col_hues[n + 1]);
    }
}
 
Последнее редактирование:
I'm watching you
Участник
Статус
Оффлайн
Регистрация
7 Фев 2020
Сообщения
752
Реакции[?]
241
Поинты[?]
3K
чото ударило в голову и наебашил это пока пил кофе и ел булку с маком, может кому пригодится
video:
ss:Посмотреть вложение 223466
imgui_widgets.cpp:
void ImGui::TextGradiented(const char* text, ImU32 leftcolor, ImU32 rightcolor, float smooth = 175) {

    ImGuiWindow* window = GetCurrentWindow();
    if (window->SkipItems)
        return;

    const ImVec2 pos = window->DC.CursorPos;
    ImDrawList* draw_list = window->DrawList;

    ImGuiContext& g = *GImGui;
    const ImGuiStyle& style = g.Style;
    const ImGuiID id = window->GetID(text);
    const ImVec2 size = CalcTextSize(text);

    const ImRect bb(pos, ImVec2(pos.x + size.x, pos.y + size.y));
    ItemSize(bb, style.FramePadding.y);
    if (!ItemAdd(bb, id))
        return;
         

    const ImU32 col_white = IM_COL32(255, 255, 255, 125);
    float centeredvertex = ImMax((int)smooth, 35);
    float vertex_out = centeredvertex * 0.50f;
    float text_inner = vertex_out - centeredvertex;
    for (int n = 0; n < 1; n++)
    {
        const ImU32 col_hues[2] = { leftcolor, rightcolor };
        ImVec2 textcenter(pos.x + (size.x / 2), pos.y + (size.y / 2));

        const float a0 = (n) / 6.0f * 2.0f * IM_PI - (0.5f / vertex_out);
        const float a1 = (n + 1.0f) / 6.0f * 2.0f * IM_PI + (0.5f / vertex_out);
        const int vert_start_idx = draw_list->VtxBuffer.Size;
        draw_list->AddText(pos, col_white, text);
        const int vert_end_idx = draw_list->VtxBuffer.Size;

        ImVec2 gradient_p0(textcenter.x + ImCos(a0) * text_inner, textcenter.y + ImSin(a0) * text_inner);
        ImVec2 gradient_p1(textcenter.x + ImCos(a1) * text_inner, textcenter.y + ImSin(a1) * text_inner);
        ShadeVertsLinearColorGradientKeepAlpha(draw_list, vert_start_idx, vert_end_idx, gradient_p0, gradient_p1, col_hues[n], col_hues[n + 1]);
    }
}
Выглядит хорошо, но это костыль.
Посмотри в саму функцию RenderText, там получится без костылей и плавность будет даже немного лучше.
 
I Want to Die in New Orleans
Участник
Статус
Оффлайн
Регистрация
10 Окт 2020
Сообщения
511
Реакции[?]
493
Поинты[?]
82K
/del )))
 
Последнее редактирование:
I'm watching you
Участник
Статус
Оффлайн
Регистрация
7 Фев 2020
Сообщения
752
Реакции[?]
241
Поинты[?]
3K
каким образом это может считаться костылём когда функция так и работает? за счет линейного переливания яркости шейдеров, создаётся эффект плавного градиента.
и что именно я должен посмотреть в РендерТексте?
AddText вызывает RenderText
В RenderText уже отрисовываются глифы, и делают это в цикле.
Ты же в свою очередь функцию предназначенную для множественной отрисовки вызываешь уже в своем цикле.
На производительность это влияния не окажет, но это логически неправильно.
До кучи использование ItemAdd уместно далеко не во всех ситуациях.

В общем не самая плохая реализация, но даже сам фреймворк предполагает другую.
 
I Want to Die in New Orleans
Участник
Статус
Оффлайн
Регистрация
10 Окт 2020
Сообщения
511
Реакции[?]
493
Поинты[?]
82K
До кучи использование ItemAdd уместно далеко не во всех ситуациях.
добавил это чисто что-бы тем кто функцию эту будет брать, было удобней работать с ней в самом меню, т.е. задать какие либо значения на {IsItemClicked, IsItemHovered} и тому подобное
Конкретно здесь оно уместно.

В общем не самая плохая реализация, но даже сам фреймворк предполагает другую.
сам фреймворк конкретно в этом случае абсолютно ничего не предлагает кроме ShadeVertsLinearColorGradientKeepAlpha, иначе я бы и не стал делать подобную функцию.

в общем я понимаю о чем ты пишешь, но не понимаю каким образом ты хочешь это реализовать, если ты сделаешь подобное и скинешь посмотреть, то я тебя пойму и признаю что у меня костыль, а пока что я честно говоря так не считаю.
 
GDPR_Anonymous
Пользователь
Статус
Оффлайн
Регистрация
17 Фев 2017
Сообщения
362
Реакции[?]
133
Поинты[?]
0
за счет линейного переливания яркости шейдеров, создаётся эффект плавного градиента
что написал, сам понял?
выглядит так, будто где то услышал слово, а что оно значит не знаешь, и пытаешься хоть где то впихнуть

AddText вызывает RenderText
В RenderText уже отрисовываются глифы, и делают это в цикле.
Ты же в свою очередь функцию предназначенную для множественной отрисовки вызываешь уже в своем цикле.
На производительность это влияния не окажет, но это логически неправильно.
До кучи использование ItemAdd уместно далеко не во всех ситуациях.

В общем не самая плохая реализация, но даже сам фреймворк предполагает другую.
здесь все сделано правильно, создавать еще 1 копию функции - как раз решение дауна, который не знает до чего уже доебаться.
оп просто оверрайтит уже добавленные вертексы, что в данном случае ок, так можно и стоит делать. только вот рендерить 2 раза текст не нужно, к чему тут синус и косинус считается когда градиент слева направо тоже не вдавался, но этого тут быть тоже не должно.
 
I'm watching you
Участник
Статус
Оффлайн
Регистрация
7 Фев 2020
Сообщения
752
Реакции[?]
241
Поинты[?]
3K
что написал, сам понял?
выглядит так, будто где то услышал слово, а что оно значит не знаешь, и пытаешься хоть где то впихнуть


здесь все сделано правильно, создавать еще 1 копию функции - как раз решение дауна, который не знает до чего уже доебаться.
оп просто оверрайтит уже добавленные вертексы, что в данном случае ок, так можно и стоит делать. только вот рендерить 2 раза текст не нужно, к чему тут синус и косинус считается когда градиент слева направо тоже не вдавался, но этого тут быть тоже не должно.
Я и не говорил о создании 2й функции...
Это все можно и в одной функции сделать, просто с разными аргументами.
 
I Want to Die in New Orleans
Участник
Статус
Оффлайн
Регистрация
10 Окт 2020
Сообщения
511
Реакции[?]
493
Поинты[?]
82K
только вот рендерить 2 раза текст не нужно
только щас увидел что рендер текста внутри цикла, согласен, my bad, спасибо что подметил, отредачил.

P.S. там оказывается ещё 125 яркости стояло на тексте
 
Пользователь
Статус
Оффлайн
Регистрация
26 Авг 2017
Сообщения
386
Реакции[?]
32
Поинты[?]
8K
При выводе текста в меню, текст появляется в отдельном окне "debug". В чем может быть проблема?
 
Эксперт
Статус
Оффлайн
Регистрация
14 Июл 2019
Сообщения
1,102
Реакции[?]
496
Поинты[?]
31K
Сверху Снизу