imgui-rs/imgui-sys/src/gfx_support.rs
2018-08-12 14:16:56 +03:00

55 lines
1.9 KiB
Rust

use gfx::format::{Format, Formatted, U8Norm};
use gfx::pso::buffer::{ElemOffset, Element, Structure};
use gfx::traits::Pod;
use std::mem;
use super::{ImDrawVert, ImVec2};
unsafe impl Pod for ImDrawVert {}
impl Structure<Format> for ImDrawVert {
fn query(name: &str) -> Option<Element<Format>> {
// array query hack from gfx_impl_struct_meta macro
let (sub_name, big_offset) = {
let mut split = name.split(|c| c == '[' || c == ']');
let _ = split.next().unwrap();
match split.next() {
Some(s) => {
let array_id: ElemOffset = s.parse().unwrap();
let sub_name = match split.next() {
Some(s) if s.starts_with('.') => &s[1..],
_ => name,
};
(
sub_name,
array_id * (mem::size_of::<ImDrawVert>() as ElemOffset),
)
}
None => (name, 0),
}
};
let dummy: &ImDrawVert = unsafe { mem::transmute(0usize) };
match sub_name {
"pos" => Some(Element {
format: <ImVec2 as Formatted>::get_format(),
offset: unsafe { mem::transmute::<_, usize>(&dummy.pos) } as ElemOffset
+ big_offset,
}),
"uv" => Some(Element {
format: <ImVec2 as Formatted>::get_format(),
offset: unsafe { mem::transmute::<_, usize>(&dummy.uv) } as ElemOffset + big_offset,
}),
"col" => Some(Element {
format: <[U8Norm; 4] as Formatted>::get_format(),
offset: unsafe { mem::transmute::<_, usize>(&dummy.col) } as ElemOffset
+ big_offset,
}),
_ => None,
}
}
}
gfx_format! {
ImVec2: R32_G32 = Vec2<Float>
}