#blender #blend #parser #gamedev #game

blend-rs

一个用于读取Blender的.blend文件的Rust库

3个版本 (重大更改)

0.3.0 2022年12月23日
0.2.0 2022年8月7日
0.1.0 2022年8月7日

#1715游戏开发

Apache-2.0

1.5MB
677

blend-rs

一个用于读取Blender的.blend文件,无需烦恼字节解析的Rust库。

注意:有关更多详细信息,请参阅文档。

描述

该库属于一组三个库,它们都与读取Blender的.blend文件的主题相关

  • blend-inspect-rs:一个用于解析和分析Blender的.blend文件的Rust库。

  • blend-bindgen-rs:一个用于生成Blender数据结构的Rust库。

  • blend-rs:一个用于从Blender的.blend文件中读取对象的Rust库。

贡献

欢迎所有贡献:想法、补丁、文档、错误报告、投诉。根据Apache-2.0许可证,您有意提交以包含在此crate中的任何贡献,将不受任何附加条款或条件的约束。

许可证

根据Apache许可证,版本2.0授权。


lib.rs:

githubcrates-iodocs-rs

blender-rs

一个用于读取Blender的.blend文件,无需烦恼字节解析的Rust库。

注意:由于本库的功能,并非所有Blender版本都受支持。有关crate功能的表格列出了支持的Blender版本。

示例

以下示例说明了如何提取对象的网格的每个顶点的坐标。

use blend_rs::blend::{read, StructIter, PointerLike, NameLike};
use blend_rs::blend::traverse::Named;

use blend_rs::blender3_2::{Object, Mesh, MPoly, MVert, MLoop};

pub struct Vertex {
    pub position: [f32; 3],
}

fn main() {

   let blend_data = std::fs::read("examples/example-3.2.blend")
       .expect("Blend file not found!");

   let reader = read(&blend_data)
       .expect("Failed to read blend data!");

   let plane: &Object = reader.iter::<Object>().unwrap()
       .find(|object| object.id.get_name() == "Plane")
       .unwrap();

   let mesh = reader.deref_single(&plane.data.as_instance_of::<Mesh>())
       .expect("Could not get mesh from object!");

   let mesh_polygons: StructIter<MPoly> = reader.deref(&mesh.mpoly)
       .expect("Could not get polygons from mesh!");

   let mesh_loops: Vec<&MLoop> = reader.deref(&mesh.mloop)
       .expect("Could not get loops from mesh!")
       .collect();

   let mesh_vertices: Vec<&MVert> = reader.deref(&mesh.mvert)
       .expect("Could not get vertices from mesh!")
       .collect();

   let vertices_per_polygon: Vec<Vec<Vertex>> = mesh_polygons
       .map(|polygon| {
           (polygon.loopstart..polygon.loopstart + polygon.totloop).into_iter()
               .map(|loop_index| {
                   Vertex {
                       position: mesh_vertices[mesh_loops[loop_index as usize].v as usize].co
                   }
               })
               .collect()
       })
       .collect();
}

crate功能

根据您的需要启用或禁用功能,以优化编译时间。

功能 默认 描述
blender2_79 生成并包含适用于Blender 2.79(64位,小端)的代码
blender2_80 生成并包含适用于Blender 2.80(64位,小端)的代码
blender2_80x86 生成并包含适用于Blender 2.80(32位,小端)的代码
blender2_93 生成并包含适用于Blender 2.93(64位,小端)的代码
blender3_2 生成并包含适用于Blender 3.2(64位,小端)的代码
blender3_3 生成并包含适用于Blender 3.3(64位,小端)的代码
all 生成并包含适用于所有上述Blender版本的代码

✔ 启用,✗ 禁用

详细信息

blend-rs 严重依赖于由 Blender DNA 生成的代码。Blender DNA 是每个 *.blend 文件的一部分,包含了对文件中所有结构体、类型和名称的描述。Blender 使用 DNA 来实现前向和后向兼容性。blend-rs 使用 DNA 来生成 Rust 代码。

该库属于一组三个库,它们都与读取Blender的.blend文件的主题相关

  • blend-inspect-rs:一个用于解析和分析 Blender 的 .blend 文件的 Rust 库。
  • blend-bindgen-rs:一个用于生成 Blender 数据结构的 Rust 库。
  • blend-rs:一个用于读取 Blender 的 .blend 文件的 Rust 库。

依赖关系