pointrain-core 0.1.0

Core library for Pointrain
Documentation
use crate::{
    traits::{PointCloud, PointCloudWithIntensity, PointCloudWithNormal},
    types::{Float, Normal, Position},
};

#[derive(Debug, Default, Clone, Copy, PartialEq)]
pub struct PointXYZINormal {
    pub pos: Position,
    pub normal: Normal,
    pub intensity: Float,
    pub curvature: Float,
}

#[derive(Debug, Default, Clone)]
pub struct PointCloudXYZINormal {
    positions: Vec<Position>,
    intensities: Vec<Float>,
    normals: Vec<Normal>,
    curvatures: Vec<Float>,
}

impl PointCloudXYZINormal {
    pub fn new() -> Self {
        Self::default()
    }
}

impl PointCloud for PointCloudXYZINormal {
    type Point = PointXYZINormal;

    fn with_capacity(capacity: usize) -> Self {
        Self {
            positions: Vec::with_capacity(capacity),
            intensities: Vec::with_capacity(capacity),
            normals: Vec::with_capacity(capacity),
            curvatures: Vec::with_capacity(capacity),
        }
    }

    fn positions(&self) -> &[Position] {
        &self.positions
    }

    fn add_point(&mut self, p: Self::Point) -> &mut Self {
        self.positions.push(p.pos);
        self.intensities.push(p.intensity);
        self.normals.push(p.normal);
        self.curvatures.push(p.curvature);
        self
    }
}

impl PointCloudWithIntensity for PointCloudXYZINormal {
    fn intensities(&self) -> &[Float] {
        &self.intensities
    }
}

impl PointCloudWithNormal for PointCloudXYZINormal {
    fn normals(&self) -> &[Normal] {
        &self.normals
    }

    fn curvatures(&self) -> &[Float] {
        &self.curvatures
    }
}