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

Download history 2/week @ 2024-06-29 35/week @ 2024-07-06 114/week @ 2024-07-20 15/week @ 2024-07-27 203/week @ 2024-08-17

226 每月下载量

BSD-3-Clause 许可

385KB
10K SLoC

glsl-lang-quote

Crates.io docs.rs

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-exprquote-statement 这组功能,启用这些功能会在 [glsl_lang] 中启用相应的 parser-exprparser-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