#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)]
pub struct ThermalRgb {
pub thermal: u16,
pub red: u16,
pub green: u16,
pub blue: u16,
}
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)]
pub struct Rgb16 {
pub red: u16,
pub green: u16,
pub blue: u16,
}
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)]
pub struct Color {
pub r: u8,
pub g: u8,
pub b: u8,
}
impl From<Rgb16> for Color {
fn from(c: Rgb16) -> Self {
Color {
r: (c.red >> 8) as u8,
g: (c.green >> 8) as u8,
b: (c.blue >> 8) as u8,
}
}
}
impl From<Color> for Rgb16 {
fn from(c: Color) -> Self {
Rgb16 {
red: u16::from(c.r) << 8 | u16::from(c.r),
green: u16::from(c.g) << 8 | u16::from(c.g),
blue: u16::from(c.b) << 8 | u16::from(c.b),
}
}
}
#[derive(Debug, Clone, Copy, Default, PartialEq)]
pub struct GpsTime(pub f64);
#[derive(Debug, Clone, Copy, Default)]
pub struct WaveformPacket {
pub descriptor_index: u8,
pub byte_offset: u64,
pub packet_size: u32,
pub return_point_location: f32,
pub dx: f32,
pub dy: f32,
pub dz: f32,
}
#[derive(Debug, Clone, Copy)]
pub struct ExtraBytes {
pub data: [u8; 192],
pub len: u8,
}
impl Default for ExtraBytes {
fn default() -> Self { Self { data: [0u8; 192], len: 0 } }
}
#[derive(Debug, Clone, Copy, Default)]
pub struct PointRecord {
pub x: f64,
pub y: f64,
pub z: f64,
pub intensity: u16,
pub color: Option<Rgb16>,
pub nir: Option<u16>,
pub thermal_rgb: Option<ThermalRgb>,
pub classification: u8,
pub user_data: u8,
pub point_source_id: u16,
pub flags: u8,
pub return_number: u8,
pub number_of_returns: u8,
pub scan_direction_flag: bool,
pub edge_of_flight_line: bool,
pub scan_angle: i16,
pub gps_time: Option<GpsTime>,
pub waveform: Option<WaveformPacket>,
pub extra_bytes: ExtraBytes,
pub normal_x: Option<f32>,
pub normal_y: Option<f32>,
pub normal_z: Option<f32>,
}