objc2_metal/
acceleration_structure_types.rs

1use core::ffi::c_float;
2
3use objc2::encode::{Encode, Encoding, RefEncode};
4
5// `MTLPackedFloat3` is actually a union internally, but replacing it with
6// this simpler struct same semantics in Rust, and is generally the nicer
7// pattern.
8//
9// <https://users.rust-lang.org/t/mapping-nested-packed-union-from-c-to-rust/87334>
10#[repr(C)]
11#[derive(Clone, Copy, Debug, PartialEq)]
12pub struct MTLPackedFloat3 {
13    pub x: c_float,
14    pub y: c_float,
15    pub z: c_float,
16}
17
18unsafe impl Encode for MTLPackedFloat3 {
19    const ENCODING: Encoding = Encoding::Struct(
20        "_MTLPackedFloat3",
21        &[Encoding::Union(
22            "?",
23            &[
24                Encoding::Struct(
25                    "?",
26                    &[c_float::ENCODING, c_float::ENCODING, c_float::ENCODING],
27                ),
28                Encoding::Array(3, &c_float::ENCODING),
29            ],
30        )],
31    );
32}
33
34unsafe impl RefEncode for MTLPackedFloat3 {
35    const ENCODING_REF: Encoding = Encoding::Pointer(&Self::ENCODING);
36}
37
38#[cfg(test)]
39#[cfg(feature = "alloc")]
40mod tests {
41    use alloc::string::ToString;
42    use objc2::encode::Encode;
43
44    use crate::MTLPackedFloat4x3;
45
46    #[test]
47    fn test_packed_float() {
48        assert_eq!(
49            MTLPackedFloat4x3::ENCODING.to_string(),
50            "{_MTLPackedFloat4x3=[4{_MTLPackedFloat3=(?={?=fff}[3f])}]}",
51        );
52    }
53}