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

Musaigen

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

Похожие темы

  1. Ответы
    23
    Просмотры
    44K
  2. Ответы
    131
    Просмотры
    37K
  3. Ответы
    46
    Просмотры
    19K
  4. Ответы
    88
    Просмотры
    20K