1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
/*!
* This crate contains a `Renderer` that uses OpenGL, via the [`glow`] crate, to render an
* [`easy-imgui`] user interface.
*/

mod renderer;
pub mod glr;
pub use glow;
pub use easy_imgui;
pub use easy_imgui_sys;

pub use renderer::*;

// These macros should be in glr, but hey...

#[macro_export]
macro_rules! uniform {
    (
        $(
            $(#[$a:meta])* $v:vis struct $name:ident {
                $(
                    $fv:vis $f:ident : $ft:tt
                ),*
                $(,)?
            }
        )*
    ) => {
        $(
            $(#[$a])* $v struct $name {
                $(
                    $fv $f: $ft ,
                )*
            }
            impl $crate::glr::UniformProvider for $name {
                fn apply(&self, gl: &$crate::glr::GlContext, u: &$crate::glr::Uniform) {
                    let name = u.name();
                    $(
                        if name == $crate::uniform!{ @NAME $f: $ft }  {
                            self.$f.apply(gl, u.location());
                            return;
                        }
                    )*
                }
            }
        )*
    };
    (@NAME $f:ident : [ $ft:ty; $n:literal ]) => { concat!(stringify!($f), "[0]") };
    (@NAME $f:ident : $ft:ty) => { stringify!($f) };
}


#[macro_export]
macro_rules! attrib {
    (
        $(
            $(#[$a:meta])* $v:vis struct $name:ident {
                $(
                    $fv:vis $f:ident : $ft:ty
                ),*
                $(,)?
            }
        )*
    ) => {
        $(
            $(#[$a])* $v struct $name {
                $(
                    $fv $f: $ft ,
                )*
            }
            unsafe impl $crate::glr::AttribProvider for $name {
                fn apply(gl: &$crate::glr::GlContext, a: &$crate::glr::Attribute) -> Option<(usize, u32, usize)> {
                    let name = a.name();
                    $(
                        if name == stringify!($f) {
                            let (n, t) = <$ft as $crate::glr::AttribField>::detail();
                            return Some((n, t, memoffset::offset_of!($name, $f)));
                        }
                    )*
                    None
                }
            }
        )*
    }
}