4个版本
0.1.3 | 2019年1月12日 |
---|---|
0.1.2 | 2019年1月5日 |
0.1.1 | 2019年1月5日 |
0.1.0 | 2019年1月5日 |
#838 in GUI
1.5MB
24K SLoC
nsf-imgui
Dear ImGui 1.66b的Rust绑定。一个实验性的个人项目,由于以下原因创建:
- 想学习Rust。
- 对游戏开发有些兴趣。
- 对现有的绑定不是很满意。
目标
- 使用cimgui数据文件自动生成大部分FFI绑定(有助于维护)。
- 同样也自动生成大部分本地包装器。
- 本地包装器不应该过于关注安全性,而是在类型(指针引用、字符串管理等)方面提供一些便利。
- 紧密遵循原始C++ API,因此不必过于担心安全性。例如,只要原始库允许您通过不匹配的begin()/end()调用破坏事物,也允许这样做。
实现细节
- 大量代码使用
generate.js
脚本生成。生成是手动触发的,仓库包括生成的文件。要运行此脚本,您需要通过npm install
安装npm包。除了generate.js
脚本外,请参阅gen.bash
脚本来了解文件是如何生成的。 - 不安全部分使用"bitflags"crate来实现作为位标志的枚举。
- 安全部分目前非常有限。只有被认为是安全的函数被包装。例如,不包含函数指针或
*void*
或类似的东西。 const char*
参数变为&CStr
,还有一个自定义的cstr!
宏来帮助在编译时构建这些。const char*
返回值被转换为String
。其他类型按原样传播,*mut
变为&mut
,*const
变为&
。- 函数参数中的"格式"部分,通常由格式字符串和参数组成,被转换为单个字符串参数。然后作为
"%s"
传递。 - 自定义
cstr!
宏支持格式化,例如cstr!("{}", myint)
。此变体在底层使用format!
宏,它会分配一个字符串。 - 所有 imgui 函数都是
ImGui
结构体的方法。您可以使用ImGui::new()
创建一个实例。此结构体只允许一个实例(通过静态互斥锁进行保护)。尽管结构体是可克隆的,但内部是 Rc。函数ImGui::new()
会调用igCreateContext()
。当最后一个ImGui
实例被丢弃时,它将调用igDestroyContext(igGetCurrentContext())
。 - 原始库使用 C 类型,例如 int、unsigned int、float、double、size_t。我假设那些是 i32、u32、f32、f64、usize 等。基本上意味着它们具有固定的大小。虽然从理论上讲这不正确,但在实践中很多情况下是正确的。它适用于典型的 64 位桌面设置,如果要将其用于某些嵌入式的特殊场景,可能不会工作。
- 原始库是用 C++ 编写的,这允许为尾随函数参数指定默认值。它使用泛型
impl Into<Option<>>
类型实现。遗憾的是,由于某种原因,这些类型内的引用需要显式生命周期,因此我必须在函数签名中为所有 ref 类型生成显式生命周期。
问与答
问:示例在哪里?
答:没有示例。这个库的目标是尽可能接近 C++ API,您可以参考原始的 C++ 示例。目前还没有围绕结构体的安全包装,因此如果您想将此库集成到您的渲染器中,您只需使用 FFI API 获取 ImDrawData,并以完全“不安全”的方式完成,就像您在 C++ 中做的那样。
问:您计划维护这个库吗?
答:这取决于情况。目前我正在将其用于我的个人爱好游戏开发项目。只要我继续工作,这个库可能会在一定程度上得到维护。然后——谁知道呢。不要期望它得到良好的维护。
变更日志
nsf-imgui
- 0.1.3
- 使用
input_text
实现String
。 - 再次修复
cstr!
宏,现在肯定没问题了。 - 修复
color_convert_hsv_to_rgb
和color_convert_rgb_to_hsv
函数上的蛇形代码转换。 - 将
igTextUnformatted
列为黑名单。
- 使用
- 0.1.2 使用
impl Into<Option<>>
泛型参数实现默认函数值。 - 0.1.1 修复带参数的
cstr!
宏变体。 - 0.1.0 首次发布。
nsf-imgui-raw
- 0.1.0 首次发布。