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, dvec2},
11    traits::{RotateTransform, ScaleTransform, ShiftTransform},
12};
13
14use crate::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 = Rectangle::from_min_size(min, dvec2(size.x, size.y));
68        rect.stroke_rgba = color::palettes::manim::YELLOW_C;
69        rect.fill_rgba = AlphaColor::TRANSPARENT;
70        rect.extract_into(buf);
71    }
72}