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

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

Метки:
  1. CleanLegend

    Проверенный

    Регистрация:
    28 мар 2013
    Сообщения:
    175
    Симпатии:
    187
    Для начала нужно скачать пустой проект 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_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
    Последнее редактирование: 12 авг 2018 в 18:14
    #kerosin, Cquint, Classic. и 10 другим нравится это.
  2. Сэнд

    Проверенный

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

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

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

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

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

    Dark_Knight Glory to mankind
    Друг

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

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

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

    Dark_Knight Glory to mankind
    Друг

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

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

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

    Dark_Knight Glory to mankind
    Друг

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

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

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

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

    Musaigen не забирайте моего проверенного!!!!!(

    Регистрация:
    1 апр 2018
    Сообщения:
    542
    Симпатии:
    158
    Кто знает в чём проблема?
    
      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
    Сообщения:
    111
    Симпатии:
    19
    Добавь в проект все .cpp имгуи, win32 impl, dx9 impl
     
    Musaigen нравится это.
  13. NearBy

    NearBy Участник

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

    Проверенный

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

    Проверенный

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

    FYP админ какой-то
    not-set

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

    Проверенный

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

    Проверенный

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

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

    Dark_Knight Glory to mankind
    Друг

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