sog-decoder 0.1.0-rc.1

.sog 3D Gaussian Splatting data decoder
Documentation
use crate::error::ParseError;

#[derive(Debug, Clone, Default)]
pub struct Vector3 {
    pub x: f32,
    pub y: f32,
    pub z: f32,
}

impl Vector3 {
    pub fn new(x: f32, y: f32, z: f32) -> Self {
        Self { x, y, z }
    }
}

impl TryFrom<Vec<f32>> for Vector3 {
    type Error = ParseError;
    fn try_from(value: Vec<f32>) -> Result<Self, Self::Error> {
        if value.len() >= 3 {
            Ok(Self::new(value[0], value[1], value[2]))
        } else {
            Err(ParseError::ParseVector(
                "Vector must have at least 3 elements".to_string(),
            ))
        }
    }
}

#[derive(Debug, Clone)]
pub struct SogDataV2 {
    pub count: u32,
    pub antialias: bool,
    pub means: Means,
    pub scales: Scales,
    pub quats: Quats,
    pub sh_0: Sh0,
    pub sh_n: Option<ShN>,
}

#[derive(Debug, Clone)]
pub struct Codebook(pub [f32; 256]);

impl TryFrom<&[f32]> for Codebook {
    type Error = ParseError;
    fn try_from(value: &[f32]) -> Result<Self, Self::Error> {
        if value.len() >= 256 {
            let mut arr = [0.0f32; 256];
            arr.copy_from_slice(&value[..256]);
            Ok(Self(arr))
        } else {
            Err(ParseError::ParseCodebook(
                "Codebook must have at least 256 elements".to_string(),
            ))
        }
    }
}

pub type ImageData = Vec<u8>;

#[derive(Debug, Clone)]
pub struct Means {
    pub mins: Vector3,
    pub maxs: Vector3,
    pub means_u: ImageData,
    pub means_l: ImageData,
}

#[derive(Debug, Clone)]
pub struct Quats(pub ImageData);

#[derive(Debug, Clone)]
pub struct Scales {
    pub codebook: Codebook,
    pub scales: ImageData,
}

#[derive(Debug, Clone)]
pub struct Sh0 {
    pub codebook: Codebook,
    pub sh_0: ImageData,
}

#[derive(Debug, Clone)]
pub struct ShN {
    pub count: i32,
    pub bands: i32,
    pub codebook: Codebook,
    pub labels: ImageData,
    pub centroids: ImageData,
}

#[derive(Debug, Clone)]
pub struct Splat {
    pub count: usize,
    pub antialias: bool,
    pub sh_degree: usize,
    pub position: Vec<f32>,
    pub rotation: Vec<f32>,
    pub scale: Vec<f32>,
    pub sh_0: Vec<f32>,
    pub sh_n: Option<Vec<f32>>,
}