macro_rules! impl_vec_types { ($t:ty, $vec2:ident, $vec3:ident, $vec4:ident) => { impl Distribution<$vec2> for Standard { #[inline] fn sample(&self, rng: &mut R) -> $vec2 { rng.gen::<[$t; 2]>().into() } } impl Distribution<$vec3> for Standard { #[inline] fn sample(&self, rng: &mut R) -> $vec3 { rng.gen::<[$t; 3]>().into() } } impl Distribution<$vec4> for Standard { #[inline] fn sample(&self, rng: &mut R) -> $vec4 { rng.gen::<[$t; 4]>().into() } } #[test] fn test_vec2_rand() { use rand::{Rng, SeedableRng}; use rand_xoshiro::Xoshiro256Plus; let mut rng1 = Xoshiro256Plus::seed_from_u64(0); let a: ($t, $t) = rng1.gen(); let mut rng2 = Xoshiro256Plus::seed_from_u64(0); let b: $vec2 = rng2.gen(); assert_eq!(a, b.into()); } #[test] fn test_vec3_rand() { use rand::{Rng, SeedableRng}; use rand_xoshiro::Xoshiro256Plus; let mut rng1 = Xoshiro256Plus::seed_from_u64(0); let a: ($t, $t, $t) = rng1.gen(); let mut rng2 = Xoshiro256Plus::seed_from_u64(0); let b: $vec3 = rng2.gen(); assert_eq!(a, b.into()); } #[test] fn test_vec4_rand() { use rand::{Rng, SeedableRng}; use rand_xoshiro::Xoshiro256Plus; let mut rng1 = Xoshiro256Plus::seed_from_u64(0); let a: ($t, $t, $t, $t) = rng1.gen(); let mut rng2 = Xoshiro256Plus::seed_from_u64(0); let b: $vec4 = rng2.gen(); assert_eq!(a, b.into()); } }; } macro_rules! impl_float_types { ($t:ident, $mat2:ident, $mat3:ident, $mat4:ident, $quat:ident, $vec2:ident, $vec3:ident, $vec4:ident) => { impl_vec_types!($t, $vec2, $vec3, $vec4); impl Distribution<$mat2> for Standard { #[inline] fn sample(&self, rng: &mut R) -> $mat2 { $mat2::from_cols_array(&rng.gen()) } } impl Distribution<$mat3> for Standard { #[inline] fn sample(&self, rng: &mut R) -> $mat3 { $mat3::from_cols_array(&rng.gen()) } } impl Distribution<$mat4> for Standard { #[inline] fn sample(&self, rng: &mut R) -> $mat4 { $mat4::from_cols_array(&rng.gen()) } } impl Distribution<$quat> for Standard { #[inline] fn sample(&self, rng: &mut R) -> $quat { let yaw = -PI + rng.gen::<$t>() * 2.0 * PI; let pitch = -PI + rng.gen::<$t>() * 2.0 * PI; let roll = -PI + rng.gen::<$t>() * 2.0 * PI; $quat::from_euler(crate::EulerRot::YXZ, yaw, pitch, roll) } } #[test] fn test_mat2_rand() { use rand::{Rng, SeedableRng}; use rand_xoshiro::Xoshiro256Plus; let mut rng1 = Xoshiro256Plus::seed_from_u64(0); let a = $mat2::from_cols_array(&rng1.gen::<[$t; 4]>()); let mut rng2 = Xoshiro256Plus::seed_from_u64(0); let b = rng2.gen::<$mat2>(); assert_eq!(a, b); } #[test] fn test_mat3_rand() { use rand::{Rng, SeedableRng}; use rand_xoshiro::Xoshiro256Plus; let mut rng1 = Xoshiro256Plus::seed_from_u64(0); let a = $mat3::from_cols_array(&rng1.gen::<[$t; 9]>()); let mut rng2 = Xoshiro256Plus::seed_from_u64(0); let b = rng2.gen::<$mat3>(); assert_eq!(a, b); } #[test] fn test_mat4_rand() { use rand::{Rng, SeedableRng}; use rand_xoshiro::Xoshiro256Plus; let mut rng1 = Xoshiro256Plus::seed_from_u64(0); let a = $mat4::from_cols_array(&rng1.gen::<[$t; 16]>()); let mut rng2 = Xoshiro256Plus::seed_from_u64(0); let b = rng2.gen::<$mat4>(); assert_eq!(a, b); } #[test] fn test_quat_rand() { use rand::{Rng, SeedableRng}; use rand_xoshiro::Xoshiro256Plus; let mut rng1 = Xoshiro256Plus::seed_from_u64(0); let a: $quat = rng1.gen(); assert!(a.is_normalized()); let mut rng2 = Xoshiro256Plus::seed_from_u64(0); let b: $quat = rng2.gen(); assert_eq!(a, b); } }; } mod f32 { use crate::{Mat2, Mat3, Mat4, Quat, Vec2, Vec3, Vec3A, Vec4}; use core::f32::consts::PI; use rand::{ distributions::{Distribution, Standard}, Rng, }; impl_float_types!(f32, Mat2, Mat3, Mat4, Quat, Vec2, Vec3, Vec4); impl Distribution for Standard { #[inline] fn sample(&self, rng: &mut R) -> Vec3A { rng.gen::<[f32; 3]>().into() } } #[test] fn test_vec3a_rand() { use rand::{Rng, SeedableRng}; use rand_xoshiro::Xoshiro256Plus; let mut rng1 = Xoshiro256Plus::seed_from_u64(0); let a: (f32, f32, f32) = rng1.gen(); let mut rng2 = Xoshiro256Plus::seed_from_u64(0); let b: Vec3A = rng2.gen(); assert_eq!(a, b.into()); } } mod f64 { use crate::{DMat2, DMat3, DMat4, DQuat, DVec2, DVec3, DVec4}; use core::f64::consts::PI; use rand::{ distributions::{Distribution, Standard}, Rng, }; impl_float_types!(f64, DMat2, DMat3, DMat4, DQuat, DVec2, DVec3, DVec4); } mod i16 { use crate::{I16Vec2, I16Vec3, I16Vec4}; use rand::{ distributions::{Distribution, Standard}, Rng, }; impl_vec_types!(i16, I16Vec2, I16Vec3, I16Vec4); } mod i32 { use crate::{IVec2, IVec3, IVec4}; use rand::{ distributions::{Distribution, Standard}, Rng, }; impl_vec_types!(i32, IVec2, IVec3, IVec4); } mod i64 { use crate::{I64Vec2, I64Vec3, I64Vec4}; use rand::{ distributions::{Distribution, Standard}, Rng, }; impl_vec_types!(i64, I64Vec2, I64Vec3, I64Vec4); } mod u16 { use crate::{U16Vec2, U16Vec3, U16Vec4}; use rand::{ distributions::{Distribution, Standard}, Rng, }; impl_vec_types!(u16, U16Vec2, U16Vec3, U16Vec4); } mod u32 { use crate::{UVec2, UVec3, UVec4}; use rand::{ distributions::{Distribution, Standard}, Rng, }; impl_vec_types!(u32, UVec2, UVec3, UVec4); } mod u64 { use crate::{U64Vec2, U64Vec3, U64Vec4}; use rand::{ distributions::{Distribution, Standard}, Rng, }; impl_vec_types!(u64, U64Vec2, U64Vec3, U64Vec4); }