• Я зарабатываю 100 000 RUB / месяц на этом сайте!

    А знаешь как? Я всего-лишь публикую (создаю темы), а админ мне платит. Трачу деньги на мороженое, робуксы и сервера в Minecraft. А ещё на паль из Китая. 

    Хочешь так же? Пиши и узнавай условия: https://t.me/alex_redact
    Реклама: https://t.me/yougame_official

Исходник Imgui gradient text

Stop Staring At the Shadows
Участник
Участник
Статус
Оффлайн
Регистрация
10 Окт 2020
Сообщения
535
Реакции
508
чото ударило в голову и наебашил это пока пил кофе и ел булку с маком, может кому пригодится
video:
ss: 1664962812472.png

upd for 10.10.22:
imgui_widgets.cpp:
Expand Collapse Copy
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]);
    }
}
 
Последнее редактирование:
чото ударило в голову и наебашил это пока пил кофе и ел булку с маком, может кому пригодится
video:
ss:Посмотреть вложение 223466
imgui_widgets.cpp:
Expand Collapse Copy
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, там получится без костылей и плавность будет даже немного лучше.
 
/del )))
 
Последнее редактирование:
каким образом это может считаться костылём когда функция так и работает? за счет линейного переливания яркости шейдеров, создаётся эффект плавного градиента.
и что именно я должен посмотреть в РендерТексте?
AddText вызывает RenderText
В RenderText уже отрисовываются глифы, и делают это в цикле.
Ты же в свою очередь функцию предназначенную для множественной отрисовки вызываешь уже в своем цикле.
На производительность это влияния не окажет, но это логически неправильно.
До кучи использование ItemAdd уместно далеко не во всех ситуациях.

В общем не самая плохая реализация, но даже сам фреймворк предполагает другую.
 
До кучи использование ItemAdd уместно далеко не во всех ситуациях.
добавил это чисто что-бы тем кто функцию эту будет брать, было удобней работать с ней в самом меню, т.е. задать какие либо значения на {IsItemClicked, IsItemHovered} и тому подобное
Конкретно здесь оно уместно.

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

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

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

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


здесь все сделано правильно, создавать еще 1 копию функции - как раз решение дауна, который не знает до чего уже доебаться.
оп просто оверрайтит уже добавленные вертексы, что в данном случае ок, так можно и стоит делать. только вот рендерить 2 раза текст не нужно, к чему тут синус и косинус считается когда градиент слева направо тоже не вдавался, но этого тут быть тоже не должно.
Я и не говорил о создании 2й функции...
Это все можно и в одной функции сделать, просто с разными аргументами.
 
только вот рендерить 2 раза текст не нужно
только щас увидел что рендер текста внутри цикла, согласен, my bad, спасибо что подметил, отредачил.

P.S. там оказывается ещё 125 яркости стояло на тексте
 
При выводе текста в меню, текст появляется в отдельном окне "debug". В чем может быть проблема?
 
Назад
Сверху Снизу