use crate::pipeline::graphics::vertex_input::VertexMemberTy;
#[macro_export]
macro_rules! impl_vertex {
($out:ty $(, $member:ident)*) => (
#[allow(unsafe_code)]
unsafe impl $crate::pipeline::graphics::vertex_input::Vertex for $out {
#[inline(always)]
fn member(name: &str) -> Option<$crate::pipeline::graphics::vertex_input::VertexMemberInfo> {
use std::ptr;
#[allow(unused_imports)]
use $crate::format::Format;
use $crate::pipeline::graphics::vertex_input::VertexMemberInfo;
use $crate::pipeline::graphics::vertex_input::VertexMemberTy;
use $crate::pipeline::graphics::vertex_input::VertexMember;
$(
if name == stringify!($member) {
let dummy = <$out>::default();
#[inline] fn f<T: VertexMember>(_: &T) -> (VertexMemberTy, usize) { T::format() }
let (ty, array_size) = f(&dummy.$member);
let dummy_ptr = (&dummy) as *const _;
let member_ptr = (&dummy.$member) as *const _;
return Some(VertexMemberInfo {
offset: member_ptr as usize - dummy_ptr as usize,
ty: ty,
array_size: array_size,
});
}
)*
None
}
}
)
}
pub unsafe trait VertexMember {
fn format() -> (VertexMemberTy, usize);
}
unsafe impl VertexMember for i8 {
#[inline]
fn format() -> (VertexMemberTy, usize) {
(VertexMemberTy::I8, 1)
}
}
unsafe impl VertexMember for u8 {
#[inline]
fn format() -> (VertexMemberTy, usize) {
(VertexMemberTy::U8, 1)
}
}
unsafe impl VertexMember for i16 {
#[inline]
fn format() -> (VertexMemberTy, usize) {
(VertexMemberTy::I16, 1)
}
}
unsafe impl VertexMember for u16 {
#[inline]
fn format() -> (VertexMemberTy, usize) {
(VertexMemberTy::U16, 1)
}
}
unsafe impl VertexMember for i32 {
#[inline]
fn format() -> (VertexMemberTy, usize) {
(VertexMemberTy::I32, 1)
}
}
unsafe impl VertexMember for u32 {
#[inline]
fn format() -> (VertexMemberTy, usize) {
(VertexMemberTy::U32, 1)
}
}
unsafe impl VertexMember for f32 {
#[inline]
fn format() -> (VertexMemberTy, usize) {
(VertexMemberTy::F32, 1)
}
}
unsafe impl VertexMember for f64 {
#[inline]
fn format() -> (VertexMemberTy, usize) {
(VertexMemberTy::F64, 1)
}
}
unsafe impl<T> VertexMember for (T,)
where
T: VertexMember,
{
#[inline]
fn format() -> (VertexMemberTy, usize) {
<T as VertexMember>::format()
}
}
unsafe impl<T> VertexMember for (T, T)
where
T: VertexMember,
{
#[inline]
fn format() -> (VertexMemberTy, usize) {
let (ty, sz) = <T as VertexMember>::format();
(ty, sz * 2)
}
}
unsafe impl<T> VertexMember for (T, T, T)
where
T: VertexMember,
{
#[inline]
fn format() -> (VertexMemberTy, usize) {
let (ty, sz) = <T as VertexMember>::format();
(ty, sz * 3)
}
}
unsafe impl<T> VertexMember for (T, T, T, T)
where
T: VertexMember,
{
#[inline]
fn format() -> (VertexMemberTy, usize) {
let (ty, sz) = <T as VertexMember>::format();
(ty, sz * 4)
}
}
#[cfg(feature = "nalgebra")]
unsafe impl<T> VertexMember for nalgebra::Vector1<T>
where
T: VertexMember,
{
#[inline]
fn format() -> (VertexMemberTy, usize) {
<T as VertexMember>::format()
}
}
#[cfg(feature = "nalgebra")]
unsafe impl<T> VertexMember for nalgebra::Vector2<T>
where
T: VertexMember,
{
#[inline]
fn format() -> (VertexMemberTy, usize) {
let (ty, sz) = <T as VertexMember>::format();
(ty, sz * 2)
}
}
#[cfg(feature = "nalgebra")]
unsafe impl<T> VertexMember for nalgebra::Vector3<T>
where
T: VertexMember,
{
#[inline]
fn format() -> (VertexMemberTy, usize) {
let (ty, sz) = <T as VertexMember>::format();
(ty, sz * 3)
}
}
#[cfg(feature = "nalgebra")]
unsafe impl<T> VertexMember for nalgebra::Vector4<T>
where
T: VertexMember,
{
#[inline]
fn format() -> (VertexMemberTy, usize) {
let (ty, sz) = <T as VertexMember>::format();
(ty, sz * 4)
}
}
#[cfg(feature = "nalgebra")]
unsafe impl<T> VertexMember for nalgebra::Point1<T>
where
T: VertexMember + nalgebra::Scalar,
{
#[inline]
fn format() -> (VertexMemberTy, usize) {
<T as VertexMember>::format()
}
}
#[cfg(feature = "nalgebra")]
unsafe impl<T> VertexMember for nalgebra::Point2<T>
where
T: VertexMember + nalgebra::Scalar,
{
#[inline]
fn format() -> (VertexMemberTy, usize) {
let (ty, sz) = <T as VertexMember>::format();
(ty, sz * 2)
}
}
#[cfg(feature = "nalgebra")]
unsafe impl<T> VertexMember for nalgebra::Point3<T>
where
T: VertexMember + nalgebra::Scalar,
{
#[inline]
fn format() -> (VertexMemberTy, usize) {
let (ty, sz) = <T as VertexMember>::format();
(ty, sz * 3)
}
}
#[cfg(feature = "nalgebra")]
unsafe impl<T> VertexMember for nalgebra::Point4<T>
where
T: VertexMember + nalgebra::Scalar,
{
#[inline]
fn format() -> (VertexMemberTy, usize) {
let (ty, sz) = <T as VertexMember>::format();
(ty, sz * 4)
}
}
macro_rules! impl_vm_array {
($sz:expr) => {
unsafe impl<T> VertexMember for [T; $sz]
where
T: VertexMember,
{
#[inline]
fn format() -> (VertexMemberTy, usize) {
let (ty, sz) = <T as VertexMember>::format();
(ty, sz * $sz)
}
}
};
}
impl_vm_array!(1);
impl_vm_array!(2);
impl_vm_array!(3);
impl_vm_array!(4);
impl_vm_array!(5);
impl_vm_array!(6);
impl_vm_array!(7);
impl_vm_array!(8);
impl_vm_array!(9);
impl_vm_array!(10);
impl_vm_array!(11);
impl_vm_array!(12);
impl_vm_array!(13);
impl_vm_array!(14);
impl_vm_array!(15);
impl_vm_array!(16);
impl_vm_array!(32);
impl_vm_array!(64);