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