| macro_rules! impl_vec_types { |
| ($t:ty, $vec2:ident, $vec3:ident, $vec4:ident) => { |
| impl Distribution<$vec2> for Standard { |
| #[inline] |
| fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> $vec2 { |
| rng.gen::<[$t; 2]>().into() |
| } |
| } |
| |
| impl Distribution<$vec3> for Standard { |
| #[inline] |
| fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> $vec3 { |
| rng.gen::<[$t; 3]>().into() |
| } |
| } |
| |
| impl Distribution<$vec4> for Standard { |
| #[inline] |
| fn sample<R: Rng + ?Sized>(&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<R: Rng + ?Sized>(&self, rng: &mut R) -> $mat2 { |
| $mat2::from_cols_array(&rng.gen()) |
| } |
| } |
| |
| impl Distribution<$mat3> for Standard { |
| #[inline] |
| fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> $mat3 { |
| $mat3::from_cols_array(&rng.gen()) |
| } |
| } |
| |
| impl Distribution<$mat4> for Standard { |
| #[inline] |
| fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> $mat4 { |
| $mat4::from_cols_array(&rng.gen()) |
| } |
| } |
| |
| impl Distribution<$quat> for Standard { |
| #[inline] |
| fn sample<R: Rng + ?Sized>(&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<Vec3A> for Standard { |
| #[inline] |
| fn sample<R: Rng + ?Sized>(&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); |
| } |