#wad #texture #quake #async #gamedev

ogre

Rust语言的Quake和Half-Life纹理WAD解析器

8个版本

0.1.7 2024年4月2日
0.1.6 2021年10月24日
0.1.3 2021年5月4日

数据格式中排名23

每月下载47

MIT许可证

54KB
1K SLoC

Ogre — 许可证 最新版本 文档

Rust语言的Quake和Half-Life纹理WAD解析器

ogre 是Quake和Half-Life WAD 文件的Rust表示和 nom 解析器。

它完全用Rust编写,并通过 #![forbid(unsafe_code)] 强制在crate范围内使用安全代码。

Rust表示

Rust表示位于 repr 模块中,是一组表示解析 WAD 文件内容的结构。

WAD 文件包含某些中间结构,例如头文件和元数据目录,这些结构仅在解析时存在,因此不会出现在最终表示中。对于您想检查 WAD 这些元素的情况,parser 模块包含自己的 parser::repr 子模块,以及用于解析到这些结构中的 nom 函数。

解析

WAD 文件解析成抽象语法树(AST)的最简单方法是通过 parser::parse_wad 函数

let wad = include_bytes!("../../ogre/test_data/wad2/medieval.wad");
let (_, wad) = ogre::parser::parse_wad(wad).expect("Failed to parse WAD");
assert!(wad.len() > 0);
println!("{:#?}", wad);

这将解析完整的 Wad,并在完成前阻塞调用线程。内部,它调用 parser 模块中的其余函数来组装其最终输出。在需要更细粒度解析的情况下,这些函数也可以直接使用。

为了更好的性能,建议使用并行化实现。有关更多信息,请参阅下面的 Async 头文件。

格式支持

ogre 支持 Quake WAD2 和 Half-Life WAD3 格式。

目前,由于原始 Doom WAD 格式的数据结构不同和范围较大,因此不支持该格式。

Serde 支持

对于需要序列化和反序列化 Rust 表示的情况,ogre 包含了为 reprparser::repr 模块中的所有类型提供的 serde::Serializeserde::Deserialize derive。

此功能受 serde_support 特性标志控制,默认启用。

Async

ogre 包含了一个并行化实现,该实现使用 async_std::taskparser 中的例程和一些 WAD 字节源之间进行复用。这种方法比单线程扩展得更好,并且通常性能更优——特别是对于大型 WAD 文件。解释和使用指南可以在 parser_async 模块中找到。

此功能受 async 特性标志控制,默认启用。

依赖项

~0.8–10MB
~103K SLoC