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