23 个版本

0.10.0 2023 年 3 月 22 日
0.8.8 2022 年 10 月 24 日
0.8.7 2022 年 4 月 19 日
0.8.6 2022 年 3 月 31 日
0.8.3 2021 年 11 月 30 日

#1761解析器实现

Download history 97/week @ 2024-03-07 66/week @ 2024-03-14 31/week @ 2024-03-21 26/week @ 2024-03-28 51/week @ 2024-04-04 33/week @ 2024-04-11

每月 156 次下载
用于 optima

MIT/Apache

385KB
8K SLoC

License: MIT Apache License 2.0 docs.rs crates.io Download numbers Github CI Minimum rustc version

Collada 解析器

这是一个用于 Collada (.dae) 格式的解析器,用于 3D 渲染器和游戏之间的数据交换。与 collada crate 相比,这个 crate 尝试更直接地表示 Collada 数据模型,并且也更为完整。它支持读写操作。

用法

主入口点是 Document 类型,它实现了 FromStr 来转换字面字符串/切片,或 Document::from_file 从磁盘上的 .dae 文件中读取。

Collada 文档会积极地进行解析,根据 COLLADA 架构 验证所有内容。一旦解析,可以直接导航数据结构(结构体和枚举),因为所有数据结构都是公共的,并且紧密反映了 XML 架构。

这个库只实现了 Collada 规范的 1.4.1 版本,尽管将来可能会扩展。(如果您在规范中发现了任何缺失的内容,或者有对后续版本的用例,请提交问题或 PR。)

use std::str::FromStr;
use dae_parser::*;

let dae_file = r##"<?xml version="1.0" encoding="utf-8"?>
<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.1">
  <asset>
    <created>1970-01-01T00:00:00Z</created>
    <modified>1970-01-01T00:00:00Z</modified>
  </asset>
  <library_geometries>
    <geometry id="Cube-mesh" name="Cube">
      <mesh>
        <source id="Cube-mesh-positions">
          <float_array id="Cube-mesh-positions-array" count="18">
            1 1 1 1 -1 1 1 -1 -1 -1 1 1 -1 -1 1 -1 -1 -1
          </float_array>
          <technique_common>
            <accessor source="#Cube-mesh-positions-array" count="6" stride="3">
              <param name="X" type="float"/>
              <param name="Y" type="float"/>
              <param name="Z" type="float"/>
            </accessor>
          </technique_common>
        </source>
        <vertices id="Cube-mesh-vertices">
          <input semantic="POSITION" source="#Cube-mesh-positions"/>
        </vertices>
        <triangles material="Material-material" count="4">
          <input semantic="VERTEX" source="#Cube-mesh-vertices" offset="0"/>
          <p>3 1 0 1 5 2 3 4 1 1 4 5</p>
        </triangles>
      </mesh>
    </geometry>
  </library_geometries>
</COLLADA>"##;

let document = Document::from_str(dae_file).unwrap();
let cube = document.local_map::<Geometry>().unwrap().get_str("Cube-mesh").unwrap();
let sources_map = document.local_map::<Source>().unwrap();
let vertices_map = document.local_map::<Vertices>().unwrap();
// sources.get("Cube-mesh-positions").unwrap();
assert_eq!(cube.id.as_ref().unwrap(), "Cube-mesh");
let mesh = cube.element.as_mesh().unwrap();
let tris = mesh.elements[0].as_triangles().unwrap();
assert_eq!(
    tris.data.as_deref().unwrap(),
    &[3, 1, 0, 1, 5, 2, 3, 4, 1, 1, 4, 5]
);
assert_eq!(tris.inputs[0].semantic, Semantic::Vertex);
let vertices = vertices_map.get_raw(&tris.inputs[0].source).unwrap();
assert_eq!(vertices.id, "Cube-mesh-vertices");
let source = sources_map
    .get_raw(&vertices.position_input().source)
    .unwrap();
assert_eq!(source.id.as_deref(), Some("Cube-mesh-positions"));

许可证

根据以下许可证之一授权

由您选择。

贡献

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

依赖项

~2.6–4MB
~71K SLoC