Skip to main content

ranim_items/
debug.rs

1//! Debug utilities for visualizing item properties.
2
3use std::ops::{Deref, DerefMut};
4
5use ranim_core::{
6    Extract,
7    anchor::Aabb,
8    color::{self, AlphaColor},
9    core_item::CoreItem,
10    glam::DVec3,
11    traits::{FillColor, RotateTransform, ScaleTransform, ShiftTransform, StrokeColor},
12};
13
14use crate::vitem::{VItem, geometry::Rectangle};
15
16/// Wrapper that visualizes the AABB of the inner item as a wireframe rectangle.
17#[derive(Clone)]
18pub struct VisualizeAabbItem<T: Aabb>(pub T);
19
20impl<T: Aabb> Deref for VisualizeAabbItem<T> {
21    type Target = T;
22    fn deref(&self) -> &Self::Target {
23        &self.0
24    }
25}
26
27impl<T: Aabb> DerefMut for VisualizeAabbItem<T> {
28    fn deref_mut(&mut self) -> &mut Self::Target {
29        &mut self.0
30    }
31}
32
33impl<T: Aabb> Aabb for VisualizeAabbItem<T> {
34    fn aabb(&self) -> [DVec3; 2] {
35        self.0.aabb()
36    }
37}
38
39impl<T: Aabb + ShiftTransform> ShiftTransform for VisualizeAabbItem<T> {
40    fn shift(&mut self, offset: DVec3) -> &mut Self {
41        self.0.shift(offset);
42        self
43    }
44}
45
46impl<T: Aabb + RotateTransform> RotateTransform for VisualizeAabbItem<T> {
47    fn rotate_on_axis(&mut self, axis: DVec3, angle: f64) -> &mut Self {
48        self.0.rotate_on_axis(axis, angle);
49        self
50    }
51}
52
53impl<T: Aabb + ScaleTransform> ScaleTransform for VisualizeAabbItem<T> {
54    fn scale(&mut self, scale: DVec3) -> &mut Self {
55        self.0.scale(scale);
56        self
57    }
58}
59
60impl<T: Aabb + Extract<Target = CoreItem>> Extract for VisualizeAabbItem<T> {
61    type Target = CoreItem;
62    fn extract_into(&self, buf: &mut Vec<Self::Target>) {
63        self.0.extract_into(buf);
64
65        let [min, max] = self.0.aabb();
66        let size = max - min;
67        let mut rect = VItem::from(Rectangle::new(size.x, size.y));
68        rect.shift(min + size / 2.0);
69        rect.set_stroke_color(color::palettes::manim::YELLOW_C);
70        rect.set_fill_color(AlphaColor::TRANSPARENT);
71        rect.extract_into(buf);
72    }
73}