Skip to content

Commit

Permalink
More tracking / filtering of state
Browse files Browse the repository at this point in the history
  • Loading branch information
jleibs committed May 8, 2023
1 parent fea25e9 commit 9e7dc17
Show file tree
Hide file tree
Showing 5 changed files with 86 additions and 39 deletions.
11 changes: 6 additions & 5 deletions crates/re_viewer/src/blueprint_components/viewport.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
use ahash::HashMap;
use arrow2_convert::{ArrowDeserialize, ArrowField, ArrowSerialize};
use re_data_store::ComponentName;
use re_log_types::{serde_field::SerdeField, Component};
Expand All @@ -7,14 +8,14 @@ pub use re_viewer_context::SpaceViewId;
// TODO(jleibs) export this from other viewport def
type VisibilitySet = std::collections::BTreeSet<SpaceViewId>;

#[derive(Clone, ArrowField, ArrowSerialize, ArrowDeserialize)]
#[derive(Clone, Default, ArrowField, ArrowSerialize, ArrowDeserialize)]
pub struct ViewportComponent {
#[arrow_field(type = "SerdeField<VisibilitySet>")]
pub space_view_keys: std::collections::BTreeSet<SpaceViewId>,
#[arrow_field(type = "SerdeField<VisibilitySet>")]
pub visible: VisibilitySet,
// TODO(jleibs): Something down in arrow-convert still requires implementing support for `==`
// Since we're replacing this with our own layout anyways, remove this for now
//#[arrow_field(type = "SerdeField<HashMap<VisibilitySet, egui_dock::Tree<SpaceViewId>>>")]
//trees: HashMap<VisibilitySet, egui_dock::Tree<SpaceViewId>>,
#[arrow_field(type = "SerdeField<HashMap<VisibilitySet, egui_dock::Tree<SpaceViewId>>>")]
pub trees: HashMap<VisibilitySet, egui_dock::Tree<SpaceViewId>>,
#[arrow_field(type = "Option<SerdeField<SpaceViewId>>")]
pub maximized: Option<SpaceViewId>,
pub has_been_user_edited: bool,
Expand Down
89 changes: 56 additions & 33 deletions crates/re_viewer/src/ui/blueprint_load.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
use ahash::HashMap;
use re_arrow_store::{TimeInt, Timeline};
use re_data_store::EntityPath;
use re_log_types::Component;
use re_viewer_context::SpaceViewId;

use crate::blueprint_components::{PanelState, SpaceViewComponent, ViewportComponent};

Expand All @@ -10,9 +12,32 @@ impl Blueprint {
pub fn from_db(egui_ctx: &egui::Context, blueprint_db: &re_data_store::LogDb) -> Self {
let mut ret = Self::new(egui_ctx);

if let Some(viewport) = load_viewport(blueprint_db) {
ret.viewport = viewport;
}
let space_views: HashMap<SpaceViewId, SpaceView> = if let Some(space_views) = blueprint_db
.entity_db
.tree
.children
.get(&re_data_store::EntityPathPart::Name(
SpaceViewComponent::SPACEVIEW_PREFIX.into(),
)) {
space_views
.children
.values()
.filter_map(|view_tree| load_space_view(&view_tree.path, blueprint_db))
.map(|sv| (sv.id, sv))
.collect()
} else {
Default::default()
};

ret.viewport = load_viewport(blueprint_db, space_views);

/*
if viewport.space_view_keys.contains(&space_view.id) {
ret.space_views.insert(space_view.id, space_view.clone());
} else {
ret.viewport.add_space_view(space_view);
}
*/

// TODO(jleibs): maybe just combine these into a single component
// TODO(jleibs): Also, don't use them if they aren't set instead of defaulting to true
Expand All @@ -24,22 +49,6 @@ impl Blueprint {
ret.time_panel_expanded =
load_selection_state(&PanelState::TIMELINE_PANEL.into(), blueprint_db);

if let Some(space_views) =
blueprint_db
.entity_db
.tree
.children
.get(&re_data_store::EntityPathPart::Name(
SpaceViewComponent::SPACEVIEW_PREFIX.into(),
))
{
for tree in space_views.children.values() {
if let Some(space_view) = load_space_view(&tree.path, blueprint_db) {
ret.viewport.add_space_view(space_view);
}
}
}

ret
}
}
Expand Down Expand Up @@ -85,7 +94,10 @@ fn load_space_view(path: &EntityPath, blueprint_db: &re_data_store::LogDb) -> Op
})
}

