bevy_gaussian_splatting 2.4.2

bevy gaussian splatting render pipeline plugin
Documentation
use std::marker::Copy;

use bevy::{
    prelude::*,
    render::render_resource::ShaderType,
};
use bytemuck::{
    Pod,
    Zeroable,
};
use serde::{
    Deserialize,
    Serialize,
};

use crate::gaussian::{
    covariance::compute_covariance_3d,
    packed::Gaussian,
};


pub type Position = [f32; 3];

#[derive(
    Clone,
    Debug,
    Default,
    Copy,
    PartialEq,
    Reflect,
    ShaderType,
    Pod,
    Zeroable,
    Serialize,
    Deserialize,
)]
#[repr(C)]
pub struct PositionVisibility {
    pub position: Position,
    pub visibility: f32,
}

impl From<[f32; 4]> for PositionVisibility {
    fn from(position_visibility: [f32; 4]) -> Self {
        Self {
            position: [
                position_visibility[0],
                position_visibility[1],
                position_visibility[2],
            ],
            visibility: position_visibility[3],
        }
    }
}

#[derive(
    Clone,
    Debug,
    Default,
    Copy,
    PartialEq,
    Reflect,
    ShaderType,
    Pod,
    Zeroable,
    Serialize,
    Deserialize,
)]
#[repr(C)]
pub struct Rotation {
    pub rotation: [f32; 4],
}

impl From<[f32; 4]> for Rotation {
    fn from(rotation: [f32; 4]) -> Self {
        Self { rotation }
    }
}

#[derive(
    Clone,
    Debug,
    Default,
    Copy,
    PartialEq,
    Reflect,
    ShaderType,
    Pod,
    Zeroable,
    Serialize,
    Deserialize,
)]
#[repr(C)]
pub struct ScaleOpacity {
    pub scale: [f32; 3],
    pub opacity: f32,
}

impl From<[f32; 4]> for ScaleOpacity {
    fn from(scale_opacity: [f32; 4]) -> Self {
        Self {
            scale: [
                scale_opacity[0],
                scale_opacity[1],
                scale_opacity[2],
            ],
            opacity: scale_opacity[3],
        }
    }
}


#[derive(
    Clone,
    Debug,
    Default,
    Copy,
    PartialEq,
    Reflect,
    ShaderType,
    Pod,
    Zeroable,
    Serialize,
    Deserialize,
)]
#[repr(C)]
pub struct Covariance3dOpacity {
    pub cov3d: [f32; 6],
    pub opacity: f32,
    pub pad: f32,
}

impl From<&Gaussian> for Covariance3dOpacity {
    fn from(gaussian: &Gaussian) -> Self {
        let cov3d = compute_covariance_3d(
            Vec4::from_slice(gaussian.rotation.rotation.as_slice()),
            Vec3::from_slice(gaussian.scale_opacity.scale.as_slice()),
        );

        Covariance3dOpacity {
            cov3d,
            opacity: gaussian.scale_opacity.opacity,
            pad: 0.0,
        }
    }
}