1use 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#[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}