fn load_viewport(blueprint_db: &re_data_store::LogDb) -> Option<Viewport> {
fn load_viewport(
blueprint_db: &re_data_store::LogDb,
space_views: HashMap<SpaceViewId, SpaceView>,
) -> Viewport {
// TODO(jleibs): This is going to need to be a LOT more ergonomic
let query = re_arrow_store::LatestAtQuery::new(Timeline::default(), TimeInt::MAX);

Expand All @@ -95,18 +107,29 @@ fn load_viewport(blueprint_db: &re_data_store::LogDb) -> Option<Viewport> {
ViewportComponent::name(),
&[ViewportComponent::name()],
);
blueprint_state.and_then(|(_, data)| {
data[0].as_ref().and_then(|cell| {
cell.try_to_native::<ViewportComponent>()
.unwrap()
.next()
.map(|v| Viewport {
space_views: Default::default(),
visible: v.visible,
trees: Default::default(),
maximized: v.maximized,
has_been_user_edited: v.has_been_user_edited,
})

let viewport_component = blueprint_state
.and_then(|(_, data)| {
data[0]
.as_ref()
.and_then(|cell| cell.try_to_native::<ViewportComponent>().unwrap().next())
})
})
.unwrap_or_default();

let mut viewport = Viewport {
// TODO(jleibs): avoid this clone
space_views: space_views.clone(),
visible: viewport_component.visible,
trees: viewport_component.trees,
maximized: viewport_component.maximized,
has_been_user_edited: viewport_component.has_been_user_edited,
};

for (id, view) in space_views {
if !viewport_component.space_view_keys.contains(&id) {
viewport.add_space_view(view);
}
}

viewport
}
2 changes: 2 additions & 0 deletions crates/re_viewer/src/ui/blueprint_sync.rs
Original file line number Diff line number Diff line change
Expand Up @@ -135,7 +135,9 @@ pub fn store_viewport(blueprint_db: &mut re_data_store::LogDb, viewport: &Viewpo
let timepoint = TimePoint::timeless();

let component = ViewportComponent {
space_view_keys: viewport.space_views.keys().cloned().collect(),
visible: viewport.visible.clone(),
trees: viewport.trees.clone(),
maximized: viewport.maximized,
has_been_user_edited: viewport.has_been_user_edited,
};
Expand Down
21 changes: 20 additions & 1 deletion crates/re_viewer/src/ui/view_spatial/ui_3d.rs
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ use super::{

// ---

#[derive(Clone, PartialEq, serde::Deserialize, serde::Serialize)]
#[derive(Clone, serde::Deserialize, serde::Serialize)]
#[serde(default)]
pub struct View3DState {
pub orbit_eye: Option<OrbitEye>,
Expand Down Expand Up @@ -61,6 +61,25 @@ pub struct View3DState {
space_camera: Vec<SpaceCamera3D>, // TODO(andreas): remove this once camera meshes are gone
}

// TODO(jleibs): This state probably doesn't belong in the blueprint in the
// first place. But since serde skips it we also have to ignore it. or else we
// re-store state on every frame. Either way the fact that we don't get it back
// out of the store is going to cause problems.
impl PartialEq for View3DState {
fn eq(&self, other: &Self) -> bool {
self.orbit_eye == other.orbit_eye
&& self.tracked_camera == other.tracked_camera
&& self.camera_before_tracked_camera == other.camera_before_tracked_camera
//&& self.eye_interpolation == other.eye_interpolation
//&& self.hovered_point == other.hovered_point
&& self.spin == other.spin
&& self.show_axes == other.show_axes
&& self.show_bbox == other.show_bbox
//&& self.last_eye_interact_time == other.last_eye_interact_time
//&& self.space_specs == other.space_specs
//&& self.space_camera == other.space_camera
}
}
impl Default for View3DState {
fn default() -> Self {
Self {
Expand Down
2 changes: 2 additions & 0 deletions rerun_py/src/python_bridge.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1201,7 +1201,9 @@ fn set_user_edited(bp_stream: &RecordingStream, user_edited: bool) {
let timepoint = time(true, bp_stream);

let viewport = ViewportComponent {
space_view_keys: Default::default(),
visible: Default::default(),
trees: Default::default(),
maximized: None,
has_been_user_edited: user_edited,
};
Expand Down

0 comments on commit 9e7dc17

Please sign in to comment.