use crate::align::{Align16, Align32, Align8};
use crate::array::MapArray;
use crate::scalar::{boolean, double, float, int, uint};
use crate::uniform::{Std140, Uniform};
macro_rules! implement_vec {
($vec:ident => [$type:ty; $size:tt]: $align:tt) => {
impl<T> From<[T; $size]> for $vec
where
T: Into<$type>,
{
fn from(values: [T; $size]) -> Self {
$vec(MapArray::map_array(values, T::into))
}
}
impl AsRef<[$type; $size]> for $vec {
fn as_ref(&self) -> &[$type; $size] {
&self.0
}
}
impl AsMut<[$type; $size]> for $vec {
fn as_mut(&mut self) -> &mut [$type; $size] {
&mut self.0
}
}
impl AsRef<[$type]> for $vec {
fn as_ref(&self) -> &[$type] {
&self.0
}
}
impl AsMut<[$type]> for $vec {
fn as_mut(&mut self) -> &mut [$type] {
&mut self.0
}
}
unsafe impl Std140 for $vec {}
impl Uniform for $vec {
type Align = $align;
type Std140 = $vec;
fn std140(&self) -> $vec {
*self
}
}
};
}
#[derive(Clone, Copy, Debug, Default, PartialOrd, PartialEq, Ord, Eq, Hash)]
pub struct bvec2([boolean; 2]);
implement_vec!(bvec2 => [boolean; 2] : Align8);
#[derive(Clone, Copy, Debug, Default, PartialOrd, PartialEq, Ord, Eq, Hash)]
pub struct bvec3([boolean; 3]);
implement_vec!(bvec3 => [boolean; 3] : Align16);
#[derive(Clone, Copy, Debug, Default, PartialOrd, PartialEq, Ord, Eq, Hash)]
pub struct bvec4([boolean; 4]);
implement_vec!(bvec4 => [boolean; 4] : Align16);
#[derive(Clone, Copy, Debug, Default, PartialOrd, PartialEq, Ord, Eq, Hash)]
pub struct ivec2([int; 2]);
implement_vec!(ivec2 => [int; 2] : Align8);
#[derive(Clone, Copy, Debug, Default, PartialOrd, PartialEq, Ord, Eq, Hash)]
pub struct ivec3([int; 3]);
implement_vec!(ivec3 => [int; 3] : Align16);
#[derive(Clone, Copy, Debug, Default, PartialOrd, PartialEq, Ord, Eq, Hash)]
pub struct ivec4([int; 4]);
implement_vec!(ivec4 => [int; 4] : Align16);
#[derive(Clone, Copy, Debug, Default, PartialOrd, PartialEq, Ord, Eq, Hash)]
pub struct uvec2([uint; 2]);
implement_vec!(uvec2 => [uint; 2] : Align8);
#[derive(Clone, Copy, Debug, Default, PartialOrd, PartialEq, Ord, Eq, Hash)]
pub struct uvec3([uint; 3]);
implement_vec!(uvec3 => [uint; 3] : Align16);
#[derive(Clone, Copy, Debug, Default, PartialOrd, PartialEq, Ord, Eq, Hash)]
pub struct uvec4([uint; 4]);
implement_vec!(uvec4 => [uint; 4] : Align16);
#[derive(Clone, Copy, Debug, Default, PartialOrd, PartialEq)]
pub struct vec2([float; 2]);
implement_vec!(vec2 => [float; 2] : Align8);
#[derive(Clone, Copy, Debug, Default, PartialOrd, PartialEq)]
pub struct vec3([float; 3]);
implement_vec!(vec3 => [float; 3] : Align16);
#[derive(Clone, Copy, Debug, Default, PartialOrd, PartialEq)]
pub struct vec4([float; 4]);
implement_vec!(vec4 => [float; 4] : Align16);
#[derive(Clone, Copy, Debug, Default, PartialOrd, PartialEq)]
pub struct dvec2([double; 2]);
implement_vec!(dvec2 => [double; 2] : Align16);
#[derive(Clone, Copy, Debug, Default, PartialOrd, PartialEq)]
pub struct dvec3([double; 3]);
implement_vec!(dvec3 => [double; 3] : Align32);
#[derive(Clone, Copy, Debug, Default, PartialOrd, PartialEq)]
pub struct dvec4([double; 4]);
implement_vec!(dvec4 => [double; 4] : Align32);