cad_import/loader/loader_gltf/
utils.rs

1use gltf::accessor::DataType;
2
3/// Returns size in bytes for the given data type.
4///
5/// # Arguments
6/// * `data_type` - The data type whose size will be returned.
7pub fn get_size_in_bytes(data_type: DataType) -> usize {
8    match data_type {
9        DataType::I8 => 1,
10        DataType::U8 => 1,
11        DataType::I16 => 2,
12        DataType::U16 => 2,
13        DataType::U32 => 4,
14        DataType::F32 => 4,
15    }
16}
17
18/// Transmutes the given vector of type U to vector of type V. However, this should only be done
19/// to primitive types U and V. Moreover, U and V must be of same size.
20///
21/// # Arguments
22/// * `vec` - The vector to transmute.
23pub fn transmute_vec<U: Sized, V: Sized>(vec: Vec<U>) -> Vec<V> {
24    assert_eq!(std::mem::size_of::<U>(), std::mem::size_of::<V>());
25
26    unsafe {
27        let mut v_clone = std::mem::ManuallyDrop::new(vec);
28        Vec::from_raw_parts(
29            v_clone.as_mut_ptr() as *mut V,
30            v_clone.len(),
31            v_clone.capacity(),
32        )
33    }
34}
35
36#[cfg(test)]
37mod test {
38    use super::*;
39
40    #[test]
41    fn test_transmute() {
42        let values = vec![0u32, 13u32, 52u32];
43        let values: Vec<i32> = transmute_vec(values);
44
45        assert_eq!(values, [0i32, 13i32, 52i32]);
46    }
47}