Skip to main content

sog_decoder/
types.rs

1use crate::error::ParseError;
2
3#[derive(Debug, Clone, Default)]
4pub struct Vector3 {
5    pub x: f32,
6    pub y: f32,
7    pub z: f32,
8}
9
10impl Vector3 {
11    pub fn new(x: f32, y: f32, z: f32) -> Self {
12        Self { x, y, z }
13    }
14}
15
16impl TryFrom<Vec<f32>> for Vector3 {
17    type Error = ParseError;
18    fn try_from(value: Vec<f32>) -> Result<Self, Self::Error> {
19        if value.len() >= 3 {
20            Ok(Self::new(value[0], value[1], value[2]))
21        } else {
22            Err(ParseError::ParseVector(
23                "Vector must have at least 3 elements".to_string(),
24            ))
25        }
26    }
27}
28
29#[derive(Debug, Clone)]
30pub struct SogDataV2 {
31    pub count: u32,
32    pub antialias: bool,
33    pub means: Means,
34    pub scales: Scales,
35    pub quats: Quats,
36    pub sh_0: Sh0,
37    pub sh_n: Option<ShN>,
38}
39
40#[derive(Debug, Clone)]
41pub struct Codebook(pub [f32; 256]);
42
43impl TryFrom<&[f32]> for Codebook {
44    type Error = ParseError;
45    fn try_from(value: &[f32]) -> Result<Self, Self::Error> {
46        if value.len() >= 256 {
47            let mut arr = [0.0f32; 256];
48            arr.copy_from_slice(&value[..256]);
49            Ok(Self(arr))
50        } else {
51            Err(ParseError::ParseCodebook(
52                "Codebook must have at least 256 elements".to_string(),
53            ))
54        }
55    }
56}
57
58pub type ImageData = Vec<u8>;
59
60#[derive(Debug, Clone)]
61pub struct Means {
62    pub mins: Vector3,
63    pub maxs: Vector3,
64    pub means_u: ImageData,
65    pub means_l: ImageData,
66}
67
68#[derive(Debug, Clone)]
69pub struct Quats(pub ImageData);
70
71#[derive(Debug, Clone)]
72pub struct Scales {
73    pub codebook: Codebook,
74    pub scales: ImageData,
75}
76
77#[derive(Debug, Clone)]
78pub struct Sh0 {
79    pub codebook: Codebook,
80    pub sh_0: ImageData,
81}
82
83#[derive(Debug, Clone)]
84pub struct ShN {
85    pub count: i32,
86    pub bands: i32,
87    pub codebook: Codebook,
88    pub labels: ImageData,
89    pub centroids: ImageData,
90}
91
92#[derive(Debug, Clone)]
93pub struct Splat {
94    pub count: usize,
95    pub antialias: bool,
96    pub sh_degree: usize,
97    pub position: Vec<f32>,
98    pub rotation: Vec<f32>,
99    pub scale: Vec<f32>,
100    pub sh_0: Vec<f32>,
101    pub sh_n: Option<Vec<f32>>,
102}