use crate::types::basic::{Double, OSString};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename = "RelativeObjectPosition")]
pub struct RelativeObjectPosition {
#[serde(rename = "@entityRef")]
pub entity_ref: OSString,
#[serde(rename = "@dx")]
pub dx: Double,
#[serde(rename = "@dy")]
pub dy: Double,
#[serde(rename = "@dz", skip_serializing_if = "Option::is_none")]
pub dz: Option<Double>,
#[serde(rename = "Orientation", skip_serializing_if = "Option::is_none")]
pub orientation: Option<crate::types::positions::road::Orientation>,
}
impl RelativeObjectPosition {
pub fn new(entity_ref: &str, dx: f64, dy: f64) -> Self {
Self {
entity_ref: OSString::literal(entity_ref.to_string()),
dx: Double::literal(dx),
dy: Double::literal(dy),
dz: None,
orientation: None,
}
}
pub fn with_z(entity_ref: &str, dx: f64, dy: f64, dz: f64) -> Self {
Self {
entity_ref: OSString::literal(entity_ref.to_string()),
dx: Double::literal(dx),
dy: Double::literal(dy),
dz: Some(Double::literal(dz)),
orientation: None,
}
}
pub fn with_orientation(
mut self,
orientation: crate::types::positions::road::Orientation,
) -> Self {
self.orientation = Some(orientation);
self
}
pub fn behind(entity_ref: &str, distance: f64) -> Self {
Self::new(entity_ref, -distance, 0.0)
}
pub fn ahead(entity_ref: &str, distance: f64) -> Self {
Self::new(entity_ref, distance, 0.0)
}
pub fn left_of(entity_ref: &str, distance: f64) -> Self {
Self::new(entity_ref, 0.0, distance)
}
pub fn right_of(entity_ref: &str, distance: f64) -> Self {
Self::new(entity_ref, 0.0, -distance)
}
pub fn at_offset(entity_ref: &str, dx: f64, dy: f64, dz: f64) -> Self {
Self::with_z(entity_ref, dx, dy, dz)
}
}
impl Default for RelativeObjectPosition {
fn default() -> Self {
Self {
entity_ref: OSString::literal("DefaultEntity".to_string()),
dx: Double::literal(0.0),
dy: Double::literal(0.0),
dz: None,
orientation: None,
}
}
}