use crate::{
error::ffi::with_ffi_error,
geom::Transform,
road::{RoadId, SignalOrientation},
};
use carla_sys::carla_rust::client::FfiLandmark;
use cxx::SharedPtr;
use derivative::Derivative;
use static_assertions::assert_impl_all;
use super::Waypoint;
#[derive(Clone, Derivative)]
#[derivative(Debug)]
#[repr(transparent)]
pub struct Landmark {
#[derivative(Debug = "ignore")]
pub(crate) inner: SharedPtr<FfiLandmark>,
}
impl Landmark {
#[cfg_attr(
carla_version_0916,
doc = " See [carla.Landmark.waypoint](https://carla.readthedocs.io/en/0.9.16/python_api/#carla.Landmark.waypoint)"
)]
#[cfg_attr(
carla_version_0915,
doc = " See [carla.Landmark.waypoint](https://carla.readthedocs.io/en/0.9.15/python_api/#carla.Landmark.waypoint)"
)]
#[cfg_attr(
carla_version_0914,
doc = " See [carla.Landmark.waypoint](https://carla.readthedocs.io/en/0.9.14/python_api/#carla.Landmark.waypoint)"
)]
#[cfg_attr(
any(carla_version_0916, carla_version_0915, carla_version_0914),
doc = " in the Python API."
)]
pub fn waypoint(&self) -> crate::Result<Option<Waypoint>> {
let ptr = with_ffi_error("waypoint", |e| self.inner.GetWaypoint(e))?;
Ok(Waypoint::from_cxx(ptr))
}
#[cfg_attr(
carla_version_0916,
doc = " See [carla.Landmark.transform](https://carla.readthedocs.io/en/0.9.16/python_api/#carla.Landmark.transform)"
)]
#[cfg_attr(
carla_version_0915,
doc = " See [carla.Landmark.transform](https://carla.readthedocs.io/en/0.9.15/python_api/#carla.Landmark.transform)"
)]
#[cfg_attr(
carla_version_0914,
doc = " See [carla.Landmark.transform](https://carla.readthedocs.io/en/0.9.14/python_api/#carla.Landmark.transform)"
)]
#[cfg_attr(
any(carla_version_0916, carla_version_0915, carla_version_0914),
doc = " in the Python API."
)]
pub fn transform(&self) -> Transform {
Transform::from_ffi(self.inner.GetTransform().clone())
}
#[cfg_attr(
carla_version_0916,
doc = " See [carla.Landmark.road_id](https://carla.readthedocs.io/en/0.9.16/python_api/#carla.Landmark.road_id)"
)]
#[cfg_attr(
carla_version_0915,
doc = " See [carla.Landmark.road_id](https://carla.readthedocs.io/en/0.9.15/python_api/#carla.Landmark.road_id)"
)]
#[cfg_attr(
carla_version_0914,
doc = " See [carla.Landmark.road_id](https://carla.readthedocs.io/en/0.9.14/python_api/#carla.Landmark.road_id)"
)]
#[cfg_attr(
any(carla_version_0916, carla_version_0915, carla_version_0914),
doc = " in the Python API."
)]
pub fn road_id(&self) -> RoadId {
self.inner.GetRoadId().into()
}
#[cfg_attr(
carla_version_0916,
doc = " See [carla.Landmark.distance](https://carla.readthedocs.io/en/0.9.16/python_api/#carla.Landmark.distance)"
)]
#[cfg_attr(
carla_version_0915,
doc = " See [carla.Landmark.distance](https://carla.readthedocs.io/en/0.9.15/python_api/#carla.Landmark.distance)"
)]
#[cfg_attr(
carla_version_0914,
doc = " See [carla.Landmark.distance](https://carla.readthedocs.io/en/0.9.14/python_api/#carla.Landmark.distance)"
)]
#[cfg_attr(
any(carla_version_0916, carla_version_0915, carla_version_0914),
doc = " in the Python API."
)]
pub fn distance(&self) -> f64 {
self.inner.GetDistance()
}
#[cfg_attr(
carla_version_0916,
doc = " See [carla.Landmark.s](https://carla.readthedocs.io/en/0.9.16/python_api/#carla.Landmark.s)"
)]
#[cfg_attr(
carla_version_0915,
doc = " See [carla.Landmark.s](https://carla.readthedocs.io/en/0.9.15/python_api/#carla.Landmark.s)"
)]
#[cfg_attr(
carla_version_0914,
doc = " See [carla.Landmark.s](https://carla.readthedocs.io/en/0.9.14/python_api/#carla.Landmark.s)"
)]
#[cfg_attr(
any(carla_version_0916, carla_version_0915, carla_version_0914),
doc = " in the Python API."
)]
pub fn s(&self) -> f64 {
self.inner.GetS()
}
#[cfg_attr(
carla_version_0916,
doc = " See [carla.Landmark.t](https://carla.readthedocs.io/en/0.9.16/python_api/#carla.Landmark.t)"
)]
#[cfg_attr(
carla_version_0915,
doc = " See [carla.Landmark.t](https://carla.readthedocs.io/en/0.9.15/python_api/#carla.Landmark.t)"
)]
#[cfg_attr(
carla_version_0914,
doc = " See [carla.Landmark.t](https://carla.readthedocs.io/en/0.9.14/python_api/#carla.Landmark.t)"
)]
#[cfg_attr(
any(carla_version_0916, carla_version_0915, carla_version_0914),
doc = " in the Python API."
)]
pub fn t(&self) -> f64 {
self.inner.GetT()
}
#[cfg_attr(
carla_version_0916,
doc = " See [carla.Landmark.id](https://carla.readthedocs.io/en/0.9.16/python_api/#carla.Landmark.id)"
)]
#[cfg_attr(
carla_version_0915,
doc = " See [carla.Landmark.id](https://carla.readthedocs.io/en/0.9.15/python_api/#carla.Landmark.id)"
)]
#[cfg_attr(
carla_version_0914,
doc = " See [carla.Landmark.id](https://carla.readthedocs.io/en/0.9.14/python_api/#carla.Landmark.id)"
)]
#[cfg_attr(
any(carla_version_0916, carla_version_0915, carla_version_0914),
doc = " in the Python API."
)]
pub fn id(&self) -> String {
self.inner.GetId().to_string()
}
#[cfg_attr(
carla_version_0916,
doc = " See [carla.Landmark.name](https://carla.readthedocs.io/en/0.9.16/python_api/#carla.Landmark.name)"
)]
#[cfg_attr(
carla_version_0915,
doc = " See [carla.Landmark.name](https://carla.readthedocs.io/en/0.9.15/python_api/#carla.Landmark.name)"
)]
#[cfg_attr(
carla_version_0914,
doc = " See [carla.Landmark.name](https://carla.readthedocs.io/en/0.9.14/python_api/#carla.Landmark.name)"
)]
#[cfg_attr(
any(carla_version_0916, carla_version_0915, carla_version_0914),
doc = " in the Python API."
)]
pub fn name(&self) -> String {
self.inner.GetName().to_string()
}
#[cfg_attr(
carla_version_0916,
doc = " See [carla.Landmark.is_dynamic](https://carla.readthedocs.io/en/0.9.16/python_api/#carla.Landmark.is_dynamic)"
)]
#[cfg_attr(
carla_version_0915,
doc = " See [carla.Landmark.is_dynamic](https://carla.readthedocs.io/en/0.9.15/python_api/#carla.Landmark.is_dynamic)"
)]
#[cfg_attr(
carla_version_0914,
doc = " See [carla.Landmark.is_dynamic](https://carla.readthedocs.io/en/0.9.14/python_api/#carla.Landmark.is_dynamic)"
)]
#[cfg_attr(
any(carla_version_0916, carla_version_0915, carla_version_0914),
doc = " in the Python API."
)]
pub fn is_dynamic(&self) -> bool {
self.inner.IsDynamic()
}
#[cfg_attr(
carla_version_0916,
doc = " See [carla.Landmark.orientation](https://carla.readthedocs.io/en/0.9.16/python_api/#carla.Landmark.orientation)"
)]
#[cfg_attr(
carla_version_0915,
doc = " See [carla.Landmark.orientation](https://carla.readthedocs.io/en/0.9.15/python_api/#carla.Landmark.orientation)"
)]
#[cfg_attr(
carla_version_0914,
doc = " See [carla.Landmark.orientation](https://carla.readthedocs.io/en/0.9.14/python_api/#carla.Landmark.orientation)"
)]
#[cfg_attr(
any(carla_version_0916, carla_version_0915, carla_version_0914),
doc = " in the Python API."
)]
pub fn orientation(&self) -> SignalOrientation {
self.inner.GetOrientation()
}
#[cfg_attr(
carla_version_0916,
doc = " See [carla.Landmark.z_offset](https://carla.readthedocs.io/en/0.9.16/python_api/#carla.Landmark.z_offset)"
)]
#[cfg_attr(
carla_version_0915,
doc = " See [carla.Landmark.z_offset](https://carla.readthedocs.io/en/0.9.15/python_api/#carla.Landmark.z_offset)"
)]
#[cfg_attr(
carla_version_0914,
doc = " See [carla.Landmark.z_offset](https://carla.readthedocs.io/en/0.9.14/python_api/#carla.Landmark.z_offset)"
)]
#[cfg_attr(
any(carla_version_0916, carla_version_0915, carla_version_0914),
doc = " in the Python API."
)]
pub fn z_offset(&self) -> f64 {
self.inner.GetZOffset()
}
#[cfg_attr(
carla_version_0916,
doc = " See [carla.Landmark.country](https://carla.readthedocs.io/en/0.9.16/python_api/#carla.Landmark.country)"
)]
#[cfg_attr(
carla_version_0915,
doc = " See [carla.Landmark.country](https://carla.readthedocs.io/en/0.9.15/python_api/#carla.Landmark.country)"
)]
#[cfg_attr(
carla_version_0914,
doc = " See [carla.Landmark.country](https://carla.readthedocs.io/en/0.9.14/python_api/#carla.Landmark.country)"
)]
#[cfg_attr(
any(carla_version_0916, carla_version_0915, carla_version_0914),
doc = " in the Python API."
)]
pub fn country(&self) -> String {
self.inner.GetCountry().to_string()
}
#[cfg_attr(
carla_version_0916,
doc = " See [carla.Landmark.type](https://carla.readthedocs.io/en/0.9.16/python_api/#carla.Landmark.type)"
)]
#[cfg_attr(
carla_version_0915,
doc = " See [carla.Landmark.type](https://carla.readthedocs.io/en/0.9.15/python_api/#carla.Landmark.type)"
)]
#[cfg_attr(
carla_version_0914,
doc = " See [carla.Landmark.type](https://carla.readthedocs.io/en/0.9.14/python_api/#carla.Landmark.type)"
)]
#[cfg_attr(
any(carla_version_0916, carla_version_0915, carla_version_0914),
doc = " in the Python API."
)]
pub fn type_(&self) -> String {
self.inner.GetType().to_string()
}
#[cfg_attr(
carla_version_0916,
doc = " See [carla.Landmark.sub_type](https://carla.readthedocs.io/en/0.9.16/python_api/#carla.Landmark.sub_type)"
)]
#[cfg_attr(
carla_version_0915,
doc = " See [carla.Landmark.sub_type](https://carla.readthedocs.io/en/0.9.15/python_api/#carla.Landmark.sub_type)"
)]
#[cfg_attr(
carla_version_0914,
doc = " See [carla.Landmark.sub_type](https://carla.readthedocs.io/en/0.9.14/python_api/#carla.Landmark.sub_type)"
)]
#[cfg_attr(
any(carla_version_0916, carla_version_0915, carla_version_0914),
doc = " in the Python API."
)]
pub fn sub_type(&self) -> String {
self.inner.GetSubType().to_string()
}
#[cfg_attr(
carla_version_0916,
doc = " See [carla.Landmark.value](https://carla.readthedocs.io/en/0.9.16/python_api/#carla.Landmark.value)"
)]
#[cfg_attr(
carla_version_0915,
doc = " See [carla.Landmark.value](https://carla.readthedocs.io/en/0.9.15/python_api/#carla.Landmark.value)"
)]
#[cfg_attr(
carla_version_0914,
doc = " See [carla.Landmark.value](https://carla.readthedocs.io/en/0.9.14/python_api/#carla.Landmark.value)"
)]
#[cfg_attr(
any(carla_version_0916, carla_version_0915, carla_version_0914),
doc = " in the Python API."
)]
pub fn value(&self) -> f64 {
self.inner.GetValue()
}
#[cfg_attr(
carla_version_0916,
doc = " See [carla.Landmark.unit](https://carla.readthedocs.io/en/0.9.16/python_api/#carla.Landmark.unit)"
)]
#[cfg_attr(
carla_version_0915,
doc = " See [carla.Landmark.unit](https://carla.readthedocs.io/en/0.9.15/python_api/#carla.Landmark.unit)"
)]
#[cfg_attr(
carla_version_0914,
doc = " See [carla.Landmark.unit](https://carla.readthedocs.io/en/0.9.14/python_api/#carla.Landmark.unit)"
)]
#[cfg_attr(
any(carla_version_0916, carla_version_0915, carla_version_0914),
doc = " in the Python API."
)]
pub fn unit(&self) -> String {
self.inner.GetUnit().to_string()
}
#[cfg_attr(
carla_version_0916,
doc = " See [carla.Landmark.height](https://carla.readthedocs.io/en/0.9.16/python_api/#carla.Landmark.height)"
)]
#[cfg_attr(
carla_version_0915,
doc = " See [carla.Landmark.height](https://carla.readthedocs.io/en/0.9.15/python_api/#carla.Landmark.height)"
)]
#[cfg_attr(
carla_version_0914,
doc = " See [carla.Landmark.height](https://carla.readthedocs.io/en/0.9.14/python_api/#carla.Landmark.height)"
)]
#[cfg_attr(
any(carla_version_0916, carla_version_0915, carla_version_0914),
doc = " in the Python API."
)]
pub fn height(&self) -> f64 {
self.inner.GetHeight()
}
#[cfg_attr(
carla_version_0916,
doc = " See [carla.Landmark.width](https://carla.readthedocs.io/en/0.9.16/python_api/#carla.Landmark.width)"
)]
#[cfg_attr(
carla_version_0915,
doc = " See [carla.Landmark.width](https://carla.readthedocs.io/en/0.9.15/python_api/#carla.Landmark.width)"
)]
#[cfg_attr(
carla_version_0914,
doc = " See [carla.Landmark.width](https://carla.readthedocs.io/en/0.9.14/python_api/#carla.Landmark.width)"
)]
#[cfg_attr(
any(carla_version_0916, carla_version_0915, carla_version_0914),
doc = " in the Python API."
)]
pub fn width(&self) -> f64 {
self.inner.GetWidth()
}
#[cfg_attr(
carla_version_0916,
doc = " See [carla.Landmark.text](https://carla.readthedocs.io/en/0.9.16/python_api/#carla.Landmark.text)"
)]
#[cfg_attr(
carla_version_0915,
doc = " See [carla.Landmark.text](https://carla.readthedocs.io/en/0.9.15/python_api/#carla.Landmark.text)"
)]
#[cfg_attr(
carla_version_0914,
doc = " See [carla.Landmark.text](https://carla.readthedocs.io/en/0.9.14/python_api/#carla.Landmark.text)"
)]
#[cfg_attr(
any(carla_version_0916, carla_version_0915, carla_version_0914),
doc = " in the Python API."
)]
pub fn text(&self) -> String {
self.inner.GetText().to_string()
}
#[cfg_attr(
carla_version_0916,
doc = " See [carla.Landmark.h_offset](https://carla.readthedocs.io/en/0.9.16/python_api/#carla.Landmark.h_offset)"
)]
#[cfg_attr(
carla_version_0915,
doc = " See [carla.Landmark.h_offset](https://carla.readthedocs.io/en/0.9.15/python_api/#carla.Landmark.h_offset)"
)]
#[cfg_attr(
carla_version_0914,
doc = " See [carla.Landmark.h_offset](https://carla.readthedocs.io/en/0.9.14/python_api/#carla.Landmark.h_offset)"
)]
#[cfg_attr(
any(carla_version_0916, carla_version_0915, carla_version_0914),
doc = " in the Python API."
)]
pub fn h_offset(&self) -> f64 {
self.inner.GethOffset()
}
#[cfg_attr(
carla_version_0916,
doc = " See [carla.Landmark.pitch](https://carla.readthedocs.io/en/0.9.16/python_api/#carla.Landmark.pitch)"
)]
#[cfg_attr(
carla_version_0915,
doc = " See [carla.Landmark.pitch](https://carla.readthedocs.io/en/0.9.15/python_api/#carla.Landmark.pitch)"
)]
#[cfg_attr(
carla_version_0914,
doc = " See [carla.Landmark.pitch](https://carla.readthedocs.io/en/0.9.14/python_api/#carla.Landmark.pitch)"
)]
#[cfg_attr(
any(carla_version_0916, carla_version_0915, carla_version_0914),
doc = " in the Python API."
)]
pub fn pitch(&self) -> f64 {
self.inner.GetPitch()
}
#[cfg_attr(
carla_version_0916,
doc = " See [carla.Landmark.roll](https://carla.readthedocs.io/en/0.9.16/python_api/#carla.Landmark.roll)"
)]
#[cfg_attr(
carla_version_0915,
doc = " See [carla.Landmark.roll](https://carla.readthedocs.io/en/0.9.15/python_api/#carla.Landmark.roll)"
)]
#[cfg_attr(
carla_version_0914,
doc = " See [carla.Landmark.roll](https://carla.readthedocs.io/en/0.9.14/python_api/#carla.Landmark.roll)"
)]
#[cfg_attr(
any(carla_version_0916, carla_version_0915, carla_version_0914),
doc = " in the Python API."
)]
pub fn roll(&self) -> f64 {
self.inner.GetRoll()
}
pub fn lane_validities(&self) -> crate::Result<Vec<(i32, i32)>> {
let count = self.inner.GetValiditiesCount();
let mut result = Vec::with_capacity(count);
for i in 0..count {
let from = with_ffi_error("validity_from_lane", |e| {
self.inner.GetValidityFromLane(i, e)
})?;
let to = with_ffi_error("validity_to_lane", |e| self.inner.GetValidityToLane(i, e))?;
result.push((from, to));
}
Ok(result)
}
}
impl Landmark {
pub(crate) fn from_cxx(ptr: SharedPtr<FfiLandmark>) -> Option<Self> {
if ptr.is_null() {
None
} else {
Some(Self { inner: ptr })
}
}
}
assert_impl_all!(Landmark: Send, Sync);