Гайд Рисование примитивов на экране через ImGui

Musaigen

abobusnik
Автор темы
Проверенный
1,581
1,300
Думаю не многие, кто использовали ImGui, знают, что его можно использовать в качестве рендера примитивов на экране. (А может и знают?...)
Я не буду рассказывать, как подключить ImGui, и т.д. Так что давайте начнём.
На новой версии ImGui будем использовать ImGui::GetBackgroundDrawList();, на старых версиях, как я знаю, используется ImDrawList* draw_list = new ImDrawList(ImGui::GetDrawListSharedData()); и ImGui::Render(draw_list); // но это не точно, anyway, я не проверял, возможно на любых версиях всё одинаково и отличаются лишь названия методов.
Итак, после строчек ImGui::NewFrame и т.п вставляем:
C++:
ImGui::GetBackgroundDrawList()->_ResetForNewFrame(); // На старых версиях название метода - Clear.
// Для чего она нужна?
// Всё просто, она очищает буфферы, благодаря чему у вас не будет дубликатов, например, линий, которые будут появляться каждый кадр.
После неё идёт ImGui::GetBackgroundDrawList()->PushClipRectFullScreen(); эта функция указывает где будет происходить отрисовка, в нашем случае, отрисовка будет на весь экран.
Дальше вы вольны рисовать что угодно, будь это простые линии или градиенты, текст, картинки и т.д.
Ну и закончу на демонстрации WallHack'a для игроков, с использованием ImGui.
sa-mp-078.png
C++:
for (int i = 0; i < 1000; i++)
{
    if (SF->getSAMP()->getPlayers()->iIsListed[i] == 0)
        continue;

    if (SF->getSAMP()->getPlayers()->pRemotePlayer[i] == NULL)
        continue;

    if (SF->getSAMP()->getPlayers()->pRemotePlayer[i]->pPlayerData == NULL)
        continue;

    if (SF->getSAMP()->getPlayers()->pRemotePlayer[i]->pPlayerData->pSAMP_Actor == NULL)
        continue;

    if (SF->getSAMP()->getPlayers()->pRemotePlayer[i]->pPlayerData->pSAMP_Actor->pGTA_Ped == NULL)
        continue;

    CPed* pPed = GAME->GetPools()->GetPed((DWORD*)SF->getSAMP()->getPlayers()->pRemotePlayer[i]->pPlayerData->pSAMP_Actor->pGTA_Ped);

    if (!pPed->IsOnScreen())
        continue;

    CVector vecHead;
    CVector2D vecScreen;
    pPed->GetTransformedBonePosition(eBone::BONE_HEAD2, &vecHead);
    SF->getGame()->convert3DCoordsToScreen(vecHead.fX, vecHead.fY, vecHead.fZ, &vecScreen.fX, &vecScreen.fY);

    ImGui::GetBackgroundDrawList()->AddLine(ImVec2(600, 0), ImVec2(vecScreen.fX, vecScreen.fY), ImGui::GetColorU32(ImGuiCol_Text));
}
Такое можно сотворить и на Lua, если там, конечно, есть что-то подобное.
Использовалась версия ImGui v1.78 WIP.
 
Последнее редактирование:

Cake_

Известный
Проверенный
263
313
имхо довольно таки странно использовать имгуи не для отрисовки самого интерфейса, тк для того чтобы отрисовать имгуи у тебя уже должны быть перехвачены present/end scene/reset ( в случае с directx) так зачем использовать инструмент который изначально создан для проектирования/отрисовки пользовательского интерфейса для отрисовок объектов игры и т.д если можно использовать напрямую средства dx( где офк функционал гараздо больше ).
*юзать это в сф , в котором завезена либа для рендера - это вообще лмао
*использовать такой способ в качестве обхода ач тоже сомнительная идея тк почти каждый ач палит именно имгуи
*если вы пишете более-менее крупный проект для того же сампа на одних инструментах имгуи вы не вывезите ( писал выше ) то есть придется все равно использовать напрямую инструменты dx
*вообще орнул с первого предложения ( что по твоему делает имгуи? не отрисовывает ли он интерфейс средствами dx в случае с dx играми на том же экране? )
 
  • Нравится
Реакции: Anton Nixon, Fott и imring

Musaigen

abobusnik
Автор темы
Проверенный
1,581
1,300
имхо довольно таки странно использовать имгуи не для отрисовки самого интерфейса, тк для того чтобы отрисовать имгуи у тебя уже должны быть перехвачены present/end scene/reset ( в случае с directx) так зачем использовать инструмент который изначально создан для проектирования/отрисовки пользовательского интерфейса для отрисовок объектов игры и т.д если можно использовать напрямую средства dx( где офк функционал гараздо больше ).
*юзать это в сф , в котором завезена либа для рендера - это вообще лмао
*использовать такой способ в качестве обхода ач тоже сомнительная идея тк почти каждый ач палит именно имгуи
*если вы пишете более-менее крупный проект для того же сампа на одних инструментах имгуи вы не вывезите ( писал выше ) то есть придется все равно использовать напрямую инструменты dx
*вообще орнул с первого предложения ( что по твоему делает имгуи? не отрисовывает ли он интерфейс средствами dx в случае с dx играми на том же экране? )
М-да, просто показал что можно использовать ImGui таким образом, а мне в итоге устроили дебаты.