diff --git a/crates/re_space_view_spatial/src/contexts/mod.rs b/crates/re_space_view_spatial/src/contexts/mod.rs index 156eca6619b0..ab04755e2289 100644 --- a/crates/re_space_view_spatial/src/contexts/mod.rs +++ b/crates/re_space_view_spatial/src/contexts/mod.rs @@ -59,7 +59,7 @@ impl ViewContextSystem for PrimitiveCounter { } } -pub fn register_contexts( +pub fn register_spatial_contexts( system_registry: &mut re_viewer_context::SpaceViewSystemRegistry, ) -> Result<(), SpaceViewClassRegistryError> { system_registry.register_context_system::()?; diff --git a/crates/re_space_view_spatial/src/parts/entity_iterator.rs b/crates/re_space_view_spatial/src/parts/entity_iterator.rs index 6946a1a1ba38..6879ee7e1c77 100644 --- a/crates/re_space_view_spatial/src/parts/entity_iterator.rs +++ b/crates/re_space_view_spatial/src/parts/entity_iterator.rs @@ -3,12 +3,16 @@ use re_query::{query_archetype_with_history, ArchetypeView, QueryError}; use re_renderer::DepthOffset; use re_types::Archetype; use re_viewer_context::{ - NamedViewSystem, SpaceViewSystemExecutionError, ViewContextCollection, ViewQuery, ViewerContext, + NamedViewSystem, SpaceViewClass, SpaceViewSystemExecutionError, ViewContextCollection, + ViewQuery, ViewerContext, }; -use crate::contexts::{ - AnnotationSceneContext, EntityDepthOffsets, PrimitiveCounter, SharedRenderBuilders, - SpatialSceneEntityContext, TransformContext, +use crate::{ + contexts::{ + AnnotationSceneContext, EntityDepthOffsets, PrimitiveCounter, SharedRenderBuilders, + SpatialSceneEntityContext, TransformContext, + }, + SpatialSpaceView3D, }; /// Iterates through all entity views for a given archetype. @@ -39,7 +43,18 @@ where let counter = view_ctx.get::()?; for (ent_path, props) in query.iter_entities_for_system(System::name()) { - let Some(world_from_entity) = transforms.reference_from_entity(ent_path) else { + // The transform that considers pinholes only makes sense if this is a 3D space-view + let world_from_entity = if view_ctx.space_view_class_name() == SpatialSpaceView3D.name() { + transforms.reference_from_entity(ent_path) + } else { + transforms.reference_from_entity_ignoring_pinhole( + ent_path, + &ctx.store_db.entity_db.data_store, + &query.latest_at_query(), + ) + }; + + let Some(world_from_entity) = world_from_entity else { continue; }; let entity_context = SpatialSceneEntityContext { diff --git a/crates/re_space_view_spatial/src/parts/images.rs b/crates/re_space_view_spatial/src/parts/images.rs index c5a0783effac..c5eba134cb9d 100644 --- a/crates/re_space_view_spatial/src/parts/images.rs +++ b/crates/re_space_view_spatial/src/parts/images.rs @@ -30,7 +30,7 @@ use crate::{ parts::SIZE_BOOST_IN_POINTS_FOR_POINT_OUTLINES, query_pinhole, view_kind::SpatialSpaceViewKind, - SpatialSpaceView2D, + SpatialSpaceView2D, SpatialSpaceView3D, }; use super::{entity_iterator::process_archetype_views, SpatialViewPartData}; @@ -214,7 +214,13 @@ impl ImagesPart { ) -> Result<(), QueryError> { re_tracing::profile_function!(); - let parent_pinhole_path = transforms.parent_pinhole(ent_path); + // Parent pinhole should only be relevant to 3D views + let parent_pinhole_path = if ent_context.space_view_class_name == SpatialSpaceView3D.name() + { + transforms.parent_pinhole(ent_path) + } else { + None + }; // If this isn't an image, return // TODO(jleibs): The ArchetypeView should probably do this for us. @@ -323,7 +329,13 @@ impl ImagesPart { } let meaning = TensorDataMeaning::Depth; - let parent_pinhole_path = transforms.parent_pinhole(ent_path); + // Parent pinhole should only be relevant to 3D views + let parent_pinhole_path = if ent_context.space_view_class_name == SpatialSpaceView3D.name() + { + transforms.parent_pinhole(ent_path) + } else { + None + }; // Instance ids of tensors refer to entries inside the tensor. for (tensor, color, draw_order) in itertools::izip!( @@ -439,7 +451,13 @@ impl ImagesPart { ) -> Result<(), QueryError> { re_tracing::profile_function!(); - let parent_pinhole_path = transforms.parent_pinhole(ent_path); + // Parent pinhole should only be relevant to 3D views + let parent_pinhole_path = if ent_context.space_view_class_name == SpatialSpaceView3D.name() + { + transforms.parent_pinhole(ent_path) + } else { + None + }; // If this isn't an image, return // TODO(jleibs): The ArchetypeView should probably to this for us. diff --git a/crates/re_space_view_spatial/src/parts/mod.rs b/crates/re_space_view_spatial/src/parts/mod.rs index 4060291583d7..00bbbc908a8c 100644 --- a/crates/re_space_view_spatial/src/parts/mod.rs +++ b/crates/re_space_view_spatial/src/parts/mod.rs @@ -43,7 +43,26 @@ pub type Keypoints = HashMap<(re_types::components::ClassId, i64), HashMap Result<(), SpaceViewClassRegistryError> { + // Note: 2D spatial systems don't include cameras as this + // part only shows a 2D projection WITHIN a 3D view. + system_registry.register_part_system::()?; + system_registry.register_part_system::()?; + system_registry.register_part_system::()?; + system_registry.register_part_system::()?; + system_registry.register_part_system::()?; + system_registry.register_part_system::()?; + system_registry.register_part_system::()?; + system_registry.register_part_system::()?; + system_registry.register_part_system::()?; + system_registry.register_part_system::()?; + system_registry.register_part_system::()?; + Ok(()) +} + +pub fn register_3d_spatial_parts( system_registry: &mut SpaceViewSystemRegistry, ) -> Result<(), SpaceViewClassRegistryError> { system_registry.register_part_system::()?; diff --git a/crates/re_space_view_spatial/src/space_view_2d.rs b/crates/re_space_view_spatial/src/space_view_2d.rs index 42d08e10e2bc..0aaf94eb1020 100644 --- a/crates/re_space_view_spatial/src/space_view_2d.rs +++ b/crates/re_space_view_spatial/src/space_view_2d.rs @@ -6,9 +6,9 @@ use re_viewer_context::{ }; use crate::{ - contexts::{register_contexts, PrimitiveCounter}, + contexts::{register_spatial_contexts, PrimitiveCounter}, heuristics::{auto_spawn_heuristic, update_object_property_heuristics}, - parts::{calculate_bounding_box, register_parts}, + parts::{calculate_bounding_box, register_2d_spatial_parts}, ui::SpatialSpaceViewState, view_kind::SpatialSpaceViewKind, }; @@ -35,8 +35,9 @@ impl SpaceViewClass for SpatialSpaceView2D { &self, system_registry: &mut re_viewer_context::SpaceViewSystemRegistry, ) -> Result<(), SpaceViewClassRegistryError> { - register_contexts(system_registry)?; - register_parts(system_registry)?; + register_spatial_contexts(system_registry)?; + register_2d_spatial_parts(system_registry)?; + Ok(()) } diff --git a/crates/re_space_view_spatial/src/space_view_3d.rs b/crates/re_space_view_spatial/src/space_view_3d.rs index 02703b539016..7ab618aab3b7 100644 --- a/crates/re_space_view_spatial/src/space_view_3d.rs +++ b/crates/re_space_view_spatial/src/space_view_3d.rs @@ -6,9 +6,9 @@ use re_viewer_context::{ }; use crate::{ - contexts::{register_contexts, PrimitiveCounter}, + contexts::{register_spatial_contexts, PrimitiveCounter}, heuristics::{auto_spawn_heuristic, update_object_property_heuristics}, - parts::{calculate_bounding_box, register_parts, CamerasPart}, + parts::{calculate_bounding_box, register_3d_spatial_parts, CamerasPart}, ui::SpatialSpaceViewState, view_kind::SpatialSpaceViewKind, }; @@ -35,8 +35,9 @@ impl SpaceViewClass for SpatialSpaceView3D { &self, system_registry: &mut re_viewer_context::SpaceViewSystemRegistry, ) -> Result<(), SpaceViewClassRegistryError> { - register_contexts(system_registry)?; - register_parts(system_registry)?; + register_spatial_contexts(system_registry)?; + register_3d_spatial_parts(system_registry)?; + Ok(()) }