use std::sync::Weak;
use super::{Link, LinkShapeData};
use crate::{
cluster_objects::{kinematic_data_tree::KinematicDataTree, KinematicTree},
joint::Joint,
ArcLock, WeakLock,
};
mod collision_builder;
mod linkbuilder;
mod visual_builder;
pub use collision_builder::CollisionBuilder;
pub use linkbuilder::LinkBuilder;
pub use visual_builder::VisualBuilder;
pub(crate) trait BuildLink {
fn build(self, tree: &Weak<KinematicDataTree>) -> ArcLock<Link>;
fn build_tree(self) -> KinematicTree
where
Self: Sized,
{
let data = KinematicDataTree::newer_link(self);
KinematicTree::new(data)
}
fn start_building_chain(self, tree: &Weak<KinematicDataTree>) -> ArcLock<Link>;
fn build_chain(
self,
tree: &Weak<KinematicDataTree>,
parent_joint: &WeakLock<Joint>,
) -> ArcLock<Link>;
fn get_shape_data(&self) -> LinkShapeData;
}
impl<T: BuildLink> From<T> for KinematicTree {
fn from(value: T) -> Self {
value.build_tree()
}
}