use crate::geom::Transform;
use autocxx::WithinBox;
use carla_sys::carla_rust::rpc::{
FfiBoneTransformDataOut, FfiBoneTransformDataOut_bone_name, FfiBoneTransformDataOut_component,
FfiBoneTransformDataOut_relative_transform, FfiBoneTransformDataOut_world,
FfiWalkerBoneControlIn, FfiWalkerBoneControlIn_add_bone, FfiWalkerBoneControlOut,
FfiWalkerBoneControlOut_bone_at, FfiWalkerBoneControlOut_bone_count,
};
#[cfg_attr(carla_version_0916, doc = "")]
#[cfg_attr(
carla_version_0916,
doc = " [`carla.BoneTransformDataIn`]: https://carla.readthedocs.io/en/0.9.16/python_api/#carla.BoneTransformDataIn"
)]
#[cfg_attr(carla_version_0915, doc = "")]
#[cfg_attr(
carla_version_0915,
doc = " [`carla.BoneTransformDataIn`]: https://carla.readthedocs.io/en/0.9.15/python_api/#carla.BoneTransformDataIn"
)]
#[cfg_attr(carla_version_0914, doc = "")]
#[cfg_attr(
carla_version_0914,
doc = " [`carla.BoneTransformDataIn`]: https://carla.readthedocs.io/en/0.9.14/python_api/#carla.BoneTransformDataIn"
)]
#[derive(Debug, Clone)]
pub struct BoneTransformDataIn {
pub bone_name: String,
pub transform: Transform,
}
#[cfg_attr(carla_version_0916, doc = "")]
#[cfg_attr(
carla_version_0916,
doc = " [`carla.BoneTransformDataOut`]: https://carla.readthedocs.io/en/0.9.16/python_api/#carla.BoneTransformDataOut"
)]
#[cfg_attr(carla_version_0915, doc = "")]
#[cfg_attr(
carla_version_0915,
doc = " [`carla.BoneTransformDataOut`]: https://carla.readthedocs.io/en/0.9.15/python_api/#carla.BoneTransformDataOut"
)]
#[cfg_attr(carla_version_0914, doc = "")]
#[cfg_attr(
carla_version_0914,
doc = " [`carla.BoneTransformDataOut`]: https://carla.readthedocs.io/en/0.9.14/python_api/#carla.BoneTransformDataOut"
)]
#[derive(Debug, Clone)]
pub struct BoneTransformDataOut {
pub bone_name: String,
pub world: Transform,
pub component: Transform,
pub relative: Transform,
}
#[cfg_attr(carla_version_0916, doc = "")]
#[cfg_attr(
carla_version_0916,
doc = " [`carla.WalkerBoneControlIn`]: https://carla.readthedocs.io/en/0.9.16/python_api/#carla.WalkerBoneControlIn"
)]
#[cfg_attr(carla_version_0915, doc = "")]
#[cfg_attr(
carla_version_0915,
doc = " [`carla.WalkerBoneControlIn`]: https://carla.readthedocs.io/en/0.9.15/python_api/#carla.WalkerBoneControlIn"
)]
#[cfg_attr(carla_version_0914, doc = "")]
#[cfg_attr(
carla_version_0914,
doc = " [`carla.WalkerBoneControlIn`]: https://carla.readthedocs.io/en/0.9.14/python_api/#carla.WalkerBoneControlIn"
)]
#[derive(Debug, Clone, Default)]
pub struct WalkerBoneControlIn {
pub bone_transforms: Vec<BoneTransformDataIn>,
}
#[cfg_attr(carla_version_0916, doc = "")]
#[cfg_attr(
carla_version_0916,
doc = " [`carla.WalkerBoneControlOut`]: https://carla.readthedocs.io/en/0.9.16/python_api/#carla.WalkerBoneControlOut"
)]
#[cfg_attr(carla_version_0915, doc = "")]
#[cfg_attr(
carla_version_0915,
doc = " [`carla.WalkerBoneControlOut`]: https://carla.readthedocs.io/en/0.9.15/python_api/#carla.WalkerBoneControlOut"
)]
#[cfg_attr(carla_version_0914, doc = "")]
#[cfg_attr(
carla_version_0914,
doc = " [`carla.WalkerBoneControlOut`]: https://carla.readthedocs.io/en/0.9.14/python_api/#carla.WalkerBoneControlOut"
)]
#[derive(Debug, Clone, Default)]
pub struct WalkerBoneControlOut {
pub bone_transforms: Vec<BoneTransformDataOut>,
}
impl BoneTransformDataOut {
pub(crate) fn from_ffi(mut ffi_bone: std::pin::Pin<&mut FfiBoneTransformDataOut>) -> Self {
Self {
bone_name: FfiBoneTransformDataOut_bone_name(ffi_bone.as_mut())
.to_string_lossy()
.into_owned(),
world: Transform::from_ffi(FfiBoneTransformDataOut_world(ffi_bone.as_mut())),
component: Transform::from_ffi(FfiBoneTransformDataOut_component(ffi_bone.as_mut())),
relative: Transform::from_ffi(FfiBoneTransformDataOut_relative_transform(
ffi_bone.as_mut(),
)),
}
}
}
impl WalkerBoneControlIn {
pub(crate) fn to_ffi(&self) -> FfiWalkerBoneControlIn {
let mut ffi = FfiWalkerBoneControlIn::new().within_box();
for bone in &self.bone_transforms {
cxx::let_cxx_string!(name_cxx = &bone.bone_name);
FfiWalkerBoneControlIn_add_bone(ffi.as_mut(), &name_cxx, bone.transform.as_ffi());
}
unsafe { *Box::from_raw(Box::into_raw(std::pin::Pin::into_inner_unchecked(ffi))) }
}
}
impl WalkerBoneControlOut {
pub(crate) fn from_ffi(mut ffi_control: std::pin::Pin<&mut FfiWalkerBoneControlOut>) -> Self {
let bone_count = FfiWalkerBoneControlOut_bone_count(ffi_control.as_mut());
let mut bone_transforms = Vec::with_capacity(bone_count);
for i in 0..bone_count {
let mut ffi_bone = FfiWalkerBoneControlOut_bone_at(ffi_control.as_mut(), i);
bone_transforms.push(BoneTransformDataOut::from_ffi(ffi_bone.as_mut().unwrap()));
}
Self { bone_transforms }
}
}