use soa_derive::StructOfArray; #[derive(Debug, Clone, PartialEq, StructOfArray)] pub struct Point { x: f32, y: f32, } #[derive(Debug, Clone, PartialEq, StructOfArray)] #[soa_derive(Debug, Clone, PartialEq)] pub struct Color { pub r: u8, pub g: u8, pub b: u8, pub a: u8, } #[derive(Debug, Clone, PartialEq, StructOfArray)] #[soa_derive(Debug, Clone, PartialEq)] pub struct Particle { pub point: Point, #[nested_soa] pub color: Color, pub mass: f32, } #[test] fn nested_soa() { let mut particle_vec = ParticleVec::new(); particle_vec.push(Particle { point: Point { x: 1.0, y: 2.0 }, color: Color { r: 255, g: 0, b: 0, a: 255 }, mass: 1.0, }); particle_vec.push(Particle { point: Point { x: 2.0, y: 3.0 }, color: Color { r: 128, g: 255, b: 100, a: 23 }, mass: 2.0, }); assert_eq!(particle_vec.point[0], Point { x: 1.0, y: 2.0 }); assert_eq!(particle_vec.color.r[0], 255); assert_eq!(particle_vec.color.g[0], 0); assert_eq!(particle_vec.color.b[0], 0); assert_eq!(particle_vec.color.a[0], 255); assert_eq!(particle_vec.point[1], Point { x: 2.0, y: 3.0 }); assert_eq!(particle_vec.color.r[1], 128); assert_eq!(particle_vec.color.g[1], 255); assert_eq!(particle_vec.color.b[1], 100); assert_eq!(particle_vec.color.a[1], 23); assert_eq!(particle_vec.color, ColorVec { r: vec![255, 128], g: vec![0, 255], b: vec![0, 100], a: vec![255, 23], }); }