#imgui #bindings #personal #api-bindings #dear

nsf-imgui

替代(个人)imgui rust绑定

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

MIT 许可证

1.5MB
24K SLoC

C++ 19K SLoC // 0.1% comments Rust 5K SLoC // 0.0% comments

nsf-imgui

Dear ImGui 1.66b的Rust绑定。一个实验性的个人项目,由于以下原因创建:

  1. 想学习Rust。
  2. 对游戏开发有些兴趣。
  3. 对现有的绑定不是很满意。

目标

  1. 使用cimgui数据文件自动生成大部分FFI绑定(有助于维护)。
  2. 同样也自动生成大部分本地包装器。
  3. 本地包装器不应该过于关注安全性,而是在类型(指针引用、字符串管理等)方面提供一些便利。
  4. 紧密遵循原始C++ API,因此不必过于担心安全性。例如,只要原始库允许您通过不匹配的begin()/end()调用破坏事物,也允许这样做。

实现细节

  1. 大量代码使用generate.js脚本生成。生成是手动触发的,仓库包括生成的文件。要运行此脚本,您需要通过npm install安装npm包。除了generate.js脚本外,请参阅gen.bash脚本来了解文件是如何生成的。
  2. 不安全部分使用"bitflags"crate来实现作为位标志的枚举。
  3. 安全部分目前非常有限。只有被认为是安全的函数被包装。例如,不包含函数指针或*void*或类似的东西。
  4. const char*参数变为&CStr,还有一个自定义的cstr!宏来帮助在编译时构建这些。const char*返回值被转换为String。其他类型按原样传播,*mut变为&mut*const变为&
  5. 函数参数中的"格式"部分,通常由格式字符串和参数组成,被转换为单个字符串参数。然后作为"%s"传递。
  6. 自定义 cstr! 宏支持格式化,例如 cstr!("{}", myint)。此变体在底层使用 format! 宏,它会分配一个字符串。
  7. 所有 imgui 函数都是 ImGui 结构体的方法。您可以使用 ImGui::new() 创建一个实例。此结构体只允许一个实例(通过静态互斥锁进行保护)。尽管结构体是可克隆的,但内部是 Rc。函数 ImGui::new() 会调用 igCreateContext()。当最后一个 ImGui 实例被丢弃时,它将调用 igDestroyContext(igGetCurrentContext())
  8. 原始库使用 C 类型,例如 int、unsigned int、float、double、size_t。我假设那些是 i32、u32、f32、f64、usize 等。基本上意味着它们具有固定的大小。虽然从理论上讲这不正确,但在实践中很多情况下是正确的。它适用于典型的 64 位桌面设置,如果要将其用于某些嵌入式的特殊场景,可能不会工作。
  9. 原始库是用 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_rgbcolor_convert_rgb_to_hsv 函数上的蛇形代码转换。
    • igTextUnformatted 列为黑名单。
  • 0.1.2 使用 impl Into<Option<>> 泛型参数实现默认函数值。
  • 0.1.1 修复带参数的 cstr! 宏变体。
  • 0.1.0 首次发布。

nsf-imgui-raw

  • 0.1.0 首次发布。

依赖项