use cadmpeg_core::text::NonBlankString;
#[cfg(feature = "schema")]
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
use crate::features::FinitePoint3;
use crate::ids::{PointCloudId, ProductDefinitionId};
use crate::scalar::FiniteReal;
use crate::topology::Color;
use crate::transform::Transform;
use crate::units::UnitVector3;
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[cfg_attr(feature = "schema", derive(JsonSchema))]
#[serde(deny_unknown_fields)]
pub struct PointCloud {
pub id: PointCloudId,
#[serde(
default,
skip_serializing_if = "Option::is_none",
deserialize_with = "deserialize_product_definition"
)]
pub product_definition: Option<ProductDefinitionId>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
deserialize_with = "deserialize_name"
)]
pub name: Option<String>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
deserialize_with = "deserialize_sensor"
)]
pub sensor: Option<Transform>,
pub positions: Vec<FinitePoint3>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub normals: Vec<UnitVector3>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub colors: Vec<Color>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub channels: Vec<PointChannel>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
deserialize_with = "deserialize_native_ref"
)]
pub native_ref: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[cfg_attr(feature = "schema", derive(JsonSchema))]
#[serde(deny_unknown_fields)]
pub struct PointChannel {
pub name: NonBlankString,
pub values: Vec<FiniteReal>,
}
cadmpeg_core::named_optional_field!(
deserialize_product_definition,
ProductDefinitionId,
"product_definition"
);
cadmpeg_core::named_optional_field!(deserialize_name, String, "name");
cadmpeg_core::named_optional_field!(deserialize_sensor, Transform, "sensor");
cadmpeg_core::named_optional_field!(deserialize_native_ref, String, "native_ref");
mod identity_rewrite;