use re_log_types::EntityPathHash;
use re_sdk_types::ViewClassIdentifier;
use re_viewer_context::{SystemExecutionOutput, ViewClass as _};
use super::UiLabel;
use crate::visualizers::LoadingIndicator;
use crate::{PickableTexturedRect, SpatialView2D};
#[derive(Default)]
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>,
}
impl SpatialViewVisualizerData {
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 iter_spatial_data(
system_output: &SystemExecutionOutput,
) -> impl Iterator<Item = (Option<ViewClassIdentifier>, &SpatialViewVisualizerData)> {
system_output
.visualizer_execution_output
.per_visualizer
.values()
.filter_map(|result| {
let output = result.as_ref().ok()?;
let data = output.get_visualizer_data::<SpatialViewVisualizerData>()?;
Some((output.affinity, data))
})
}