C++ Вопрос Dear ImGui DPI Scaling РЕШЕНО

Начинающий
Статус
Оффлайн
Регистрация
18 Июл 2022
Сообщения
111
Реакции[?]
26
Поинты[?]
2K
О великие гуру имгуи, нужна ваша помощь!!!11!
Воспользовался этим гайдом " гайд ", обновив последную версию имгуи под копирку отсюда "
Пожалуйста, авторизуйтесь для просмотра ссылки.
", все прекрасно скейлится, но почему-то курсор улетает куда-то вправый нижний угол (когда идет изменения скейла) .
wdnuY-HLj4w.jpg
Также заметил, что когда наступает бездействие в окне рендера, координаты курсора становятся запредельными числами, не знаю с чем связано.
J0cc83AjQlA.jpg
Во второй ссылке не все, что нужно вставить имеется? Или я где-то лоханулся.
Пожалуйста, авторизуйтесь для просмотра ссылки.

VT не знаю зачем нужен, этож сурс епта :roflanPominki:
 
Последнее редактирование:
Начинающий
Статус
Оффлайн
Регистрация
18 Июл 2022
Сообщения
111
Реакции[?]
26
Поинты[?]
2K
Заметив еще пару странностей, ТОЛЬКО при выполнении
C++:
io.MousePos.x /= dpi_scale;
io.MousePos.y /= dpi_scale;
положение курсора начинает дико косоебить в разные стороны
 
Пользователь
Статус
Оффлайн
Регистрация
23 Окт 2020
Сообщения
98
Реакции[?]
46
Поинты[?]
0
Заметив еще пару странностей, ТОЛЬКО при выполнении
C++:
io.MousePos.x /= dpi_scale;
io.MousePos.y /= dpi_scale;
положение курсора начинает дико косоебить в разные стороны
Я не шарю в имгуи но может попробовать умножать, вдруг поможет.
C++:
io.MousePos.x *= dpi_scale;
io.MousePos.y *= dpi_scale;
Еще вариант скорее всего: Когда ты получаешь координаты мышки используя
GetCursorPos();
Нужно использовать
ScreenToClient();
 
Последнее редактирование:
Начинающий
Статус
Оффлайн
Регистрация
18 Июл 2022
Сообщения
111
Реакции[?]
26
Поинты[?]
2K
Я не шарю в имгуи но может попробовать умножать, вдруг поможет.
Умножение уже до этого пробовал.
UPD:
Я нашел как можно заскейлить. Вот фикс проблемы, если это кому-то нужно, хотя я сомневаюсь...
imgui.cpp
C++:
void ImGuiIO::AddMousePosEvent(float x, float y)
{
    ImGuiContext& g = *GImGui;
    IM_ASSERT(&g.IO == this && "Can only add events to current context.");
    if (!AppAcceptingEvents)
        return;

    // Apply same flooring as UpdateMouseInputs()
    ImVec2 pos((x > -FLT_MAX) ? ImFloorSigned(x) : x, (y > -FLT_MAX) ? ImFloorSigned(y) : y);

    // Filter duplicate
    const ImGuiInputEvent* latest_event = FindLatestInputEvent(ImGuiInputEventType_MousePos);
    const ImVec2 latest_pos = latest_event ? ImVec2(latest_event->MousePos.PosX, latest_event->MousePos.PosY) : g.IO.MousePos;
    if (latest_pos.x == pos.x && latest_pos.y == pos.y)
        return;
    ImGuiInputEvent e;
    e.Type = ImGuiInputEventType_MousePos;
    e.Source = ImGuiInputSource_Mouse;
    e.MousePos.PosX = pos.x / DisplayFramebufferScale.x;
    e.MousePos.PosY = pos.y / DisplayFramebufferScale.y;
    g.InputEventsQueue.push_back(e);
}
ебалу с делением координат комментим

C++:
        //if (io.MousePos.x != -FLT_MAX && io.MousePos.y != -FLT_MAX)
        //{
        //    io.MousePos.x /= dpi_scale;
        //    io.MousePos.y /= dpi_scale;
        //}
 
Последнее редактирование:
Сверху Снизу