From 3daaa45f885ca5b045fcbdbdbd9e3f0d6e830fc5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Thu, 8 May 2025 16:39:03 +0200 Subject: [PATCH 01/12] `ChunkComponents::contains_component` and removal of `ComponentNameSet` Actually, `re_view_dataframe` still uses `ComponentNameSet` --- crates/store/re_chunk/src/chunk.rs | 6 ++-- crates/store/re_chunk_store/src/query.rs | 32 ++++++++----------- crates/store/re_chunk_store/tests/reads.rs | 5 ++- crates/store/re_types_core/src/lib.rs | 2 +- crates/store/re_types_core/src/loggable.rs | 2 -- .../re_view/src/annotation_scene_context.rs | 14 ++++---- .../re_view_dataframe/src/view_query/ui.rs | 32 +++++++++++++++---- .../src/contexts/depth_offsets.rs | 17 ++++++++-- .../src/contexts/transform_tree_context.rs | 18 ++++------- .../src/max_image_dimension_subscriber.rs | 13 +++----- .../viewer/re_view_spatial/src/mesh_cache.rs | 9 ++++-- .../src/line_visualizer_system.rs | 3 +- .../src/point_visualizer_system.rs | 3 +- .../src/cache/image_decode_cache.rs | 4 +-- .../src/cache/image_stats_cache.rs | 4 +-- .../src/cache/tensor_stats_cache.rs | 4 +-- .../src/cache/video_cache.rs | 4 +-- .../src/view/view_context_system.rs | 4 +-- .../src/view/visualizer_entity_subscriber.rs | 8 ++--- .../src/view/visualizer_system.rs | 8 ++--- examples/rust/extend_viewer_ui/src/main.rs | 6 ++-- 21 files changed, 102 insertions(+), 96 deletions(-) diff --git a/crates/store/re_chunk/src/chunk.rs b/crates/store/re_chunk/src/chunk.rs index 462e60804202..93c0b6f312ec 100644 --- a/crates/store/re_chunk/src/chunk.rs +++ b/crates/store/re_chunk/src/chunk.rs @@ -102,10 +102,8 @@ impl ChunkComponents { } /// Whether any of the components in this chunk has the given name. - pub fn contains_component_name(&self, component_name: ComponentName) -> bool { - self.0 - .keys() - .any(|desc| desc.component_name == component_name) + pub fn contains_component(&self, component_descr: &ComponentDescriptor) -> bool { + self.0.contains_key(component_descr) } } diff --git a/crates/store/re_chunk_store/src/query.rs b/crates/store/re_chunk_store/src/query.rs index b7f9df44662a..8e893f3447e5 100644 --- a/crates/store/re_chunk_store/src/query.rs +++ b/crates/store/re_chunk_store/src/query.rs @@ -10,8 +10,7 @@ use re_chunk::{Chunk, LatestAtQuery, RangeQuery, TimelineName}; use re_log_types::ResolvedTimeRange; use re_log_types::{EntityPath, TimeInt, Timeline}; use re_types_core::{ - ComponentDescriptor, ComponentDescriptorSet, ComponentName, ComponentNameSet, - UnorderedComponentDescriptorSet, + ComponentDescriptor, ComponentDescriptorSet, ComponentName, UnorderedComponentDescriptorSet, }; use crate::{store::ChunkIdSetPerTime, ChunkStore}; @@ -156,21 +155,21 @@ impl ChunkStore { &self, timeline: &TimelineName, entity_path: &EntityPath, - ) -> Option { + ) -> Option { re_tracing::profile_function!(); - let static_components: Option = self + let static_components: Option = self .static_chunk_ids_per_entity .get(entity_path) .map(|static_chunks_per_component| { static_chunks_per_component .keys() - .map(|descr| descr.component_name) - .collect::() + .cloned() + .collect::() }) .filter(|names| !names.is_empty()); - let temporal_components: Option = self + let temporal_components: Option = self .temporal_chunk_ids_per_entity_per_component .get(entity_path) .map(|temporal_chunk_ids_per_timeline| { @@ -179,8 +178,8 @@ impl ChunkStore { .map(|temporal_chunk_ids_per_component| { temporal_chunk_ids_per_component .keys() - .map(|descr| descr.component_name) - .collect::() + .cloned() + .collect::() }) .unwrap_or_default() }) @@ -242,29 +241,24 @@ impl ChunkStore { pub fn all_components_for_entity_sorted( &self, entity_path: &EntityPath, - ) -> Option { + ) -> Option { re_tracing::profile_function!(); - let static_components: Option = self + let static_components: Option = self .static_chunk_ids_per_entity .get(entity_path) .map(|static_chunks_per_component| { - static_chunks_per_component - .keys() - .map(|descr| descr.component_name) - .collect() + static_chunks_per_component.keys().cloned().collect() }); - let temporal_components: Option = self + let temporal_components: Option = self .temporal_chunk_ids_per_entity_per_component .get(entity_path) .map(|temporal_chunk_ids_per_timeline| { temporal_chunk_ids_per_timeline .iter() .flat_map(|(_, temporal_chunk_ids_per_component)| { - temporal_chunk_ids_per_component - .keys() - .map(|descr| descr.component_name) + temporal_chunk_ids_per_component.keys().cloned() }) .collect() }); diff --git a/crates/store/re_chunk_store/tests/reads.rs b/crates/store/re_chunk_store/tests/reads.rs index aa92468016ed..e52d8a2a89c9 100644 --- a/crates/store/re_chunk_store/tests/reads.rs +++ b/crates/store/re_chunk_store/tests/reads.rs @@ -14,7 +14,7 @@ use re_log_types::{ }; use re_types::{ testing::{build_some_large_structs, LargeStruct}, - ComponentDescriptor, ComponentNameSet, + ComponentDescriptor, ComponentDescriptorSet, }; use re_types_core::Component as _; @@ -61,8 +61,7 @@ fn all_components() -> anyhow::Result<()> { let component_names = store.all_components_on_timeline_sorted(&timeline, entity_path); let expected_component_names = expected.map(|expected| { - let expected: ComponentNameSet = - expected.iter().map(|desc| desc.component_name).collect(); + let expected: ComponentDescriptorSet = expected.iter().cloned().collect(); expected }); diff --git a/crates/store/re_types_core/src/lib.rs b/crates/store/re_types_core/src/lib.rs index 295bb61f85c5..cf89cd6e6c7f 100644 --- a/crates/store/re_types_core/src/lib.rs +++ b/crates/store/re_types_core/src/lib.rs @@ -44,7 +44,7 @@ pub use self::{ component_descriptor::ComponentDescriptor, id::{ChunkId, RowId}, loggable::{ - Component, ComponentDescriptorSet, ComponentName, ComponentNameSet, DatatypeName, Loggable, + Component, ComponentDescriptorSet, ComponentName, DatatypeName, Loggable, UnorderedComponentDescriptorSet, }, loggable_batch::{ diff --git a/crates/store/re_types_core/src/loggable.rs b/crates/store/re_types_core/src/loggable.rs index 762605c4546d..a382e36b4b6e 100644 --- a/crates/store/re_types_core/src/loggable.rs +++ b/crates/store/re_types_core/src/loggable.rs @@ -123,8 +123,6 @@ pub trait Component: Loggable { pub type UnorderedComponentDescriptorSet = IntSet; -pub type ComponentNameSet = std::collections::BTreeSet; - pub type ComponentDescriptorSet = std::collections::BTreeSet; re_string_interner::declare_new_type!( diff --git a/crates/viewer/re_view/src/annotation_scene_context.rs b/crates/viewer/re_view/src/annotation_scene_context.rs index 3ea7528ca943..860ceed3bac9 100644 --- a/crates/viewer/re_view/src/annotation_scene_context.rs +++ b/crates/viewer/re_view/src/annotation_scene_context.rs @@ -1,4 +1,4 @@ -use re_types::{archetypes::AnnotationContext, Archetype as _, ComponentNameSet}; +use re_types::{archetypes::AnnotationContext, Archetype as _, ComponentDescriptorSet}; use re_viewer_context::{ AnnotationMap, IdentifiedViewSystem, ViewContextSystem, ViewSystemIdentifier, }; @@ -13,13 +13,11 @@ impl IdentifiedViewSystem for AnnotationSceneContext { } impl ViewContextSystem for AnnotationSceneContext { - fn compatible_component_sets(&self) -> Vec { - vec![ - AnnotationContext::required_components() - .iter() - .map(|descr| descr.component_name) - .collect(), // - ] + fn compatible_component_sets(&self) -> Vec { + vec![AnnotationContext::required_components() + .iter() + .cloned() + .collect()] } fn execute( diff --git a/crates/viewer/re_view_dataframe/src/view_query/ui.rs b/crates/viewer/re_view_dataframe/src/view_query/ui.rs index 27858a3bbe14..6ef97702103e 100644 --- a/crates/viewer/re_view_dataframe/src/view_query/ui.rs +++ b/crates/viewer/re_view_dataframe/src/view_query/ui.rs @@ -7,11 +7,15 @@ use re_log_types::{ }; use re_sorbet::ColumnSelector; use re_types::blueprint::components; -use re_types_core::{ComponentName, ComponentNameSet}; +use re_types_core::ComponentName; use re_ui::{list_item, TimeDragValue, UiExt as _}; use re_viewer_context::{ViewId, ViewSystemExecutionError, ViewerContext}; use std::collections::{BTreeSet, HashSet}; +// TODO(#6889): This should be a `ComponentDescriptorSet`, but we first need to figure out +// how to handle descriptors for dataframe view queries in general. +type ComponentNameSet = std::collections::BTreeSet; + // UI implementation impl Query { pub(super) fn timeline_ui( @@ -237,7 +241,8 @@ impl Query { all_components .iter() .filter_map(|c| { - c.indicator_component_archetype_short_name() + c.component_name + .indicator_component_archetype_short_name() .and_then(|archetype_short_name| { ctx.reflection() .archetype_reflection_from_short_name(&archetype_short_name) @@ -248,13 +253,22 @@ impl Query { .required_fields() .map(|field| field.component_name) }) - .filter(|c| all_components.contains(c)) + .filter(|c| { + all_components + .iter() + .any(|descr| &descr.component_name == c) + }) .collect::() }; // If the currently saved component, we auto-switch it to a reasonable one. let mut filter_component = filter_component - .and_then(|component| all_components.contains(&component).then_some(component)) + .and_then(|component| { + all_components + .iter() + .any(|descr| descr.component_name == component) + .then_some(component) + }) .or_else(|| suggested_components().first().copied()) .unwrap_or_else(|| ComponentName::from("-")); @@ -283,9 +297,13 @@ impl Query { egui::ComboBox::new("pov_component", "") .selected_text(filter_component.short_name()) .show_ui(ui, |ui| { - for component in all_components { - let label = component.short_name(); - ui.selectable_value(&mut filter_component, component, label); + for descr in all_components { + let label = descr.short_name(); + ui.selectable_value( + &mut filter_component, + descr.component_name, + label, + ); } }); }), diff --git a/crates/viewer/re_view_spatial/src/contexts/depth_offsets.rs b/crates/viewer/re_view_spatial/src/contexts/depth_offsets.rs index 32be813fa548..cc42bd165eed 100644 --- a/crates/viewer/re_view_spatial/src/contexts/depth_offsets.rs +++ b/crates/viewer/re_view_spatial/src/contexts/depth_offsets.rs @@ -3,7 +3,7 @@ use std::collections::{BTreeMap, BTreeSet}; use ahash::HashMap; use re_log_types::EntityPathHash; -use re_types::{components::DrawOrder, Component as _, ComponentNameSet}; +use re_types::{archetypes, components::DrawOrder, ComponentDescriptorSet}; use re_view::latest_at_with_blueprint_resolved_data; use re_viewer_context::{IdentifiedViewSystem, ViewContextSystem, ViewSystemIdentifier}; @@ -23,8 +23,19 @@ impl IdentifiedViewSystem for EntityDepthOffsets { } impl ViewContextSystem for EntityDepthOffsets { - fn compatible_component_sets(&self) -> Vec { - vec![std::iter::once(DrawOrder::name()).collect()] + fn compatible_component_sets(&self) -> Vec { + vec![[ + archetypes::Arrows2D::descriptor_indicator(), + archetypes::Boxes2D::descriptor_indicator(), + archetypes::DepthImage::descriptor_indicator(), + archetypes::EncodedImage::descriptor_indicator(), + archetypes::Image::descriptor_indicator(), + archetypes::LineStrips2D::descriptor_indicator(), + archetypes::Points2D::descriptor_indicator(), + archetypes::SegmentationImage::descriptor_indicator(), + ] + .into_iter() + .collect()] } fn execute( diff --git a/crates/viewer/re_view_spatial/src/contexts/transform_tree_context.rs b/crates/viewer/re_view_spatial/src/contexts/transform_tree_context.rs index debcd4bb7e3b..82ce54b186e5 100644 --- a/crates/viewer/re_view_spatial/src/contexts/transform_tree_context.rs +++ b/crates/viewer/re_view_spatial/src/contexts/transform_tree_context.rs @@ -5,8 +5,8 @@ use re_entity_db::{EntityPath, EntityTree}; use re_log_types::EntityPathHash; use re_types::{ archetypes::{self, InstancePoses3D, Transform3D}, - components::{ImagePlaneDistance, PinholeProjection}, - Archetype as _, Component as _, ComponentNameSet, + components::ImagePlaneDistance, + Archetype as _, Component as _, ComponentDescriptorSet, }; use re_view::DataResultQuery as _; use re_viewer_context::{DataResultTree, IdentifiedViewSystem, ViewContext, ViewContextSystem}; @@ -149,17 +149,11 @@ impl Default for TransformTreeContext { } impl ViewContextSystem for TransformTreeContext { - fn compatible_component_sets(&self) -> Vec { + fn compatible_component_sets(&self) -> Vec { vec![ - Transform3D::all_components() - .iter() - .map(|descr| descr.component_name) - .collect(), - InstancePoses3D::all_components() - .iter() - .map(|descr| descr.component_name) - .collect(), - std::iter::once(PinholeProjection::name()).collect(), + Transform3D::all_components().iter().cloned().collect(), + InstancePoses3D::all_components().iter().cloned().collect(), + std::iter::once(archetypes::Pinhole::descriptor_image_from_camera()).collect(), ] } diff --git a/crates/viewer/re_view_spatial/src/max_image_dimension_subscriber.rs b/crates/viewer/re_view_spatial/src/max_image_dimension_subscriber.rs index 7aa903f6e2bb..384637fc49d1 100644 --- a/crates/viewer/re_view_spatial/src/max_image_dimension_subscriber.rs +++ b/crates/viewer/re_view_spatial/src/max_image_dimension_subscriber.rs @@ -93,27 +93,22 @@ impl PerStoreChunkSubscriber for MaxImageDimensionsStoreSubscriber { } // TODO(andreas): this should be part of the ImageFormat component's tag instead. - if components - .contains_component_name(archetypes::Image::descriptor_indicator().component_name) - { + if components.contains_component(&archetypes::Image::descriptor_indicator()) { self.max_dimensions .entry(event.diff.chunk.entity_path().clone()) .or_default() .image_types .insert(ImageTypes::IMAGE); } - if components.contains_component_name( - archetypes::SegmentationImage::descriptor_indicator().component_name, - ) { + if components.contains_component(&archetypes::SegmentationImage::descriptor_indicator()) + { self.max_dimensions .entry(event.diff.chunk.entity_path().clone()) .or_default() .image_types .insert(ImageTypes::SEGMENTATION_IMAGE); } - if components.contains_component_name( - archetypes::DepthImage::descriptor_indicator().component_name, - ) { + if components.contains_component(&archetypes::DepthImage::descriptor_indicator()) { self.max_dimensions .entry(event.diff.chunk.entity_path().clone()) .or_default() diff --git a/crates/viewer/re_view_spatial/src/mesh_cache.rs b/crates/viewer/re_view_spatial/src/mesh_cache.rs index 4fe8aea0b07d..8494b3ab3e01 100644 --- a/crates/viewer/re_view_spatial/src/mesh_cache.rs +++ b/crates/viewer/re_view_spatial/src/mesh_cache.rs @@ -7,7 +7,10 @@ use re_chunk_store::{ChunkStoreEvent, RowId}; use re_entity_db::VersionedInstancePathHash; use re_log_types::hash::Hash64; use re_renderer::RenderContext; -use re_types::{components::MediaType, Component as _}; +use re_types::{ + archetypes::{Asset3D, Mesh3D}, + components::MediaType, +}; use re_viewer_context::Cache; use crate::mesh_loader::{LoadedMesh, NativeAsset3D, NativeMesh3D}; @@ -93,12 +96,12 @@ impl Cache for MeshCache { let contains_asset_blob = event .chunk .components() - .contains_component_name(re_types::components::Blob::name()); + .contains_component(&Asset3D::descriptor_blob()); let contains_vertex_positions = event .chunk .components() - .contains_component_name(re_types::components::Position3D::name()); + .contains_component(&Mesh3D::descriptor_vertex_positions()); contains_asset_blob || contains_vertex_positions }; diff --git a/crates/viewer/re_view_time_series/src/line_visualizer_system.rs b/crates/viewer/re_view_time_series/src/line_visualizer_system.rs index 475b097f5e50..fa59797d47ec 100644 --- a/crates/viewer/re_view_time_series/src/line_visualizer_system.rs +++ b/crates/viewer/re_view_time_series/src/line_visualizer_system.rs @@ -44,8 +44,7 @@ impl VisualizerSystem for SeriesLineSystem { .queried .extend(archetypes::SeriesLines::all_components().iter().cloned()); - query_info.indicators = - [archetypes::SeriesLines::descriptor_indicator().component_name].into(); + query_info.indicators = [archetypes::SeriesLines::descriptor_indicator()].into(); query_info } diff --git a/crates/viewer/re_view_time_series/src/point_visualizer_system.rs b/crates/viewer/re_view_time_series/src/point_visualizer_system.rs index 3597e47b10b0..ce82b0d46d18 100644 --- a/crates/viewer/re_view_time_series/src/point_visualizer_system.rs +++ b/crates/viewer/re_view_time_series/src/point_visualizer_system.rs @@ -45,8 +45,7 @@ impl VisualizerSystem for SeriesPointSystem { .queried .extend(archetypes::SeriesPoints::all_components().iter().cloned()); - query_info.indicators = - [archetypes::SeriesPoints::descriptor_indicator().component_name].into(); + query_info.indicators = [archetypes::SeriesPoints::descriptor_indicator()].into(); query_info } diff --git a/crates/viewer/re_viewer_context/src/cache/image_decode_cache.rs b/crates/viewer/re_viewer_context/src/cache/image_decode_cache.rs index 96ebfacef894..a4218a4d4a62 100644 --- a/crates/viewer/re_viewer_context/src/cache/image_decode_cache.rs +++ b/crates/viewer/re_viewer_context/src/cache/image_decode_cache.rs @@ -4,9 +4,9 @@ use itertools::Either; use re_chunk_store::ChunkStoreEvent; use re_log_types::hash::Hash64; use re_types::{ + archetypes::EncodedImage, components::{ImageBuffer, MediaType}, image::{ImageKind, ImageLoadError}, - Component as _, }; use crate::{Cache, ImageInfo}; @@ -159,7 +159,7 @@ impl Cache for ImageDecodeCache { event .chunk .components() - .contains_component_name(re_types::components::Blob::name()) + .contains_component(&EncodedImage::descriptor_blob()) }; if is_deletion() && contains_image_blob() { diff --git a/crates/viewer/re_viewer_context/src/cache/image_stats_cache.rs b/crates/viewer/re_viewer_context/src/cache/image_stats_cache.rs index aa09b5499ee0..4b18fc2379b6 100644 --- a/crates/viewer/re_viewer_context/src/cache/image_stats_cache.rs +++ b/crates/viewer/re_viewer_context/src/cache/image_stats_cache.rs @@ -3,7 +3,7 @@ use itertools::Either; use re_chunk_store::ChunkStoreEvent; use re_log_types::hash::Hash64; -use re_types::Component as _; +use re_types::archetypes::EncodedImage; use crate::{Cache, ImageInfo, ImageStats}; @@ -39,7 +39,7 @@ impl Cache for ImageStatsCache { event .chunk .components() - .contains_component_name(re_types::components::Blob::name()) + .contains_component(&EncodedImage::descriptor_blob()) }; if is_deletion() && contains_image_blob() { diff --git a/crates/viewer/re_viewer_context/src/cache/tensor_stats_cache.rs b/crates/viewer/re_viewer_context/src/cache/tensor_stats_cache.rs index b49551b811d4..3808433932ea 100644 --- a/crates/viewer/re_viewer_context/src/cache/tensor_stats_cache.rs +++ b/crates/viewer/re_viewer_context/src/cache/tensor_stats_cache.rs @@ -3,7 +3,7 @@ use itertools::Either; use re_chunk_store::ChunkStoreEvent; use re_log_types::hash::Hash64; -use re_types::{datatypes::TensorData, Component as _}; +use re_types::{archetypes::Tensor, datatypes::TensorData}; use crate::{Cache, TensorStats}; @@ -41,7 +41,7 @@ impl Cache for TensorStatsCache { event .chunk .components() - .contains_component_name(re_types::components::TensorData::name()) + .contains_component(&Tensor::descriptor_data()) }; if is_deletion() && contains_tensor_data() { diff --git a/crates/viewer/re_viewer_context/src/cache/video_cache.rs b/crates/viewer/re_viewer_context/src/cache/video_cache.rs index ab5ae872a5b0..24ea96ba295c 100644 --- a/crates/viewer/re_viewer_context/src/cache/video_cache.rs +++ b/crates/viewer/re_viewer_context/src/cache/video_cache.rs @@ -9,7 +9,7 @@ use itertools::Either; use re_chunk_store::ChunkStoreEvent; use re_log_types::hash::Hash64; use re_renderer::{external::re_video::VideoLoadError, video::Video}; -use re_types::{components::MediaType, Component as _}; +use re_types::{archetypes::AssetVideo, components::MediaType}; use re_video::decode::DecodeSettings; use crate::Cache; @@ -117,7 +117,7 @@ impl Cache for VideoCache { event .chunk .components() - .contains_component_name(re_types::components::Blob::name()) + .contains_component(&AssetVideo::descriptor_blob()) }; if is_deletion() && contains_video_blob() { diff --git a/crates/viewer/re_viewer_context/src/view/view_context_system.rs b/crates/viewer/re_viewer_context/src/view/view_context_system.rs index 92b12ce6ee45..0ccb6bf55986 100644 --- a/crates/viewer/re_viewer_context/src/view/view_context_system.rs +++ b/crates/viewer/re_viewer_context/src/view/view_context_system.rs @@ -1,6 +1,6 @@ use ahash::HashMap; -use re_types::{ComponentNameSet, ViewClassIdentifier}; +use re_types::{ComponentDescriptorSet, ViewClassIdentifier}; use crate::{IdentifiedViewSystem, ViewQuery, ViewSystemExecutionError, ViewSystemIdentifier}; @@ -19,7 +19,7 @@ pub trait ViewContextSystem: Send + Sync { /// specific entities. /// It may still run once per frame as part of the global context if it has been registered to /// do so, see [`crate::ViewSystemRegistrator`]. - fn compatible_component_sets(&self) -> Vec; + fn compatible_component_sets(&self) -> Vec; /// Queries the chunk store and performs data conversions to make it ready for consumption by scene elements. fn execute(&mut self, ctx: &ViewContext<'_>, query: &ViewQuery<'_>); 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 5e08db29bf7a..4eb2665323f1 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 @@ -4,7 +4,7 @@ use nohash_hasher::IntMap; use re_chunk_store::{ChunkStoreDiffKind, ChunkStoreEvent, ChunkStoreSubscriber}; use re_log_types::{EntityPathHash, StoreId}; -use re_types::{ComponentDescriptor, ComponentNameSet}; +use re_types::{ComponentDescriptor, ComponentDescriptorSet}; use crate::{ IdentifiedViewSystem, IndicatedEntities, MaybeVisualizableEntities, ViewSystemIdentifier, @@ -30,7 +30,7 @@ pub struct VisualizerEntitySubscriber { visualizer: ViewSystemIdentifier, /// See [`crate::VisualizerQueryInfo::indicators`] - indicator_components: ComponentNameSet, + indicator_components: ComponentDescriptorSet, /// Assigns each required component an index. required_components_indices: IntMap, @@ -172,12 +172,12 @@ impl ChunkStoreSubscriber for VisualizerEntitySubscriber { // Update indicator component tracking: if self.indicator_components.is_empty() - || self.indicator_components.iter().any(|component_name| { + || self.indicator_components.iter().any(|component_descr| { event .diff .chunk .components() - .contains_component_name(*component_name) + .contains_component(component_descr) }) { store_mapping 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 558d56730c27..a23bb4f9242e 100644 --- a/crates/viewer/re_viewer_context/src/view/visualizer_system.rs +++ b/crates/viewer/re_viewer_context/src/view/visualizer_system.rs @@ -1,6 +1,6 @@ use std::collections::BTreeMap; -use re_types::{Archetype, ComponentDescriptor, ComponentDescriptorSet, ComponentNameSet}; +use re_types::{Archetype, ComponentDescriptor, ComponentDescriptorSet}; use crate::{ ComponentFallbackProvider, DataBasedVisualizabilityFilter, IdentifiedViewSystem, @@ -39,7 +39,7 @@ impl FromIterator for SortedComponentDescriptorSet { pub struct VisualizerQueryInfo { /// These are not required, but if _any_ of these are found, it is a strong indication that this /// system should be active (if also the `required_components` are found). - pub indicators: ComponentNameSet, + pub indicators: ComponentDescriptorSet, /// Returns the minimal set of components that the system _requires_ in order to be instantiated. /// @@ -56,7 +56,7 @@ pub struct VisualizerQueryInfo { impl VisualizerQueryInfo { pub fn from_archetype() -> Self { Self { - indicators: std::iter::once(A::indicator().descriptor.component_name).collect(), + indicators: std::iter::once(A::indicator().descriptor).collect(), required: A::required_components().iter().cloned().collect(), queried: A::all_components().iter().cloned().collect(), } @@ -64,7 +64,7 @@ impl VisualizerQueryInfo { pub fn empty() -> Self { Self { - indicators: ComponentNameSet::default(), + indicators: ComponentDescriptorSet::default(), required: ComponentDescriptorSet::default(), queried: SortedComponentDescriptorSet::default(), } diff --git a/examples/rust/extend_viewer_ui/src/main.rs b/examples/rust/extend_viewer_ui/src/main.rs index c0fbad801656..5a9fcaea27c5 100644 --- a/examples/rust/extend_viewer_ui/src/main.rs +++ b/examples/rust/extend_viewer_ui/src/main.rs @@ -140,9 +140,9 @@ fn entity_ui( .store() .all_components_on_timeline_sorted(&timeline, entity_path) { - for component in components { - ui.collapsing(component.to_string(), |ui| { - component_ui(ui, entity_db, timeline, entity_path, component); + for descr in components { + ui.collapsing(descr.to_string(), |ui| { + component_ui(ui, entity_db, timeline, entity_path, descr.component_name); }); } } From 8cfb181ca0a345bd5f01de7a36c5e9ff6b1c8f5c Mon Sep 17 00:00:00 2001 From: Andreas Reich Date: Thu, 8 May 2025 18:10:29 +0200 Subject: [PATCH 02/12] more todo references --- crates/viewer/re_view_dataframe/src/view_query/ui.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/crates/viewer/re_view_dataframe/src/view_query/ui.rs b/crates/viewer/re_view_dataframe/src/view_query/ui.rs index 6ef97702103e..7db7c15424da 100644 --- a/crates/viewer/re_view_dataframe/src/view_query/ui.rs +++ b/crates/viewer/re_view_dataframe/src/view_query/ui.rs @@ -256,6 +256,7 @@ impl Query { .filter(|c| { all_components .iter() + // TODO(#6889): Should we filter by the component descriptor instead? .any(|descr| &descr.component_name == c) }) .collect::() @@ -266,6 +267,7 @@ impl Query { .and_then(|component| { all_components .iter() + // TODO(#6889): Should we filter by the component descriptor instead? .any(|descr| descr.component_name == component) .then_some(component) }) From 662fe0b3dd1a850f3b009794594cb72c5a1708c9 Mon Sep 17 00:00:00 2001 From: Andreas Reich Date: Thu, 8 May 2025 18:37:29 +0200 Subject: [PATCH 03/12] Remove `MaybeTagged` accessor --- crates/store/re_query/src/latest_at.rs | 32 +--- crates/store/re_query/src/lib.rs | 34 ---- crates/store/re_query/src/range.rs | 52 +----- crates/viewer/re_view/src/results_ext.rs | 154 +++++------------- .../src/line_visualizer_system.rs | 17 +- .../src/point_visualizer_system.rs | 18 +- .../re_view_time_series/src/series_query.rs | 28 ++-- 7 files changed, 90 insertions(+), 245 deletions(-) diff --git a/crates/store/re_query/src/latest_at.rs b/crates/store/re_query/src/latest_at.rs index ee4680c26141..10c697eae990 100644 --- a/crates/store/re_query/src/latest_at.rs +++ b/crates/store/re_query/src/latest_at.rs @@ -16,7 +16,7 @@ use re_types_core::{ ComponentDescriptor, ComponentName, }; -use crate::{MaybeTagged, QueryCache, QueryCacheKey, QueryError}; +use crate::{QueryCache, QueryCacheKey, QueryError}; // --- Public API --- @@ -247,14 +247,6 @@ impl LatestAtResults { self.components.get(component_descr) } - // TODO(#6889): remove this please! - pub fn get_by_maybe(&self, component_descriptor: &MaybeTagged) -> Option<&UnitChunkShared> { - match component_descriptor { - MaybeTagged::Descriptor(component_descriptor) => self.get(component_descriptor), - MaybeTagged::JustName(component_name) => self.get_by_name(component_name), - } - } - // TODO(#6889): Going forward, we should avoid querying by name. /// Returns the [`UnitChunkShared`] for the specified [`Component`]. #[inline] @@ -262,28 +254,6 @@ impl LatestAtResults { let component_descr = self.find_component_descriptor(*component_name)?; self.components.get(component_descr) } - - /// Returns the [`UnitChunkShared`] for the specified [`Component`]. - /// - /// Returns an error if the component is not present. - // TODO(#6889): Remove this in favor or `get` - #[inline] - pub fn get_required_by_name( - &self, - component_name: &ComponentName, - ) -> crate::Result<&UnitChunkShared> { - let component_descr = - self.find_component_descriptor(*component_name) - .ok_or(QueryError::PrimaryNotFound(ComponentDescriptor::new( - *component_name, - )))?; - if let Some(component) = self.components.get(component_descr) { - Ok(component) - } else { - Err(QueryError::PrimaryNotFound(component_descr.clone())) - } - } - /// Returns the [`UnitChunkShared`] for the specified [`Component`]. /// /// Returns an error if the component is not present. diff --git a/crates/store/re_query/src/lib.rs b/crates/store/re_query/src/lib.rs index 615b107ad08b..53d33d375fad 100644 --- a/crates/store/re_query/src/lib.rs +++ b/crates/store/re_query/src/lib.rs @@ -72,37 +72,3 @@ pub enum QueryError { } pub type Result = std::result::Result; - -// --- - -use re_chunk::ComponentName; -use re_types_core::ComponentDescriptor; - -// TODO(#6889): This is a temporary object until we use tagged components everywhere or have explicit untagged queries (?). - -#[derive(Debug, Clone)] -pub enum MaybeTagged { - Descriptor(ComponentDescriptor), - JustName(ComponentName), -} - -impl<'a> From<&'a ComponentDescriptor> for MaybeTagged { - #[inline] - fn from(descr: &'a ComponentDescriptor) -> Self { - Self::Descriptor(descr.clone()) - } -} - -impl From for MaybeTagged { - #[inline] - fn from(descr: ComponentDescriptor) -> Self { - Self::Descriptor(descr) - } -} - -impl From for MaybeTagged { - #[inline] - fn from(name: ComponentName) -> Self { - Self::JustName(name) - } -} diff --git a/crates/store/re_query/src/range.rs b/crates/store/re_query/src/range.rs index dbb4e201d301..c622d7076104 100644 --- a/crates/store/re_query/src/range.rs +++ b/crates/store/re_query/src/range.rs @@ -8,9 +8,9 @@ use re_byte_size::SizeBytes; use re_chunk::{Chunk, ChunkId}; use re_chunk_store::{ChunkStore, RangeQuery, TimeInt}; use re_log_types::{EntityPath, ResolvedTimeRange}; -use re_types_core::{ComponentDescriptor, ComponentName}; +use re_types_core::ComponentDescriptor; -use crate::{MaybeTagged, QueryCache, QueryCacheKey, QueryError}; +use crate::{QueryCache, QueryCacheKey, QueryError}; // --- Public API --- @@ -93,16 +93,6 @@ impl RangeResults { } } - /// Returns the [`Chunk`]s for the specified `component_name`. - // TODO(#6889): Remove in favor of `get` - #[inline] - pub fn get_by_name(&self, component_name: &ComponentName) -> Option<&[Chunk]> { - let component_descr = self.find_component_descriptor(*component_name)?; - self.components - .get(component_descr) - .map(|chunks| chunks.as_slice()) - } - /// Returns the [`Chunk`]s for the specified `component_name`. #[inline] pub fn get(&self, component_descr: &ComponentDescriptor) -> Option<&[Chunk]> { @@ -111,32 +101,6 @@ impl RangeResults { .map(|chunks| chunks.as_slice()) } - /// Returns the [`Chunk`]s for the specified `component_name`. - /// - /// Returns an error if the component is not present. - // TODO(#6889): Remove in favor of `get_required` - #[inline] - pub fn get_required_by_name(&self, component_name: &ComponentName) -> crate::Result<&[Chunk]> { - let component_descr = - self.find_component_descriptor(*component_name) - .ok_or(QueryError::PrimaryNotFound(ComponentDescriptor::new( - *component_name, - )))?; - - self.components.get(component_descr).map_or_else( - || Err(QueryError::PrimaryNotFound(component_descr.clone())), - |chunks| Ok(chunks.as_slice()), - ) - } - - // TODO(#6889): remove this please! - pub fn get_by_maybe(&self, component_descriptor: &MaybeTagged) -> Option<&[Chunk]> { - match component_descriptor { - MaybeTagged::Descriptor(component_descriptor) => self.get(component_descriptor), - MaybeTagged::JustName(component_name) => self.get_by_name(component_name), - } - } - /// Returns the [`Chunk`]s for the specified component. /// /// Returns an error if the component is not present. @@ -147,18 +111,6 @@ impl RangeResults { |chunks| Ok(chunks.as_slice()), ) } - - // TODO(#6889): Workaround, we should instead always pass component descriptor to the respective methods. - fn find_component_descriptor( - &self, - component_name: ComponentName, - ) -> Option<&ComponentDescriptor> { - let component_descr = self - .components - .keys() - .find(|component_descr| component_descr.component_name == component_name)?; - Some(component_descr) - } } impl RangeResults { diff --git a/crates/viewer/re_view/src/results_ext.rs b/crates/viewer/re_view/src/results_ext.rs index 04fcfba00cbc..306ca9305467 100644 --- a/crates/viewer/re_view/src/results_ext.rs +++ b/crates/viewer/re_view/src/results_ext.rs @@ -4,7 +4,7 @@ use itertools::Itertools as _; use re_chunk_store::{Chunk, LatestAtQuery, RangeQuery, UnitChunkShared}; use re_log_types::hash::Hash64; -use re_query::{LatestAtResults, MaybeTagged, RangeResults}; +use re_query::{LatestAtResults, RangeResults}; use re_types::ComponentDescriptor; use re_types_core::ComponentName; use re_viewer_context::{DataResult, QueryContext, ViewContext}; @@ -235,8 +235,7 @@ pub trait RangeResultsExt { /// For results that are aware of the blueprint, overrides, store results, and defaults will be /// considered. // TODO(#6889): Take descriptor instead of name. - fn get_optional_chunks(&self, component_descriptor: impl Into) - -> Cow<'_, [Chunk]>; + fn get_optional_chunks(&self, component_descriptor: ComponentDescriptor) -> Cow<'_, [Chunk]>; /// Returns a zero-copy iterator over all the results for the given `(timeline, component)` pair. /// @@ -248,7 +247,6 @@ pub trait RangeResultsExt { timeline: TimelineName, component_descriptor: ComponentDescriptor, ) -> HybridResultsChunkIter<'_> { - let component_descriptor = MaybeTagged::Descriptor(component_descriptor); let chunks = self.get_optional_chunks(component_descriptor.clone()); HybridResultsChunkIter { chunks, @@ -273,17 +271,11 @@ impl RangeResultsExt for LatestAtResults { } #[inline] - fn get_optional_chunks( - &self, - component_descriptor: impl Into, - ) -> Cow<'_, [Chunk]> { - let component_descriptor = component_descriptor.into(); - self.get_by_maybe(&component_descriptor) - .cloned() - .map_or_else( - || Cow::Owned(vec![]), - |chunk| Cow::Owned(vec![Arc::unwrap_or_clone(chunk.into_chunk())]), - ) + fn get_optional_chunks(&self, component_descriptor: ComponentDescriptor) -> Cow<'_, [Chunk]> { + self.get(&component_descriptor).cloned().map_or_else( + || Cow::Owned(vec![]), + |chunk| Cow::Owned(vec![Arc::unwrap_or_clone(chunk.into_chunk())]), + ) } } @@ -302,12 +294,8 @@ impl RangeResultsExt for RangeResults { } #[inline] - fn get_optional_chunks( - &self, - component_descriptor: impl Into, - ) -> Cow<'_, [Chunk]> { - let component_descriptor = component_descriptor.into(); - Cow::Borrowed(self.get_by_maybe(&component_descriptor).unwrap_or_default()) + fn get_optional_chunks(&self, component_descriptor: ComponentDescriptor) -> Cow<'_, [Chunk]> { + Cow::Borrowed(self.get(&component_descriptor).unwrap_or_default()) } } @@ -334,15 +322,10 @@ impl RangeResultsExt for HybridRangeResults<'_> { } #[inline] - fn get_optional_chunks( - &self, - component_descriptor: impl Into, - ) -> Cow<'_, [Chunk]> { + fn get_optional_chunks(&self, component_descriptor: ComponentDescriptor) -> Cow<'_, [Chunk]> { re_tracing::profile_function!(); - let component_descriptor = component_descriptor.into(); - - if let Some(unit) = self.overrides.get_by_maybe(&component_descriptor) { + if let Some(unit) = self.overrides.get(&component_descriptor) { // Because this is an override we always re-index the data as static let chunk = Arc::unwrap_or_clone(unit.clone().into_chunk()) .into_static() @@ -353,15 +336,12 @@ impl RangeResultsExt for HybridRangeResults<'_> { // NOTE: Because this is a range query, we always need the defaults to come first, // since range queries don't have any state to bootstrap from. - let defaults = self - .defaults - .get_by_maybe(&component_descriptor) - .map(|unit| { - // Because this is an default from the blueprint we always re-index the data as static - Arc::unwrap_or_clone(unit.clone().into_chunk()) - .into_static() - .zeroed() - }); + let defaults = self.defaults.get(&component_descriptor).map(|unit| { + // Because this is an default from the blueprint we always re-index the data as static + Arc::unwrap_or_clone(unit.clone().into_chunk()) + .into_static() + .zeroed() + }); let chunks = self.results.get_optional_chunks(component_descriptor); @@ -398,13 +378,8 @@ impl RangeResultsExt for HybridLatestAtResults<'_> { } #[inline] - fn get_optional_chunks( - &self, - component_descriptor: impl Into, - ) -> Cow<'_, [Chunk]> { - let component_descriptor = component_descriptor.into(); - - if let Some(unit) = self.overrides.get_by_maybe(&component_descriptor) { + fn get_optional_chunks(&self, component_descriptor: ComponentDescriptor) -> Cow<'_, [Chunk]> { + if let Some(unit) = self.overrides.get(&component_descriptor) { // Because this is an override we always re-index the data as static let chunk = Arc::unwrap_or_clone(unit.clone().into_chunk()) .into_static() @@ -428,7 +403,7 @@ impl RangeResultsExt for HybridLatestAtResults<'_> { } // Otherwise try to use the default data. - let Some(unit) = self.defaults.get_by_maybe(&component_descriptor) else { + let Some(unit) = self.defaults.get(&component_descriptor) else { return Cow::Owned(Vec::new()); }; // Because this is an default from the blueprint we always re-index the data as static @@ -453,10 +428,7 @@ impl RangeResultsExt for HybridResults<'_> { } #[inline] - fn get_optional_chunks( - &self, - component_descriptor: impl Into, - ) -> Cow<'_, [Chunk]> { + fn get_optional_chunks(&self, component_descriptor: ComponentDescriptor) -> Cow<'_, [Chunk]> { match self { Self::LatestAt(_, results) => results.get_optional_chunks(component_descriptor), Self::Range(_, results) => results.get_optional_chunks(component_descriptor), @@ -473,7 +445,7 @@ use re_chunk_store::external::re_chunk; pub struct HybridResultsChunkIter<'a> { chunks: Cow<'a, [Chunk]>, timeline: TimelineName, - component_descriptor: MaybeTagged, + component_descriptor: ComponentDescriptor, } impl<'a> HybridResultsChunkIter<'a> { @@ -487,24 +459,12 @@ impl<'a> HybridResultsChunkIter<'a> { pub fn component_slow( &'a self, ) -> impl Iterator)> + 'a { - match &self.component_descriptor { - MaybeTagged::Descriptor(component_descriptor) => { - itertools::Either::Left(self.chunks.iter().flat_map(move |chunk| { - itertools::izip!( - chunk.iter_component_indices(&self.timeline, component_descriptor), - chunk.iter_component::(component_descriptor), - ) - })) - } - MaybeTagged::JustName(component_name) => { - itertools::Either::Right(self.chunks.iter().flat_map(move |chunk| { - itertools::izip!( - chunk.iter_component_indices_by_name(&self.timeline, component_name), - chunk.iter_component_by_name::(), - ) - })) - } - } + self.chunks.iter().flat_map(move |chunk| { + itertools::izip!( + chunk.iter_component_indices(&self.timeline, &self.component_descriptor), + chunk.iter_component::(&self.component_descriptor), + ) + }) } /// Iterate as indexed, sliced, deserialized component batches. @@ -513,25 +473,13 @@ impl<'a> HybridResultsChunkIter<'a> { pub fn slice( &'a self, ) -> impl Iterator)> + 'a { - match &self.component_descriptor { - MaybeTagged::Descriptor(component_descriptor) => { - itertools::Either::Left(self.chunks.iter().flat_map(move |chunk| { - itertools::izip!( - chunk.iter_component_indices(&self.timeline, component_descriptor), - // TODO(#6889): Use descriptor instead of name. - chunk.iter_slices::(component_descriptor.component_name), - ) - })) - } - MaybeTagged::JustName(component_name) => { - itertools::Either::Right(self.chunks.iter().flat_map(move |chunk| { - itertools::izip!( - chunk.iter_component_indices_by_name(&self.timeline, component_name), - chunk.iter_slices::(*component_name), - ) - })) - } - } + self.chunks.iter().flat_map(move |chunk| { + itertools::izip!( + chunk.iter_component_indices(&self.timeline, &self.component_descriptor), + // TODO(#6889): Use descriptor instead of name. + chunk.iter_slices::(self.component_descriptor.component_name), + ) + }) } /// Iterate as indexed, sliced, deserialized component batches for a specific struct field. @@ -541,27 +489,15 @@ impl<'a> HybridResultsChunkIter<'a> { &'a self, field_name: &'a str, ) -> impl Iterator)> + 'a { - match &self.component_descriptor { - MaybeTagged::Descriptor(component_descriptor) => { - itertools::Either::Left(self.chunks.iter().flat_map(move |chunk| { - itertools::izip!( - chunk.iter_component_indices(&self.timeline, component_descriptor), - chunk.iter_slices_from_struct_field::( - // TODO(#6889): Use descriptor instead of name.s - component_descriptor.component_name, - field_name, - ) - ) - })) - } - MaybeTagged::JustName(component_name) => { - itertools::Either::Right(self.chunks.iter().flat_map(move |chunk| { - itertools::izip!( - chunk.iter_component_indices_by_name(&self.timeline, component_name), - chunk.iter_slices_from_struct_field::(*component_name, field_name) - ) - })) - } - } + self.chunks.iter().flat_map(move |chunk| { + itertools::izip!( + chunk.iter_component_indices(&self.timeline, &self.component_descriptor), + chunk.iter_slices_from_struct_field::( + // TODO(#6889): Use descriptor instead of name.s + self.component_descriptor.component_name, + field_name, + ) + ) + }) } } diff --git a/crates/viewer/re_view_time_series/src/line_visualizer_system.rs b/crates/viewer/re_view_time_series/src/line_visualizer_system.rs index 475b097f5e50..3cc0a1c3eaee 100644 --- a/crates/viewer/re_view_time_series/src/line_visualizer_system.rs +++ b/crates/viewer/re_view_time_series/src/line_visualizer_system.rs @@ -3,9 +3,9 @@ use itertools::Itertools as _; use re_chunk_store::{RangeQuery, RowId}; use re_log_types::{EntityPath, TimeInt}; use re_types::{ - archetypes, + archetypes::{self}, components::{AggregationPolicy, Color, Name, SeriesVisible, StrokeWidth}, - Archetype as _, Component as _, + Archetype as _, }; use re_view::{range_with_blueprint_resolved_data, RangeResultsExt as _}; use re_viewer_context::external::re_entity_db::InstancePath; @@ -235,19 +235,20 @@ impl SeriesLineSystem { &results, &all_scalar_chunks, &mut points_per_series, + &archetypes::SeriesLines::descriptor_colors(), ); collect_radius_ui( &query, &results, &all_scalar_chunks, &mut points_per_series, - StrokeWidth::name(), + &archetypes::SeriesLines::descriptor_widths(), 0.5, ); // Now convert the `PlotPoints` into `Vec` let aggregator = results - .get_optional_chunks(AggregationPolicy::name()) + .get_optional_chunks(archetypes::SeriesLines::descriptor_aggregation_policy()) .iter() .find(|chunk| !chunk.is_empty()) .and_then(|chunk| chunk.component_mono::(0)?.ok()) @@ -310,7 +311,13 @@ impl SeriesLineSystem { num_series, archetypes::SeriesLines::descriptor_visible_series(), ); - let series_names = collect_series_name(self, &query_ctx, &results, num_series); + let series_names = collect_series_name( + self, + &query_ctx, + &results, + num_series, + &archetypes::SeriesLines::descriptor_names(), + ); debug_assert_eq!(points_per_series.len(), series_names.len()); for (instance, (points, label, visible)) in itertools::izip!( diff --git a/crates/viewer/re_view_time_series/src/point_visualizer_system.rs b/crates/viewer/re_view_time_series/src/point_visualizer_system.rs index 3597e47b10b0..72d050a3684e 100644 --- a/crates/viewer/re_view_time_series/src/point_visualizer_system.rs +++ b/crates/viewer/re_view_time_series/src/point_visualizer_system.rs @@ -243,13 +243,14 @@ impl SeriesPointSystem { &results, &all_scalar_chunks, &mut points_per_series, + &archetypes::SeriesPoints::descriptor_colors(), ); collect_radius_ui( &query, &results, &all_scalar_chunks, &mut points_per_series, - MarkerSize::name(), + &archetypes::SeriesPoints::descriptor_marker_sizes(), // `marker_size` is a radius, see NOTE above 1.0, ); @@ -259,7 +260,8 @@ impl SeriesPointSystem { re_tracing::profile_scope!("fill marker shapes"); { - let all_marker_shapes_chunks = results.get_optional_chunks(MarkerShape::name()); + let all_marker_shapes_chunks = + results.get_optional_chunks(archetypes::SeriesPoints::descriptor_markers()); if all_marker_shapes_chunks.len() == 1 && all_marker_shapes_chunks[0].is_static() @@ -267,7 +269,9 @@ impl SeriesPointSystem { re_tracing::profile_scope!("override/default fast path"); if let Some(marker_shapes) = all_marker_shapes_chunks[0] - .iter_component_by_name::() + .iter_component::( + &archetypes::SeriesPoints::descriptor_markers(), + ) .next() { for (points, marker_shape) in points_per_series @@ -344,7 +348,13 @@ impl SeriesPointSystem { num_series, archetypes::SeriesPoints::descriptor_visible_series(), ); - let series_names = collect_series_name(self, &query_ctx, &results, num_series); + let series_names = collect_series_name( + self, + &query_ctx, + &results, + num_series, + &archetypes::SeriesPoints::descriptor_names(), + ); debug_assert_eq!(points_per_series.len(), series_names.len()); for (instance, (points, label, visible)) in itertools::izip!( diff --git a/crates/viewer/re_view_time_series/src/series_query.rs b/crates/viewer/re_view_time_series/src/series_query.rs index 4b04c0ffdeee..34642456b8c8 100644 --- a/crates/viewer/re_view_time_series/src/series_query.rs +++ b/crates/viewer/re_view_time_series/src/series_query.rs @@ -5,9 +5,7 @@ use itertools::Itertools as _; use re_chunk_store::RangeQuery; use re_log_types::{EntityPath, TimeInt}; use re_types::external::arrow::datatypes::DataType as ArrowDatatype; -use re_types::{ - components, Component as _, ComponentDescriptor, ComponentName, Loggable as _, RowId, -}; +use re_types::{components, Component as _, ComponentDescriptor, Loggable as _, RowId}; use re_view::{clamped_or_nothing, ChunksWithDescriptor, HybridRangeResults, RangeResultsExt as _}; use re_viewer_context::{auto_color_egui, QueryContext, TypedComponentFallbackProvider}; @@ -123,6 +121,7 @@ pub fn collect_colors( results: &re_view::HybridRangeResults<'_>, all_scalar_chunks: &ChunksWithDescriptor<'_>, points_per_series: &mut smallvec::SmallVec<[Vec; 1]>, + color_descriptor: &ComponentDescriptor, ) { re_tracing::profile_function!(); @@ -134,12 +133,12 @@ pub fn collect_colors( let [a, b, g, r] = raw.to_le_bytes(); re_renderer::Color32::from_rgba_unmultiplied(r, g, b, a) } - let all_color_chunks = results.get_optional_chunks(components::Color::name()); + let all_color_chunks = results.get_optional_chunks(color_descriptor.clone()); if all_color_chunks.len() == 1 && all_color_chunks[0].is_static() { re_tracing::profile_scope!("override/default fast path"); if let Some(colors) = all_color_chunks[0] - .iter_slices::(components::Color::name()) + .iter_slices::(color_descriptor.component_name) .next() { for (points, color) in points_per_series @@ -214,14 +213,19 @@ pub fn collect_series_name( query_ctx: &QueryContext<'_>, results: &re_view::HybridRangeResults<'_>, num_series: usize, + name_descriptor: &ComponentDescriptor, ) -> Vec { re_tracing::profile_function!(); let mut series_names: Vec = results - .get_optional_chunks(components::Name::name()) + .get_optional_chunks(name_descriptor.clone()) .iter() .find(|chunk| !chunk.is_empty()) - .and_then(|chunk| chunk.iter_slices::(components::Name::name()).next()) + .and_then(|chunk| { + chunk + .iter_slices::(name_descriptor.component_name) + .next() + }) .map(|slice| slice.into_iter().map(|s| s.to_string()).collect()) .unwrap_or_default(); @@ -245,7 +249,7 @@ pub fn collect_radius_ui( results: &re_view::HybridRangeResults<'_>, all_scalar_chunks: &ChunksWithDescriptor<'_>, points_per_series: &mut smallvec::SmallVec<[Vec; 1]>, - radius_component_name: ComponentName, + radius_descriptor: &ComponentDescriptor, radius_multiplier: f32, ) { re_tracing::profile_function!(); @@ -253,13 +257,13 @@ pub fn collect_radius_ui( let num_series = points_per_series.len(); { - let all_radius_chunks = results.get_optional_chunks(radius_component_name); + let all_radius_chunks = results.get_optional_chunks(radius_descriptor.clone()); if all_radius_chunks.len() == 1 && all_radius_chunks[0].is_static() { re_tracing::profile_scope!("override/default fast path"); if let Some(radius) = all_radius_chunks[0] - .iter_slices::(radius_component_name) + .iter_slices::(radius_descriptor.component_name) .next() { for (points, radius) in points_per_series @@ -277,8 +281,8 @@ pub fn collect_radius_ui( let all_radii = all_radius_chunks.iter().flat_map(|chunk| { itertools::izip!( - chunk.iter_component_indices_by_name(query.timeline(), &radius_component_name), - chunk.iter_slices::(radius_component_name) + chunk.iter_component_indices(query.timeline(), radius_descriptor), + chunk.iter_slices::(radius_descriptor.component_name) ) }); From 6e19d779858a091100ea3e22573e716195a8efff Mon Sep 17 00:00:00 2001 From: Andreas Reich Date: Thu, 8 May 2025 19:18:57 +0200 Subject: [PATCH 04/12] lint --- crates/store/re_query/src/latest_at.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/crates/store/re_query/src/latest_at.rs b/crates/store/re_query/src/latest_at.rs index 10c697eae990..006ab9c6c696 100644 --- a/crates/store/re_query/src/latest_at.rs +++ b/crates/store/re_query/src/latest_at.rs @@ -254,6 +254,7 @@ impl LatestAtResults { let component_descr = self.find_component_descriptor(*component_name)?; self.components.get(component_descr) } + /// Returns the [`UnitChunkShared`] for the specified [`Component`]. /// /// Returns an error if the component is not present. From 73871d17286241fb33fd63df948404d0c5e61148 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Fri, 9 May 2025 10:10:20 +0200 Subject: [PATCH 05/12] Always use descriptors with `get_mono_with_fallback` --- crates/viewer/re_view/src/results_ext.rs | 25 ++++++++++++++----- .../src/visualizer_system.rs | 2 +- .../re_view_graph/src/visualizers/edges.rs | 4 ++- .../src/contexts/depth_offsets.rs | 2 +- .../src/contexts/transform_tree_context.rs | 4 ++- .../src/visualizers/transform3d_arrows.rs | 8 ++++-- .../src/visualizer_system.rs | 2 +- 7 files changed, 34 insertions(+), 13 deletions(-) diff --git a/crates/viewer/re_view/src/results_ext.rs b/crates/viewer/re_view/src/results_ext.rs index 306ca9305467..411baf95d440 100644 --- a/crates/viewer/re_view/src/results_ext.rs +++ b/crates/viewer/re_view/src/results_ext.rs @@ -41,7 +41,11 @@ pub struct HybridRangeResults<'a> { impl HybridLatestAtResults<'_> { /// Returns the [`UnitChunkShared`] for the specified [`re_types_core::Component`]. #[inline] - pub fn get(&self, component_name: impl Into) -> Option<&UnitChunkShared> { + // TODO(#6889): This method seems to be unused? + pub fn get_by_name( + &self, + component_name: impl Into, + ) -> Option<&UnitChunkShared> { let component_name = component_name.into(); self.overrides .get_by_name(&component_name) @@ -49,7 +53,7 @@ impl HybridLatestAtResults<'_> { .or_else(|| self.defaults.get_by_name(&component_name)) } - pub fn fallback_raw(&self, component_name: ComponentName) -> arrow::array::ArrayRef { + pub fn fallback_raw(&self, component_descr: ComponentDescriptor) -> arrow::array::ArrayRef { let query_context = QueryContext { viewer_ctx: self.ctx.viewer_ctx, target_entity_path: &self.data_result.entity_path, @@ -62,7 +66,8 @@ impl HybridLatestAtResults<'_> { self.data_result.best_fallback_for( &query_context, &self.ctx.visualizer_collection, - component_name, + // TODO(#6889): Pass full descriptor here. + component_descr.component_name, ) } @@ -80,8 +85,13 @@ impl HybridLatestAtResults<'_> { /// Utility for retrieving the first instance of a component. #[inline] - pub fn get_mono_with_fallback(&self) -> C { - self.get_instance_with_fallback(0) + pub fn get_mono_with_fallback( + &self, + component_descr: ComponentDescriptor, + ) -> C { + debug_assert_eq!(component_descr.component_name, C::name()); + + self.get_instance_with_fallback(0, component_descr) } /// Utility for retrieving a single instance of a component, not checking for defaults. @@ -112,11 +122,14 @@ impl HybridLatestAtResults<'_> { pub fn get_instance_with_fallback( &self, index: usize, + component_descr: ComponentDescriptor, ) -> C { + debug_assert_eq!(component_descr.component_name, C::name()); + self.get_instance(index) .or_else(|| { // No override, no store, no default -> try fallback instead - let raw_fallback = self.fallback_raw(C::name()); + let raw_fallback = self.fallback_raw(component_descr); C::from_arrow(raw_fallback.as_ref()) .ok() .and_then(|r| r.first().cloned()) 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 c938393d027a..da368e988322 100644 --- a/crates/viewer/re_view_bar_chart/src/visualizer_system.rs +++ b/crates/viewer/re_view_bar_chart/src/visualizer_system.rs @@ -64,7 +64,7 @@ impl VisualizerSystem for BarChartVisualizerSystem { }; if tensor.is_vector() { - let color = results.get_mono_with_fallback(); + let color = results.get_mono_with_fallback(BarChart::descriptor_color()); self.charts .insert(data_result.entity_path.clone(), (tensor.0.clone(), color)); } diff --git a/crates/viewer/re_view_graph/src/visualizers/edges.rs b/crates/viewer/re_view_graph/src/visualizers/edges.rs index 47502d4e8c31..8b746c19c4cf 100644 --- a/crates/viewer/re_view_graph/src/visualizers/edges.rs +++ b/crates/viewer/re_view_graph/src/visualizers/edges.rs @@ -70,7 +70,9 @@ impl VisualizerSystem for EdgesVisualizer { let all_edges = results.iter_as(query.timeline, GraphEdges::descriptor_edges()); // TODO(#6889): This still uses an untagged query. - let graph_type = results.get_mono_with_fallback::(); + let graph_type = results.get_mono_with_fallback::( + GraphEdges::descriptor_graph_type(), + ); let sources = all_edges .slice_from_struct_field::(SOURCE) diff --git a/crates/viewer/re_view_spatial/src/contexts/depth_offsets.rs b/crates/viewer/re_view_spatial/src/contexts/depth_offsets.rs index 32be813fa548..9fd00d37fffe 100644 --- a/crates/viewer/re_view_spatial/src/contexts/depth_offsets.rs +++ b/crates/viewer/re_view_spatial/src/contexts/depth_offsets.rs @@ -94,7 +94,7 @@ fn collect_draw_order_per_visualizer( [draw_order_descriptor], query_shadowed_components, ) - .get_mono_with_fallback::(); + .get_mono_with_fallback::(draw_order_descriptor.clone()); entities_per_draw_order .entry(draw_order) diff --git a/crates/viewer/re_view_spatial/src/contexts/transform_tree_context.rs b/crates/viewer/re_view_spatial/src/contexts/transform_tree_context.rs index debcd4bb7e3b..5c1a79c2eea2 100644 --- a/crates/viewer/re_view_spatial/src/contexts/transform_tree_context.rs +++ b/crates/viewer/re_view_spatial/src/contexts/transform_tree_context.rs @@ -374,7 +374,9 @@ fn lookup_image_plane_distance( query, &archetypes::Pinhole::descriptor_image_plane_distance(), ) - .get_mono_with_fallback::() + .get_mono_with_fallback::( + archetypes::Pinhole::descriptor_image_plane_distance(), + ) }) .unwrap_or_default() .into() 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 f53f2c91408a..7be71f899ed8 100644 --- a/crates/viewer/re_view_spatial/src/visualizers/transform3d_arrows.rs +++ b/crates/viewer/re_view_spatial/src/visualizers/transform3d_arrows.rs @@ -128,7 +128,9 @@ impl VisualizerSystem for Transform3DArrowsVisualizer { false, ); - let axis_length: f32 = results.get_mono_with_fallback::().into(); + let axis_length: f32 = results + .get_mono_with_fallback::(Transform3D::descriptor_axis_length()) + .into(); if axis_length == 0.0 { // Don't draw axis and don't add to the bounding box! @@ -236,7 +238,9 @@ impl TypedComponentFallbackProvider for Transform3DArrowsVisualizer let results = data_result .latest_at_with_blueprint_resolved_data::(view_ctx, ctx.query); - Some(results.get_mono_with_fallback::()) + Some(results.get_mono_with_fallback::( + Pinhole::descriptor_image_plane_distance(), + )) } else { None } diff --git a/crates/viewer/re_view_text_document/src/visualizer_system.rs b/crates/viewer/re_view_text_document/src/visualizer_system.rs index 5aeeba10a3b1..d9fbc1663fc9 100644 --- a/crates/viewer/re_view_text_document/src/visualizer_system.rs +++ b/crates/viewer/re_view_text_document/src/visualizer_system.rs @@ -51,7 +51,7 @@ impl VisualizerSystem for TextDocumentSystem { }; self.text_entries.push(TextDocumentEntry { body: text.clone(), - media_type: results.get_mono_with_fallback(), + media_type: results.get_mono_with_fallback(TextDocument::descriptor_media_type()), }); } From ca6af1d33863ef6e70ea849d3851e2396039efbc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Fri, 9 May 2025 11:09:34 +0200 Subject: [PATCH 06/12] Ripple down further --- crates/store/re_query/src/latest_at.rs | 22 +++++--- crates/viewer/re_view/src/results_ext.rs | 55 +++++++++++++------ .../src/visualizer_system.rs | 4 +- .../re_view_graph/src/visualizers/nodes.rs | 2 +- .../src/visualizers/cameras.rs | 16 ++++-- .../re_view_spatial/src/visualizers/videos.rs | 5 +- .../src/visualizer_system.rs | 4 +- .../re_viewport_blueprint/src/container.rs | 10 ++-- 8 files changed, 78 insertions(+), 40 deletions(-) diff --git a/crates/store/re_query/src/latest_at.rs b/crates/store/re_query/src/latest_at.rs index 006ab9c6c696..ab11c8af0132 100644 --- a/crates/store/re_query/src/latest_at.rs +++ b/crates/store/re_query/src/latest_at.rs @@ -436,14 +436,13 @@ impl LatestAtResults { &self, log_level: re_log::Level, instance_index: usize, + component_descr: ComponentDescriptor, ) -> Option { - let component_descr = self.find_component_descriptor(C::name())?; - - self.components.get(component_descr).and_then(|unit| { + self.components.get(&component_descr).and_then(|unit| { self.ok_or_log_err( log_level, - component_descr, - unit.component_instance(component_descr, instance_index)?, + &component_descr, + unit.component_instance(&component_descr, instance_index)?, ) }) } @@ -452,8 +451,17 @@ impl LatestAtResults { /// /// Logs an error if the data cannot be deserialized, or if the instance index is out of bounds. #[inline] - pub fn component_instance(&self, instance_index: usize) -> Option { - self.component_instance_with_log_level(re_log::Level::Error, instance_index) + pub fn component_instance( + &self, + instance_index: usize, + component_descr: ComponentDescriptor, + ) -> Option { + debug_assert_eq!(component_descr.component_name, C::name()); + self.component_instance_with_log_level( + re_log::Level::Error, + instance_index, + component_descr, + ) } /// Returns the deserialized data for the specified component at the given instance index. diff --git a/crates/viewer/re_view/src/results_ext.rs b/crates/viewer/re_view/src/results_ext.rs index 411baf95d440..fa0564ebbb81 100644 --- a/crates/viewer/re_view/src/results_ext.rs +++ b/crates/viewer/re_view/src/results_ext.rs @@ -53,7 +53,8 @@ impl HybridLatestAtResults<'_> { .or_else(|| self.defaults.get_by_name(&component_name)) } - pub fn fallback_raw(&self, component_descr: ComponentDescriptor) -> arrow::array::ArrayRef { + // TODO(#6889): Right now, fallbacks are on a per-component basis, so it's fine to pass the component name here. + pub fn fallback_raw(&self, component_name: ComponentName) -> arrow::array::ArrayRef { let query_context = QueryContext { viewer_ctx: self.ctx.viewer_ctx, target_entity_path: &self.data_result.entity_path, @@ -66,21 +67,26 @@ impl HybridLatestAtResults<'_> { self.data_result.best_fallback_for( &query_context, &self.ctx.visualizer_collection, - // TODO(#6889): Pass full descriptor here. - component_descr.component_name, + component_name, ) } /// Utility for retrieving the first instance of a component, ignoring defaults. #[inline] - pub fn get_required_mono(&self) -> Option { - self.get_required_instance(0) + pub fn get_required_mono( + &self, + component_descr: ComponentDescriptor, + ) -> Option { + self.get_required_instance(0, component_descr) } /// Utility for retrieving the first instance of a component. #[inline] - pub fn get_mono(&self) -> Option { - self.get_instance(0) + pub fn get_mono( + &self, + component_descr: ComponentDescriptor, + ) -> Option { + self.get_instance(0, component_descr) } /// Utility for retrieving the first instance of a component. @@ -98,21 +104,35 @@ impl HybridLatestAtResults<'_> { /// /// If overrides or defaults are present, they will only be used respectively if they have a component at the specified index. #[inline] - pub fn get_required_instance(&self, index: usize) -> Option { - self.overrides.component_instance::(index).or_else(|| + pub fn get_required_instance( + &self, + index: usize, + component_descr: ComponentDescriptor, + ) -> Option { + self.overrides + .component_instance::(index, component_descr.clone()) + .or_else(|| // No override -> try recording store instead - self.results.component_instance::(index)) + self.results.component_instance::(index, component_descr)) } /// Utility for retrieving a single instance of a component. /// /// If overrides or defaults are present, they will only be used respectively if they have a component at the specified index. #[inline] - pub fn get_instance(&self, index: usize) -> Option { - self.get_required_instance(index).or_else(|| { - // No override & no store -> try default instead - self.defaults.component_instance::(index) - }) + pub fn get_instance( + &self, + index: usize, + component_descr: ComponentDescriptor, + ) -> Option { + debug_assert_eq!(component_descr.component_name, C::name()); + + self.get_required_instance(index, component_descr.clone()) + .or_else(|| { + // No override & no store -> try default instead + self.defaults + .component_instance::(index, component_descr) + }) } /// Utility for retrieving a single instance of a component. @@ -126,10 +146,11 @@ impl HybridLatestAtResults<'_> { ) -> C { debug_assert_eq!(component_descr.component_name, C::name()); - self.get_instance(index) + let component_name = component_descr.component_name; + self.get_instance(index, component_descr) .or_else(|| { // No override, no store, no default -> try fallback instead - let raw_fallback = self.fallback_raw(component_descr); + let raw_fallback = self.fallback_raw(component_name); C::from_arrow(raw_fallback.as_ref()) .ok() .and_then(|r| r.first().cloned()) 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 da368e988322..e3f7e6f1a6b5 100644 --- a/crates/viewer/re_view_bar_chart/src/visualizer_system.rs +++ b/crates/viewer/re_view_bar_chart/src/visualizer_system.rs @@ -59,7 +59,9 @@ impl VisualizerSystem for BarChartVisualizerSystem { let results = data_result .latest_at_with_blueprint_resolved_data::(ctx, &timeline_query); - let Some(tensor) = results.get_required_mono::() else { + let Some(tensor) = + results.get_required_mono::(BarChart::descriptor_values()) + else { continue; }; diff --git a/crates/viewer/re_view_graph/src/visualizers/nodes.rs b/crates/viewer/re_view_graph/src/visualizers/nodes.rs index 47c4afecc841..c374ba3c95d0 100644 --- a/crates/viewer/re_view_graph/src/visualizers/nodes.rs +++ b/crates/viewer/re_view_graph/src/visualizers/nodes.rs @@ -85,7 +85,7 @@ impl VisualizerSystem for NodeVisualizer { let all_labels = results.iter_as(query.timeline, GraphNodes::descriptor_labels()); let all_radii = results.iter_as(query.timeline, GraphNodes::descriptor_radii()); let show_label = results - .get_mono::() + .get_mono::(GraphNodes::descriptor_labels()) .is_none_or(bool::from); let data = range_zip_1x4( diff --git a/crates/viewer/re_view_spatial/src/visualizers/cameras.rs b/crates/viewer/re_view_spatial/src/visualizers/cameras.rs index cc1c2c2844b1..509a9732d5b5 100644 --- a/crates/viewer/re_view_spatial/src/visualizers/cameras.rs +++ b/crates/viewer/re_view_spatial/src/visualizers/cameras.rs @@ -3,7 +3,7 @@ use re_log_types::Instance; use re_renderer::renderer::LineStripFlags; use re_types::{ archetypes::Pinhole, - components::{self}, + components::{self, PinholeProjection}, Archetype as _, }; use re_view::latest_at_with_blueprint_resolved_data; @@ -249,20 +249,24 @@ impl VisualizerSystem for CamerasVisualizer { query_shadowed_components, ); - let Some(pinhole_projection) = - query_results.get_required_mono::() + let Some(pinhole_projection) = query_results + .get_required_mono::( + Pinhole::descriptor_image_from_camera(), + ) else { continue; }; let resolution = query_results - .get_mono::() + .get_mono::(Pinhole::descriptor_resolution()) .unwrap_or_else(|| self.fallback_for(&query_ctx)); let camera_xyz = query_results - .get_mono::() + .get_mono::(Pinhole::descriptor_camera_xyz()) .unwrap_or_else(|| self.fallback_for(&query_ctx)); let image_plane_distance = query_results - .get_mono::() + .get_mono::( + Pinhole::descriptor_image_plane_distance(), + ) .unwrap_or_else(|| self.fallback_for(&query_ctx)); let component_data = CameraComponentDataWithFallbacks { diff --git a/crates/viewer/re_view_spatial/src/visualizers/videos.rs b/crates/viewer/re_view_spatial/src/visualizers/videos.rs index 413005d56c16..ca3f1f70ce12 100644 --- a/crates/viewer/re_view_spatial/src/visualizers/videos.rs +++ b/crates/viewer/re_view_spatial/src/visualizers/videos.rs @@ -394,8 +394,9 @@ fn latest_at_query_video_from_datastore( ); let blob_row_id = results.component_row_id(&AssetVideo::descriptor_blob())?; - let blob = results.component_instance::(0)?; - let media_type = results.component_instance::(0); + let blob = results.component_instance::(0, AssetVideo::descriptor_blob())?; + let media_type = + results.component_instance::(0, AssetVideo::descriptor_media_type()); let video = ctx.store_context.caches.entry(|c: &mut VideoCache| { let debug_name = entity_path.to_string(); diff --git a/crates/viewer/re_view_text_document/src/visualizer_system.rs b/crates/viewer/re_view_text_document/src/visualizer_system.rs index d9fbc1663fc9..626615254780 100644 --- a/crates/viewer/re_view_text_document/src/visualizer_system.rs +++ b/crates/viewer/re_view_text_document/src/visualizer_system.rs @@ -46,7 +46,9 @@ impl VisualizerSystem for TextDocumentSystem { let results = data_result .latest_at_with_blueprint_resolved_data::(ctx, &timeline_query); - let Some(text) = results.get_required_mono::() else { + let Some(text) = + results.get_required_mono::(TextDocument::descriptor_text()) + else { continue; }; self.text_entries.push(TextDocumentEntry { diff --git a/crates/viewer/re_viewport_blueprint/src/container.rs b/crates/viewer/re_viewport_blueprint/src/container.rs index 2d78a109fba1..5771a4440ce0 100644 --- a/crates/viewer/re_viewport_blueprint/src/container.rs +++ b/crates/viewer/re_viewport_blueprint/src/container.rs @@ -79,15 +79,15 @@ impl ContainerBlueprint { // This is a required component. Note that when loading containers we crawl the subtree and so // cleared empty container paths may exist transiently. The fact that they have an empty container_kind // is the marker that the have been cleared and not an error. - let container_kind = results.component_instance::(0)?; + let container_kind = results.component_mono::()?; - let display_name = results.component_instance::(0); + let display_name = results.component_mono::(); let contents = results.component_batch::(); let col_shares = results.component_batch::(); let row_shares = results.component_batch::(); - let active_tab = results.component_instance::(0); - let visible = results.component_instance::(0); - let grid_columns = results.component_instance::(0); + let active_tab = results.component_mono::(); + let visible = results.component_mono::(); + let grid_columns = results.component_mono::(); // ---- From d803230aec8d36c1301f32daa0f7bd36b75b82bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Fri, 9 May 2025 12:47:06 +0200 Subject: [PATCH 07/12] clean up reference --- crates/store/re_query/src/latest_at.rs | 10 +++++----- crates/viewer/re_view/src/results_ext.rs | 16 ++++++++-------- .../re_view_bar_chart/src/visualizer_system.rs | 4 ++-- .../re_view_graph/src/visualizers/edges.rs | 2 +- .../re_view_graph/src/visualizers/nodes.rs | 2 +- .../src/contexts/depth_offsets.rs | 2 +- .../src/contexts/transform_tree_context.rs | 2 +- .../re_view_spatial/src/visualizers/cameras.rs | 10 +++++----- .../src/visualizers/transform3d_arrows.rs | 4 ++-- .../re_view_spatial/src/visualizers/videos.rs | 4 ++-- .../src/visualizer_system.rs | 4 ++-- 11 files changed, 30 insertions(+), 30 deletions(-) diff --git a/crates/store/re_query/src/latest_at.rs b/crates/store/re_query/src/latest_at.rs index ab11c8af0132..b0c777b67f61 100644 --- a/crates/store/re_query/src/latest_at.rs +++ b/crates/store/re_query/src/latest_at.rs @@ -436,13 +436,13 @@ impl LatestAtResults { &self, log_level: re_log::Level, instance_index: usize, - component_descr: ComponentDescriptor, + component_descr: &ComponentDescriptor, ) -> Option { - self.components.get(&component_descr).and_then(|unit| { + self.components.get(component_descr).and_then(|unit| { self.ok_or_log_err( log_level, - &component_descr, - unit.component_instance(&component_descr, instance_index)?, + component_descr, + unit.component_instance(component_descr, instance_index)?, ) }) } @@ -454,7 +454,7 @@ impl LatestAtResults { pub fn component_instance( &self, instance_index: usize, - component_descr: ComponentDescriptor, + component_descr: &ComponentDescriptor, ) -> Option { debug_assert_eq!(component_descr.component_name, C::name()); self.component_instance_with_log_level( diff --git a/crates/viewer/re_view/src/results_ext.rs b/crates/viewer/re_view/src/results_ext.rs index fa0564ebbb81..a8a6415fe6a0 100644 --- a/crates/viewer/re_view/src/results_ext.rs +++ b/crates/viewer/re_view/src/results_ext.rs @@ -75,7 +75,7 @@ impl HybridLatestAtResults<'_> { #[inline] pub fn get_required_mono( &self, - component_descr: ComponentDescriptor, + component_descr: &ComponentDescriptor, ) -> Option { self.get_required_instance(0, component_descr) } @@ -84,7 +84,7 @@ impl HybridLatestAtResults<'_> { #[inline] pub fn get_mono( &self, - component_descr: ComponentDescriptor, + component_descr: &ComponentDescriptor, ) -> Option { self.get_instance(0, component_descr) } @@ -93,7 +93,7 @@ impl HybridLatestAtResults<'_> { #[inline] pub fn get_mono_with_fallback( &self, - component_descr: ComponentDescriptor, + component_descr: &ComponentDescriptor, ) -> C { debug_assert_eq!(component_descr.component_name, C::name()); @@ -107,10 +107,10 @@ impl HybridLatestAtResults<'_> { pub fn get_required_instance( &self, index: usize, - component_descr: ComponentDescriptor, + component_descr: &ComponentDescriptor, ) -> Option { self.overrides - .component_instance::(index, component_descr.clone()) + .component_instance::(index, component_descr) .or_else(|| // No override -> try recording store instead self.results.component_instance::(index, component_descr)) @@ -123,11 +123,11 @@ impl HybridLatestAtResults<'_> { pub fn get_instance( &self, index: usize, - component_descr: ComponentDescriptor, + component_descr: &ComponentDescriptor, ) -> Option { debug_assert_eq!(component_descr.component_name, C::name()); - self.get_required_instance(index, component_descr.clone()) + self.get_required_instance(index, component_descr) .or_else(|| { // No override & no store -> try default instead self.defaults @@ -142,7 +142,7 @@ impl HybridLatestAtResults<'_> { pub fn get_instance_with_fallback( &self, index: usize, - component_descr: ComponentDescriptor, + component_descr: &ComponentDescriptor, ) -> C { debug_assert_eq!(component_descr.component_name, C::name()); 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 e3f7e6f1a6b5..a6f78b4df3b9 100644 --- a/crates/viewer/re_view_bar_chart/src/visualizer_system.rs +++ b/crates/viewer/re_view_bar_chart/src/visualizer_system.rs @@ -60,13 +60,13 @@ impl VisualizerSystem for BarChartVisualizerSystem { .latest_at_with_blueprint_resolved_data::(ctx, &timeline_query); let Some(tensor) = - results.get_required_mono::(BarChart::descriptor_values()) + results.get_required_mono::(&BarChart::descriptor_values()) else { continue; }; if tensor.is_vector() { - let color = results.get_mono_with_fallback(BarChart::descriptor_color()); + let color = results.get_mono_with_fallback(&BarChart::descriptor_color()); self.charts .insert(data_result.entity_path.clone(), (tensor.0.clone(), color)); } diff --git a/crates/viewer/re_view_graph/src/visualizers/edges.rs b/crates/viewer/re_view_graph/src/visualizers/edges.rs index 8b746c19c4cf..90473b30cb75 100644 --- a/crates/viewer/re_view_graph/src/visualizers/edges.rs +++ b/crates/viewer/re_view_graph/src/visualizers/edges.rs @@ -71,7 +71,7 @@ impl VisualizerSystem for EdgesVisualizer { let all_edges = results.iter_as(query.timeline, GraphEdges::descriptor_edges()); // TODO(#6889): This still uses an untagged query. let graph_type = results.get_mono_with_fallback::( - GraphEdges::descriptor_graph_type(), + &GraphEdges::descriptor_graph_type(), ); let sources = all_edges diff --git a/crates/viewer/re_view_graph/src/visualizers/nodes.rs b/crates/viewer/re_view_graph/src/visualizers/nodes.rs index c374ba3c95d0..7d0755fcd3f8 100644 --- a/crates/viewer/re_view_graph/src/visualizers/nodes.rs +++ b/crates/viewer/re_view_graph/src/visualizers/nodes.rs @@ -85,7 +85,7 @@ impl VisualizerSystem for NodeVisualizer { let all_labels = results.iter_as(query.timeline, GraphNodes::descriptor_labels()); let all_radii = results.iter_as(query.timeline, GraphNodes::descriptor_radii()); let show_label = results - .get_mono::(GraphNodes::descriptor_labels()) + .get_mono::(&GraphNodes::descriptor_labels()) .is_none_or(bool::from); let data = range_zip_1x4( diff --git a/crates/viewer/re_view_spatial/src/contexts/depth_offsets.rs b/crates/viewer/re_view_spatial/src/contexts/depth_offsets.rs index 9fd00d37fffe..791a0dede20c 100644 --- a/crates/viewer/re_view_spatial/src/contexts/depth_offsets.rs +++ b/crates/viewer/re_view_spatial/src/contexts/depth_offsets.rs @@ -94,7 +94,7 @@ fn collect_draw_order_per_visualizer( [draw_order_descriptor], query_shadowed_components, ) - .get_mono_with_fallback::(draw_order_descriptor.clone()); + .get_mono_with_fallback::(draw_order_descriptor); entities_per_draw_order .entry(draw_order) diff --git a/crates/viewer/re_view_spatial/src/contexts/transform_tree_context.rs b/crates/viewer/re_view_spatial/src/contexts/transform_tree_context.rs index 5c1a79c2eea2..96fa3b6dcded 100644 --- a/crates/viewer/re_view_spatial/src/contexts/transform_tree_context.rs +++ b/crates/viewer/re_view_spatial/src/contexts/transform_tree_context.rs @@ -375,7 +375,7 @@ fn lookup_image_plane_distance( &archetypes::Pinhole::descriptor_image_plane_distance(), ) .get_mono_with_fallback::( - archetypes::Pinhole::descriptor_image_plane_distance(), + &archetypes::Pinhole::descriptor_image_plane_distance(), ) }) .unwrap_or_default() diff --git a/crates/viewer/re_view_spatial/src/visualizers/cameras.rs b/crates/viewer/re_view_spatial/src/visualizers/cameras.rs index 509a9732d5b5..139f45929a77 100644 --- a/crates/viewer/re_view_spatial/src/visualizers/cameras.rs +++ b/crates/viewer/re_view_spatial/src/visualizers/cameras.rs @@ -3,7 +3,7 @@ use re_log_types::Instance; use re_renderer::renderer::LineStripFlags; use re_types::{ archetypes::Pinhole, - components::{self, PinholeProjection}, + components::{self}, Archetype as _, }; use re_view::latest_at_with_blueprint_resolved_data; @@ -251,21 +251,21 @@ impl VisualizerSystem for CamerasVisualizer { let Some(pinhole_projection) = query_results .get_required_mono::( - Pinhole::descriptor_image_from_camera(), + &Pinhole::descriptor_image_from_camera(), ) else { continue; }; let resolution = query_results - .get_mono::(Pinhole::descriptor_resolution()) + .get_mono::(&Pinhole::descriptor_resolution()) .unwrap_or_else(|| self.fallback_for(&query_ctx)); let camera_xyz = query_results - .get_mono::(Pinhole::descriptor_camera_xyz()) + .get_mono::(&Pinhole::descriptor_camera_xyz()) .unwrap_or_else(|| self.fallback_for(&query_ctx)); let image_plane_distance = query_results .get_mono::( - Pinhole::descriptor_image_plane_distance(), + &Pinhole::descriptor_image_plane_distance(), ) .unwrap_or_else(|| self.fallback_for(&query_ctx)); 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 7be71f899ed8..55756cac6088 100644 --- a/crates/viewer/re_view_spatial/src/visualizers/transform3d_arrows.rs +++ b/crates/viewer/re_view_spatial/src/visualizers/transform3d_arrows.rs @@ -129,7 +129,7 @@ impl VisualizerSystem for Transform3DArrowsVisualizer { ); let axis_length: f32 = results - .get_mono_with_fallback::(Transform3D::descriptor_axis_length()) + .get_mono_with_fallback::(&Transform3D::descriptor_axis_length()) .into(); if axis_length == 0.0 { @@ -239,7 +239,7 @@ impl TypedComponentFallbackProvider for Transform3DArrowsVisualizer .latest_at_with_blueprint_resolved_data::(view_ctx, ctx.query); Some(results.get_mono_with_fallback::( - Pinhole::descriptor_image_plane_distance(), + &Pinhole::descriptor_image_plane_distance(), )) } else { None diff --git a/crates/viewer/re_view_spatial/src/visualizers/videos.rs b/crates/viewer/re_view_spatial/src/visualizers/videos.rs index ca3f1f70ce12..0c66a6130ed1 100644 --- a/crates/viewer/re_view_spatial/src/visualizers/videos.rs +++ b/crates/viewer/re_view_spatial/src/visualizers/videos.rs @@ -394,9 +394,9 @@ fn latest_at_query_video_from_datastore( ); let blob_row_id = results.component_row_id(&AssetVideo::descriptor_blob())?; - let blob = results.component_instance::(0, AssetVideo::descriptor_blob())?; + let blob = results.component_instance::(0, &AssetVideo::descriptor_blob())?; let media_type = - results.component_instance::(0, AssetVideo::descriptor_media_type()); + results.component_instance::(0, &AssetVideo::descriptor_media_type()); let video = ctx.store_context.caches.entry(|c: &mut VideoCache| { let debug_name = entity_path.to_string(); diff --git a/crates/viewer/re_view_text_document/src/visualizer_system.rs b/crates/viewer/re_view_text_document/src/visualizer_system.rs index 626615254780..e5e7bcd4fdd6 100644 --- a/crates/viewer/re_view_text_document/src/visualizer_system.rs +++ b/crates/viewer/re_view_text_document/src/visualizer_system.rs @@ -47,13 +47,13 @@ impl VisualizerSystem for TextDocumentSystem { .latest_at_with_blueprint_resolved_data::(ctx, &timeline_query); let Some(text) = - results.get_required_mono::(TextDocument::descriptor_text()) + results.get_required_mono::(&TextDocument::descriptor_text()) else { continue; }; self.text_entries.push(TextDocumentEntry { body: text.clone(), - media_type: results.get_mono_with_fallback(TextDocument::descriptor_media_type()), + media_type: results.get_mono_with_fallback(&TextDocument::descriptor_media_type()), }); } From c3bce9eafb7335d15ac518f1664e0a968bd2b37b Mon Sep 17 00:00:00 2001 From: Andreas Reich Date: Fri, 9 May 2025 13:23:07 +0200 Subject: [PATCH 08/12] Make chunk component/slice iteration use full component descriptors (#9931) --- crates/store/re_chunk/src/chunk.rs | 10 +- crates/store/re_chunk/src/iter.rs | 225 +++++------------- crates/store/re_query/examples/range.rs | 2 +- crates/store/re_query/tests/range.rs | 2 +- .../re_view/src/chunks_with_descriptor.rs | 3 +- crates/viewer/re_view/src/results_ext.rs | 6 +- .../src/max_image_dimension_subscriber.rs | 84 ++++--- .../re_view_spatial/src/transform_cache.rs | 2 +- .../src/point_visualizer_system.rs | 12 +- .../re_view_time_series/src/series_query.rs | 18 +- .../color_coordinates_visualizer_system.rs | 2 +- 11 files changed, 142 insertions(+), 224 deletions(-) diff --git a/crates/store/re_chunk/src/chunk.rs b/crates/store/re_chunk/src/chunk.rs index 93c0b6f312ec..b3268d5fc3e8 100644 --- a/crates/store/re_chunk/src/chunk.rs +++ b/crates/store/re_chunk/src/chunk.rs @@ -18,7 +18,8 @@ use re_log_types::{ EntityPath, NonMinI64, ResolvedTimeRange, TimeInt, TimePoint, TimeType, Timeline, TimelineName, }; use re_types_core::{ - ComponentDescriptor, ComponentName, DeserializationError, Loggable as _, SerializationError, + ArchetypeName, ComponentDescriptor, ComponentName, DeserializationError, Loggable as _, + SerializationError, }; use crate::{ChunkId, RowId}; @@ -105,6 +106,13 @@ impl ChunkComponents { pub fn contains_component(&self, component_descr: &ComponentDescriptor) -> bool { self.0.contains_key(component_descr) } + + /// Whether any of the components in this chunk is tagged with the given archetype name. + pub fn has_component_with_archetype_name(&self, archetype_name: ArchetypeName) -> bool { + self.0 + .keys() + .any(|desc| desc.archetype_name == Some(archetype_name)) + } } impl std::ops::Deref for ChunkComponents { diff --git a/crates/store/re_chunk/src/iter.rs b/crates/store/re_chunk/src/iter.rs index d910aad71196..6bded2b85df2 100644 --- a/crates/store/re_chunk/src/iter.rs +++ b/crates/store/re_chunk/src/iter.rs @@ -14,7 +14,7 @@ use itertools::{izip, Either, Itertools as _}; use re_arrow_util::{offsets_lengths, ArrowArrayDowncastRef as _}; use re_log_types::{TimeInt, TimePoint, TimelineName}; -use re_types_core::{ArrowString, Component, ComponentDescriptor, ComponentName}; +use re_types_core::{ArrowString, Component, ComponentDescriptor}; use crate::{Chunk, RowId, TimeColumn}; @@ -54,56 +54,6 @@ impl Chunk { } } - /// Returns an iterator over the indices (`(TimeInt, RowId)`) of a [`Chunk`], for a given - /// timeline and component. - /// - /// If the chunk is static, `timeline` will be ignored. - /// - /// This is different than [`Self::iter_indices`] in that it will only yield indices for rows - /// at which there is data for the specified `component_name`. - /// - /// See also [`Self::iter_indices`]. - // TODO(#6889): remove in favor of `iter_component_indices`. - pub fn iter_component_indices_by_name( - &self, - timeline: &TimelineName, - component_name: &ComponentName, - ) -> impl Iterator + '_ { - let Some(list_array) = self.get_first_component(*component_name) else { - return Either::Left(std::iter::empty()); - }; - - if self.is_static() { - let indices = izip!(std::iter::repeat(TimeInt::STATIC), self.row_ids()); - - if let Some(validity) = list_array.nulls() { - Either::Right(Either::Left(Either::Left( - indices - .enumerate() - .filter_map(|(i, o)| validity.is_valid(i).then_some(o)), - ))) - } else { - Either::Right(Either::Left(Either::Right(indices))) - } - } else { - let Some(time_column) = self.timelines.get(timeline) else { - return Either::Left(std::iter::empty()); - }; - - let indices = izip!(time_column.times(), self.row_ids()); - - if let Some(validity) = list_array.nulls() { - Either::Right(Either::Right(Either::Left( - indices - .enumerate() - .filter_map(|(i, o)| validity.is_valid(i).then_some(o)), - ))) - } else { - Either::Right(Either::Right(Either::Right(indices))) - } - } - } - /// Returns an iterator over the indices (`(TimeInt, RowId)`) of a [`Chunk`], for a given /// timeline and component. /// @@ -233,11 +183,11 @@ impl Chunk { /// /// I.e. each `(offset, len)` pair describes the position of a component batch in the /// underlying arrow array of values. - pub fn iter_component_offsets( - &self, - component_name: &ComponentName, - ) -> impl Iterator + '_ { - let Some(list_array) = self.get_first_component(*component_name) else { + pub fn iter_component_offsets<'a>( + &'a self, + component_descriptor: &ComponentDescriptor, + ) -> impl Iterator + 'a { + let Some(list_array) = self.components.get(component_descriptor) else { return Either::Left(std::iter::empty()); }; @@ -268,16 +218,18 @@ impl Chunk { #[inline] pub fn iter_slices<'a, S: 'a + ChunkComponentSlicer>( &'a self, - component_name: ComponentName, + component_descriptor: ComponentDescriptor, ) -> impl Iterator> + 'a { - let Some(list_array) = self.get_first_component(component_name) else { + let Some(list_array) = self.components.get(&component_descriptor) else { return Either::Left(std::iter::empty()); }; + let component_offset_values = self.iter_component_offsets(&component_descriptor); + Either::Right(S::slice( - component_name, + component_descriptor, &**list_array.values() as _, - self.iter_component_offsets(&component_name), + component_offset_values, )) } @@ -295,19 +247,19 @@ impl Chunk { /// See also [`Self::iter_slices_from_struct_field`]. pub fn iter_slices_from_struct_field<'a, S: 'a + ChunkComponentSlicer>( &'a self, - component_name: ComponentName, + component_descriptor: ComponentDescriptor, field_name: &'a str, ) -> impl Iterator> + 'a { - let Some(list_array) = self.get_first_component(component_name) else { + let Some(list_array) = self.components.get(&component_descriptor) else { return Either::Left(std::iter::empty()); }; let Some(struct_array) = list_array.values().downcast_array_ref::() else { if cfg!(debug_assertions) { - panic!("downcast failed for {component_name}, data discarded"); + panic!("downcast failed for {component_descriptor}, data discarded"); } else { - re_log::error_once!("downcast failed for {component_name}, data discarded"); + re_log::error_once!("downcast failed for {component_descriptor}, data discarded"); } return Either::Left(std::iter::empty()); }; @@ -319,10 +271,10 @@ impl Chunk { .find_map(|(i, field)| (field.name() == field_name).then_some(i)) else { if cfg!(debug_assertions) { - panic!("field {field_name} not found for {component_name}, data discarded"); + panic!("field {field_name} not found for {component_descriptor}, data discarded"); } else { re_log::error_once!( - "field {field_name} not found for {component_name}, data discarded" + "field {field_name} not found for {component_descriptor}, data discarded" ); } return Either::Left(std::iter::empty()); @@ -330,19 +282,21 @@ impl Chunk { if field_idx >= struct_array.num_columns() { if cfg!(debug_assertions) { - panic!("field {field_name} not found for {component_name}, data discarded"); + panic!("field {field_name} not found for {component_descriptor}, data discarded"); } else { re_log::error_once!( - "field {field_name} not found for {component_name}, data discarded" + "field {field_name} not found for {component_descriptor}, data discarded" ); return Either::Left(std::iter::empty()); } } + let component_offset_values = self.iter_component_offsets(&component_descriptor); + Either::Right(S::slice( - component_name, + component_descriptor, struct_array.column(field_idx), - self.iter_component_offsets(&component_name), + component_offset_values, )) } } @@ -356,7 +310,9 @@ pub trait ChunkComponentSlicer { type Item<'a>; fn slice<'a>( - component_name: ComponentName, + // TODO(#9903): A reference to component descriptor should be enough since the returned iterator doesn't depend on it being alive. + // However, I wasn't able to get this idea across to the borrow checker. + component_descriptor: ComponentDescriptor, array: &'a dyn ArrowArray, component_offsets: impl Iterator + 'a, ) -> impl Iterator> + 'a; @@ -364,7 +320,7 @@ pub trait ChunkComponentSlicer { /// The actual implementation of `impl_native_type!`, so that we don't have to work in a macro. fn slice_as_native<'a, P, T>( - component_name: ComponentName, + component_descriptor: &ComponentDescriptor, array: &'a dyn ArrowArray, component_offsets: impl Iterator + 'a, ) -> impl Iterator + 'a @@ -374,9 +330,9 @@ where { let Some(values) = array.downcast_array_ref::>() else { if cfg!(debug_assertions) { - panic!("downcast failed for {component_name}, data discarded"); + panic!("downcast failed for {component_descriptor}, data discarded"); } else { - re_log::error_once!("downcast failed for {component_name}, data discarded"); + re_log::error_once!("downcast failed for {component_descriptor}, data discarded"); } return Either::Left(std::iter::empty()); }; @@ -393,12 +349,12 @@ macro_rules! impl_native_type { type Item<'a> = &'a [$native_type]; fn slice<'a>( - component_name: ComponentName, + component_descriptor: ComponentDescriptor, array: &'a dyn ArrowArray, component_offsets: impl Iterator + 'a, ) -> impl Iterator> + 'a { slice_as_native::<$arrow_primitive_type, $native_type>( - component_name, + &component_descriptor, array, component_offsets, ) @@ -423,7 +379,7 @@ impl_native_type!(arrow::array::types::Float64Type, f64); /// The actual implementation of `impl_array_native_type!`, so that we don't have to work in a macro. fn slice_as_array_native<'a, const N: usize, P, T>( - component_name: ComponentName, + component_descriptor: &ComponentDescriptor, array: &'a dyn ArrowArray, component_offsets: impl Iterator + 'a, ) -> impl Iterator + 'a @@ -434,9 +390,9 @@ where { let Some(fixed_size_list_array) = array.downcast_array_ref::() else { if cfg!(debug_assertions) { - panic!("downcast failed for {component_name}, data discarded"); + panic!("downcast failed for {component_descriptor}, data discarded"); } else { - re_log::error_once!("downcast failed for {component_name}, data discarded"); + re_log::error_once!("downcast failed for {component_descriptor}, data discarded"); } return Either::Left(std::iter::empty()); }; @@ -446,9 +402,9 @@ where .downcast_array_ref::>() else { if cfg!(debug_assertions) { - panic!("downcast failed for {component_name}, data discarded"); + panic!("downcast failed for {component_descriptor}, data discarded"); } else { - re_log::error_once!("downcast failed for {component_name}, data discarded"); + re_log::error_once!("downcast failed for {component_descriptor}, data discarded"); } return Either::Left(std::iter::empty()); }; @@ -474,12 +430,12 @@ macro_rules! impl_array_native_type { type Item<'a> = &'a [[$native_type; N]]; fn slice<'a>( - component_name: ComponentName, + component_descriptor: ComponentDescriptor, array: &'a dyn ArrowArray, component_offsets: impl Iterator + 'a, ) -> impl Iterator> + 'a { slice_as_array_native::( - component_name, + &component_descriptor, array, component_offsets, ) @@ -504,7 +460,7 @@ impl_array_native_type!(arrow::array::types::Float64Type, f64); /// The actual implementation of `impl_buffer_native_type!`, so that we don't have to work in a macro. fn slice_as_buffer_native<'a, P, T>( - component_name: ComponentName, + component_descriptor: &ComponentDescriptor, array: &'a dyn ArrowArray, component_offsets: impl Iterator + 'a, ) -> impl Iterator>> + 'a @@ -514,9 +470,9 @@ where { let Some(inner_list_array) = array.downcast_array_ref::() else { if cfg!(debug_assertions) { - panic!("downcast failed for {component_name}, data discarded"); + panic!("downcast failed for {component_descriptor}, data discarded"); } else { - re_log::error_once!("downcast failed for {component_name}, data discarded"); + re_log::error_once!("downcast failed for {component_descriptor}, data discarded"); } return Either::Left(std::iter::empty()); }; @@ -526,9 +482,9 @@ where .downcast_array_ref::>() else { if cfg!(debug_assertions) { - panic!("downcast failed for {component_name}, data discarded"); + panic!("downcast failed for {component_descriptor}, data discarded"); } else { - re_log::error_once!("downcast failed for {component_name}, data discarded"); + re_log::error_once!("downcast failed for {component_descriptor}, data discarded"); } return Either::Left(std::iter::empty()); }; @@ -555,12 +511,12 @@ macro_rules! impl_buffer_native_type { type Item<'a> = Vec>; fn slice<'a>( - component_name: ComponentName, + component_descriptor: ComponentDescriptor, array: &'a dyn ArrowArray, component_offsets: impl Iterator + 'a, ) -> impl Iterator> + 'a { slice_as_buffer_native::<$primitive_type, $native_type>( - component_name, + &component_descriptor, array, component_offsets, ) @@ -585,7 +541,7 @@ impl_buffer_native_type!(arrow::array::types::Float64Type, f64); /// The actual implementation of `impl_array_list_native_type!`, so that we don't have to work in a macro. fn slice_as_array_list_native<'a, const N: usize, P, T>( - component_name: ComponentName, + component_descriptor: &ComponentDescriptor, array: &'a dyn ArrowArray, component_offsets: impl Iterator + 'a, ) -> impl Iterator> + 'a @@ -596,9 +552,9 @@ where { let Some(inner_list_array) = array.downcast_array_ref::() else { if cfg!(debug_assertions) { - panic!("downcast failed for {component_name}, data discarded"); + panic!("downcast failed for {component_descriptor}, data discarded"); } else { - re_log::error_once!("downcast failed for {component_name}, data discarded"); + re_log::error_once!("downcast failed for {component_descriptor}, data discarded"); } return Either::Left(std::iter::empty()); }; @@ -611,9 +567,9 @@ where .downcast_array_ref::() else { if cfg!(debug_assertions) { - panic!("downcast failed for {component_name}, data discarded"); + panic!("downcast failed for {component_descriptor}, data discarded"); } else { - re_log::error_once!("downcast failed for {component_name}, data discarded"); + re_log::error_once!("downcast failed for {component_descriptor}, data discarded"); } return Either::Left(std::iter::empty()); }; @@ -623,9 +579,9 @@ where .downcast_array_ref::>() else { if cfg!(debug_assertions) { - panic!("downcast failed for {component_name}, data discarded"); + panic!("downcast failed for {component_descriptor}, data discarded"); } else { - re_log::error_once!("downcast failed for {component_name}, data discarded"); + re_log::error_once!("downcast failed for {component_descriptor}, data discarded"); } return Either::Left(std::iter::empty()); }; @@ -656,12 +612,12 @@ macro_rules! impl_array_list_native_type { type Item<'a> = Vec<&'a [[$native_type; N]]>; fn slice<'a>( - component_name: ComponentName, + component_descriptor: ComponentDescriptor, array: &'a dyn ArrowArray, component_offsets: impl Iterator + 'a, ) -> impl Iterator> + 'a { slice_as_array_list_native::( - component_name, + &component_descriptor, array, component_offsets, ) @@ -688,15 +644,15 @@ impl ChunkComponentSlicer for String { type Item<'a> = Vec; fn slice<'a>( - component_name: ComponentName, + component_descriptor: ComponentDescriptor, array: &'a dyn ArrowArray, component_offsets: impl Iterator + 'a, ) -> impl Iterator> + 'a { let Some(utf8_array) = array.downcast_array_ref::() else { if cfg!(debug_assertions) { - panic!("downcast failed for {component_name}, data discarded"); + panic!("downcast failed for {component_descriptor}, data discarded"); } else { - re_log::error_once!("downcast failed for {component_name}, data discarded"); + re_log::error_once!("downcast failed for {component_descriptor}, data discarded"); } return Either::Left(std::iter::empty()); }; @@ -720,15 +676,15 @@ impl ChunkComponentSlicer for bool { type Item<'a> = ArrowBooleanBuffer; fn slice<'a>( - component_name: ComponentName, + component_descriptor: ComponentDescriptor, array: &'a dyn ArrowArray, component_offsets: impl Iterator + 'a, ) -> impl Iterator> + 'a { let Some(values) = array.downcast_array_ref::() else { if cfg!(debug_assertions) { - panic!("downcast failed for {component_name}, data discarded"); + panic!("downcast failed for {component_descriptor}, data discarded"); } else { - re_log::error_once!("downcast failed for {component_name}, data discarded"); + re_log::error_once!("downcast failed for {component_descriptor}, data discarded"); } return Either::Left(std::iter::empty()); }; @@ -881,63 +837,6 @@ impl> Iterator for ChunkCompon } impl Chunk { - /// Returns an iterator over the deserialized batches of a [`Chunk`], for a given component. - /// - /// This is a dedicated fast path: the entire column will be downcasted and deserialized at - /// once, and then every component batch will be a slice reference into that global slice. - /// Use this when working with complex arrow datatypes and performance matters (e.g. ranging - /// through enum types across many timestamps). - /// - /// TODO(#5305): Note that, while this is much faster than deserializing each row individually, - /// this still uses the old codegen'd deserialization path, which does some very unidiomatic Arrow - /// things, and is therefore very slow at the moment. Avoid this on performance critical paths. - /// - /// See also: - /// * [`Self::iter_slices`] - /// * [`Self::iter_slices_from_struct_field`] - // TODO(#6889): Remove in favor of `iter_component`. - #[inline] - pub fn iter_component_by_name( - &self, - ) -> ChunkComponentIter + '_> { - let Some(list_array) = self.get_first_component(C::name()) else { - return ChunkComponentIter { - values: Arc::new(vec![]), - offsets: Either::Left(std::iter::empty()), - }; - }; - - let values = arrow::array::ArrayRef::from(list_array.values().clone()); - let values = match C::from_arrow(&values) { - Ok(values) => values, - Err(err) => { - if cfg!(debug_assertions) { - panic!( - "[DEBUG-ONLY] deserialization failed for {}, data discarded: {}", - C::name(), - re_error::format_ref(&err), - ); - } else { - re_log::error_once!( - "deserialization failed for {}, data discarded: {}", - C::name(), - re_error::format_ref(&err), - ); - } - return ChunkComponentIter { - values: Arc::new(vec![]), - offsets: Either::Left(std::iter::empty()), - }; - } - }; - - // NOTE: No need for validity checks here, `iter_offsets` already takes care of that. - ChunkComponentIter { - values: Arc::new(values), - offsets: Either::Right(self.iter_component_offsets(&C::name())), - } - } - /// Returns an iterator over the deserialized batches of a [`Chunk`], for a given component. /// /// This is a dedicated fast path: the entire column will be downcasted and deserialized at @@ -997,7 +896,7 @@ impl Chunk { // NOTE: No need for validity checks here, `iter_offsets` already takes care of that. ChunkComponentIter { values: Arc::new(values), - offsets: Either::Right(self.iter_component_offsets(&C::name())), + offsets: Either::Right(self.iter_component_offsets(component_descriptor)), } } } diff --git a/crates/store/re_query/examples/range.rs b/crates/store/re_query/examples/range.rs index bc0ded2a5289..c49e12437c5b 100644 --- a/crates/store/re_query/examples/range.rs +++ b/crates/store/re_query/examples/range.rs @@ -65,7 +65,7 @@ fn main() -> anyhow::Result<()> { .flat_map(|chunk| { izip!( chunk.iter_component_indices(query.timeline(), &MyPoints::descriptor_colors()), - chunk.iter_slices::(MyPoints::descriptor_colors().component_name), // TODO(#6889): use descriptor directly. + chunk.iter_slices::(MyPoints::descriptor_colors()), ) }); diff --git a/crates/store/re_query/tests/range.rs b/crates/store/re_query/tests/range.rs index 7aa8e88eed20..f73ee658ab35 100644 --- a/crates/store/re_query/tests/range.rs +++ b/crates/store/re_query/tests/range.rs @@ -1267,7 +1267,7 @@ fn query_and_compare( .flat_map(|chunk| { itertools::izip!( chunk.iter_component_indices(query.timeline(), &descriptor_colors), - chunk.iter_slices::(descriptor_colors.component_name), // TODO(#6889): use descriptor directly. + chunk.iter_slices::(descriptor_colors.clone()), ) }) .collect_vec(); diff --git a/crates/viewer/re_view/src/chunks_with_descriptor.rs b/crates/viewer/re_view/src/chunks_with_descriptor.rs index 67cd3acda4be..1d5e42eb8649 100644 --- a/crates/viewer/re_view/src/chunks_with_descriptor.rs +++ b/crates/viewer/re_view/src/chunks_with_descriptor.rs @@ -56,8 +56,7 @@ impl<'chunk> ChunkWithDescriptor<'chunk, '_> { pub fn iter_slices( &self, ) -> impl Iterator> + 'chunk { - // TODO(#6889): Use the full descriptor instead. - self.chunk.iter_slices::(self.descriptor.component_name) + self.chunk.iter_slices::(self.descriptor.clone()) } /// See [`Chunk::iter_component`]. diff --git a/crates/viewer/re_view/src/results_ext.rs b/crates/viewer/re_view/src/results_ext.rs index a8a6415fe6a0..f9b8eebad93f 100644 --- a/crates/viewer/re_view/src/results_ext.rs +++ b/crates/viewer/re_view/src/results_ext.rs @@ -510,8 +510,7 @@ impl<'a> HybridResultsChunkIter<'a> { self.chunks.iter().flat_map(move |chunk| { itertools::izip!( chunk.iter_component_indices(&self.timeline, &self.component_descriptor), - // TODO(#6889): Use descriptor instead of name. - chunk.iter_slices::(self.component_descriptor.component_name), + chunk.iter_slices::(self.component_descriptor.clone()), ) }) } @@ -527,8 +526,7 @@ impl<'a> HybridResultsChunkIter<'a> { itertools::izip!( chunk.iter_component_indices(&self.timeline, &self.component_descriptor), chunk.iter_slices_from_struct_field::( - // TODO(#6889): Use descriptor instead of name.s - self.component_descriptor.component_name, + self.component_descriptor.clone(), field_name, ) ) diff --git a/crates/viewer/re_view_spatial/src/max_image_dimension_subscriber.rs b/crates/viewer/re_view_spatial/src/max_image_dimension_subscriber.rs index 384637fc49d1..89cdeb1229ac 100644 --- a/crates/viewer/re_view_spatial/src/max_image_dimension_subscriber.rs +++ b/crates/viewer/re_view_spatial/src/max_image_dimension_subscriber.rs @@ -7,7 +7,7 @@ use re_types::{ archetypes, components::{Blob, ImageFormat, MediaType}, external::image, - Component as _, Loggable as _, + Archetype as _, Component as _, Loggable as _, }; bitflags::bitflags! { @@ -74,7 +74,8 @@ impl PerStoreChunkSubscriber for MaxImageDimensionsStoreSubscriber { } // Handle `Image`, `DepthImage`, `SegmentationImage`… - let components = event.diff.chunk.components(); + let chunk = &event.diff.chunk; + let components = chunk.components(); for image_format_list_array in components.get_by_component_name(ImageFormat::name()) { for new_dim in image_format_list_array.iter().filter_map(|array| { array.and_then(|array| { @@ -84,7 +85,7 @@ impl PerStoreChunkSubscriber for MaxImageDimensionsStoreSubscriber { }) { let max_dim = self .max_dimensions - .entry(event.diff.chunk.entity_path().clone()) + .entry(chunk.entity_path().clone()) .or_default(); max_dim.width = max_dim.width.max(new_dim.width); @@ -92,56 +93,69 @@ impl PerStoreChunkSubscriber for MaxImageDimensionsStoreSubscriber { } } - // TODO(andreas): this should be part of the ImageFormat component's tag instead. - if components.contains_component(&archetypes::Image::descriptor_indicator()) { + if components.has_component_with_archetype_name(archetypes::Image::name()) { self.max_dimensions - .entry(event.diff.chunk.entity_path().clone()) + .entry(chunk.entity_path().clone()) .or_default() .image_types .insert(ImageTypes::IMAGE); } - if components.contains_component(&archetypes::SegmentationImage::descriptor_indicator()) - { + + if components.has_component_with_archetype_name(archetypes::SegmentationImage::name()) { self.max_dimensions - .entry(event.diff.chunk.entity_path().clone()) + .entry(chunk.entity_path().clone()) .or_default() .image_types .insert(ImageTypes::SEGMENTATION_IMAGE); } - if components.contains_component(&archetypes::DepthImage::descriptor_indicator()) { + if components.has_component_with_archetype_name(archetypes::DepthImage::name()) { self.max_dimensions - .entry(event.diff.chunk.entity_path().clone()) + .entry(chunk.entity_path().clone()) .or_default() .image_types .insert(ImageTypes::DEPTH_IMAGE); } // Handle `ImageEncoded`, `AssetVideo`… - let blobs = event.diff.chunk.iter_slices::<&[u8]>(Blob::name()); - let media_types = event.diff.chunk.iter_slices::(MediaType::name()); - for (blob, media_type) in - itertools::izip!(blobs, media_types.map(Some).chain(std::iter::repeat(None))) + for (blob_descr, _blob_list_array) in components + .iter() + .filter(|(descr, _)| descr.component_name == Blob::name()) { - if let Some(blob) = blob.first() { - let media_type = - media_type.and_then(|v| v.first().map(|v| MediaType(v.clone().into()))); - let Some(media_type) = MediaType::or_guess_from_data(media_type, blob) else { - continue; - }; - - if let Some([width, height]) = size_from_blob(blob, &media_type) { - let max_dim = self - .max_dimensions - .entry(event.diff.chunk.entity_path().clone()) - .or_default(); - max_dim.width = max_dim.width.max(width); - max_dim.height = max_dim.height.max(height); - - // TODO(andreas): this should be part of the Blob component's tag instead. - if media_type.is_image() { - max_dim.image_types.insert(ImageTypes::ENCODED_IMAGE); - } else if media_type.is_video() { - max_dim.image_types.insert(ImageTypes::VIDEO); + let blobs = chunk.iter_slices::<&[u8]>(blob_descr.clone()); + + let media_type_descr = components + .keys() + .find(|desc| { + desc.component_name == MediaType::name() + && desc.archetype_name == blob_descr.archetype_name + }) + .unwrap(); + let media_types = chunk.iter_slices::(media_type_descr.clone()); + for (blob, media_type) in + itertools::izip!(blobs, media_types.map(Some).chain(std::iter::repeat(None))) + { + if let Some(blob) = blob.first() { + let media_type = + media_type.and_then(|v| v.first().map(|v| MediaType(v.clone().into()))); + let Some(media_type) = MediaType::or_guess_from_data(media_type, blob) + else { + continue; + }; + + if let Some([width, height]) = size_from_blob(blob, &media_type) { + let max_dim = self + .max_dimensions + .entry(chunk.entity_path().clone()) + .or_default(); + max_dim.width = max_dim.width.max(width); + max_dim.height = max_dim.height.max(height); + + // TODO(andreas): this should be part of the Blob component's tag instead. + if media_type.is_image() { + max_dim.image_types.insert(ImageTypes::ENCODED_IMAGE); + } else if media_type.is_video() { + max_dim.image_types.insert(ImageTypes::VIDEO); + } } } } diff --git a/crates/viewer/re_view_spatial/src/transform_cache.rs b/crates/viewer/re_view_spatial/src/transform_cache.rs index a32213095544..538ceeffcc3e 100644 --- a/crates/viewer/re_view_spatial/src/transform_cache.rs +++ b/crates/viewer/re_view_spatial/src/transform_cache.rs @@ -540,7 +540,7 @@ impl TransformCacheStoreSubscriber { let recursively_cleared_times = chunk .iter_component_indices(timeline, &descr) - .zip(chunk.iter_slices::(descr.component_name)) + .zip(chunk.iter_slices::(descr.clone())) .filter_map(|((time, _row_id), bool_slice)| { bool_slice .values() diff --git a/crates/viewer/re_view_time_series/src/point_visualizer_system.rs b/crates/viewer/re_view_time_series/src/point_visualizer_system.rs index f703f817d57b..2b41e2c7b87a 100644 --- a/crates/viewer/re_view_time_series/src/point_visualizer_system.rs +++ b/crates/viewer/re_view_time_series/src/point_visualizer_system.rs @@ -3,7 +3,7 @@ use itertools::Itertools as _; use re_types::{ archetypes, components::{Color, MarkerShape, MarkerSize, Name, SeriesVisible}, - Archetype as _, Component as _, + Archetype as _, }; use re_view::{clamped_or_nothing, range_with_blueprint_resolved_data}; use re_viewer_context::{ @@ -289,7 +289,11 @@ impl SeriesPointSystem { let mut all_marker_shapes_iters = all_marker_shapes_chunks .iter() - .map(|chunk| chunk.iter_component_by_name::()) + .map(|chunk| { + chunk.iter_component::( + &archetypes::SeriesPoints::descriptor_markers(), + ) + }) .collect_vec(); let all_marker_shapes_indexed = { let all_marker_shapes = all_marker_shapes_iters @@ -297,9 +301,9 @@ impl SeriesPointSystem { .flat_map(|it| it.into_iter()); let all_marker_shapes_indices = all_marker_shapes_chunks.iter().flat_map(|chunk| { - chunk.iter_component_indices_by_name( + chunk.iter_component_indices( query.timeline(), - &MarkerShape::name(), + &archetypes::SeriesPoints::descriptor_markers(), ) }); itertools::izip!(all_marker_shapes_indices, all_marker_shapes) diff --git a/crates/viewer/re_view_time_series/src/series_query.rs b/crates/viewer/re_view_time_series/src/series_query.rs index 34642456b8c8..60850cd8c192 100644 --- a/crates/viewer/re_view_time_series/src/series_query.rs +++ b/crates/viewer/re_view_time_series/src/series_query.rs @@ -5,7 +5,7 @@ use itertools::Itertools as _; use re_chunk_store::RangeQuery; use re_log_types::{EntityPath, TimeInt}; use re_types::external::arrow::datatypes::DataType as ArrowDatatype; -use re_types::{components, Component as _, ComponentDescriptor, Loggable as _, RowId}; +use re_types::{components, ComponentDescriptor, Loggable as _, RowId}; use re_view::{clamped_or_nothing, ChunksWithDescriptor, HybridRangeResults, RangeResultsExt as _}; use re_viewer_context::{auto_color_egui, QueryContext, TypedComponentFallbackProvider}; @@ -138,7 +138,7 @@ pub fn collect_colors( re_tracing::profile_scope!("override/default fast path"); if let Some(colors) = all_color_chunks[0] - .iter_slices::(color_descriptor.component_name) + .iter_slices::(color_descriptor.clone()) .next() { for (points, color) in points_per_series @@ -175,8 +175,8 @@ pub fn collect_colors( let all_colors = all_color_chunks.iter().flat_map(|chunk| { itertools::izip!( - chunk.iter_component_indices_by_name(query.timeline(), &components::Color::name()), - chunk.iter_slices::(components::Color::name()) + chunk.iter_component_indices(query.timeline(), color_descriptor), + chunk.iter_slices::(color_descriptor.clone()) ) }); @@ -221,11 +221,7 @@ pub fn collect_series_name( .get_optional_chunks(name_descriptor.clone()) .iter() .find(|chunk| !chunk.is_empty()) - .and_then(|chunk| { - chunk - .iter_slices::(name_descriptor.component_name) - .next() - }) + .and_then(|chunk| chunk.iter_slices::(name_descriptor.clone()).next()) .map(|slice| slice.into_iter().map(|s| s.to_string()).collect()) .unwrap_or_default(); @@ -263,7 +259,7 @@ pub fn collect_radius_ui( re_tracing::profile_scope!("override/default fast path"); if let Some(radius) = all_radius_chunks[0] - .iter_slices::(radius_descriptor.component_name) + .iter_slices::(radius_descriptor.clone()) .next() { for (points, radius) in points_per_series @@ -282,7 +278,7 @@ pub fn collect_radius_ui( let all_radii = all_radius_chunks.iter().flat_map(|chunk| { itertools::izip!( chunk.iter_component_indices(query.timeline(), radius_descriptor), - chunk.iter_slices::(radius_descriptor.component_name) + chunk.iter_slices::(radius_descriptor.clone()) ) }); diff --git a/examples/rust/custom_view/src/color_coordinates_visualizer_system.rs b/examples/rust/custom_view/src/color_coordinates_visualizer_system.rs index 0f2aa72e4a4a..eff3eab0a674 100644 --- a/examples/rust/custom_view/src/color_coordinates_visualizer_system.rs +++ b/examples/rust/custom_view/src/color_coordinates_visualizer_system.rs @@ -65,7 +65,7 @@ impl VisualizerSystem for InstanceColorSystem { let colors = results .components .iter() - .flat_map(|(descr, chunk)| chunk.iter_slices::(descr.component_name).flatten()) + .flat_map(|(descr, chunk)| chunk.iter_slices::(descr.clone()).flatten()) .collect::>(); if colors.is_empty() { From 99bd5f834bd3ae75a2340ac53c5272474aecea10 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Fri, 9 May 2025 13:46:15 +0200 Subject: [PATCH 09/12] New doc comments to the rescue! --- crates/viewer/re_view_graph/src/visualizers/nodes.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/viewer/re_view_graph/src/visualizers/nodes.rs b/crates/viewer/re_view_graph/src/visualizers/nodes.rs index 7d0755fcd3f8..e41b93c56f5b 100644 --- a/crates/viewer/re_view_graph/src/visualizers/nodes.rs +++ b/crates/viewer/re_view_graph/src/visualizers/nodes.rs @@ -85,7 +85,7 @@ impl VisualizerSystem for NodeVisualizer { let all_labels = results.iter_as(query.timeline, GraphNodes::descriptor_labels()); let all_radii = results.iter_as(query.timeline, GraphNodes::descriptor_radii()); let show_label = results - .get_mono::(&GraphNodes::descriptor_labels()) + .get_mono::(&GraphNodes::descriptor_show_labels()) .is_none_or(bool::from); let data = range_zip_1x4( From fd719d7ed165c243ecb726688ffed430a319aad5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Fri, 9 May 2025 16:51:51 +0200 Subject: [PATCH 10/12] merge shenanigans --- crates/store/re_chunk/src/chunk.rs | 7 ------- 1 file changed, 7 deletions(-) diff --git a/crates/store/re_chunk/src/chunk.rs b/crates/store/re_chunk/src/chunk.rs index 28bc267caaff..350ff0d98afd 100644 --- a/crates/store/re_chunk/src/chunk.rs +++ b/crates/store/re_chunk/src/chunk.rs @@ -113,13 +113,6 @@ impl ChunkComponents { .keys() .any(|desc| desc.archetype_name == Some(archetype_name)) } - - /// Whether any of the components in this chunk is tagged with the given archetype name. - pub fn has_component_with_archetype_name(&self, archetype_name: ArchetypeName) -> bool { - self.0 - .keys() - .any(|desc| desc.archetype_name == Some(archetype_name)) - } } impl std::ops::Deref for ChunkComponents { From d044321eeda4eaee5d50410153e3bf9ec6814ad6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Fri, 9 May 2025 17:05:10 +0200 Subject: [PATCH 11/12] remove `HybridLatestAtResult::get` --- crates/viewer/re_view/src/results_ext.rs | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) diff --git a/crates/viewer/re_view/src/results_ext.rs b/crates/viewer/re_view/src/results_ext.rs index f9b8eebad93f..8f318ffc4bb7 100644 --- a/crates/viewer/re_view/src/results_ext.rs +++ b/crates/viewer/re_view/src/results_ext.rs @@ -2,7 +2,7 @@ use std::{borrow::Cow, sync::Arc}; use itertools::Itertools as _; -use re_chunk_store::{Chunk, LatestAtQuery, RangeQuery, UnitChunkShared}; +use re_chunk_store::{Chunk, LatestAtQuery, RangeQuery}; use re_log_types::hash::Hash64; use re_query::{LatestAtResults, RangeResults}; use re_types::ComponentDescriptor; @@ -39,20 +39,6 @@ pub struct HybridRangeResults<'a> { } impl HybridLatestAtResults<'_> { - /// Returns the [`UnitChunkShared`] for the specified [`re_types_core::Component`]. - #[inline] - // TODO(#6889): This method seems to be unused? - pub fn get_by_name( - &self, - component_name: impl Into, - ) -> Option<&UnitChunkShared> { - let component_name = component_name.into(); - self.overrides - .get_by_name(&component_name) - .or_else(|| self.results.get_by_name(&component_name)) - .or_else(|| self.defaults.get_by_name(&component_name)) - } - // TODO(#6889): Right now, fallbacks are on a per-component basis, so it's fine to pass the component name here. pub fn fallback_raw(&self, component_name: ComponentName) -> arrow::array::ArrayRef { let query_context = QueryContext { From 3537130d727537c5ded1bd9c141131872ded3128 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Fri, 9 May 2025 18:08:05 +0200 Subject: [PATCH 12/12] merge stuff --- crates/viewer/re_view_spatial/src/contexts/depth_offsets.rs | 2 +- .../re_view_spatial/src/contexts/transform_tree_context.rs | 4 ++-- crates/viewer/re_view_spatial/src/mesh_cache.rs | 5 ++++- .../viewer/re_viewer_context/src/cache/tensor_stats_cache.rs | 2 +- 4 files changed, 8 insertions(+), 5 deletions(-) diff --git a/crates/viewer/re_view_spatial/src/contexts/depth_offsets.rs b/crates/viewer/re_view_spatial/src/contexts/depth_offsets.rs index 461f7ede58cd..4a4ac6e4c4fb 100644 --- a/crates/viewer/re_view_spatial/src/contexts/depth_offsets.rs +++ b/crates/viewer/re_view_spatial/src/contexts/depth_offsets.rs @@ -3,7 +3,7 @@ use std::collections::{BTreeMap, BTreeSet}; use ahash::HashMap; use re_log_types::EntityPathHash; -use re_types::{Component as _, ComponentDescriptorSet, components::DrawOrder}; +use re_types::{ComponentDescriptorSet, archetypes, components::DrawOrder}; use re_view::latest_at_with_blueprint_resolved_data; use re_viewer_context::{IdentifiedViewSystem, ViewContextSystem, ViewSystemIdentifier}; diff --git a/crates/viewer/re_view_spatial/src/contexts/transform_tree_context.rs b/crates/viewer/re_view_spatial/src/contexts/transform_tree_context.rs index 84931e95bed6..222a63f0a655 100644 --- a/crates/viewer/re_view_spatial/src/contexts/transform_tree_context.rs +++ b/crates/viewer/re_view_spatial/src/contexts/transform_tree_context.rs @@ -4,9 +4,9 @@ use re_chunk_store::LatestAtQuery; use re_entity_db::{EntityPath, EntityTree}; use re_log_types::EntityPathHash; use re_types::{ - Archetype as _, Component as _, ComponentNameSet, + Archetype as _, Component as _, ComponentDescriptorSet, archetypes::{self, InstancePoses3D, Transform3D}, - components::{ImagePlaneDistance, PinholeProjection}, + components::ImagePlaneDistance, }; use re_view::DataResultQuery as _; use re_viewer_context::{DataResultTree, IdentifiedViewSystem, ViewContext, ViewContextSystem}; diff --git a/crates/viewer/re_view_spatial/src/mesh_cache.rs b/crates/viewer/re_view_spatial/src/mesh_cache.rs index 1ba925f3ceec..8494b3ab3e01 100644 --- a/crates/viewer/re_view_spatial/src/mesh_cache.rs +++ b/crates/viewer/re_view_spatial/src/mesh_cache.rs @@ -7,7 +7,10 @@ use re_chunk_store::{ChunkStoreEvent, RowId}; use re_entity_db::VersionedInstancePathHash; use re_log_types::hash::Hash64; use re_renderer::RenderContext; -use re_types::{Component as _, components::MediaType}; +use re_types::{ + archetypes::{Asset3D, Mesh3D}, + components::MediaType, +}; use re_viewer_context::Cache; use crate::mesh_loader::{LoadedMesh, NativeAsset3D, NativeMesh3D}; diff --git a/crates/viewer/re_viewer_context/src/cache/tensor_stats_cache.rs b/crates/viewer/re_viewer_context/src/cache/tensor_stats_cache.rs index 95bbe015788a..3808433932ea 100644 --- a/crates/viewer/re_viewer_context/src/cache/tensor_stats_cache.rs +++ b/crates/viewer/re_viewer_context/src/cache/tensor_stats_cache.rs @@ -3,7 +3,7 @@ use itertools::Either; use re_chunk_store::ChunkStoreEvent; use re_log_types::hash::Hash64; -use re_types::{Component as _, datatypes::TensorData}; +use re_types::{archetypes::Tensor, datatypes::TensorData}; use crate::{Cache, TensorStats};