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}