3个版本 (破坏性更新)
0.3.0 | 2023年11月28日 |
---|---|
0.2.0 | 2023年11月17日 |
0.1.0 | 2023年11月15日 |
#1866 在 解析器实现
每月21次 下载
用于 orphist
185KB
5K SLoC
orphism
概述
作为一名VTuber,你的模型可能附带了一堆位于 runtime
目录下的文件。orphism
是一个Rust编程语言的库,它允许你加载和解释这些文件,前提是你的程序是用Rust编写的。
从那时起,你要做什么取决于你自己。
这不是什么?
- 没有UI,这是一个用于构建其他东西的库。
- 它不提供创建、编辑模型的方式,除了数据序列化和反序列化。
- 如果你需要这些,格式供应商的官方编辑器提供了这些功能。
- 它不提供对这些资产的非Rust接口。
- 如果你需要这些,格式供应商的官方SDK提供了这些功能。
尽管可能使用这个库构建一些或全部这些功能,但它们都明确不包括在本项目的范围之内。
那么它是什么?
- 它提供了一系列数据类型,用于读取、验证和分析这些文件。
- 它为在顶部构建其他(更有趣)的东西提供了一个基础。
- 它不受格式供应商的EULA和许可要求的限制,因为它不与他们的SDK或任何其他受许可的工作共享或包含任何代码。
这个存在的原因是什么?
-
作为对VTubing社区及其每天所做的一切表示感谢的象征。
-
为其他Rustaceans在VTubing空间中构建酷东西打开一条道路。
我如何获得这个神奇的工具?
在你的项目目录中运行以下Cargo命令(假设你已经安装了 cargo-edit)
cargo add orphism
或者将以下行添加到你的 Cargo.toml
(在 [dependencies]
数组中)
orphism = "^ 0.2"
我如何使用它?
一个最小的程序可能看起来像这样
use orphism::Runtime;
use orphism::moc3::Model;
use std::path::PathBuf;
fn main() {
let runtime = Runtime::new_from_runtime_path(PathBuf::from("./path/to/model/runtime")).expect("failed to load runtime directory");
let moc3 = runtime.load_model().expect("failed to load model").data;
let model = Model::read(moc3).expect("failed to parse model");
}
核心数据类型
orphism
主要围绕两种数据类型展开。
运行时
orphism
中的 Runtime
结构体表示包含您运行时模型资产的 runtime/
目录。这基本上是磁盘上的状态,以及从该状态加载的机制。
大多数运行时包含一个模型以及与此模型相关的其他文件,orphism
将尝试检测这一点。如果在给定的运行时目录中检测到多个模型,它将返回一个错误,指示问题所在,以及它尝试从中加载的路径。
对于这些情况,有一个 Runtime::new_from_model_path
函数,允许您通过针对特定的模型文件来消除歧义。
一旦您有了 Runtime
,您就可以调用它的 .load_model()
方法来加载 Model
。
模型
orphism
中的 Model
结构体表示加载和解析后文件的包含内容。这基本上是内存中的状态,以及访问和使用数据的机制。
项目 Crates
orphism
由几个相关的 Crates 组成。顶层 Crates 是这个,它重新导出所有其他子 Crates(除了 orphist
),同时提供统一的错误处理。
如果您不需要全部内容,每个支持的数据格式都有一个单独的 Crates,因此您可以只加载您想要执行的操作所需的所需内容。
还有一个主要用于测试和验证的命令行界面。
这是如何制作的?
- 仔细地,没有使用或引用格式供应商的任何代码或库。
- ImHex 中来自 MOC3ingbird Exploit (CVE-2023-27566) 的突出显示模式对于理解此格式至关重要。
- 关于未记录的 JSON 格式的发现过程在此描述:这里。
- 关于未记录的二进制格式的发现过程在此描述:这里。
许可证
orphism
可在 MIT 许可证下使用。有关完整文本,请参阅 LICENSE.txt
。
虽然许可证很短,但它仍然是用律师的语言写的。如果您更喜欢更接地气的话,请考虑以下内容
依赖项
~6–16MB
~221K SLoC