/// All user-configurable properties for a spatial plot. Mirrors the frontend
/// SpatialPropertiesV1 type — any new field added to one must be added to both.
#[derive(
    Debug,
    Clone,
    conjure_object::serde::Serialize,
    conjure_object::serde::Deserialize,
    conjure_object::private::DeriveWith
)]
#[serde(crate = "conjure_object::serde")]
#[derive_with(PartialEq, Eq, PartialOrd, Ord, Hash)]
#[conjure_object::private::staged_builder::staged_builder]
#[builder(crate = conjure_object::private::staged_builder, update, inline)]
pub struct GeoPlot3dSpatialPropertiesV1 {
    #[builder(default, into)]
    #[serde(rename = "pointSize", skip_serializing_if = "Option::is_none", default)]
    #[derive_with(with = conjure_object::private::DoubleWrapper)]
    point_size: Option<f64>,
    #[builder(default, into)]
    #[serde(rename = "splatMode", skip_serializing_if = "Option::is_none", default)]
    splat_mode: Option<super::SpatialSplatMode>,
    #[builder(
        default,
        custom(
            type = impl
            Into<Option<super::SpatialAppearanceColoring>>,
            convert = |v|v.into().map(Box::new)
        )
    )]
    #[serde(rename = "coloring", skip_serializing_if = "Option::is_none", default)]
    coloring: Option<Box<super::SpatialAppearanceColoring>>,
    #[builder(
        default,
        custom(
            type = impl
            Into<Option<super::SpatialVolumetricFilter>>,
            convert = |v|v.into().map(Box::new)
        )
    )]
    #[serde(rename = "filter", skip_serializing_if = "Option::is_none", default)]
    filter: Option<Box<super::SpatialVolumetricFilter>>,
    #[builder(
        default,
        custom(
            type = impl
            Into<Option<super::SpatialTimeBinding>>,
            convert = |v|v.into().map(Box::new)
        )
    )]
    #[serde(rename = "timeBinding", skip_serializing_if = "Option::is_none", default)]
    time_binding: Option<Box<super::SpatialTimeBinding>>,
}
impl GeoPlot3dSpatialPropertiesV1 {
    /// Constructs a new instance of the type.
    #[inline]
    pub fn new() -> Self {
        Self::builder().build()
    }
    /// Splat diameter in scene units. Defaults to 0.05.
    #[inline]
    pub fn point_size(&self) -> Option<f64> {
        self.point_size.as_ref().map(|o| *o)
    }
    /// Shape rendered for each point. Defaults to PARABOLIC.
    #[inline]
    pub fn splat_mode(&self) -> Option<&super::SpatialSplatMode> {
        self.splat_mode.as_ref().map(|o| &*o)
    }
    /// How to color the point cloud. Defaults to Z-axis gradient with VIRIDIS.
    #[inline]
    pub fn coloring(&self) -> Option<&super::SpatialAppearanceColoring> {
        self.coloring.as_ref().map(|o| &**o)
    }
    /// Volumetric visibility filter applied before rendering. Defaults to none.
    #[inline]
    pub fn filter(&self) -> Option<&super::SpatialVolumetricFilter> {
        self.filter.as_ref().map(|o| &**o)
    }
    /// Playhead-driven time-visibility binding. Absent means no time filtering.
    #[inline]
    pub fn time_binding(&self) -> Option<&super::SpatialTimeBinding> {
        self.time_binding.as_ref().map(|o| &**o)
    }
}
