Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions Cargo.lock
Original file line number Diff line number Diff line change
Expand Up @@ -10161,6 +10161,7 @@ dependencies = [
"bytemuck",
"egui",
"half",
"macaw",
"ndarray",
"re_chunk_store",
"re_data_ui",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,4 +36,9 @@ table Tensor (
/// E.g. if all values are positive, some bigger than 1.0 and all smaller than 255.0,
/// the Viewer will guess that the data likely came from an 8bit image, thus assuming a range of 0-255.
value_range: rerun.components.ValueRange ("attr.rerun.component_optional", nullable, order: 2000);

/// Opacity of the tensor for 2D views.
///
/// Only applied when the tensor is displayed as a 2D slice.
opacity: rerun.components.Opacity ("attr.rerun.component_optional", nullable, order: 3000);
}
102 changes: 89 additions & 13 deletions crates/store/re_sdk_types/src/archetypes/tensor.rs

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

7 changes: 7 additions & 0 deletions crates/store/re_sdk_types/src/reflection/mod.rs

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@ use egui::{Response, Ui};
use itertools::Itertools as _;
use nohash_hasher::IntSet;
use re_log_types::{EntityPath, EntityPathFilter, EntityPathRule, RuleEffect};
use re_sdk_types::View as _;
use re_sdk_types::ViewClassIdentifier;
use re_sdk_types::blueprint::views::TensorView;
use re_ui::UiExt as _;
use re_viewer_context::{Item, RecommendedView, SystemCommand, SystemCommandSender as _};
use re_viewport_blueprint::ViewBlueprint;
Expand Down Expand Up @@ -126,15 +128,14 @@ fn create_view_for_selected_entities(
.filter_map(|(item, _)| item.entity_path().cloned())
.collect::<IntSet<_>>();

let origin = ctx
let view_class = ctx
.viewer_context
.view_class_registry()
.get_class_or_log_error(identifier)
.get_class_or_log_error(identifier);
let origin = view_class
.recommended_origin_for_entities(&entities_of_interest, ctx.viewer_context.recording())
.unwrap_or_else(EntityPath::root);

let mut query_filter = EntityPathFilter::default();

let target_container_id = ctx
.clicked_item_enclosing_container_id_and_position()
.map(|(id, _)| id);
Expand All @@ -143,25 +144,48 @@ fn create_view_for_selected_entities(
// relative to the origin. This makes sense since if you create a view and
// then change the origin you likely wanted those entities to still be there.

#[expect(clippy::iter_over_hash_type)] // Order of rule insertion does not matter here
for path in entities_of_interest {
query_filter.insert_rule(
RuleEffect::Include,
EntityPathRule::including_entity_subtree(&path),
);
}
let recommended = RecommendedView {
origin,
query_filter,
};
if identifier == TensorView::identifier() && entities_of_interest.len() > 1 {
let mut entities = entities_of_interest.into_iter().collect::<Vec<_>>();
entities.sort();

let view = ViewBlueprint::new(identifier, recommended);
let view_id = view.id;
ctx.viewport_blueprint
.add_views(std::iter::once(view), target_container_id, None);
ctx.viewer_context
.command_sender()
.send_system(SystemCommand::set_selection(Item::View(view_id)));
let mut views = Vec::with_capacity(entities.len());
for entity_path in entities {
views.push(ViewBlueprint::new(
identifier,
RecommendedView::new_single_entity(entity_path),
));
}

if let Some(view_id) = views.first().map(|view| view.id) {
ctx.viewport_blueprint
.add_views(views.into_iter(), target_container_id, None);
ctx.viewer_context
.command_sender()
.send_system(SystemCommand::set_selection(Item::View(view_id)));
}
} else {
let mut query_filter = EntityPathFilter::default();

#[expect(clippy::iter_over_hash_type)] // Order of rule insertion does not matter here
for path in entities_of_interest {
query_filter.insert_rule(
RuleEffect::Include,
EntityPathRule::including_entity_subtree(&path),
);
}
let recommended = RecommendedView {
origin,
query_filter,
};

let view = ViewBlueprint::new(identifier, recommended);
let view_id = view.id;
ctx.viewport_blueprint
.add_views(std::iter::once(view), target_container_id, None);
ctx.viewer_context
.command_sender()
.send_system(SystemCommand::set_selection(Item::View(view_id)));
}
ctx.viewport_blueprint
.mark_user_interaction(ctx.viewer_context);
}
1 change: 1 addition & 0 deletions crates/viewer/re_data_ui/src/image.rs
Original file line number Diff line number Diff line change
Expand Up @@ -166,6 +166,7 @@ fn show_image_preview(
..Default::default()
},
debug_name.into(),
None,
) {
let color = ui.visuals().error_fg_color;
painter.text(
Expand Down
2 changes: 2 additions & 0 deletions crates/viewer/re_view_spatial/src/picking_ui_pixel.rs
Original file line number Diff line number Diff line change
Expand Up @@ -234,6 +234,7 @@ fn try_show_zoomed_image_region(
colormapped_texture.clone(),
egui::TextureOptions::NEAREST,
interaction_id.debug_label("zoomed_region"),
None,
)?;
}

Expand Down Expand Up @@ -293,6 +294,7 @@ fn try_show_zoomed_image_region(
colormapped_texture,
egui::TextureOptions::NEAREST,
interaction_id.debug_label("single_pixel"),
None,
)
})
.inner?;
Expand Down
3 changes: 2 additions & 1 deletion crates/viewer/re_view_tensor/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ re_sdk_types.workspace = true
re_ui.workspace = true
re_viewer_context.workspace = true
re_viewport_blueprint.workspace = true

macaw.workspace = true
anyhow.workspace = true
bytemuck.workspace = true
egui.workspace = true
Expand All @@ -39,6 +39,7 @@ ndarray.workspace = true
thiserror.workspace = true
wgpu.workspace = true


[dev-dependencies]
re_test_context.workspace = true
re_test_viewport.workspace = true
1 change: 1 addition & 0 deletions crates/viewer/re_view_tensor/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

mod dimension_mapping;
mod tensor_dimension_mapper;
mod tensor_slice_hover;
mod tensor_slice_to_gpu;
mod view_class;
mod visualizer_system;
Expand Down
Loading
Loading