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 在 解析器实现
每月 156 次下载
用于 optima
385KB
8K SLoC
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 (LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT 许可证 (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
由您选择。
贡献
除非您明确声明,否则任何有意提交以包含在您的工作中的贡献,根据 Apache-2.0 许可证定义,应作为上述双重许可,不附加任何额外条款或条件。
依赖项
~2.6–4MB
~71K SLoC