robot-description-builder 0.0.3

A libary to create (valid) Robot descriptions
Documentation
use nalgebra::Matrix3;

use crate::{
	link::LinkShapeData,
	transform::{Mirror, MirrorUpdater, Transform},
};

#[derive(Debug, PartialEq, Clone)]
pub enum JointTransformMode {
	Direct(Transform),
	FigureItOut(fn(LinkShapeData) -> Transform),
}

impl JointTransformMode {
	pub(crate) fn apply(self, parent_link_data: LinkShapeData) -> Transform {
		match self {
			JointTransformMode::Direct(transform) => transform,
			JointTransformMode::FigureItOut(func) => func(parent_link_data),
		}
	}
}

impl Mirror for JointTransformMode {
	fn mirrored(&self, mirror_matrix: &Matrix3<f32>) -> Self {
		match self {
			JointTransformMode::Direct(transform) => {
				Self::Direct(transform.mirrored(mirror_matrix))
			}
			JointTransformMode::FigureItOut(_) => todo!("I do not know how to do this yet."),
		}
	}
}

impl MirrorUpdater for JointTransformMode {
	fn update_mirror_matrix(&self, mirror_matrix: &Matrix3<f32>) -> Matrix3<f32> {
		match self {
			JointTransformMode::Direct(transform) => transform.update_mirror_matrix(mirror_matrix),
			JointTransformMode::FigureItOut(_) => todo!("I do not know how to do this yet."),
		}
	}

	fn mirrored_update_matrix(&self, mirror_matrix: &Matrix3<f32>) -> (Self, Matrix3<f32>) {
		match self {
			JointTransformMode::Direct(transform) => {
				let (new_transform, new_mirror_matrix) =
					transform.mirrored_update_matrix(mirror_matrix);
				(Self::Direct(new_transform), new_mirror_matrix)
			}
			JointTransformMode::FigureItOut(_) => todo!("I do not know how to do this yet."),
		}
	}
}

impl From<fn(LinkShapeData) -> Transform> for JointTransformMode {
	fn from(value: fn(LinkShapeData) -> Transform) -> Self {
		Self::FigureItOut(value)
	}
}

impl Default for JointTransformMode {
	fn default() -> Self {
		Self::Direct(Transform::default())
	}
}