辛吉
這是一個以程式設計方式為優秀的 C++ 立即模式 gui 產生的瘦 c-api 包裝器 Dear ImGui。所有 imgui.h 函數均以程式設計方式包裝。產生的檔案是: cimgui.cpp
、 cimgui.h
(用於 C 編譯)。另外,為了幫助建立綁定, definitions.lua
包含函數定義資訊和structs_and_enums.lua
。該程式庫旨在作為中間層,以便能夠使用可與 C 介面的其他語言中的 Dear ImGui(如 D - 請參閱 D 綁定)
歷史:
最初 cimgui 是由 Stephan Dilly 開發的手寫程式碼,但最近由 sonoro1234 轉變為自動生成的版本,以便更輕鬆地跟上 imgui (讓用戶選擇所需的分支並提交)
筆記:
- 目前此包裝器基於版本 [Dear ImGui 的 1.91.4,具有內部 api]
- 僅包裝 imgui.h(可選的 imgui_internal.h)中的函數、結構和枚舉。
- 如果你對 imgui 後端感興趣,你應該看看 LuaJIT-ImGui 專案。
- 除了在 cimgui_overloads 表 (https://github.com/cimgui/cimgui/blob/master/generator/generator.lua#L60) 中編碼的名稱外,所有命名都是透過演算法進行的。在正式版本中該表是空的。
- 目前重載函數名稱可以在(https://github.com/cimgui/cimgui/blob/master/generator/output/overloads.txt)中找到
彙編
使用發電機
- 只有當您想要一個與提供的版本不同的 imgui 版本時才需要(在編譯之前),否則生成已經完成。
- 您將需要 LuaJIT(https://github.com/LuaJIT/LuaJIT.git better 2.1 分支)或在 https://luapower.com/luajit/download 中為 linux/macOS/windows 預先編譯
- 您還需要使用 C++ 編譯器進行預處理:gcc(例如在 windows MinGW-W64-builds 中)、clang 或 cl (MSVC)。 (這個倉庫是用 gcc 完成的)
- 將
imgui
資料夾更新為您想要的版本。 - 編輯 Windows 上的
generator/generator.bat
或 Linux 上的generator/generator.sh
,在 gcc、clang 或 cl 之間進行選擇,並選擇所需的後端以及是否生成 imgui_internal、是否生成註釋以及是否生成構造函數也有僅執行您自己提供的結構初始化的版本(_Construct 新增到建構函式名稱中) - 生成器的預設設定是 gcc 作為編譯器,包含 imgui_internal 以及 sdl、glfw、vulkan、opengl2 和 opengl3 作為後端。
- 編輯 config_generator.lua 以新增您選擇的後端所需的包含內容(vulkan 需要它)。
- 在 PATH 上使用 gcc、clang 或 cl 和 LuaJIT 運行生成器.bat 或生成器.sh。
- 結果會產生一些檔案:
cimgui.cpp
、 cimgui.h
和cimgui_impl.h
用於編譯,以及一些包含有關綁定資訊的 lua/json 檔案:包含函數資訊的definitions.json
、包含結構和枚舉資訊的structs_and_enums.json
、 impl_definitions.json
包含來自後端資訊的函數。 - 您可以透過在呼叫結束時編輯編譯器標誌來將編譯器標誌傳遞給generator.sh或generator.bat,以進一步指定編譯器行為。 (例如-DIMGUI_USER_CONFIG)
- 您可以在命令列中將任何額外參數傳遞給generator.sh (.bat)。
- 如果您使用的選項與 cimgui repo 不同,並且您想在 cimgui 更新後保留它們,則可以將它們保存在 cimgui 資料夾之外的生成器.sh (.bat) 副本中,其中在 luajit 呼叫之前使用
cd cimgui/generator
。參見#232(評論)
產生綁定
- 當您定義 CIMGUI_DEFINE_ENUMS_AND_STRUCTS 時,C 介面由 cimgui.h 公開
- 根據您喜歡的語言,您可以使用產生的 lua 或 json 文件,如下所示:
- https://github.com/sonoro1234/LuaJIT-ImGui/blob/master/lua/build.bat(在https://github.com/sonoro1234/LuaJIT-ImGui/blob/master/lua/class_gen中產生lua程式碼.lua)
- https://github.com/mellinoe/ImGui.NET/tree/autogen/src/CodeGenerator
定義 描述
- 它是一個集合,其中鍵是在沒有重載的情況下產生的 cimgui 名稱,值是重載數組(可能只有一個重載)
- 每個重載都是一個集合。一些相關的鍵和值是:
- stname :函數所屬結構的名稱(如果它是 ImGui 命名空間中的頂級,則為「」)
- ov_cimguiname :重載的 cimgui 名稱(如果不存在,將從 cimguiname 取得)
- cimguiname :沒有重載的名稱(如果沒有 ov_cimguiname 則應使用此名稱)
- ret : 返回型
- retref :如果原始回傳型別是引用,則設定。 (將是 cimgui 中的指針)
- argsT :一組集合(每個集合的 type:參數類型和 name:參數名稱,當參數是函數指標時還 ret:傳回型別和簽章:函式簽章)
- args :由 argsT 連接並以逗號分隔的字串
- call_args :用於呼叫 imgui 函數的參數名稱以逗號分隔的字串
- defaults :一個集合,其中 key 是參數名稱,value 是預設值。
- Manual :如果函數是手寫的(不是產生的),則為 true
- Skipped :如果未產生此函數(且不是手寫的),則為 true
- isvararg :如果某個參數是 vararg,則設定
- constructor :如果函數是類別的建構函數,則設定函數。
- destructor :如果函數是類別的析構函數而不僅僅是預設析構函數,則設定。
- realdestructor :如果函數是類別的析構函數,則設定
- templated :如果函數屬於模板類別 (ImVector),則設定
- templatedgen:如果函數屬於從模板產生的結構(ImVector_ImWchar),則設定
- nonUDT :如果存在,原始函數將傳回使用者定義的類型,以便簽章已變更為接受指向 UDT 的指標為第一個參數。
- location :此函數來自的頭檔的名稱和行號。 (imgui:000,內部:123,imgui_impl_xxx:123)
- is_static_function :當它是 struct static 函數時設定。
structs_and_enums 描述
- Is 是一個包含三項的集合:
- 在鍵枚舉下,我們得到枚舉集合,其中每個鍵都是枚舉標記名,值是表示為帶有鍵的集合的有序值的數組
- name :此枚舉值的名稱
- 值:C 字串
- calc_value : value 對應的數值
- 在 key structs 下,我們得到 structs 集合,其中鍵是結構體名稱,值是結構體成員的陣列。每一個都作為帶有鍵的集合給出
- type : 結構體成員的類型
- template_type :如果類型有模板參數(如 ImVector),這裡將是
- name : 結構體成員的名稱
- size : 陣列元素的數量(當它是陣列時)
- bitfield :位域寬度(如果它是位域)
- 在關鍵位置下,我們得到位置集合,其中每個鍵是枚舉標記名或結構名稱,值是頭檔的名稱和行號。
用法
- 透過在原始 imgui.h 中加入
ig
來使用 ImGui c++ 命名空間中的任何方法 - 方法具有相同的參數列表和返回值(如果可能)
- 屬於結構體的函數有一個額外的第一個參數和指向該結構體的指標。
- 當函數以值傳回 UDT(使用者定義型別)時,有些編譯器會抱怨,因此產生的函數會接受指向 UDT 類型的指標作為第一個參數(如果屬於結構體則為第二個參數)。
與後端一起使用
- 查看 backend_test 資料夾,了解使用 SDL 和 opengl3、glfw 和 opengl3、SDL 和 Vulkan 建構的 cmake 模組
- 讀如何使用 cimgui 後端
基於 cimgui 的綁定範例
- LuaJIT-ImGui
- ImGui.NET
- 尼姆格爾/imgui
- kotlin-imgui
- CImGui.jl
- 奧丁因吉
- 廢棄的伊吉
- 綁定BC-CimGui
- imgui-rs
- 因吉帕斯
- 水晶imgui
基於cimgui的C範例
- sdl2_opengl3
- sdl2-cimgui-演示
- cimgui_c_sdl2_範例
- 帶有 GLFW 的 cimgui-c-範例
- raylib-cimgui