use rerun_0_28 as rerun;
use super::{Motor, Plane, Point};
impl From<Point<f32>> for rerun::Position3D {
#[inline]
fn from(p: Point<f32>) -> Self {
rerun::Position3D::new(p.x(), p.y(), p.z())
}
}
impl From<Motor<f32>> for rerun::Transform3D {
#[inline]
fn from(motor: Motor<f32>) -> Self {
use super::Point;
use crate::ops::Transform;
let m = motor.unitized();
let quat = rerun::Quaternion::from_xyzw([-m.rx(), -m.ry(), -m.rz(), m.ps()]);
let rotation = rerun::components::RotationQuat(quat);
let origin = Point::origin();
let transformed = m.transform(&origin);
let translation = rerun::Vec3D::new(
transformed.cartesian_x(),
transformed.cartesian_y(),
transformed.cartesian_z(),
);
rerun::Transform3D::from_translation_rotation(translation, rotation)
}
}
impl From<Plane<f32>> for rerun::Vec3D {
#[inline]
fn from(plane: Plane<f32>) -> Self {
let n = plane.normal();
rerun::Vec3D::new(n.x(), n.y(), n.z())
}
}
#[cfg(test)]
mod tests {
use super::*;
use approx::abs_diff_eq;
use proptest::prelude::*;
use crate::specialized::projective::dim3::BulkMotor;
const EPS: f32 = 1e-4;
proptest! {
#[test]
fn point_to_position_preserves_cartesian(
x in -100.0f32..100.0,
y in -100.0f32..100.0,
z in -100.0f32..100.0,
) {
let p = Point::from_cartesian(x, y, z);
let pos: rerun::Position3D = p.into();
prop_assert!(abs_diff_eq!(pos.x(), x, epsilon = EPS));
prop_assert!(abs_diff_eq!(pos.y(), y, epsilon = EPS));
prop_assert!(abs_diff_eq!(pos.z(), z, epsilon = EPS));
}
#[test]
fn plane_to_vec3d_is_normal(
nx in -1.0f32..1.0,
ny in -1.0f32..1.0,
nz in -1.0f32..1.0,
d in -10.0f32..10.0,
) {
if nx*nx + ny*ny + nz*nz < 0.01 {
return Ok(());
}
let plane = Plane::from_normal_and_distance(nx, ny, nz, d);
let v: rerun::Vec3D = plane.into();
prop_assert!(abs_diff_eq!(v.x(), nx, epsilon = EPS));
prop_assert!(abs_diff_eq!(v.y(), ny, epsilon = EPS));
prop_assert!(abs_diff_eq!(v.z(), nz, epsilon = EPS));
}
#[test]
fn motor_to_transform3d_does_not_panic(m in any::<BulkMotor<f32>>()) {
let _t: rerun::Transform3D = (*m).into();
}
}
#[test]
fn motor_pure_translation_converts() {
let motor = Motor::from_translation(1.0_f32, 2.0, 3.0);
let _t: rerun::Transform3D = motor.into();
}
#[test]
fn motor_pure_rotation_converts() {
let motor = Motor::from_rotation_z(std::f32::consts::FRAC_PI_2);
let _t: rerun::Transform3D = motor.into();
}
}