bevy_crevice_derive/
lib.rs

1mod glsl;
2mod layout;
3
4use bevy_macro_utils::BevyManifest;
5use proc_macro::TokenStream as CompilerTokenStream;
6
7use syn::{parse_macro_input, DeriveInput, Path};
8
9#[proc_macro_derive(AsStd140)]
10pub fn derive_as_std140(input: CompilerTokenStream) -> CompilerTokenStream {
11    let input = parse_macro_input!(input as DeriveInput);
12    let expanded = layout::emit(input, "Std140", "std140", 16);
13
14    CompilerTokenStream::from(expanded)
15}
16
17#[proc_macro_derive(AsStd430)]
18pub fn derive_as_std430(input: CompilerTokenStream) -> CompilerTokenStream {
19    let input = parse_macro_input!(input as DeriveInput);
20    let expanded = layout::emit(input, "Std430", "std430", 0);
21
22    CompilerTokenStream::from(expanded)
23}
24
25#[proc_macro_derive(GlslStruct)]
26pub fn derive_glsl_struct(input: CompilerTokenStream) -> CompilerTokenStream {
27    let input = parse_macro_input!(input as DeriveInput);
28    let expanded = glsl::emit(input);
29
30    CompilerTokenStream::from(expanded)
31}
32
33const BEVY: &str = "bevy";
34const BEVY_CREVICE: &str = "bevy_crevice";
35const BEVY_RENDER: &str = "bevy_render";
36
37fn bevy_crevice_path() -> Path {
38    let bevy_manifest = BevyManifest::default();
39    bevy_manifest
40        .maybe_get_path(crate::BEVY)
41        .map(|bevy_path| {
42            let mut segments = bevy_path.segments;
43            segments.push(BevyManifest::parse_str("render"));
44            Path {
45                leading_colon: None,
46                segments,
47            }
48        })
49        .or_else(|| bevy_manifest.maybe_get_path(crate::BEVY_RENDER))
50        .map(|bevy_render_path| {
51            let mut segments = bevy_render_path.segments;
52            segments.push(BevyManifest::parse_str("render_resource"));
53            Path {
54                leading_colon: None,
55                segments,
56            }
57        })
58        .unwrap_or_else(|| bevy_manifest.get_path(crate::BEVY_CREVICE))
59}