use crate::{
geom::{Transform, Vector3D},
rpc::ActorId,
};
use carla_sys::carla_rust::{client::FfiActorSnapshot, geom::FfiVector3D};
use cxx::UniquePtr;
use derivative::Derivative;
use static_assertions::assert_impl_all;
#[derive(Derivative)]
#[derivative(Debug)]
#[repr(transparent)]
pub struct ActorSnapshot {
#[derivative(Debug = "ignore")]
pub(crate) inner: UniquePtr<FfiActorSnapshot>,
}
impl ActorSnapshot {
pub fn id(&self) -> ActorId {
self.inner.GetId().into()
}
pub fn transform(&self) -> Transform {
Transform::from_ffi(self.inner.GetTransform())
}
pub fn velocity(&self) -> Vector3D {
unsafe {
let cpp_vec = self.inner.GetVelocity();
Vector3D::from_ffi(std::mem::transmute::<
carla_sys::carla::geom::Vector3D,
FfiVector3D,
>(cpp_vec))
}
}
pub fn angular_velocity(&self) -> Vector3D {
unsafe {
let cpp_vec = self.inner.GetAngularVelocity();
Vector3D::from_ffi(std::mem::transmute::<
carla_sys::carla::geom::Vector3D,
FfiVector3D,
>(cpp_vec))
}
}
pub fn acceleration(&self) -> Vector3D {
unsafe {
let cpp_vec = self.inner.GetAcceleration();
Vector3D::from_ffi(std::mem::transmute::<
carla_sys::carla::geom::Vector3D,
FfiVector3D,
>(cpp_vec))
}
}
pub(crate) fn from_cxx(ptr: UniquePtr<FfiActorSnapshot>) -> Option<Self> {
if ptr.is_null() {
None
} else {
Some(Self { inner: ptr })
}
}
}
assert_impl_all!(ActorSnapshot: Send, Sync);