#imgui #personal #bindings #part #unsafe

sys nsf-imgui-raw

替代(个人)imgui rust 绑定,不安全 ffi 部分

1 个不稳定发布

0.1.0 2019年1月5日

#1184 in GUI


nsf-imgui 中使用

MIT 许可证

1MB
21K SLoC

C++ 19K SLoC // 0.1% comments Rust 2K SLoC

nsf-imgui

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

  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 位桌面配置,如果要在嵌入式场景中使用 imgui,可能不适用。
  9. 原始库是用 C++ 编写的,这允许指定尾随函数参数的默认值。它使用泛型 impl Into<Option<>> 类型实现。不幸的是,由于某种原因,这些类型中的引用需要显式的生命周期,因此我必须为函数签名中的所有 ref 类型生成显式的生命周期。

问答

问:示例在哪里?

答:没有。这个库的目标是尽可能接近 C++ API,您可以参考原始的 C++ 示例。目前还没有围绕结构体的安全包装,因此如果您想将此库集成到渲染器中,您只需使用 FFI API 获取 ImDrawData,并以完全“不安全”的方式完成它,就像在 C++ 中做的那样。

问:您计划维护这个库吗?

答:这取决于。目前我正在用它来开发我的个人爱好游戏开发项目。只要我继续工作,这个库可能会在一定程度上得到维护。然后——谁知道呢。不要期望它会得到很好的维护。

变更日志

nsf-imgui

  • 0.1.3
    • 使用 String 实现 input_text
    • 再次修复 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 首次发布。

依赖项