Гайд API SF | Урок 5 - Подключение ImGui

Тема в разделе "C/C++", создана пользователем CleanLegend, 27 июл 2018.

Метки:
Статус темы:
Закрыта.
  1. CleanLegend

    Всефорумный модератор

    Регистрация:
    28 мар 2013
    Сообщения:
    224
    Симпатии:
    250
    Для начала нужно скачать пустой проект SF, это можно сделать в этой теме .
    Открываем проект и в начало сразу вставляем:
    #define _SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS 1
    Для подключения ImGui нам понадобиться каллбеки на present, reset, wndproc.
    Present:
    
    bool CALLBACK Present(CONST RECT *pSourceRect, CONST RECT *pDestRect, HWND hDestWindowOverride, CONST RGNDATA *pDirtyRegion)
    {
     
        if (SUCCEEDED(SF->getRender()->BeginRender()))
        {
    
    
        SF->getRender()->EndRender();
        }
        return true;
    }
    
    Reset:
    
    HRESULT CALLBACK Reset(D3DPRESENT_PARAMETERS* pPresentationParameters)
    {
        return true;
    }
    
    Wndproc:
    
    bool CALLBACK WndProcHandler(HWND hwd, UINT msg, WPARAM wParam, LPARAM lParam)
    {
        return true;
    }
    
    в mainloop регистрируем их:
    SF->getRender()->registerD3DCallback(eDirect3DDeviceMethods::D3DMETHOD_PRESENT, Present);
    SF->getRender()->registerD3DCallback(eDirect3DDeviceMethods::D3DMETHOD_RESET, Reset);
    SF->getGame()->registerWndProcCallback(SFGame::MEDIUM_CB_PRIORITY, WndProcHandler);
    Теперь можно перейти к подключению ImGui. Скачиваем и распаковываем в папке с проектом эти файлы:
    imgui.cpp
    imconfig.h
    imgui.h
    imgui_demo.cpp
    imgui_draw.cpp
    imgui_internal.h
    stb_rect_pack.h
    stb_textedit.h
    stb_truetype.h
    Переходим в папку examples и добавляем в проект 4 файла:
    imgui_impl_dx9.cpp
    imgui_impl_dx9.h
    imgui_impl_win32.cpp
    imgui_impl_win32.h
    В начало main.cpp добавляем #include:
    
    #include "imgui.h"
    #include "imgui_impl_dx9.h"
    #include "imgui_impl_win32.h"
    #include <d3d9.h>
    #define DIRECTINPUT_VERSION 0x0800
    #include <dinput.h>
    #include <tchar.h>
    extern LRESULT ImGui_ImplWin32_WndProcHandler(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
    
    После успешного добавления файлов, можно перейти к инициализации, она будет проходить в mainloop.Для инициализации нам нужен hwnd окна и device.
    ImGui::CreateContext();
    ImGuiIO& io = ImGui::GetIO(); (void)io;
    ImGui_ImplWin32_Init(GetActiveWindow());
    ImGui_ImplDX9_Init(SF->getRender()->getD3DDevice());
    Перейдем к презенту:
    
    ImGui_ImplDX9_NewFrame();
    ImGui_ImplWin32_NewFrame();
    ImGui::NewFrame();
    if (activew)
    {
     ImGui::Begin("ImGui меню", &activew, ImVec2(305, 160), 0.8f, ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoSavedSettings | ImGuiWindowFlags_NoResize);
      {
     ImGui::Checkbox("Aimbot", &bAimbot);
      ImGui::Checkbox("WH", &bAimbot);
      ImGui::Checkbox("SpeedHack", &bAimbot);
      ImGui::Checkbox("Что-то крутое", &bAimbot);
       }
       ImGui::End();
       }
    ImGui::EndFrame();
     ImGui::Render();
      ImGui_ImplDX9_RenderDrawData(ImGui::GetDrawData());
    Добавляем в reset:
    ImGui_ImplDX9_InvalidateDeviceObjects();
    В Wndproc:
    ImGui_ImplWin32_WndProcHandler(hwd, msg, wParam, lParam);
    Добавляем выгрузку плагина:

    
    //Вставляем функцию перед mainloop:
    void CALLBACK PluginFree()
    {
    
        ImGui_ImplDX9_Shutdown();
        ImGui_ImplWin32_Shutdown();
        ImGui::DestroyContext();
    }
    SF->getGame()->registerGameDestructorCallback(PluginFree);
     // в mainloop регистрируем каллбек 
    В итоге у вас должно получится вот это:
    [​IMG]
    На момент написания гайда использовалась версия: 1.63
     
    #1 CleanLegend, 27 июл 2018
    Последнее редактирование: 13 сен 2018
    #kerosin, Cquint, Classic. и 10 другим нравится это.
  2. Сэнд

    Проверенный

    Регистрация:
    26 авг 2015
    Сообщения:
    438
    Симпатии:
    276
    как такое же сделать с аси подскажите плс
     
  3. kawa operand

    kawa operand перерывпятьминут

    Регистрация:
    15 апр 2017
    Сообщения:
    621
    Симпатии:
    369
    прикинь точно так же
     
  4. imring

    imring колечконуп
    Всефорумный модератор

    Регистрация:
    3 авг 2016
    Сообщения:
    1.611
    Симпатии:
    897
    вроде @mkrn делал проект с подключенным имгуи
     
  5. Dark_Knight

    Dark_Knight Режим чтения

    Регистрация:
    18 мар 2013
    Сообщения:
    3.369
    Симпатии:
    1.673
    И без выгрузки Imgui. Кстати, тут тоже самое.
     
    #5 Dark_Knight, 27 июл 2018
    Последнее редактирование: 27 июл 2018
  6. mkrn

    mkrn Постоянный участник

    Регистрация:
    19 фев 2017
    Сообщения:
    50
    Симпатии:
    32
    это был твой проект с фиксом некоторых багов, соре ;)
     
  7. Dark_Knight

    Dark_Knight Режим чтения

    Регистрация:
    18 мар 2013
    Сообщения:
    3.369
    Симпатии:
    1.673
    Ага. Пофиксил так, что убрал деиницилизацию imgui
     
  8. mkrn

    mkrn Постоянный участник

    Регистрация:
    19 фев 2017
    Сообщения:
    50
    Симпатии:
    32
    ничего не убирал. Быть может вы путаете мой проект с каким-то другим, сударь?
     
  9. Dark_Knight

    Dark_Knight Режим чтения

    Регистрация:
    18 мар 2013
    Сообщения:
    3.369
    Симпатии:
    1.673
    Человек утверждал, что это твой проект. Никакого в нем декстуктора плагина не увидел даже.
     
  10. mkrn

    mkrn Постоянный участник

    Регистрация:
    19 фев 2017
    Сообщения:
    50
    Симпатии:
    32
    Софт - ImGUI(https://blast.hk/threads/12387/)

    в моём проекте всё точно так же как и здесь, только исправлены параметры ресета и в imgui.cpp там фикс с разрешением экрана связанный. Вся кривизна, до которой в этом проекте можно доебаться, сделана тобой и ебать себе мозг с ней у меня не было ни малейшего желания. Свой проект я делал бы по-другому, а в этом моей целью было только лишь то, чтобы он нормально работал и не крашил из-за того, что дарк_кнуйт решил из презента параметры в ресет ебануть
     
    #10 mkrn, 28 июл 2018
    Последнее редактирование: 28 июл 2018
    Cookie doge нравится это.
  11. Musaigen

    Musaigen мой проект лайкнул пиксель
    Проверенный

    Регистрация:
    1 апр 2018
    Сообщения:
    798
    Симпатии:
    298
    Кто знает в чём проблема?
    
      imgui_impl_dx9.cpp
      main.cpp
      Создание кода...
    main.obj : error LNK2019: ссылка на неразрешенный внешний символ __imp__GetActiveWindow@0 в функции "void __stdcall mainloop(void)" (?mainloop@@YGXXZ)
    main.obj : error LNK2019: ссылка на неразрешенный внешний символ "struct ImGuiContext * __cdecl ImGui::CreateContext(struct ImFontAtlas *)" (?CreateContext@ImGui@@YAPAUImGuiContext@@PAUImFontAtlas@@@Z) в функции "void __stdcall mainloop(void)" (?mainloop@@YGXXZ)
    main.obj : error LNK2019: ссылка на неразрешенный внешний символ "struct ImGuiIO & __cdecl ImGui::GetIO(void)" (?GetIO@ImGui@@YAAAUImGuiIO@@XZ) в функции "void __stdcall mainloop(void)" (?mainloop@@YGXXZ)
    main.obj : error LNK2019: ссылка на неразрешенный внешний символ "void __cdecl ImGui::EndFrame(void)" (?EndFrame@ImGui@@YAXXZ) в функции "bool __stdcall Present(struct tagRECT const *,struct tagRECT const *,struct HWND__ *,struct _RGNDATA const *)" (?Present@@YG_NPBUtagRECT@@0PAUHWND__@@PBU_RGNDATA@@@Z)
    main.obj : error LNK2019: ссылка на неразрешенный внешний символ "void __cdecl ImGui::Render(void)" (?Render@ImGui@@YAXXZ) в функции "bool __stdcall Present(struct tagRECT const *,struct tagRECT const *,struct HWND__ *,struct _RGNDATA const *)" (?Present@@YG_NPBUtagRECT@@0PAUHWND__@@PBU_RGNDATA@@@Z)
    main.obj : error LNK2019: ссылка на неразрешенный внешний символ "struct ImDrawData * __cdecl ImGui::GetDrawData(void)" (?GetDrawData@ImGui@@YAPAUImDrawData@@XZ) в функции "bool __stdcall Present(struct tagRECT const *,struct tagRECT const *,struct HWND__ *,struct _RGNDATA const *)" (?Present@@YG_NPBUtagRECT@@0PAUHWND__@@PBU_RGNDATA@@@Z)
    main.obj : error LNK2019: ссылка на неразрешенный внешний символ "void __cdecl ImGui::End(void)" (?End@ImGui@@YAXXZ) в функции "bool __stdcall Present(struct tagRECT const *,struct tagRECT const *,struct HWND__ *,struct _RGNDATA const *)" (?Present@@YG_NPBUtagRECT@@0PAUHWND__@@PBU_RGNDATA@@@Z)
    main.obj : error LNK2019: ссылка на неразрешенный внешний символ "bool __cdecl ImGui::Checkbox(char const *,bool *)" (?Checkbox@ImGui@@YA_NPBDPA_N@Z) в функции "bool __stdcall Present(struct tagRECT const *,struct tagRECT const *,struct HWND__ *,struct _RGNDATA const *)" (?Present@@YG_NPBUtagRECT@@0PAUHWND__@@PBU_RGNDATA@@@Z)
    main.obj : error LNK2019: ссылка на неразрешенный внешний символ "bool __cdecl ImGui::Begin(char const *,bool *,struct ImVec2 const &,float,int)" (?Begin@ImGui@@YA_NPBDPA_NABUImVec2@@MH@Z) в функции "bool __stdcall Present(struct tagRECT const *,struct tagRECT const *,struct HWND__ *,struct _RGNDATA const *)" (?Present@@YG_NPBUtagRECT@@0PAUHWND__@@PBU_RGNDATA@@@Z)
    main.obj : error LNK2019: ссылка на неразрешенный внешний символ "bool __cdecl ImGui_ImplDX9_Init(void *,struct IDirect3DDevice9 *)" (?ImGui_ImplDX9_Init@@YA_NPAXPAUIDirect3DDevice9@@@Z) в функции "void __stdcall mainloop(void)" (?mainloop@@YGXXZ)
    main.obj : error LNK2019: ссылка на неразрешенный внешний символ "void __cdecl ImGui_ImplDX9_NewFrame(void)" (?ImGui_ImplDX9_NewFrame@@YAXXZ) в функции "bool __stdcall Present(struct tagRECT const *,struct tagRECT const *,struct HWND__ *,struct _RGNDATA const *)" (?Present@@YG_NPBUtagRECT@@0PAUHWND__@@PBU_RGNDATA@@@Z)
    main.obj : error LNK2019: ссылка на неразрешенный внешний символ "void __cdecl ImGui_ImplDX9_RenderDrawData(struct ImDrawData *)" (?ImGui_ImplDX9_RenderDrawData@@YAXPAUImDrawData@@@Z) в функции "bool __stdcall Present(struct tagRECT const *,struct tagRECT const *,struct HWND__ *,struct _RGNDATA const *)" (?Present@@YG_NPBUtagRECT@@0PAUHWND__@@PBU_RGNDATA@@@Z)
    main.obj : error LNK2019: ссылка на неразрешенный внешний символ "void __cdecl ImGui_ImplDX9_InvalidateDeviceObjects(void)" (?ImGui_ImplDX9_InvalidateDeviceObjects@@YAXXZ) в функции "long __stdcall Reset(struct _D3DPRESENT_PARAMETERS_ *)" (?Reset@@YGJPAU_D3DPRESENT_PARAMETERS_@@@Z)
    main.obj : error LNK2019: ссылка на неразрешенный внешний символ "long __cdecl ImGui_ImplWin32_WndProcHandler(struct HWND__ *,unsigned int,unsigned int,long)" (?ImGui_ImplWin32_WndProcHandler@@YAJPAUHWND__@@IIJ@Z) в функции "bool __stdcall WndProcHandler(struct HWND__ *,unsigned int,unsigned int,long)" (?WndProcHandler@@YG_NPAUHWND__@@IIJ@Z)
    C:\Users\User\source\repos\SFPlugin\\bin\SFPlugin.sf : fatal error LNK1120: неразрешенных внешних элементов: 14
    
     
  12. _Vine_

    _Vine_ Интересующийся

    Регистрация:
    6 янв 2016
    Сообщения:
    118
    Симпатии:
    20
    Добавь в проект все .cpp имгуи, win32 impl, dx9 impl
     
    Musaigen нравится это.
  13. NearBy

    NearBy Активный участник

    Регистрация:
    3 июл 2018
    Сообщения:
    27
    Симпатии:
    6
    Если ты дебаг компилишь , поставь релиз + подключи все библиотеки Imgui.И платформу поставь x86.
     
  14. CleanLegend

    Всефорумный модератор

    Регистрация:
    28 мар 2013
    Сообщения:
    224
    Симпатии:
    250
    Добавил выгрузку
     
  15. By_Surse

    Проверенный

    Регистрация:
    6 июл 2015
    Сообщения:
    213
    Симпатии:
    219
    Тут описание подключения старой версии.
    Зачем??? Зачем создавать imgui_impl_dx9.cpp imgui_impl_dx9.h если они уже есть в папке с имгуи?
     
  16. FYP

    FYP
    not-set

    Регистрация:
    9 мар 2013
    Сообщения:
    1.563
    Симпатии:
    4.051
    тем более. в этом imgui_impl_dx9 устаревшая реализация, в версии 1.62 был произведён рефакторинг всех рендереров.
    лучше обнови гайд, вот: ocornut/imgui(https://github.com/ocornut/imgui/tree/master/examples)
     
    CleanLegend нравится это.
  17. CleanLegend

    Всефорумный модератор

    Регистрация:
    28 мар 2013
    Сообщения:
    224
    Симпатии:
    250
    Обновил
     
  18. By_Surse

    Проверенный

    Регистрация:
    6 июл 2015
    Сообщения:
    213
    Симпатии:
    219
    ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoSavedSettings | ImGuiWindowFlags_NoResize
    убери
    если крашит, надо просто было писать так:

    if (bMenuActive)
    {
    ImGui::Begin("Window", &bMenuActive);
    ...
    ImGui::End();
    }
     
  19. Dark_Knight

    Dark_Knight Режим чтения

    Регистрация:
    18 мар 2013
    Сообщения:
    3.369
    Симпатии:
    1.673
    Зачем убирать? Все правильно у него написано.
     
  20. Revalto

    Revalto Свой человек

    Регистрация:
    13 фев 2016
    Сообщения:
    383
    Симпатии:
    90
    Попытка использовать стили - неудачно!
    [​IMG]

    P.S. ImGui::CreateContext(); перед стилем решил все
     
    #20 Revalto, 15 авг 2018
    Последнее редактирование: 15 авг 2018
  21. CleanLegend

    Всефорумный модератор

    Регистрация:
    28 мар 2013
    Сообщения:
    224
    Симпатии:
    250
    В какой момент стиль меняешь?
     
  22. Revalto

    Revalto Свой человек

    Регистрация:
    13 фев 2016
    Сообщения:
    383
    Симпатии:
    90
    upload_2018-8-16_0-21-3.png
     
  23. Musaigen

    Musaigen мой проект лайкнул пиксель
    Проверенный

    Регистрация:
    1 апр 2018
    Сообщения:
    798
    Симпатии:
    298
  24. Revalto

    Revalto Свой человек

    Регистрация:
    13 фев 2016
    Сообщения:
    383
    Симпатии:
    90
    При выходе с игры, допустим через /q, такая же ошибка!
     
  25. MasterLight

    MasterLight Активный участник

    Регистрация:
    4 сен 2015
    Сообщения:
    29
    Симпатии:
    5
    +, тоже самое
     
  26. CleanLegend

    Всефорумный модератор

    Регистрация:
    28 мар 2013
    Сообщения:
    224
    Симпатии:
    250
    При выходе не вызывается GameDestructor, нужно перехватывать отправку /q, либо в DLL_PROCESS_DETACH добавить деинициализацию imgui:
    case DLL_PROCESS_DETACH:
    ImGui_ImplDX9_Shutdown();
    ImGui_ImplWin32_Shutdown();
    ImGui::DestroyContext();
     
    Revalto нравится это.
  27. Revalto

    Revalto Свой человек

    Регистрация:
    13 фев 2016
    Сообщения:
    383
    Симпатии:
    90
    Это надо добавить в мануале, а то мало ли :)
     
  28. Lupus

    Lupus Участник

    Регистрация:
    21 ноя 2017
    Сообщения:
    8
    Симпатии:
    0
    how i can make it 'button toggleing'?
     
  29. CleanLegend

    Всефорумный модератор

    Регистрация:
    28 мар 2013
    Сообщения:
    224
    Симпатии:
    250
  30. MasterLight

    MasterLight Активный участник

    Регистрация:
    4 сен 2015
    Сообщения:
    29
    Симпатии:
    5
    Не помогло, всё равно та же ошибка при /q.
    И ещё, что тут не так?
    
    void CALLBACK cmd_debug_info(std::string param)
    {
       int *resX, *resY;
       SF->getGame()->getScreenResolution(resX, resY);
       snprintf(messageBuffer, 128, "ResX - %i, ResY - %i", *resX, *resY);
       SF->getSAMP()->getChat()->AddChatMessage(-1, messageBuffer);
    }
    
     
  31. imring

    imring колечконуп
    Всефорумный модератор

    Регистрация:
    3 авг 2016
    Сообщения:
    1.611
    Симпатии:
    897
    исправь
    SF->getGame()->registerGameDestructorCallback(PluginFree);
     
    ShuffleBoy нравится это.
  32. mrdiimax

    mrdiimax Знающий

    Регистрация:
    24 янв 2016
    Сообщения:
    271
    Симпатии:
    42
    Цельный проект есть у кого?
     
  33. Revalto

    Revalto Свой человек

    Регистрация:
    13 фев 2016
    Сообщения:
    383
    Симпатии:
    90
    Уже так сложно подставить?
    #define _SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS 1
    #include <windows.h>
    #include <string>
    #include <assert.h>
    #include <process.h>
    
    #include "ImGUI\imgui.h"
    #include "ImGUI\imgui_impl_dx9.h"
    #include "ImGUI\imgui_impl_win32.h"
    #include <d3d9.h>
    #define DIRECTINPUT_VERSION 0x0800
    #include <dinput.h>
    #include <tchar.h>
    extern LRESULT ImGui_ImplWin32_WndProcHandler(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
    
    #include "SAMPFUNCS_API.h"
    #include "game_api\game_api.h"
    
    SAMPFUNCS *SF = new SAMPFUNCS();
    
    bool CALLBACK Present(CONST RECT *pSourceRect, CONST RECT *pDestRect, HWND hDestWindowOverride, CONST RGNDATA *pDirtyRegion)
    {
        if (SUCCEEDED(SF->getRender()->BeginRender()))
        {
    
            ImGui_ImplDX9_NewFrame();
            ImGui_ImplWin32_NewFrame();
            ImGui::NewFrame();
            if (activew)
            {
                ImGui::Begin("ImGui меню", &activew, ImVec2(305, 160), 0.8f, ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoSavedSettings | ImGuiWindowFlags_NoResize);
                {
                    ImGui::Checkbox("Aimbot", &bAimbot);
                    ImGui::Checkbox("WH", &bAimbot);
                    ImGui::Checkbox("SpeedHack", &bAimbot);
                    ImGui::Checkbox("Что-то крутое", &bAimbot);
                }
                ImGui::End();
            }
            ImGui::EndFrame();
            ImGui::Render();
            ImGui_ImplDX9_RenderDrawData(ImGui::GetDrawData());
    
            SF->getRender()->EndRender();
        }
        return true;
    }
    
    HRESULT CALLBACK Reset(D3DPRESENT_PARAMETERS* pPresentationParameters)
    {
        ImGui_ImplDX9_InvalidateDeviceObjects();
        return true;
    }
    
    bool CALLBACK WndProcHandler(HWND hwd, UINT msg, WPARAM wParam, LPARAM lParam)
    {
        ImGui_ImplWin32_WndProcHandler(hwd, msg, wParam, lParam);
        return true;
    }
    
    void CALLBACK PluginFree()
    {
    
        ImGui_ImplDX9_Shutdown();
        ImGui_ImplWin32_Shutdown();
        ImGui::DestroyContext();
    }
    
    void CALLBACK mainloop()
    {
        static bool init = false;
        if (!init)
        {
            if (GAME == nullptr)
                return;
            if (GAME->GetSystemState() != eSystemState::GS_PLAYING_GAME)
                return;
            if (!SF->getSAMP()->IsInitialized())
                return;
            SF->getSAMP()->getChat()->AddChatMessage( D3DCOLOR_XRGB( 0, 0xAA, 0 ), "SAMPFUNCS Plugin loaded." );
            SF>getGame()>registerGameDestructorCallback(PluginFree);
            SF->getRender()->registerD3DCallback(eDirect3DDeviceMethods::D3DMETHOD_PRESENT, Present);
            SF->getRender()->registerD3DCallback(eDirect3DDeviceMethods::D3DMETHOD_RESET, Reset);
            SF->getGame()->registerWndProcCallback(SFGame::MEDIUM_CB_PRIORITY, WndProcHandler);
    
            ImGui::CreateContext();
            ImGuiIO& io = ImGui::GetIO(); (void)io;
            ImGui_ImplWin32_Init(GetActiveWindow());
            ImGui_ImplDX9_Init(SF->getRender()->getD3DDevice());
          
            init = true;
        }
    }
    
    BOOL APIENTRY DllMain(HMODULE hModule, DWORD dwReasonForCall, LPVOID lpReserved)
    {
        switch (dwReasonForCall)
        {
            case DLL_PROCESS_ATTACH:
                SF->initPlugin(mainloop, hModule);
                break;
            case DLL_THREAD_ATTACH:
            case DLL_THREAD_DETACH:
            case DLL_PROCESS_DETACH:
                break;
        }
        return TRUE;
    }
     
Статус темы:
Закрыта.