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
}
}
)*
}
}