clay_core/
pack.rs

1use nalgebra::{Scalar, Vector3, Matrix3};
2
3
4/// Something that could be packed to `i32` buffers
5pub trait PackInt {
6    /// Size of integer part of an object.
7    fn size() -> usize;
8    
9    /// Write an object into `i32` buffer.
10    ///
11    /// Buffer *must* be of size greater or equal to object's one.
12    fn pack_int_to(&self, buffer: &mut [i32]);
13}
14
15/// Something that could be packed to `f32` buffers
16pub trait PackFloat {
17    /// Size of float part of an object.
18    fn size() -> usize;
19
20    /// Write an object into `f32` buffer.
21    ///
22    /// Buffer *must* be of size greater or equal to object's one.
23    fn pack_float_to(&self, buffer: &mut [f32]);
24}
25
26/// Something that could be packed to a pair of `i32` and `f32` buffers
27pub trait Pack {
28    /// Size of integer part of an object.
29    fn size_int() -> usize;
30
31    /// Size of float part of an object.
32    fn size_float() -> usize;
33
34    /// Write an object into int and float buffers.
35    ///
36    /// Buffers *must* be of size greater or equal to object's one.
37    fn pack_to(&self, buffer_int: &mut [i32], buffer_float: &mut [f32]);
38}
39
40pub trait PackerInt {
41    fn pack<T: PackInt>(self, t: &T) -> Self;
42}
43impl<'a> PackerInt for &'a mut [i32] {
44    fn pack<T: PackInt>(self, t: &T) -> Self {
45        t.pack_int_to(self);
46        &mut self[T::size()..]
47    }
48}
49
50pub trait PackerFloat {
51    fn pack<T: PackFloat>(self, t: &T) -> Self;
52}
53impl<'a> PackerFloat for &'a mut [f32] {
54    fn pack<T: PackFloat>(self, t: &T) -> Self {
55        t.pack_float_to(self);
56        &mut self[T::size()..]
57    }
58}
59
60pub struct Packer<'a> {
61    buffer_int: &'a mut [i32],
62    buffer_float: &'a mut [f32],
63}
64impl<'a> Packer<'a> {
65    pub fn new(buffer_int: &'a mut [i32], buffer_float: &'a mut [f32]) -> Self {
66        Self { buffer_int, buffer_float }
67    }
68    pub fn pack<T: Pack>(self, t: &T) -> Self {
69        t.pack_to(self.buffer_int, self.buffer_float);
70        Self {
71            buffer_int: &mut self.buffer_int[T::size_int()..],
72            buffer_float: &mut self.buffer_float[T::size_float()..],
73        }
74    }
75}
76
77
78impl PackInt for i32 {
79    fn size() -> usize { 1 }
80    fn pack_int_to(&self, buffer: &mut [i32]) {
81        buffer[0] = *self;
82    }
83}
84impl Pack for i32 {
85    fn size_int() -> usize { 1 }
86    fn size_float() -> usize { 0 }
87    fn pack_to(&self, buffer_int: &mut [i32], _buffer_float: &mut [f32]) {
88        buffer_int[0] = *self;
89    }
90}
91impl PackInt for u32 {
92    fn size() -> usize { 1 }
93    fn pack_int_to(&self, buffer: &mut [i32]) {
94        buffer[0] = *self as i32;
95    }
96}
97impl Pack for u32 {
98    fn size_int() -> usize { 1 }
99    fn size_float() -> usize { 0 }
100    fn pack_to(&self, buffer_int: &mut [i32], _buffer_float: &mut [f32]) {
101        buffer_int[0] = *self as i32;
102    }
103}
104
105impl PackFloat for f32 {
106    fn size() -> usize { 1 }
107    fn pack_float_to(&self, buffer: &mut [f32]) {
108        buffer[0] = *self;
109    }
110}
111impl Pack for f32 {
112    fn size_int() -> usize { 0 }
113    fn size_float() -> usize { 1 }
114    fn pack_to(&self, _buffer_int: &mut [i32], buffer_float: &mut [f32]) {
115        buffer_float[0] = *self;
116    }
117}
118impl PackFloat for f64 {
119    fn size() -> usize { 1 }
120    fn pack_float_to(&self, buffer: &mut [f32]) {
121        buffer[0] = *self as f32;
122    }
123}
124impl Pack for f64 {
125    fn size_int() -> usize { 0 }
126    fn size_float() -> usize { 1 }
127    fn pack_to(&self, _buffer_int: &mut [i32], buffer_float: &mut [f32]) {
128        buffer_float[0] = *self as f32;
129    }
130}
131
132impl<T: PackFloat + Scalar> PackFloat for Vector3<T> {
133    fn size() -> usize { 3*T::size() }
134    fn pack_float_to(&self, mut buffer: &mut [f32]) {
135        for x in self.as_slice() {
136            buffer = buffer.pack(x);
137        }
138    }
139}
140impl<T: Pack + Scalar> Pack for Vector3<T> {
141    fn size_int() -> usize { 3*T::size_int() }
142    fn size_float() -> usize { 3*T::size_float() }
143    fn pack_to(&self, buffer_int: &mut [i32], buffer_float: &mut [f32]) {
144        let mut packer = Packer::new(buffer_int, buffer_float);
145        for x in self.as_slice() {
146            packer = packer.pack(x);
147        }
148    }
149}
150
151
152impl<T: PackFloat + Scalar> PackFloat for Matrix3<T> {
153    fn size() -> usize { 9*T::size() }
154    fn pack_float_to(&self, mut buffer: &mut [f32]) {
155        for x in self.as_slice() {
156            buffer = buffer.pack(x);
157        }
158    }
159}
160impl<T: Pack + Scalar> Pack for Matrix3<T> {
161    fn size_int() -> usize { 9*T::size_int() }
162    fn size_float() -> usize { 9*T::size_float() }
163    fn pack_to(&self, buffer_int: &mut [i32], buffer_float: &mut [f32]) {
164        let mut packer = Packer::new(buffer_int, buffer_float);
165        for x in self.as_slice() {
166            packer = packer.pack(x);
167        }
168    }
169}