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 在 模拟
131 每月下载次数
用于 7 个 crate(4 个直接使用)
11MB
215K SLoC
请参阅包含正在进行中的安全包装器的 仓库。
演示
Tomasz Stachowiak 在 2019 年 10 月的斯德哥尔摩 Rust Meetup 上对这一项目进行了演示,介绍了 C++ 到 Rust 的绑定 physx-sys
的工作技术细节。
基本用法
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++编译器)直接提取的结构布局元数据。
构建过程包括几个步骤
pxbind
实用程序使用clang
提取关于PhysX函数和类型的元数据,并生成部分Rust和C绑定作为physx_generated.hpp
和physx_generated.rs
。这些包含所有函数定义和类型的小子集。它还通过生成structgen.cpp
来生成一个名为structgen
的C++实用程序。structgen
针对PhysX SDK进行编译,并生成所有剩余的类型封装。对于每个结构,它查询其成员的大小和偏移量,并生成structgen_out.hpp
和structgen_out.rs
。这些类型是“平凡旧数据”结构,将完美匹配C++类型的数据布局。- 所有生成的C类型一起编译形成
physx_api
,这是一个Rust可以链接的静态库。 - Rust封装被编译,并与PhysX和C封装进行链接。
步骤2..4完全自动地从build.rs
内部执行,而步骤1仅在升级PhysX SDK或修改生成器时才需要。因此,构建和运行pxbind
是一个手动任务,并且目前仅在*nix系统上受支持。
许可证
根据您的选择,许可为以下之一
- Apache License,版本2.0,(LICENSE-APACHE或https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT许可证(LICENSE-MIT或https://open-source.org.cn/licenses/MIT)
。
请注意,PhysX C++ SDK有它自己的BSD 3许可证。
贡献
除非您明确声明,否则任何有意提交以包含在您的工作中的贡献,如Apache-2.0许可证中定义的,应如上所述双许可,没有额外的条款或条件。