34 个版本

0.11.5 2023 年 10 月 11 日
0.11.3 2023 年 7 月 7 日
0.11.0 2023 年 3 月 3 日
0.8.1 2022 年 11 月 22 日
0.2.3+4.1.1 2019 年 11 月 18 日

42模拟

Download history 105/week @ 2024-04-01 24/week @ 2024-04-08 26/week @ 2024-04-15 42/week @ 2024-04-22 40/week @ 2024-04-29 25/week @ 2024-05-06 62/week @ 2024-05-13 69/week @ 2024-05-20 55/week @ 2024-05-27 53/week @ 2024-06-03 53/week @ 2024-06-10 61/week @ 2024-06-17 35/week @ 2024-06-24 25/week @ 2024-07-01 15/week @ 2024-07-08 50/week @ 2024-07-15

131 每月下载次数
用于 7 个 crate(4 个直接使用)

(MIT OR Apache-2.0) AND BSD-3-Clause

11MB
215K SLoC

C++ 205K SLoC // 0.1% comments Rust 11K SLoC // 0.0% comments Shell 9 SLoC // 0.4% comments

🎳 physx-sys

NVIDIA PhysX 5.1 C++ API 自动生成的 Rust 不安全绑定。

Build Status Crates.io Docs Contributor Covenant Embark Embark

请参阅包含正在进行中的安全包装器的 仓库

演示

Tomasz Stachowiak 在 2019 年 10 月的斯德哥尔摩 Rust Meetup 上对这一项目进行了演示,介绍了 C++ 到 Rust 的绑定 physx-sys 的工作技术细节。

An unholy fusion of Rust and C++ in physx-rs (Stockholm Rust Meetup, October 2019)

基本用法

unsafe {
    let foundation = physx_create_foundation();
    let physics = physx_create_physics(foundation);

    let mut scene_desc = PxSceneDesc_new(PxPhysics_getTolerancesScale(physics));
    scene_desc.gravity = PxVec3 {
        x: 0.0,
        y: -9.81,
        z: 0.0,
    };

    let dispatcher = phys_PxDefaultCpuDispatcherCreate(
        1,
        null_mut(),
        PxDefaultCpuDispatcherWaitForWorkMode::WaitForWork,
        0,
    );
    scene_desc.cpuDispatcher = dispatcher.cast();
    scene_desc.filterShader = get_default_simulation_filter_shader();

    let scene = PxPhysics_createScene_mut(physics, &scene_desc);

    // Your physics simulation goes here
}

示例

一个简单的示例,展示了如何使用 physx-sys。可以使用 cargo run --examples ball 运行。

 o

  o
   o

    o
                      ooooooooo
     o              oo         oo
                   o             o
      o           o               o
                 o                 oo
       o        o                    o
               o                                ooooooo
              o                       o       oo       oo
        o    o                         o    oo           oo
            o                           o  o               o    ooooooooo
         o                                o                 o oo         oooooooooo oo

工作原理

绑定是通过一个自定义 Rust 应用程序生成的,该应用程序解析 SDK 的抽象语法树,并使用针对此 SDK 特选的启发式方法将 C++ PhysX 函数和类型映射到 Rust。它不是一个通用的 C++ <-> Rust 绑定生成器,在其他项目上使用它可能会崩溃。

由于C++没有标准且稳定的ABI,通常不建议从Rust代码中调用它;由于PhysX暴露了C++接口,我们无法直接使用它。这就是为什么physx-sys既生成Rust接口,也生成纯C封装的原因。C代码在构建时编译成静态库,然后Rust与C进行通信。

为了最小化在C封装和原始C++ API之间序列化数据所需的工作量,我们为每个构建目标生成一个定制的专用C封装。该封装基于从编译和运行一个针对PhysX SDK的小型程序(使用构建过程中使用的特定C++编译器)直接提取的结构布局元数据。

构建过程包括几个步骤

  1. pxbind实用程序使用clang提取关于PhysX函数和类型的元数据,并生成部分Rust和C绑定作为physx_generated.hppphysx_generated.rs。这些包含所有函数定义和类型的小子集。它还通过生成structgen.cpp来生成一个名为structgen的C++实用程序。
  2. structgen针对PhysX SDK进行编译,并生成所有剩余的类型封装。对于每个结构,它查询其成员的大小和偏移量,并生成structgen_out.hppstructgen_out.rs。这些类型是“平凡旧数据”结构,将完美匹配C++类型的数据布局。
  3. 所有生成的C类型一起编译形成physx_api,这是一个Rust可以链接的静态库。
  4. Rust封装被编译,并与PhysX和C封装进行链接。

步骤2..4完全自动地从build.rs内部执行,而步骤1仅在升级PhysX SDK或修改生成器时才需要。因此,构建和运行pxbind是一个手动任务,并且目前仅在*nix系统上受支持。

许可证

根据您的选择,许可为以下之一

请注意,PhysX C++ SDK有它自己的BSD 3许可证

贡献

除非您明确声明,否则任何有意提交以包含在您的工作中的贡献,如Apache-2.0许可证中定义的,应如上所述双许可,没有额外的条款或条件。

依赖项