use re_log_types::EntityPathHash;
use re_sdk_types::ViewClassIdentifier;
use re_viewer_context::ViewClass as _;
use super::UiLabel;
use crate::view_kind::SpatialViewKind;
use crate::visualizers::LoadingIndicator;
use crate::{PickableTexturedRect, SpatialView2D};
pub struct SpatialViewVisualizerData {
pub loading_indicators: Vec<LoadingIndicator>,
pub ui_labels: Vec<UiLabel>,
bounding_boxes: Vec<(EntityPathHash, macaw::BoundingBox)>,
regions_of_interest: Vec<(EntityPathHash, macaw::BoundingBox)>,
pub pickable_rects: Vec<PickableTexturedRect>,
pub preferred_view_kind: Option<SpatialViewKind>,
}
impl SpatialViewVisualizerData {
pub fn new(preferred_view_kind: Option<SpatialViewKind>) -> Self {
Self {
loading_indicators: Default::default(),
ui_labels: Default::default(),
bounding_boxes: Default::default(),
regions_of_interest: Default::default(),
pickable_rects: Default::default(),
preferred_view_kind,
}
}
pub fn add_pickable_rect(
&mut self,
pickable_rect: PickableTexturedRect,
class_identifier: ViewClassIdentifier,
) {
self.add_pickable_rect_to_bounding_box(&pickable_rect, class_identifier);
self.pickable_rects.push(pickable_rect);
}
pub fn add_bounding_box(
&mut self,
entity: EntityPathHash,
bbox: macaw::BoundingBox,
world_from_obj: glam::Affine3A,
) {
let transformed = bbox.transform_affine3(&world_from_obj);
self.bounding_boxes.push((entity, transformed));
self.regions_of_interest.push((entity, transformed));
}
pub fn add_bounding_box_and_region_of_interest(
&mut self,
entity: EntityPathHash,
bbox: macaw::BoundingBox,
region_of_interest: macaw::BoundingBox,
world_from_obj: glam::Affine3A,
) {
self.bounding_boxes
.push((entity, bbox.transform_affine3(&world_from_obj)));
self.regions_of_interest.push((
entity,
region_of_interest.transform_affine3(&world_from_obj),
));
}
pub fn add_pickable_rect_to_bounding_box(
&mut self,
pickable_rect: &PickableTexturedRect,
class_identifier: ViewClassIdentifier,
) {
if class_identifier == SpatialView2D::identifier() {
let entry = (
pickable_rect.ent_path.hash(),
pickable_rect.textured_rect.bounding_box(),
);
self.bounding_boxes.push(entry);
self.regions_of_interest.push(entry);
}
}
pub fn iter_bounding_boxes(
&self,
) -> impl ExactSizeIterator<Item = &(EntityPathHash, macaw::BoundingBox)> {
self.bounding_boxes.iter()
}
pub fn iter_regions_of_interest(
&self,
) -> impl ExactSizeIterator<Item = &(EntityPathHash, macaw::BoundingBox)> {
self.regions_of_interest.iter()
}
pub fn as_any(&self) -> &dyn std::any::Any {
self
}
}