辛吉
这是一个以编程方式为优秀的 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