use super::Point3;
use serde::{Deserialize, Serialize};
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "kebab-case")]
pub enum ContactType {
#[default]
None,
Vertex,
Facet,
Edge,
Shaft,
ToolProfile,
NumericFallback,
}
#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Contact {
#[serde(rename = "type")]
pub contact_type: ContactType,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub point: Option<Point3>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub triangle_id: Option<u32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub distance: Option<f64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub detail: Option<String>,
}
#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ClPoint {
pub x: f64,
pub y: f64,
pub z: f64,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub contact: Option<Contact>,
}
impl ClPoint {
pub fn new(x: f64, y: f64, z: f64) -> Self {
Self { x, y, z, contact: None }
}
pub fn position(&self) -> Point3 {
Point3::new(self.x, self.y, self.z)
}
pub fn is_finite(&self) -> bool {
self.position().is_finite()
}
}