15 个版本
新版本 0.6.0 | 2024年8月19日 |
---|---|
0.5.3 | 2024年7月23日 |
0.5.2 | 2023年11月13日 |
0.5.1 | 2023年4月27日 |
0.1.3 | 2021年4月16日 |
#37 in #glsl
226 每月下载量
385KB
10K SLoC
glsl-lang-quote
glsl-lang-quote
提供了使用 [glsl_lang] crate 在 Rust 中引用 GLSL 语法的 proc-macros。
使用方法
use glsl_lang_quote::glsl;
// Parse a translation unit at compile time
let ast = glsl! {
void main() {
gl_FragColor = vec4(1., 0., 0., 1.);
}
};
// There is exactly one external declaration
assert_eq!(ast.0.len(), 1);
解析表达式
此 crate 提供了 quote-expr
和 quote-statement
这组功能,启用这些功能会在 [glsl_lang] 中启用相应的 parser-expr
和 parser-statement
,从而为语言语法的此类 GLSL 片段创建专门的解析器。
这是在编译时解析大量表达式和语句的最高效选项,但是这会减慢 glsl-lang-quote
的初始编译速度,因为 [glsl_lang] 中生成的解析器文件将大得多。
因此,默认情况下,此 crate 启用了 quote-parsable
功能,该功能使用 [glsl_lang] 的 glsl_lang::parse::Parsable trait,其限制适用。无论您选择哪种方法,以下代码都将正常工作
use glsl_lang_quote::glsl_expr;
// Parse an expression
let ast = glsl_expr! {
a = vec4(1., 0., 0., 1.)
};
引用和有状态的词法分析器
由于 [glsl_lang] 的解析器有一个有状态的词法分析器(用于处理 GLSL 的语法不是上下文无关的事实),声明一个类型(例如一个 struct
)并使用它必须在同一个宏调用中发生,否则解析器将 忘记 之前声明的类型。最好只解析整个翻译单元 ([glsl!] 宏),或解析无歧义的片段(例如表达式,但不包括语句)。
use glsl_lang_quote::{glsl, glsl_statement};
// This is ok:
let ast = glsl! {
struct PointLight {
vec3 pos;
vec3 color;
}
PointLight p;
};
// This will not compile, PointLight can't be parsed as a type name without extra state
let statement = glsl_expr! {
PointLight p;
};
## Author
Alixinne <alixinne@pm.me>
## License
BSD-3-Clause
依赖项
~3–10MB
~107K SLoC