diff --git a/crates/viewer/re_context_menu/src/actions/add_entities_to_new_view.rs b/crates/viewer/re_context_menu/src/actions/add_entities_to_new_view.rs index be8578bf45f0..303f7f1e671f 100644 --- a/crates/viewer/re_context_menu/src/actions/add_entities_to_new_view.rs +++ b/crates/viewer/re_context_menu/src/actions/add_entities_to_new_view.rs @@ -86,8 +86,8 @@ fn recommended_views_for_selection(ctx: &ContextMenuContext<'_>) -> IntSet) -> IntSet Vec { // TODO(jleibs): This has already been computed for the View this frame. Maybe We // should do this earlier and store it with the View? - let applicable_entities_per_visualizer = ctx + let maybe_visualizable_entities = ctx .viewer_ctx .view_class_registry - .applicable_entities_for_visualizer_systems(&entity_db.store_id()); + .maybe_visualizable_entities_for_visualizer_systems(&entity_db.store_id()); let visualizable_entities = view .class(ctx.viewer_ctx.view_class_registry) .determine_visualizable_entities( - &applicable_entities_per_visualizer, + &maybe_visualizable_entities, entity_db, &ctx.visualizer_collection, &view.space_origin, diff --git a/crates/viewer/re_view/src/heuristics.rs b/crates/viewer/re_view/src/heuristics.rs index 72fbfed03d25..a14a8c0155ae 100644 --- a/crates/viewer/re_view/src/heuristics.rs +++ b/crates/viewer/re_view/src/heuristics.rs @@ -1,6 +1,6 @@ use re_viewer_context::{ - ApplicableEntities, IdentifiedViewSystem, RecommendedView, ViewClass, ViewSpawnHeuristics, - ViewerContext, VisualizerSystem, + IdentifiedViewSystem, MaybeVisualizableEntities, RecommendedView, ViewClass, + ViewSpawnHeuristics, ViewerContext, VisualizerSystem, }; /// Spawns a view for each single entity which is visualizable & indicator-matching for a given visualizer. @@ -22,21 +22,21 @@ where else { return Default::default(); }; - let Some(applicable_entities) = ctx - .applicable_entities_per_visualizer + let Some(maybe_visualizable_entities) = ctx + .maybe_visualizable_entities_per_visualizer .get(&TVisualizer::identifier()) else { return Default::default(); }; let visualizer = TVisualizer::default(); - let recommended_views = applicable_entities + let recommended_views = maybe_visualizable_entities .intersection(indicator_matching_entities) .filter_map(|entity| { let context = view.visualizable_filter_context(entity, ctx.recording()); if visualizer .filter_visualizable_entities( - ApplicableEntities(std::iter::once(entity.clone()).collect()), + MaybeVisualizableEntities(std::iter::once(entity.clone()).collect()), context.as_ref(), ) .is_empty() diff --git a/crates/viewer/re_view/src/lib.rs b/crates/viewer/re_view/src/lib.rs index 965d22585ee0..fdda75609696 100644 --- a/crates/viewer/re_view/src/lib.rs +++ b/crates/viewer/re_view/src/lib.rs @@ -40,7 +40,7 @@ pub mod external { // ----------- -/// Utility for implementing [`re_viewer_context::VisualizerAdditionalApplicabilityFilter`] using on the properties of a concrete component. +/// Utility for implementing [`re_viewer_context::VisualizerDataBasedVisualizabilityFilter`] using on the properties of a concrete component. #[inline] pub fn diff_component_filter( event: &re_chunk_store::ChunkStoreEvent, diff --git a/crates/viewer/re_view_bar_chart/src/view_class.rs b/crates/viewer/re_view_bar_chart/src/view_class.rs index 52608ffc7604..548eef5edef8 100644 --- a/crates/viewer/re_view_bar_chart/src/view_class.rs +++ b/crates/viewer/re_view_bar_chart/src/view_class.rs @@ -11,7 +11,7 @@ use re_view::controls::{ }; use re_view::{controls, suggest_view_for_each_entity, view_property_ui}; use re_viewer_context::{ - ApplicableEntities, IdentifiedViewSystem as _, IndicatedEntities, PerVisualizer, + MaybeVisualizableEntities, IdentifiedViewSystem as _, IndicatedEntities, PerVisualizer, TypedComponentFallbackProvider, ViewClass, ViewClassRegistryError, ViewId, ViewQuery, ViewState, ViewStateExt, ViewSystemExecutionError, ViewerContext, VisualizableEntities, }; @@ -75,7 +75,7 @@ Display a 1D tensor as a bar chart. fn choose_default_visualizers( &self, entity_path: &EntityPath, - _applicable_entities_per_visualizer: &PerVisualizer, + _maybe_visualizable_entities_per_visualizer: &PerVisualizer, visualizable_entities_per_visualizer: &PerVisualizer, _indicated_entities_per_visualizer: &PerVisualizer, ) -> re_viewer_context::SmallVisualizerSet { diff --git a/crates/viewer/re_view_bar_chart/src/visualizer_system.rs b/crates/viewer/re_view_bar_chart/src/visualizer_system.rs index 52055dd46323..b02e313d83c8 100644 --- a/crates/viewer/re_view_bar_chart/src/visualizer_system.rs +++ b/crates/viewer/re_view_bar_chart/src/visualizer_system.rs @@ -10,9 +10,9 @@ use re_types::{ }; use re_view::{diff_component_filter, DataResultQuery as _}; use re_viewer_context::{ - auto_color_for_entity_path, IdentifiedViewSystem, QueryContext, TypedComponentFallbackProvider, - ViewContext, ViewContextCollection, ViewQuery, ViewSystemExecutionError, - VisualizerAdditionalApplicabilityFilter, VisualizerQueryInfo, VisualizerSystem, + auto_color_for_entity_path, DataBasedVisualizabilityFilter, IdentifiedViewSystem, QueryContext, + TypedComponentFallbackProvider, ViewContext, ViewContextCollection, ViewQuery, + ViewSystemExecutionError, VisualizerQueryInfo, VisualizerSystem, }; /// A bar chart system, with everything needed to render it. @@ -27,11 +27,11 @@ impl IdentifiedViewSystem for BarChartVisualizerSystem { } } -struct BarChartVisualizerEntityFilter; +struct BarChartVisualizabilityFilter; -impl VisualizerAdditionalApplicabilityFilter for BarChartVisualizerEntityFilter { +impl DataBasedVisualizabilityFilter for BarChartVisualizabilityFilter { #[inline] - fn update_applicability(&mut self, event: &ChunkStoreEvent) -> bool { + fn update_visualizability(&mut self, event: &ChunkStoreEvent) -> bool { diff_component_filter(event, |tensor: &re_types::components::TensorData| { tensor.is_vector() }) @@ -43,8 +43,8 @@ impl VisualizerSystem for BarChartVisualizerSystem { VisualizerQueryInfo::from_archetype::() } - fn applicability_filter(&self) -> Option> { - Some(Box::new(BarChartVisualizerEntityFilter)) + fn data_based_visualizability_filter(&self) -> Option> { + Some(Box::new(BarChartVisualizabilityFilter)) } fn execute( diff --git a/crates/viewer/re_view_graph/src/view.rs b/crates/viewer/re_view_graph/src/view.rs index b7ecf8b0d91e..f0842ffdd8ff 100644 --- a/crates/viewer/re_view_graph/src/view.rs +++ b/crates/viewer/re_view_graph/src/view.rs @@ -101,12 +101,12 @@ Display a graph of nodes and edges. } fn spawn_heuristics(&self, ctx: &ViewerContext<'_>) -> ViewSpawnHeuristics { - if let Some(applicable) = ctx - .applicable_entities_per_visualizer + if let Some(maybe_visualizable) = ctx + .maybe_visualizable_entities_per_visualizer .get(&NodeVisualizer::identifier()) { ViewSpawnHeuristics::new( - applicable + maybe_visualizable .iter() .cloned() .map(RecommendedView::new_single_entity), diff --git a/crates/viewer/re_view_graph/tests/basic.rs b/crates/viewer/re_view_graph/tests/basic.rs index e5f41e850ec1..44f0697c108a 100644 --- a/crates/viewer/re_view_graph/tests/basic.rs +++ b/crates/viewer/re_view_graph/tests/basic.rs @@ -178,8 +178,10 @@ fn run_graph_view_and_save_snapshot( let class_identifier = GraphView::identifier(); let view_class_registry = &mut test_context.view_class_registry; - let applicable_entities_per_visualizer = view_class_registry - .applicable_entities_for_visualizer_systems(&test_context.recording_store.store_id()); + let maybe_visualizable_entities_per_visualizer = view_class_registry + .maybe_visualizable_entities_for_visualizer_systems( + &test_context.recording_store.store_id(), + ); // TODO(andreas): this is c&p from TestContext::run. Make it nicer plz ;) let store_context = re_viewer_context::StoreContext { @@ -201,7 +203,7 @@ fn run_graph_view_and_save_snapshot( let visualizable_entities = view_class_registry .get_class_or_log_error(class_identifier) .determine_visualizable_entities( - &applicable_entities_per_visualizer, + &maybe_visualizable_entities_per_visualizer, &test_context.recording_store, &view_class_registry.new_visualizer_collection(class_identifier), &view_blueprint.space_origin, diff --git a/crates/viewer/re_view_spatial/src/heuristics.rs b/crates/viewer/re_view_spatial/src/heuristics.rs index fbed4e7b8634..f869ab7898c7 100644 --- a/crates/viewer/re_view_spatial/src/heuristics.rs +++ b/crates/viewer/re_view_spatial/src/heuristics.rs @@ -8,8 +8,9 @@ use crate::{view_kind::SpatialViewKind, visualizers::SpatialViewVisualizerData}; /// Returns all entities for which a visualizer of the given kind would be picked. /// -/// I.e. all entities for which at least one visualizer of the specified kind is applicable +/// I.e. all entities for which at least one visualizer of the specified kind is "maybe visualizable" /// *and* has a matching indicator component. +/// (we can't reason with "visualizable" because that can be influenced by view properties like its origin) pub fn default_visualized_entities_for_visualizer_kind( ctx: &ViewerContext<'_>, view_class_identifier: ViewClassIdentifier, @@ -27,8 +28,8 @@ pub fn default_visualized_entities_for_visualizer_kind( if data.preferred_view_kind == Some(visualizer_kind) { let indicator_matching = ctx.indicated_entities_per_visualizer.get(&id)?; - let applicable = ctx.applicable_entities_per_visualizer.get(&id)?; - Some(indicator_matching.intersection(applicable)) + let maybe_visualizable = ctx.maybe_visualizable_entities_per_visualizer.get(&id)?; + Some(indicator_matching.intersection(maybe_visualizable)) } else { None } diff --git a/crates/viewer/re_view_spatial/src/spatial_topology.rs b/crates/viewer/re_view_spatial/src/spatial_topology.rs index e279a025c9d1..8bd6bb2fd747 100644 --- a/crates/viewer/re_view_spatial/src/spatial_topology.rs +++ b/crates/viewer/re_view_spatial/src/spatial_topology.rs @@ -165,7 +165,7 @@ impl ChunkStoreSubscriber for SpatialTopologyStoreSubscriber { /// /// Describes how 2D & 3D spaces are connected/disconnected. /// -/// Used to determine whether 2D/3D visualizers are applicable and to inform +/// Used to determine whether 2D/3D visualizers are visualizable and to inform /// view generation heuristics. /// /// Spatial topology is time independent but may change as new data comes in. diff --git a/crates/viewer/re_view_spatial/src/view_3d.rs b/crates/viewer/re_view_spatial/src/view_3d.rs index c83faf828c5a..919012d003af 100644 --- a/crates/viewer/re_view_spatial/src/view_3d.rs +++ b/crates/viewer/re_view_spatial/src/view_3d.rs @@ -12,10 +12,10 @@ use re_types::{ use re_ui::{list_item, UiExt as _}; use re_view::view_property_ui; use re_viewer_context::{ - ApplicableEntities, IdentifiedViewSystem, IndicatedEntities, PerVisualizer, RecommendedView, - SmallVisualizerSet, ViewClass, ViewClassRegistryError, ViewId, ViewQuery, ViewSpawnHeuristics, - ViewState, ViewStateExt as _, ViewSystemExecutionError, ViewSystemIdentifier, ViewerContext, - VisualizableEntities, VisualizableFilterContext, + IdentifiedViewSystem, IndicatedEntities, MaybeVisualizableEntities, PerVisualizer, + RecommendedView, SmallVisualizerSet, ViewClass, ViewClassRegistryError, ViewId, ViewQuery, + ViewSpawnHeuristics, ViewState, ViewStateExt as _, ViewSystemExecutionError, + ViewSystemIdentifier, ViewerContext, VisualizableEntities, VisualizableFilterContext, }; use re_viewport_blueprint::ViewProperty; @@ -195,7 +195,7 @@ impl ViewClass for SpatialView3D { fn choose_default_visualizers( &self, entity_path: &EntityPath, - applicable_entities_per_visualizer: &PerVisualizer, + maybe_visualizable_entities_per_visualizer: &PerVisualizer, visualizable_entities_per_visualizer: &PerVisualizer, indicated_entities_per_visualizer: &PerVisualizer, ) -> SmallVisualizerSet { @@ -203,16 +203,17 @@ impl ViewClass for SpatialView3D { let axis_detector = AxisLengthDetector::identifier(); let camera_viz = CamerasVisualizer::identifier(); - let applicable: HashSet<&ViewSystemIdentifier> = applicable_entities_per_visualizer - .iter() - .filter_map(|(visualizer, ents)| { - if ents.contains(entity_path) { - Some(visualizer) - } else { - None - } - }) - .collect(); + let maybe_visualizable: HashSet<&ViewSystemIdentifier> = + maybe_visualizable_entities_per_visualizer + .iter() + .filter_map(|(visualizer, ents)| { + if ents.contains(entity_path) { + Some(visualizer) + } else { + None + } + }) + .collect(); let visualizable: HashSet<&ViewSystemIdentifier> = visualizable_entities_per_visualizer .iter() @@ -251,7 +252,9 @@ impl ViewClass for SpatialView3D { // … then we enable it if either: // - If someone set an axis_length explicitly, so [`AxisLengthDetector`] is applicable. // - If we already have the [`CamerasVisualizer`] active. - if applicable.contains(&axis_detector) || enabled_visualizers.contains(&camera_viz) { + if maybe_visualizable.contains(&axis_detector) + || enabled_visualizers.contains(&camera_viz) + { enabled_visualizers.push(arrows_viz); } } diff --git a/crates/viewer/re_view_spatial/src/visualizers/arrows2d.rs b/crates/viewer/re_view_spatial/src/visualizers/arrows2d.rs index cde335b81bb9..43444b4bdce6 100644 --- a/crates/viewer/re_view_spatial/src/visualizers/arrows2d.rs +++ b/crates/viewer/re_view_spatial/src/visualizers/arrows2d.rs @@ -9,7 +9,7 @@ use re_types::{ }; use re_view::{process_annotation_and_keypoint_slices, process_color_slice}; use re_viewer_context::{ - auto_color_for_entity_path, ApplicableEntities, IdentifiedViewSystem, QueryContext, + auto_color_for_entity_path, MaybeVisualizableEntities, IdentifiedViewSystem, QueryContext, TypedComponentFallbackProvider, ViewContext, ViewContextCollection, ViewQuery, ViewSystemExecutionError, VisualizableEntities, VisualizableFilterContext, VisualizerQueryInfo, VisualizerSystem, @@ -178,7 +178,7 @@ impl VisualizerSystem for Arrows2DVisualizer { fn filter_visualizable_entities( &self, - entities: ApplicableEntities, + entities: MaybeVisualizableEntities, context: &dyn VisualizableFilterContext, ) -> VisualizableEntities { re_tracing::profile_function!(); diff --git a/crates/viewer/re_view_spatial/src/visualizers/arrows3d.rs b/crates/viewer/re_view_spatial/src/visualizers/arrows3d.rs index c47bd7fc04bf..9a835a5893a4 100644 --- a/crates/viewer/re_view_spatial/src/visualizers/arrows3d.rs +++ b/crates/viewer/re_view_spatial/src/visualizers/arrows3d.rs @@ -7,7 +7,7 @@ use re_types::{ }; use re_view::{process_annotation_slices, process_color_slice}; use re_viewer_context::{ - auto_color_for_entity_path, ApplicableEntities, IdentifiedViewSystem, QueryContext, + auto_color_for_entity_path, MaybeVisualizableEntities, IdentifiedViewSystem, QueryContext, TypedComponentFallbackProvider, ViewContext, ViewContextCollection, ViewQuery, ViewSystemExecutionError, VisualizableEntities, VisualizableFilterContext, VisualizerQueryInfo, VisualizerSystem, @@ -177,7 +177,7 @@ impl VisualizerSystem for Arrows3DVisualizer { fn filter_visualizable_entities( &self, - entities: ApplicableEntities, + entities: MaybeVisualizableEntities, context: &dyn VisualizableFilterContext, ) -> VisualizableEntities { re_tracing::profile_function!(); diff --git a/crates/viewer/re_view_spatial/src/visualizers/assets3d.rs b/crates/viewer/re_view_spatial/src/visualizers/assets3d.rs index 55d4256386ba..8454c7eba1bc 100644 --- a/crates/viewer/re_view_spatial/src/visualizers/assets3d.rs +++ b/crates/viewer/re_view_spatial/src/visualizers/assets3d.rs @@ -7,7 +7,7 @@ use re_types::{ ArrowBuffer, ArrowString, Component as _, }; use re_viewer_context::{ - ApplicableEntities, IdentifiedViewSystem, QueryContext, ViewContext, ViewContextCollection, + MaybeVisualizableEntities, IdentifiedViewSystem, QueryContext, ViewContext, ViewContextCollection, ViewQuery, ViewSystemExecutionError, VisualizableEntities, VisualizableFilterContext, VisualizerQueryInfo, VisualizerSystem, }; @@ -121,7 +121,7 @@ impl VisualizerSystem for Asset3DVisualizer { fn filter_visualizable_entities( &self, - entities: ApplicableEntities, + entities: MaybeVisualizableEntities, context: &dyn VisualizableFilterContext, ) -> VisualizableEntities { re_tracing::profile_function!(); diff --git a/crates/viewer/re_view_spatial/src/visualizers/boxes2d.rs b/crates/viewer/re_view_spatial/src/visualizers/boxes2d.rs index 5fb61892a63d..9e89b274ac57 100644 --- a/crates/viewer/re_view_spatial/src/visualizers/boxes2d.rs +++ b/crates/viewer/re_view_spatial/src/visualizers/boxes2d.rs @@ -7,7 +7,7 @@ use re_types::{ }; use re_view::{process_annotation_slices, process_color_slice}; use re_viewer_context::{ - auto_color_for_entity_path, ApplicableEntities, IdentifiedViewSystem, QueryContext, + auto_color_for_entity_path, MaybeVisualizableEntities, IdentifiedViewSystem, QueryContext, TypedComponentFallbackProvider, ViewContext, ViewContextCollection, ViewQuery, ViewSystemExecutionError, VisualizableEntities, VisualizableFilterContext, VisualizerQueryInfo, VisualizerSystem, @@ -177,7 +177,7 @@ impl VisualizerSystem for Boxes2DVisualizer { fn filter_visualizable_entities( &self, - entities: ApplicableEntities, + entities: MaybeVisualizableEntities, context: &dyn VisualizableFilterContext, ) -> VisualizableEntities { re_tracing::profile_function!(); diff --git a/crates/viewer/re_view_spatial/src/visualizers/boxes3d.rs b/crates/viewer/re_view_spatial/src/visualizers/boxes3d.rs index ba6bc35e343d..039bb4a3359d 100644 --- a/crates/viewer/re_view_spatial/src/visualizers/boxes3d.rs +++ b/crates/viewer/re_view_spatial/src/visualizers/boxes3d.rs @@ -6,7 +6,7 @@ use re_types::{ ArrowString, Component as _, }; use re_viewer_context::{ - auto_color_for_entity_path, ApplicableEntities, IdentifiedViewSystem, QueryContext, + auto_color_for_entity_path, MaybeVisualizableEntities, IdentifiedViewSystem, QueryContext, TypedComponentFallbackProvider, ViewContext, ViewContextCollection, ViewQuery, ViewSystemExecutionError, VisualizableEntities, VisualizableFilterContext, VisualizerQueryInfo, VisualizerSystem, @@ -101,7 +101,7 @@ impl VisualizerSystem for Boxes3DVisualizer { fn filter_visualizable_entities( &self, - entities: ApplicableEntities, + entities: MaybeVisualizableEntities, context: &dyn VisualizableFilterContext, ) -> VisualizableEntities { re_tracing::profile_function!(); diff --git a/crates/viewer/re_view_spatial/src/visualizers/cameras.rs b/crates/viewer/re_view_spatial/src/visualizers/cameras.rs index 834d90f90daf..9c2ae9997b18 100644 --- a/crates/viewer/re_view_spatial/src/visualizers/cameras.rs +++ b/crates/viewer/re_view_spatial/src/visualizers/cameras.rs @@ -6,7 +6,7 @@ use re_types::{ components::{ImagePlaneDistance, ViewCoordinates}, }; use re_viewer_context::{ - ApplicableEntities, DataResult, IdentifiedViewSystem, QueryContext, + MaybeVisualizableEntities, DataResult, IdentifiedViewSystem, QueryContext, TypedComponentFallbackProvider, ViewContext, ViewContextCollection, ViewOutlineMasks, ViewQuery, ViewStateExt as _, ViewSystemExecutionError, VisualizableEntities, VisualizableFilterContext, VisualizerQueryInfo, VisualizerSystem, @@ -202,7 +202,7 @@ impl VisualizerSystem for CamerasVisualizer { fn filter_visualizable_entities( &self, - entities: ApplicableEntities, + entities: MaybeVisualizableEntities, context: &dyn VisualizableFilterContext, ) -> VisualizableEntities { re_tracing::profile_function!(); diff --git a/crates/viewer/re_view_spatial/src/visualizers/capsules3d.rs b/crates/viewer/re_view_spatial/src/visualizers/capsules3d.rs index c7f016a50d9f..9018004a525f 100644 --- a/crates/viewer/re_view_spatial/src/visualizers/capsules3d.rs +++ b/crates/viewer/re_view_spatial/src/visualizers/capsules3d.rs @@ -8,7 +8,7 @@ use re_types::{ }; use re_view::clamped_or_nothing; use re_viewer_context::{ - auto_color_for_entity_path, ApplicableEntities, IdentifiedViewSystem, QueryContext, + auto_color_for_entity_path, IdentifiedViewSystem, MaybeVisualizableEntities, QueryContext, TypedComponentFallbackProvider, ViewContext, ViewContextCollection, ViewQuery, ViewSystemExecutionError, VisualizableEntities, VisualizableFilterContext, VisualizerQueryInfo, VisualizerSystem, @@ -123,7 +123,7 @@ impl VisualizerSystem for Capsules3DVisualizer { fn filter_visualizable_entities( &self, - entities: ApplicableEntities, + entities: MaybeVisualizableEntities, context: &dyn VisualizableFilterContext, ) -> VisualizableEntities { re_tracing::profile_function!(); diff --git a/crates/viewer/re_view_spatial/src/visualizers/depth_images.rs b/crates/viewer/re_view_spatial/src/visualizers/depth_images.rs index 3b946caefd14..fee29dc7e5a5 100644 --- a/crates/viewer/re_view_spatial/src/visualizers/depth_images.rs +++ b/crates/viewer/re_view_spatial/src/visualizers/depth_images.rs @@ -12,7 +12,7 @@ use re_types::{ Component as _, }; use re_viewer_context::{ - ApplicableEntities, ColormapWithRange, IdentifiedViewSystem, ImageInfo, ImageStatsCache, + MaybeVisualizableEntities, ColormapWithRange, IdentifiedViewSystem, ImageInfo, ImageStatsCache, QueryContext, TypedComponentFallbackProvider, ViewClass, ViewContext, ViewContextCollection, ViewQuery, ViewSystemExecutionError, VisualizableEntities, VisualizableFilterContext, VisualizerQueryInfo, VisualizerSystem, @@ -239,7 +239,7 @@ impl VisualizerSystem for DepthImageVisualizer { fn filter_visualizable_entities( &self, - entities: ApplicableEntities, + entities: MaybeVisualizableEntities, context: &dyn VisualizableFilterContext, ) -> VisualizableEntities { re_tracing::profile_function!(); diff --git a/crates/viewer/re_view_spatial/src/visualizers/ellipsoids.rs b/crates/viewer/re_view_spatial/src/visualizers/ellipsoids.rs index 43e2f707ae13..6bfcfc428b0f 100644 --- a/crates/viewer/re_view_spatial/src/visualizers/ellipsoids.rs +++ b/crates/viewer/re_view_spatial/src/visualizers/ellipsoids.rs @@ -6,7 +6,7 @@ use re_types::{ ArrowString, Component as _, }; use re_viewer_context::{ - auto_color_for_entity_path, ApplicableEntities, IdentifiedViewSystem, QueryContext, + auto_color_for_entity_path, MaybeVisualizableEntities, IdentifiedViewSystem, QueryContext, TypedComponentFallbackProvider, ViewContext, ViewContextCollection, ViewQuery, ViewSystemExecutionError, VisualizableEntities, VisualizableFilterContext, VisualizerQueryInfo, VisualizerSystem, @@ -108,7 +108,7 @@ impl VisualizerSystem for Ellipsoids3DVisualizer { fn filter_visualizable_entities( &self, - entities: ApplicableEntities, + entities: MaybeVisualizableEntities, context: &dyn VisualizableFilterContext, ) -> VisualizableEntities { re_tracing::profile_function!(); diff --git a/crates/viewer/re_view_spatial/src/visualizers/encoded_image.rs b/crates/viewer/re_view_spatial/src/visualizers/encoded_image.rs index bad12c67990b..8ae4aff9e7ca 100644 --- a/crates/viewer/re_view_spatial/src/visualizers/encoded_image.rs +++ b/crates/viewer/re_view_spatial/src/visualizers/encoded_image.rs @@ -5,10 +5,10 @@ use re_types::{ }; use re_view::{diff_component_filter, HybridResults}; use re_viewer_context::{ - ApplicableEntities, IdentifiedViewSystem, ImageDecodeCache, QueryContext, + IdentifiedViewSystem, ImageDecodeCache, MaybeVisualizableEntities, QueryContext, TypedComponentFallbackProvider, ViewContext, ViewContextCollection, ViewQuery, ViewSystemExecutionError, VisualizableEntities, VisualizableFilterContext, - VisualizerAdditionalApplicabilityFilter, VisualizerQueryInfo, VisualizerSystem, + DataBasedVisualizabilityFilter, VisualizerQueryInfo, VisualizerSystem, }; use crate::{ @@ -40,11 +40,11 @@ impl IdentifiedViewSystem for EncodedImageVisualizer { struct ImageMediaTypeFilter; -impl VisualizerAdditionalApplicabilityFilter for ImageMediaTypeFilter { - /// Marks entities only as applicable for `EncodedImage` if they have an image media type. +impl DataBasedVisualizabilityFilter for ImageMediaTypeFilter { + /// Marks entities only as "maybe visualizable" for `EncodedImage` if they have an image media type. /// /// Otherwise the image encoder might be suggested for other blobs like video. - fn update_applicability(&mut self, event: &re_chunk_store::ChunkStoreEvent) -> bool { + fn update_visualizability(&mut self, event: &re_chunk_store::ChunkStoreEvent) -> bool { diff_component_filter(event, |media_type: &re_types::components::MediaType| { media_type.is_image() }) || diff_component_filter(event, |image: &re_types::components::Blob| { @@ -58,15 +58,15 @@ impl VisualizerSystem for EncodedImageVisualizer { VisualizerQueryInfo::from_archetype::() } - fn applicability_filter( + fn data_based_visualizability_filter( &self, - ) -> Option> { + ) -> Option> { Some(Box::new(ImageMediaTypeFilter)) } fn filter_visualizable_entities( &self, - entities: ApplicableEntities, + entities: MaybeVisualizableEntities, context: &dyn VisualizableFilterContext, ) -> VisualizableEntities { re_tracing::profile_function!(); diff --git a/crates/viewer/re_view_spatial/src/visualizers/images.rs b/crates/viewer/re_view_spatial/src/visualizers/images.rs index 82accc935600..bd7456141ebd 100644 --- a/crates/viewer/re_view_spatial/src/visualizers/images.rs +++ b/crates/viewer/re_view_spatial/src/visualizers/images.rs @@ -6,7 +6,7 @@ use re_types::{ }; use re_view::HybridResults; use re_viewer_context::{ - ApplicableEntities, IdentifiedViewSystem, ImageInfo, QueryContext, + MaybeVisualizableEntities, IdentifiedViewSystem, ImageInfo, QueryContext, TypedComponentFallbackProvider, ViewContext, ViewContextCollection, ViewQuery, ViewSystemExecutionError, VisualizableEntities, VisualizableFilterContext, VisualizerQueryInfo, VisualizerSystem, @@ -51,7 +51,7 @@ impl VisualizerSystem for ImageVisualizer { fn filter_visualizable_entities( &self, - entities: ApplicableEntities, + entities: MaybeVisualizableEntities, context: &dyn VisualizableFilterContext, ) -> VisualizableEntities { re_tracing::profile_function!(); diff --git a/crates/viewer/re_view_spatial/src/visualizers/lines2d.rs b/crates/viewer/re_view_spatial/src/visualizers/lines2d.rs index 8c39164880a9..dd215527af1f 100644 --- a/crates/viewer/re_view_spatial/src/visualizers/lines2d.rs +++ b/crates/viewer/re_view_spatial/src/visualizers/lines2d.rs @@ -7,7 +7,7 @@ use re_types::{ }; use re_view::{process_annotation_slices, process_color_slice}; use re_viewer_context::{ - auto_color_for_entity_path, ApplicableEntities, IdentifiedViewSystem, QueryContext, + auto_color_for_entity_path, MaybeVisualizableEntities, IdentifiedViewSystem, QueryContext, TypedComponentFallbackProvider, ViewContext, ViewContextCollection, ViewQuery, ViewSystemExecutionError, VisualizableEntities, VisualizableFilterContext, VisualizerQueryInfo, VisualizerSystem, @@ -160,7 +160,7 @@ impl VisualizerSystem for Lines2DVisualizer { fn filter_visualizable_entities( &self, - entities: ApplicableEntities, + entities: MaybeVisualizableEntities, context: &dyn VisualizableFilterContext, ) -> VisualizableEntities { re_tracing::profile_function!(); diff --git a/crates/viewer/re_view_spatial/src/visualizers/lines3d.rs b/crates/viewer/re_view_spatial/src/visualizers/lines3d.rs index 81c3bb5803c0..d82b09966b2a 100644 --- a/crates/viewer/re_view_spatial/src/visualizers/lines3d.rs +++ b/crates/viewer/re_view_spatial/src/visualizers/lines3d.rs @@ -7,7 +7,7 @@ use re_types::{ }; use re_view::{process_annotation_slices, process_color_slice}; use re_viewer_context::{ - auto_color_for_entity_path, ApplicableEntities, IdentifiedViewSystem, QueryContext, + auto_color_for_entity_path, MaybeVisualizableEntities, IdentifiedViewSystem, QueryContext, TypedComponentFallbackProvider, ViewContext, ViewContextCollection, ViewQuery, ViewSystemExecutionError, VisualizableEntities, VisualizableFilterContext, VisualizerQueryInfo, VisualizerSystem, @@ -165,7 +165,7 @@ impl VisualizerSystem for Lines3DVisualizer { fn filter_visualizable_entities( &self, - entities: ApplicableEntities, + entities: MaybeVisualizableEntities, context: &dyn VisualizableFilterContext, ) -> VisualizableEntities { re_tracing::profile_function!(); diff --git a/crates/viewer/re_view_spatial/src/visualizers/meshes.rs b/crates/viewer/re_view_spatial/src/visualizers/meshes.rs index fc74a42395b7..33ecdd7ce715 100644 --- a/crates/viewer/re_view_spatial/src/visualizers/meshes.rs +++ b/crates/viewer/re_view_spatial/src/visualizers/meshes.rs @@ -10,7 +10,7 @@ use re_types::{ Component as _, }; use re_viewer_context::{ - ApplicableEntities, IdentifiedViewSystem, QueryContext, ViewContext, ViewContextCollection, + MaybeVisualizableEntities, IdentifiedViewSystem, QueryContext, ViewContext, ViewContextCollection, ViewQuery, ViewSystemExecutionError, VisualizableEntities, VisualizableFilterContext, VisualizerQueryInfo, VisualizerSystem, }; @@ -157,7 +157,7 @@ impl VisualizerSystem for Mesh3DVisualizer { fn filter_visualizable_entities( &self, - entities: ApplicableEntities, + entities: MaybeVisualizableEntities, context: &dyn VisualizableFilterContext, ) -> VisualizableEntities { re_tracing::profile_function!(); diff --git a/crates/viewer/re_view_spatial/src/visualizers/mod.rs b/crates/viewer/re_view_spatial/src/visualizers/mod.rs index 0bf2cb4b8297..543721157a57 100644 --- a/crates/viewer/re_view_spatial/src/visualizers/mod.rs +++ b/crates/viewer/re_view_spatial/src/visualizers/mod.rs @@ -50,7 +50,7 @@ use ahash::HashMap; use re_entity_db::EntityPath; use re_types::datatypes::{KeypointId, KeypointPair}; use re_viewer_context::{ - auto_color_egui, ApplicableEntities, IdentifiedViewSystem, ViewClassRegistryError, + auto_color_egui, MaybeVisualizableEntities, IdentifiedViewSystem, ViewClassRegistryError, ViewSystemExecutionError, ViewSystemIdentifier, ViewSystemRegistrator, VisualizableEntities, VisualizableFilterContext, VisualizerCollection, }; @@ -271,7 +271,7 @@ pub fn image_view_coordinates() -> re_types::components::ViewCoordinates { } fn filter_visualizable_2d_entities( - entities: ApplicableEntities, + entities: MaybeVisualizableEntities, context: &dyn VisualizableFilterContext, ) -> VisualizableEntities { if let Some(context) = context @@ -302,7 +302,7 @@ fn filter_visualizable_2d_entities( } fn filter_visualizable_3d_entities( - entities: ApplicableEntities, + entities: MaybeVisualizableEntities, context: &dyn VisualizableFilterContext, ) -> VisualizableEntities { if let Some(context) = context diff --git a/crates/viewer/re_view_spatial/src/visualizers/points2d.rs b/crates/viewer/re_view_spatial/src/visualizers/points2d.rs index b6b9a00c1d39..719512170668 100644 --- a/crates/viewer/re_view_spatial/src/visualizers/points2d.rs +++ b/crates/viewer/re_view_spatial/src/visualizers/points2d.rs @@ -8,7 +8,7 @@ use re_types::{ }; use re_view::{process_annotation_and_keypoint_slices, process_color_slice}; use re_viewer_context::{ - auto_color_for_entity_path, ApplicableEntities, IdentifiedViewSystem, QueryContext, + auto_color_for_entity_path, MaybeVisualizableEntities, IdentifiedViewSystem, QueryContext, TypedComponentFallbackProvider, ViewContext, ViewContextCollection, ViewQuery, ViewSystemExecutionError, VisualizableEntities, VisualizableFilterContext, VisualizerQueryInfo, VisualizerSystem, @@ -177,7 +177,7 @@ impl VisualizerSystem for Points2DVisualizer { fn filter_visualizable_entities( &self, - entities: ApplicableEntities, + entities: MaybeVisualizableEntities, context: &dyn VisualizableFilterContext, ) -> VisualizableEntities { re_tracing::profile_function!(); diff --git a/crates/viewer/re_view_spatial/src/visualizers/points3d.rs b/crates/viewer/re_view_spatial/src/visualizers/points3d.rs index 9114f9e9f159..362e4c814d32 100644 --- a/crates/viewer/re_view_spatial/src/visualizers/points3d.rs +++ b/crates/viewer/re_view_spatial/src/visualizers/points3d.rs @@ -8,7 +8,7 @@ use re_types::{ }; use re_view::{process_annotation_and_keypoint_slices, process_color_slice}; use re_viewer_context::{ - auto_color_for_entity_path, ApplicableEntities, IdentifiedViewSystem, QueryContext, + auto_color_for_entity_path, MaybeVisualizableEntities, IdentifiedViewSystem, QueryContext, TypedComponentFallbackProvider, ViewContext, ViewContextCollection, ViewQuery, ViewSystemExecutionError, VisualizableEntities, VisualizableFilterContext, VisualizerQueryInfo, VisualizerSystem, @@ -167,7 +167,7 @@ impl VisualizerSystem for Points3DVisualizer { fn filter_visualizable_entities( &self, - entities: ApplicableEntities, + entities: MaybeVisualizableEntities, context: &dyn VisualizableFilterContext, ) -> VisualizableEntities { re_tracing::profile_function!(); diff --git a/crates/viewer/re_view_spatial/src/visualizers/segmentation_images.rs b/crates/viewer/re_view_spatial/src/visualizers/segmentation_images.rs index 4f8a7bb97f3d..02203ec39776 100644 --- a/crates/viewer/re_view_spatial/src/visualizers/segmentation_images.rs +++ b/crates/viewer/re_view_spatial/src/visualizers/segmentation_images.rs @@ -5,7 +5,7 @@ use re_types::{ Component as _, }; use re_viewer_context::{ - ApplicableEntities, IdentifiedViewSystem, ImageInfo, QueryContext, + MaybeVisualizableEntities, IdentifiedViewSystem, ImageInfo, QueryContext, TypedComponentFallbackProvider, ViewContext, ViewContextCollection, ViewQuery, ViewSystemExecutionError, VisualizableEntities, VisualizableFilterContext, VisualizerQueryInfo, VisualizerSystem, @@ -50,7 +50,7 @@ impl VisualizerSystem for SegmentationImageVisualizer { fn filter_visualizable_entities( &self, - entities: ApplicableEntities, + entities: MaybeVisualizableEntities, context: &dyn VisualizableFilterContext, ) -> VisualizableEntities { re_tracing::profile_function!(); diff --git a/crates/viewer/re_view_spatial/src/visualizers/transform3d_arrows.rs b/crates/viewer/re_view_spatial/src/visualizers/transform3d_arrows.rs index 1ecb0dc73177..16ceedf0321a 100644 --- a/crates/viewer/re_view_spatial/src/visualizers/transform3d_arrows.rs +++ b/crates/viewer/re_view_spatial/src/visualizers/transform3d_arrows.rs @@ -8,7 +8,7 @@ use re_types::{ }; use re_view::{latest_at_with_blueprint_resolved_data, DataResultQuery}; use re_viewer_context::{ - ApplicableEntities, IdentifiedViewSystem, QueryContext, TypedComponentFallbackProvider, + IdentifiedViewSystem, MaybeVisualizableEntities, QueryContext, TypedComponentFallbackProvider, ViewContext, ViewContextCollection, ViewQuery, ViewStateExt, ViewSystemExecutionError, VisualizableEntities, VisualizableFilterContext, VisualizerQueryInfo, VisualizerSystem, }; @@ -33,19 +33,21 @@ impl IdentifiedViewSystem for Transform3DArrowsVisualizer { } } -struct Transform3DApplicabilityFilter { - applicability_trigger_components: IntSet, +struct Transform3DVisualizabilityFilter { + visualizability_trigger_components: IntSet, } -impl re_viewer_context::VisualizerAdditionalApplicabilityFilter for Transform3DApplicabilityFilter { - fn update_applicability(&mut self, event: &re_chunk_store::ChunkStoreEvent) -> bool { - // There's no required component on `Transform3D` archetype, so by default it would always be applicable. +impl re_viewer_context::DataBasedVisualizabilityFilter + for Transform3DVisualizabilityFilter +{ + fn update_visualizability(&mut self, event: &re_chunk_store::ChunkStoreEvent) -> bool { + // There's no required component on `Transform3D` archetype, so by default it would always be visualizable. // That's not entirely wrong, after all, the transform arrows make always sense! // But today, this notion messes with a lot of things: // * it means everything can be visualized in a 3D view! - // * if there's no indicated visualizer, we show any visualizer that is applicable (that would be this one always then) + // * if there's no indicated visualizer, we show any visualizer that is visualizable (that would be this one always then) event.diff.chunk.component_names().any(|component_name| { - self.applicability_trigger_components + self.visualizability_trigger_components .contains(&component_name) }) } @@ -56,11 +58,11 @@ impl VisualizerSystem for Transform3DArrowsVisualizer { VisualizerQueryInfo::from_archetype::() } - fn applicability_filter( + fn data_based_visualizability_filter( &self, - ) -> Option> { - Some(Box::new(Transform3DApplicabilityFilter { - applicability_trigger_components: Transform3D::all_components() + ) -> Option> { + Some(Box::new(Transform3DVisualizabilityFilter { + visualizability_trigger_components: Transform3D::all_components() .iter() .map(|descr| descr.component_name) .collect(), @@ -69,7 +71,7 @@ impl VisualizerSystem for Transform3DArrowsVisualizer { fn filter_visualizable_entities( &self, - entities: ApplicableEntities, + entities: MaybeVisualizableEntities, context: &dyn VisualizableFilterContext, ) -> VisualizableEntities { filter_visualizable_3d_entities(entities, context) @@ -310,7 +312,7 @@ impl VisualizerSystem for AxisLengthDetector { #[inline] fn filter_visualizable_entities( &self, - _entities: ApplicableEntities, + _entities: MaybeVisualizableEntities, _context: &dyn VisualizableFilterContext, ) -> VisualizableEntities { // Never actually visualize this detector diff --git a/crates/viewer/re_view_spatial/src/visualizers/videos.rs b/crates/viewer/re_view_spatial/src/visualizers/videos.rs index c5c5f3d36af7..4546b32a4776 100644 --- a/crates/viewer/re_view_spatial/src/visualizers/videos.rs +++ b/crates/viewer/re_view_spatial/src/visualizers/videos.rs @@ -15,7 +15,7 @@ use re_types::{ Archetype, Component as _, }; use re_viewer_context::{ - ApplicableEntities, IdentifiedViewSystem, TypedComponentFallbackProvider, VideoCache, + MaybeVisualizableEntities, IdentifiedViewSystem, TypedComponentFallbackProvider, VideoCache, ViewClass as _, ViewContext, ViewContextCollection, ViewId, ViewQuery, ViewSystemExecutionError, ViewerContext, VisualizableEntities, VisualizableFilterContext, VisualizerQueryInfo, VisualizerSystem, @@ -59,7 +59,7 @@ impl VisualizerSystem for VideoFrameReferenceVisualizer { fn filter_visualizable_entities( &self, - entities: ApplicableEntities, + entities: MaybeVisualizableEntities, context: &dyn VisualizableFilterContext, ) -> VisualizableEntities { re_tracing::profile_function!(); diff --git a/crates/viewer/re_view_tensor/src/view_class.rs b/crates/viewer/re_view_tensor/src/view_class.rs index 3727ee9c73cf..a83b27c3e7e6 100644 --- a/crates/viewer/re_view_tensor/src/view_class.rs +++ b/crates/viewer/re_view_tensor/src/view_class.rs @@ -15,7 +15,7 @@ use re_types::{ use re_ui::{list_item, UiExt as _}; use re_view::{suggest_view_for_each_entity, view_property_ui}; use re_viewer_context::{ - gpu_bridge, ApplicableEntities, ColormapWithRange, IdentifiedViewSystem as _, + gpu_bridge, MaybeVisualizableEntities, ColormapWithRange, IdentifiedViewSystem as _, IndicatedEntities, PerVisualizer, TensorStatsCache, TypedComponentFallbackProvider, ViewClass, ViewClassRegistryError, ViewId, ViewQuery, ViewState, ViewStateExt as _, ViewSystemExecutionError, ViewerContext, VisualizableEntities, @@ -95,7 +95,7 @@ Note: select the view to configure which dimensions are shown." fn choose_default_visualizers( &self, entity_path: &EntityPath, - _applicable_entities_per_visualizer: &PerVisualizer, + _maybe_visualizable_entities_per_visualizer: &PerVisualizer, visualizable_entities_per_visualizer: &PerVisualizer, _indicated_entities_per_visualizer: &PerVisualizer, ) -> re_viewer_context::SmallVisualizerSet { diff --git a/crates/viewer/re_view_time_series/src/view_class.rs b/crates/viewer/re_view_time_series/src/view_class.rs index ebcad6927277..0809a12f18e9 100644 --- a/crates/viewer/re_view_time_series/src/view_class.rs +++ b/crates/viewer/re_view_time_series/src/view_class.rs @@ -16,7 +16,7 @@ use re_view::controls::{ }; use re_view::{controls, view_property_ui}; use re_viewer_context::{ - ApplicableEntities, IdentifiedViewSystem, IndicatedEntities, PerVisualizer, QueryRange, + IdentifiedViewSystem, IndicatedEntities, MaybeVisualizableEntities, PerVisualizer, QueryRange, RecommendedView, SmallVisualizerSet, SystemExecutionOutput, TypedComponentFallbackProvider, ViewClass, ViewClassRegistryError, ViewId, ViewQuery, ViewSpawnHeuristics, ViewState, ViewStateExt as _, ViewSystemExecutionError, ViewSystemIdentifier, ViewerContext, @@ -191,12 +191,14 @@ Display time series data in a plot. } // Because SeriesLine is our fallback visualizer, also include any entities for which - // SeriesLine is applicable, even if not indicated. - if let Some(applicable) = ctx - .applicable_entities_per_visualizer + // SeriesLine is visualizable, even if not indicated. + if let Some(maybe_visualizable) = ctx + .maybe_visualizable_entities_per_visualizer .get(&SeriesLineSystem::identifier()) { - indicated_entities.0.extend(applicable.iter().cloned()); + indicated_entities + .0 + .extend(maybe_visualizable.iter().cloned()); } if indicated_entities.0.is_empty() { @@ -236,7 +238,7 @@ Display time series data in a plot. fn choose_default_visualizers( &self, entity_path: &EntityPath, - _applicable_entities_per_visualizer: &PerVisualizer, + _maybe_visualizable_entities_per_visualizer: &PerVisualizer, visualizable_entities_per_visualizer: &PerVisualizer, indicated_entities_per_visualizer: &PerVisualizer, ) -> SmallVisualizerSet { diff --git a/crates/viewer/re_viewer/src/app_state.rs b/crates/viewer/re_viewer/src/app_state.rs index 7a2d454b3246..82fede4f77f5 100644 --- a/crates/viewer/re_viewer/src/app_state.rs +++ b/crates/viewer/re_viewer/src/app_state.rs @@ -220,8 +220,8 @@ impl AppState { viewport_ui.blueprint.root_container, )); - let applicable_entities_per_visualizer = - view_class_registry.applicable_entities_for_visualizer_systems(&recording.store_id()); + let maybe_visualizable_entities_per_visualizer = + view_class_registry.maybe_visualizable_entities_for_visualizer_systems(&recording.store_id()); let indicated_entities_per_visualizer = view_class_registry.indicated_entities_per_visualizer(&recording.store_id()); @@ -239,7 +239,7 @@ impl AppState { let visualizable_entities = view .class(view_class_registry) .determine_visualizable_entities( - &applicable_entities_per_visualizer, + &maybe_visualizable_entities_per_visualizer, recording, &view_class_registry.new_visualizer_collection(view.class_identifier()), &view.space_origin, @@ -269,7 +269,7 @@ impl AppState { reflection, component_ui_registry, store_context, - applicable_entities_per_visualizer: &applicable_entities_per_visualizer, + maybe_visualizable_entities_per_visualizer: &maybe_visualizable_entities_per_visualizer, indicated_entities_per_visualizer: &indicated_entities_per_visualizer, query_results: &query_results, rec_cfg, @@ -308,7 +308,7 @@ impl AppState { let visualizable_entities = view .class(view_class_registry) .determine_visualizable_entities( - &applicable_entities_per_visualizer, + &maybe_visualizable_entities_per_visualizer, recording, &view_class_registry.new_visualizer_collection(view.class_identifier()), &view.space_origin, @@ -317,7 +317,7 @@ impl AppState { let resolver = view.contents.build_resolver( view_class_registry, view, - &applicable_entities_per_visualizer, + &maybe_visualizable_entities_per_visualizer, &visualizable_entities, &indicated_entities_per_visualizer, ); @@ -348,7 +348,7 @@ impl AppState { reflection, component_ui_registry, store_context, - applicable_entities_per_visualizer: &applicable_entities_per_visualizer, + maybe_visualizable_entities_per_visualizer: &maybe_visualizable_entities_per_visualizer, indicated_entities_per_visualizer: &indicated_entities_per_visualizer, query_results: &query_results, rec_cfg, diff --git a/crates/viewer/re_viewer_context/src/lib.rs b/crates/viewer/re_viewer_context/src/lib.rs index faaa5d6983d2..8409e226cd81 100644 --- a/crates/viewer/re_viewer_context/src/lib.rs +++ b/crates/viewer/re_viewer_context/src/lib.rs @@ -74,7 +74,7 @@ pub use self::{ time_control::{Looping, PlayState, TimeControl, TimeView, TimelineCallbacks}, time_drag_value::TimeDragValue, typed_entity_collections::{ - ApplicableEntities, IndicatedEntities, PerVisualizer, VisualizableEntities, + IndicatedEntities, MaybeVisualizableEntities, PerVisualizer, VisualizableEntities, }, undo::BlueprintUndoState, utils::{auto_color_egui, auto_color_for_entity_path, level_to_rich_text}, @@ -86,7 +86,7 @@ pub use self::{ ViewContextCollection, ViewContextSystem, ViewEntityHighlight, ViewHighlights, ViewOutlineMasks, ViewQuery, ViewSpawnHeuristics, ViewState, ViewStateExt, ViewStates, ViewSystemExecutionError, ViewSystemIdentifier, ViewSystemRegistrator, - VisualizableFilterContext, VisualizerAdditionalApplicabilityFilter, VisualizerCollection, + VisualizableFilterContext, VisualizerCollection, DataBasedVisualizabilityFilter, VisualizerQueryInfo, VisualizerSystem, }, viewer_context::{RecordingConfig, ViewerContext}, diff --git a/crates/viewer/re_viewer_context/src/test_context.rs b/crates/viewer/re_viewer_context/src/test_context.rs index 7d01791232a4..1288d176f27a 100644 --- a/crates/viewer/re_viewer_context/src/test_context.rs +++ b/crates/viewer/re_viewer_context/src/test_context.rs @@ -244,7 +244,7 @@ impl TestContext { component_ui_registry: &self.component_ui_registry, view_class_registry: &self.view_class_registry, store_context: &store_context, - applicable_entities_per_visualizer: &Default::default(), + maybe_visualizable_entities_per_visualizer: &Default::default(), indicated_entities_per_visualizer: &Default::default(), query_results: &self.query_results, rec_cfg: &self.recording_config, diff --git a/crates/viewer/re_viewer_context/src/typed_entity_collections.rs b/crates/viewer/re_viewer_context/src/typed_entity_collections.rs index 1dfdd1729c3d..3f99b269c098 100644 --- a/crates/viewer/re_viewer_context/src/typed_entity_collections.rs +++ b/crates/viewer/re_viewer_context/src/typed_entity_collections.rs @@ -5,13 +5,17 @@ use re_log_types::EntityPath; use crate::ViewSystemIdentifier; -/// List of entities that are *applicable* to a given visualizer. +/// List of entities that are *maybe* visualizable with a given visualizer. /// -/// An entity is applicable if it at any point in time on any timeline has all required components. +/// Note that this filter latches: +/// An entity is "maybe visualizable" if it at any point in time on any timeline has all required components. +/// +/// We evaluate this filtering step entirely by store subscriber. +/// This in turn implies that this can *not* be influenced by individual view setups. #[derive(Default, Clone, Debug)] -pub struct ApplicableEntities(pub IntSet); +pub struct MaybeVisualizableEntities(pub IntSet); -impl std::ops::Deref for ApplicableEntities { +impl std::ops::Deref for MaybeVisualizableEntities { type Target = IntSet; #[inline] @@ -43,8 +47,7 @@ impl std::ops::Deref for IndicatedEntities { /// change, e.g. its origin. /// TODO(andreas): Unclear if any of the view's configuring blueprint entities are included in this! /// -/// This is a subset of [`ApplicableEntities`] and differs on a -/// per view instance base. +/// This is a subset of [`MaybeVisualizableEntities`] and may differs on a per view instance base! #[derive(Default, Clone, Debug)] pub struct VisualizableEntities(pub IntSet); diff --git a/crates/viewer/re_viewer_context/src/view/mod.rs b/crates/viewer/re_viewer_context/src/view/mod.rs index 85f7edff3b28..554d016eeb76 100644 --- a/crates/viewer/re_viewer_context/src/view/mod.rs +++ b/crates/viewer/re_viewer_context/src/view/mod.rs @@ -36,7 +36,7 @@ pub use view_query::{ ViewQuery, }; pub use view_states::ViewStates; -pub use visualizer_entity_subscriber::VisualizerAdditionalApplicabilityFilter; +pub use visualizer_entity_subscriber::DataBasedVisualizabilityFilter; pub use visualizer_system::{VisualizerCollection, VisualizerQueryInfo, VisualizerSystem}; // --------------------------------------------------------------------------- diff --git a/crates/viewer/re_viewer_context/src/view/view_class.rs b/crates/viewer/re_viewer_context/src/view/view_class.rs index 6ecc035ae640..1f9f2ab61f4b 100644 --- a/crates/viewer/re_viewer_context/src/view/view_class.rs +++ b/crates/viewer/re_viewer_context/src/view/view_class.rs @@ -5,7 +5,7 @@ use re_log_types::EntityPath; use re_types::{ComponentName, ViewClassIdentifier}; use crate::{ - ApplicableEntities, IndicatedEntities, PerVisualizer, QueryRange, SmallVisualizerSet, + IndicatedEntities, MaybeVisualizableEntities, PerVisualizer, QueryRange, SmallVisualizerSet, SystemExecutionOutput, ViewClassRegistryError, ViewId, ViewQuery, ViewSpawnHeuristics, ViewSystemExecutionError, ViewSystemRegistrator, ViewerContext, VisualizableEntities, }; @@ -141,7 +141,7 @@ pub trait ViewClass: Send + Sync { fn choose_default_visualizers( &self, entity_path: &EntityPath, - _applicable_entities_per_visualizer: &PerVisualizer, + _maybe_visualizable_entities_per_visualizer: &PerVisualizer, visualizable_entities_per_visualizer: &PerVisualizer, indicated_entities_per_visualizer: &PerVisualizer, ) -> SmallVisualizerSet { @@ -219,10 +219,10 @@ pub trait ViewClass: Send + Sync { pub trait ViewClassExt<'a>: ViewClass + 'a { /// Determines the set of visible entities for a given view. // TODO(andreas): This should be part of the View's (non-blueprint) state. - // Updated whenever `applicable_entities_per_visualizer` or the view blueprint changes. + // Updated whenever `maybe_visualizable_entities_per_visualizer` or the view blueprint changes. fn determine_visualizable_entities( &self, - applicable_entities_per_visualizer: &PerVisualizer, + maybe_visualizable_entities_per_visualizer: &PerVisualizer, entity_db: &EntityDb, visualizers: &crate::VisualizerCollection, space_origin: &EntityPath, @@ -235,11 +235,11 @@ pub trait ViewClassExt<'a>: ViewClass + 'a { visualizers .iter_with_identifiers() .map(|(visualizer_identifier, visualizer_system)| { - let entities = if let Some(applicable_entities) = - applicable_entities_per_visualizer.get(&visualizer_identifier) + let entities = if let Some(maybe_visualizable_entities) = + maybe_visualizable_entities_per_visualizer.get(&visualizer_identifier) { visualizer_system.filter_visualizable_entities( - applicable_entities.clone(), + maybe_visualizable_entities.clone(), filter_ctx.as_ref(), ) } else { diff --git a/crates/viewer/re_viewer_context/src/view/view_class_registry.rs b/crates/viewer/re_viewer_context/src/view/view_class_registry.rs index 58ba77b776b2..459e144ce9a5 100644 --- a/crates/viewer/re_viewer_context/src/view/view_class_registry.rs +++ b/crates/viewer/re_viewer_context/src/view/view_class_registry.rs @@ -5,7 +5,7 @@ use re_chunk_store::{ChunkStore, ChunkStoreSubscriberHandle}; use re_types::ViewClassIdentifier; use crate::{ - ApplicableEntities, IdentifiedViewSystem, IndicatedEntities, PerVisualizer, ViewClass, + IdentifiedViewSystem, IndicatedEntities, MaybeVisualizableEntities, PerVisualizer, ViewClass, ViewContextCollection, ViewContextSystem, ViewSystemIdentifier, VisualizerCollection, VisualizerSystem, }; @@ -270,16 +270,16 @@ impl ViewClassRegistry { .sorted_by_key(|entry| entry.class.display_name()) } - /// For each visualizer, return the set of entities that is applicable to it. + /// For each visualizer, return the set of entities that may be visualizable with it. /// /// The list is kept up to date by store subscribers. - pub fn applicable_entities_for_visualizer_systems( + pub fn maybe_visualizable_entities_for_visualizer_systems( &self, store_id: &re_log_types::StoreId, - ) -> PerVisualizer { + ) -> PerVisualizer { re_tracing::profile_function!(); - PerVisualizer::( + PerVisualizer::( self.visualizers .iter() .map(|(id, entry)| { @@ -287,7 +287,7 @@ impl ViewClassRegistry { *id, ChunkStore::with_subscriber::( entry.entity_subscriber_handle, - |subscriber| subscriber.applicable_entities(store_id).cloned(), + |subscriber| subscriber.maybe_visualizable_entities(store_id).cloned(), ) .flatten() .unwrap_or_default(), diff --git a/crates/viewer/re_viewer_context/src/view/visualizer_entity_subscriber.rs b/crates/viewer/re_viewer_context/src/view/visualizer_entity_subscriber.rs index 2ddd36cdbb20..4165593f770b 100644 --- a/crates/viewer/re_viewer_context/src/view/visualizer_entity_subscriber.rs +++ b/crates/viewer/re_viewer_context/src/view/visualizer_entity_subscriber.rs @@ -7,7 +7,7 @@ use re_log_types::{EntityPathHash, StoreId}; use re_types::{ComponentName, ComponentNameSet}; use crate::{ - ApplicableEntities, IdentifiedViewSystem, IndicatedEntities, ViewSystemIdentifier, + IdentifiedViewSystem, IndicatedEntities, MaybeVisualizableEntities, ViewSystemIdentifier, VisualizerSystem, }; @@ -15,10 +15,12 @@ use crate::{ /// processed by a single given visualizer type. /// /// The list of entities is additive: -/// If an entity was at any point in time applicable to the visualizer, it will be +/// If an entity was at any point in time passes the "maybe visualizable" filter for the visualizer, it will be /// kept in the list of entities. /// -/// Applicability is determined by the visualizer's set of required components. +/// "maybe visualizable" is determined by.. +/// * set of required components +/// * additional custom data based criteria a visualizer may set /// /// There's only a single entity subscriber per visualizer *type*. /// This means that if the same visualizer is used in multiple views, only a single @@ -35,29 +37,35 @@ pub struct VisualizerEntitySubscriber { per_store_mapping: HashMap, - /// Additional filter for applicability. - applicability_filter: Box, + /// Additional filter for visualizability. + additional_filter: Box, } -/// Additional filter for applicability on top of the default check for required components. -pub trait VisualizerAdditionalApplicabilityFilter: Send + Sync { - /// Updates the internal applicability filter state based on the given events. +/// Additional filter for visualizability on top of the default check for required components. +/// +/// This is part of the "maybe visualizable" criteria. +/// I.e. if this (and the required components) are passed, an entity is deemed "maybe visualizable" +/// on all timelines & time points. +/// However, there might be additional view instance based filters that prune this set further to the final +/// "visualizable" set. +pub trait DataBasedVisualizabilityFilter: Send + Sync { + /// Updates the internal visualizability filter state based on the given events. /// /// Called for every update no matter whether the entity is already has all required components or not. /// - /// Returns true if the entity changed in the event is now applicable to the visualizer, false otherwise. + /// Returns true if the entity changed in the event is now visualizable to the visualizer (bar any view dependent restrictions), false otherwise. /// Once a entity passes this filter, it can never go back to being filtered out. /// **This implies that the filter does not _need_ to be stateful.** - /// It is perfectly fine to return `true` only if something in the diff is regarded as applicable and false otherwise. - /// (However, if necessary, the applicability filter *can* keep track of state.) - fn update_applicability(&mut self, _event: &ChunkStoreEvent) -> bool; + /// It is perfectly fine to return `true` only if some aspect in the diff is regarded as visualizable and false otherwise. + /// (However, if necessary, the filter *can* keep track of state.) + fn update_visualizability(&mut self, _event: &ChunkStoreEvent) -> bool; } -struct DefaultVisualizerApplicabilityFilter; +struct DefaultVisualizabilityFilter; -impl VisualizerAdditionalApplicabilityFilter for DefaultVisualizerApplicabilityFilter { +impl DataBasedVisualizabilityFilter for DefaultVisualizabilityFilter { #[inline] - fn update_applicability(&mut self, _event: &ChunkStoreEvent) -> bool { + fn update_visualizability(&mut self, _event: &ChunkStoreEvent) -> bool { true } } @@ -66,16 +74,16 @@ impl VisualizerAdditionalApplicabilityFilter for DefaultVisualizerApplicabilityF struct VisualizerEntityMapping { /// For each entity, which of the required components are present. /// - /// Last bit is used for the applicability filter. + /// Last bit is used for the data-based-visualizability filter. /// /// In order of `required_components`. - /// If all bits are set, the entity is applicable to the visualizer. + /// If all bits are set, the entity is "maybe visualizable" to the visualizer. // TODO(andreas): We could just limit the number of required components to 32 or 64 and // then use a single u32/u64 as a bitmap. required_component_and_filter_bitmap_per_entity: IntMap, /// Which entities the visualizer can be applied to. - applicable_entities: ApplicableEntities, + maybe_visualizable_entities: MaybeVisualizableEntities, /// List of all entities in this store that at some point in time had any of the indicator components. /// @@ -98,24 +106,27 @@ impl VisualizerEntitySubscriber { .map(|(i, name)| (name, i)) .collect(), per_store_mapping: Default::default(), - applicability_filter: visualizer - .applicability_filter() - .unwrap_or_else(|| Box::new(DefaultVisualizerApplicabilityFilter)), + additional_filter: visualizer + .data_based_visualizability_filter() + .unwrap_or_else(|| Box::new(DefaultVisualizabilityFilter)), } } - /// List of entities that are applicable to the visualizer. + /// List of entities that are may be visualizable by the visualizer. #[inline] - pub fn applicable_entities(&self, store: &StoreId) -> Option<&ApplicableEntities> { + pub fn maybe_visualizable_entities( + &self, + store: &StoreId, + ) -> Option<&MaybeVisualizableEntities> { self.per_store_mapping .get(store) - .map(|mapping| &mapping.applicable_entities) + .map(|mapping| &mapping.maybe_visualizable_entities) } /// List of entities that at some point in time had any of the indicator components advertised by this visualizer. /// /// Useful for quickly evaluating basic "should this visualizer apply by default"-heuristic. - /// Does *not* imply that any of the given entities is also in the applicable-set! + /// Does *not* imply that any of the given entities is also in the (maybe-)visualizable-set! /// /// If the visualizer has no indicator components, this list will contain all entities in the store. pub fn indicated_entities(&self, store: &StoreId) -> Option<&IndicatedEntities> { @@ -148,7 +159,7 @@ impl ChunkStoreSubscriber for VisualizerEntitySubscriber { for event in events { if event.diff.kind != ChunkStoreDiffKind::Addition { - // Applicability is only additive, don't care about removals. + // Visualizability is only additive, don't care about removals. continue; } @@ -180,7 +191,7 @@ impl ChunkStoreSubscriber for VisualizerEntitySubscriber { }); if required_components_bitmap.all() { - // We already know that this entity is applicable to the visualizer. + // We already know that this entity is visualizable to the visualizer. continue; } @@ -203,20 +214,20 @@ impl ChunkStoreSubscriber for VisualizerEntitySubscriber { if !custom_filter { required_components_bitmap.set( bit_index_for_filter, - self.applicability_filter.update_applicability(event), + self.additional_filter.update_visualizability(event), ); } if required_components_bitmap.all() { re_log::trace!( - "Entity {:?} in store {:?} is now applicable to visualizer {:?}", + "Entity {:?} in store {:?} may now be visualizable by {:?}", entity_path, event.store_id, self.visualizer ); store_mapping - .applicable_entities + .maybe_visualizable_entities .0 .insert(entity_path.clone()); } diff --git a/crates/viewer/re_viewer_context/src/view/visualizer_system.rs b/crates/viewer/re_viewer_context/src/view/visualizer_system.rs index 408d57e32325..64e933e87964 100644 --- a/crates/viewer/re_viewer_context/src/view/visualizer_system.rs +++ b/crates/viewer/re_viewer_context/src/view/visualizer_system.rs @@ -3,9 +3,10 @@ use std::collections::BTreeMap; use re_types::{Archetype, ComponentName, ComponentNameSet}; use crate::{ - ApplicableEntities, ComponentFallbackProvider, IdentifiedViewSystem, ViewContext, - ViewContextCollection, ViewQuery, ViewSystemExecutionError, ViewSystemIdentifier, - VisualizableEntities, VisualizableFilterContext, VisualizerAdditionalApplicabilityFilter, + ComponentFallbackProvider, DataBasedVisualizabilityFilter, IdentifiedViewSystem, + MaybeVisualizableEntities, ViewContext, ViewContextCollection, ViewQuery, + ViewSystemExecutionError, ViewSystemIdentifier, VisualizableEntities, + VisualizableFilterContext, }; #[derive(Debug, Clone, Default)] @@ -89,23 +90,25 @@ pub trait VisualizerSystem: Send + Sync + 'static { /// Information about which components are queried by the visualizer. fn visualizer_query_info(&self) -> VisualizerQueryInfo; - /// Filters a set of applicable entities (entities that have all required components), - /// into to a set of visualizable entities. + /// Filters a set of "maybe visualizable" entities + /// (entities that have all required components and fulfill other view independent criteria), + /// into to a set of "visualizable" entities. /// /// The context passed in here is generated by [`crate::ViewClass::visualizable_filter_context`]. #[inline] fn filter_visualizable_entities( &self, - entities: ApplicableEntities, + entities: MaybeVisualizableEntities, _context: &dyn VisualizableFilterContext, ) -> VisualizableEntities { VisualizableEntities(entities.0) } - /// Additional filter for applicability. + /// Additional filter for visualizability based on component data. /// - /// If none is specified, applicability is solely determined by required components. - fn applicability_filter(&self) -> Option> { + /// If none is specified, "maybe visualizable" is solely determined by required components. + /// (for final visualizability, the view instance dependent filter is applied, see [`crate::VisualizerSystem::filter_visualizable_entities`]) + fn data_based_visualizability_filter(&self) -> Option> { None } diff --git a/crates/viewer/re_viewer_context/src/viewer_context.rs b/crates/viewer/re_viewer_context/src/viewer_context.rs index 20098813a688..b7359189926d 100644 --- a/crates/viewer/re_viewer_context/src/viewer_context.rs +++ b/crates/viewer/re_viewer_context/src/viewer_context.rs @@ -8,9 +8,9 @@ use re_query::StorageEngineReadGuard; use crate::drag_and_drop::DragAndDropPayload; use crate::{ - query_context::DataQueryResult, AppOptions, ApplicableEntities, ApplicationSelectionState, - Caches, CommandSender, ComponentUiRegistry, DragAndDropManager, IndicatedEntities, - ItemCollection, PerVisualizer, StoreContext, SystemCommandSender as _, TimeControl, + query_context::DataQueryResult, AppOptions, ApplicationSelectionState, Caches, CommandSender, + ComponentUiRegistry, DragAndDropManager, IndicatedEntities, ItemCollection, + MaybeVisualizableEntities, PerVisualizer, StoreContext, SystemCommandSender as _, TimeControl, ViewClassRegistry, ViewId, }; @@ -45,12 +45,12 @@ pub struct ViewerContext<'a> { /// Mapping from class and system to entities for the store /// /// TODO(andreas): This should have a generation id, allowing to update heuristics(?)/visualizable entities etc. - pub applicable_entities_per_visualizer: &'a PerVisualizer, + pub maybe_visualizable_entities_per_visualizer: &'a PerVisualizer, /// For each visualizer, the set of entities that have at least one matching indicator component. /// - /// TODO(andreas): Should we always do the intersection with `applicable_entities_per_visualizer` - /// or are we ever interested in a non-applicable but indicator-matching entity? + /// TODO(andreas): Should we always do the intersection with `maybe_visualizable_entities_per_visualizer` + /// or are we ever interested in a (definitely-)non-visualizable but indicator-matching entity? pub indicated_entities_per_visualizer: &'a PerVisualizer, /// All the query results for this frame. diff --git a/crates/viewer/re_viewport_blueprint/src/entity_add_info.rs b/crates/viewer/re_viewport_blueprint/src/entity_add_info.rs index 7d4aa4825d8f..3a97bf7ab792 100644 --- a/crates/viewer/re_viewport_blueprint/src/entity_add_info.rs +++ b/crates/viewer/re_viewport_blueprint/src/entity_add_info.rs @@ -74,7 +74,7 @@ pub fn create_entity_add_info( // TODO(andreas): This should be state that is already available because it's part of the view's state. let class = view.class(ctx.view_class_registry); let visualizable_entities = class.determine_visualizable_entities( - ctx.applicable_entities_per_visualizer, + ctx.maybe_visualizable_entities_per_visualizer, ctx.recording(), &ctx.view_class_registry .new_visualizer_collection(view.class_identifier()), diff --git a/crates/viewer/re_viewport_blueprint/src/view.rs b/crates/viewer/re_viewport_blueprint/src/view.rs index 7d223dff19fb..35ca9b36d785 100644 --- a/crates/viewer/re_viewport_blueprint/src/view.rs +++ b/crates/viewer/re_viewport_blueprint/src/view.rs @@ -444,8 +444,8 @@ mod tests { }; use re_types::{Component as _, ComponentName}; use re_viewer_context::{ - test_context::TestContext, ApplicableEntities, DataResult, IndicatedEntities, OverridePath, - PerVisualizer, StoreContext, VisualizableEntities, + test_context::TestContext, DataResult, IndicatedEntities, MaybeVisualizableEntities, + OverridePath, PerVisualizer, StoreContext, VisualizableEntities, }; use crate::view_contents::DataQueryPropertyResolver; @@ -487,11 +487,16 @@ mod tests { .or_insert_with(|| VisualizableEntities(entity_paths.into_iter().collect())); } - let applicable_entities = PerVisualizer::( + let maybe_visualizable_entities = PerVisualizer::( visualizable_entities .0 .iter() - .map(|(id, entities)| (*id, ApplicableEntities(entities.iter().cloned().collect()))) + .map(|(id, entities)| { + ( + *id, + MaybeVisualizableEntities(entities.iter().cloned().collect()), + ) + }) .collect(), ); @@ -511,7 +516,7 @@ mod tests { let resolver = view.contents.build_resolver( &test_ctx.view_class_registry, &view, - &applicable_entities, + &maybe_visualizable_entities, &visualizable_entities, &indicated_entities_per_visualizer, ); diff --git a/crates/viewer/re_viewport_blueprint/src/view_contents.rs b/crates/viewer/re_viewport_blueprint/src/view_contents.rs index d2d9068ac9e6..45e50be78a20 100644 --- a/crates/viewer/re_viewport_blueprint/src/view_contents.rs +++ b/crates/viewer/re_viewport_blueprint/src/view_contents.rs @@ -15,9 +15,9 @@ use re_types::{ }; use re_types_core::ComponentName; use re_viewer_context::{ - ApplicableEntities, DataQueryResult, DataResult, DataResultHandle, DataResultNode, - DataResultTree, IndicatedEntities, OverridePath, PerVisualizer, PropertyOverrides, QueryRange, - ViewClassRegistry, ViewId, ViewStates, ViewerContext, VisualizableEntities, + DataQueryResult, DataResult, DataResultHandle, DataResultNode, DataResultTree, + IndicatedEntities, MaybeVisualizableEntities, OverridePath, PerVisualizer, PropertyOverrides, + QueryRange, ViewClassRegistry, ViewId, ViewStates, ViewerContext, VisualizableEntities, }; use crate::{ViewBlueprint, ViewProperty}; @@ -167,7 +167,7 @@ impl ViewContents { &self, view_class_registry: &'a re_viewer_context::ViewClassRegistry, view: &'a ViewBlueprint, - applicable_entities_per_visualizer: &'a PerVisualizer, + maybe_visualizable_entities_per_visualizer: &'a PerVisualizer, visualizable_entities_per_visualizer: &'a PerVisualizer, indicated_entities_per_visualizer: &'a PerVisualizer, ) -> DataQueryPropertyResolver<'a> { @@ -181,7 +181,7 @@ impl ViewContents { view, individual_override_root, recursive_override_root, - applicable_entities_per_visualizer, + maybe_visualizable_entities_per_visualizer, visualizable_entities_per_visualizer, indicated_entities_per_visualizer, } @@ -417,7 +417,7 @@ pub struct DataQueryPropertyResolver<'a> { view: &'a ViewBlueprint, individual_override_root: EntityPath, recursive_override_root: EntityPath, - applicable_entities_per_visualizer: &'a PerVisualizer, + maybe_visualizable_entities_per_visualizer: &'a PerVisualizer, visualizable_entities_per_visualizer: &'a PerVisualizer, indicated_entities_per_visualizer: &'a PerVisualizer, } @@ -468,7 +468,7 @@ impl DataQueryPropertyResolver<'_> { .class(self.view_class_registry) .choose_default_visualizers( &node.data_result.entity_path, - self.applicable_entities_per_visualizer, + self.maybe_visualizable_entities_per_visualizer, self.visualizable_entities_per_visualizer, self.indicated_entities_per_visualizer, ); diff --git a/examples/rust/custom_view/src/color_coordinates_view.rs b/examples/rust/custom_view/src/color_coordinates_view.rs index 2098da981cce..631401888f33 100644 --- a/examples/rust/custom_view/src/color_coordinates_view.rs +++ b/examples/rust/custom_view/src/color_coordinates_view.rs @@ -106,9 +106,9 @@ impl ViewClass for ColorCoordinatesView { } fn spawn_heuristics(&self, ctx: &ViewerContext<'_>) -> ViewSpawnHeuristics { - // By default spawn a single view at the root if there's anything the visualizer is applicable to. + // By default spawn a single view at the root if there's anything the visualizer may be able to show. if ctx - .applicable_entities_per_visualizer + .maybe_visualizable_entities_per_visualizer .get(&InstanceColorSystem::identifier()) .map_or(true, |entities| entities.is_empty()) {