@@ -3,7 +3,7 @@ use std::{borrow::Cow, str::FromStr as _};
3
3
use ahash:: HashMap ;
4
4
use egui:: { Ui , text_edit:: TextEditState , text_selection:: LabelSelectionState } ;
5
5
6
- use re_chunk:: TimelineName ;
6
+ use re_chunk:: { Timeline , TimelineName } ;
7
7
use re_chunk_store:: LatestAtQuery ;
8
8
use re_entity_db:: EntityDb ;
9
9
use re_log_types:: { AbsoluteTimeRangeF , DataSourceMessage , StoreId , TableId } ;
@@ -14,9 +14,10 @@ use re_types::blueprint::components::PanelState;
14
14
use re_ui:: { ContextExt as _, UiExt as _} ;
15
15
use re_viewer_context:: {
16
16
AppOptions , ApplicationSelectionState , AsyncRuntimeHandle , BlueprintUndoState , CommandSender ,
17
- ComponentUiRegistry , DisplayMode , DragAndDropManager , GlobalContext , Item , PlayState ,
18
- RecordingConfig , SelectionChange , StorageContext , StoreContext , StoreHub , SystemCommand ,
19
- SystemCommandSender as _, TableStore , ViewClassRegistry , ViewStates , ViewerContext ,
17
+ ComponentUiRegistry , DataQueryResult , DisplayMode , DragAndDropManager , GlobalContext ,
18
+ IndicatedEntities , Item , MaybeVisualizableEntities , PerVisualizer , PlayState , RecordingConfig ,
19
+ SelectionChange , StorageContext , StoreContext , StoreHub , SystemCommand ,
20
+ SystemCommandSender as _, TableStore , ViewClassRegistry , ViewId , ViewStates , ViewerContext ,
20
21
blueprint_timeline,
21
22
open_url:: { self , ViewerOpenUrl } ,
22
23
} ;
@@ -278,7 +279,7 @@ impl AppState {
278
279
view_class_registry. indicated_entities_per_visualizer ( recording. store_id ( ) ) ;
279
280
280
281
// Execute the queries for every `View`
281
- let mut query_results = {
282
+ let query_results = {
282
283
re_tracing:: profile_scope!( "query_results" ) ;
283
284
viewport_ui
284
285
. blueprint
@@ -359,39 +360,18 @@ impl AppState {
359
360
// Update the viewport. May spawn new views and handle queued requests (like screenshots).
360
361
viewport_ui. on_frame_start ( & ctx) ;
361
362
362
- for view in viewport_ui. blueprint . views . values ( ) {
363
- if let Some ( query_result) = query_results. get_mut ( & view. id ) {
364
- // TODO(andreas): This needs to be done in a store subscriber that exists per view (instance, not class!).
365
- // Note that right now we determine *all* visualizable entities, not just the queried ones.
366
- // In a store subscriber set this is fine, but on a per-frame basis it's wasteful.
367
- let visualizable_entities = view
368
- . class ( view_class_registry)
369
- . determine_visualizable_entities (
370
- & maybe_visualizable_entities_per_visualizer,
371
- recording,
372
- & view_class_registry
373
- . new_visualizer_collection ( view. class_identifier ( ) ) ,
374
- & view. space_origin ,
375
- ) ;
376
-
377
- let resolver = re_viewport_blueprint:: DataQueryPropertyResolver :: new (
378
- view,
379
- view_class_registry,
380
- & maybe_visualizable_entities_per_visualizer,
381
- & visualizable_entities,
382
- & indicated_entities_per_visualizer,
383
- ) ;
384
-
385
- resolver. update_overrides (
386
- store_context. blueprint ,
387
- & blueprint_query,
388
- rec_cfg. time_ctrl . read ( ) . timeline ( ) ,
389
- view_class_registry,
390
- query_result,
391
- view_states,
392
- ) ;
393
- }
394
- }
363
+ let active_timeline = * rec_cfg. time_ctrl . read ( ) . timeline ( ) ;
364
+ let query_results = update_overrides (
365
+ store_context,
366
+ query_results,
367
+ view_class_registry,
368
+ & viewport_ui. blueprint ,
369
+ & blueprint_query,
370
+ & active_timeline,
371
+ & maybe_visualizable_entities_per_visualizer,
372
+ & indicated_entities_per_visualizer,
373
+ view_states,
374
+ ) ;
395
375
396
376
// We need to recreate the context to appease the borrow checker. It is a bit annoying, but
397
377
// it's just a bunch of refs so not really that big of a deal in practice.
@@ -760,6 +740,93 @@ impl AppState {
760
740
}
761
741
}
762
742
743
+ /// Updates the query results for the given viewport UI.
744
+ ///
745
+ /// Returns query results derived from the previous one.
746
+ #[ expect( clippy:: too_many_arguments) ]
747
+ fn update_overrides (
748
+ store_context : & StoreContext < ' _ > ,
749
+ mut query_results : HashMap < ViewId , DataQueryResult > ,
750
+ view_class_registry : & ViewClassRegistry ,
751
+ viewport_blueprint : & ViewportBlueprint ,
752
+ blueprint_query : & LatestAtQuery ,
753
+ active_timeline : & Timeline ,
754
+ maybe_visualizable_entities_per_visualizer : & PerVisualizer < MaybeVisualizableEntities > ,
755
+ indicated_entities_per_visualizer : & PerVisualizer < IndicatedEntities > ,
756
+ view_states : & mut ViewStates ,
757
+ ) -> HashMap < ViewId , DataQueryResult > {
758
+ use rayon:: iter:: { IntoParallelIterator as _, ParallelIterator as _} ;
759
+
760
+ struct OverridesUpdateTask < ' a > {
761
+ view : & ' a re_viewport_blueprint:: ViewBlueprint ,
762
+ view_state : & ' a dyn re_viewer_context:: ViewState ,
763
+ query_result : DataQueryResult ,
764
+ }
765
+
766
+ for view in viewport_blueprint. views . values ( ) {
767
+ view_states. ensure_state_exists ( view. id , view. class ( view_class_registry) ) ;
768
+ }
769
+
770
+ let work_items = viewport_blueprint
771
+ . views
772
+ . values ( )
773
+ . filter_map ( |view| {
774
+ query_results. remove ( & view. id ) . map ( |query_result| {
775
+ let view_state = view_states
776
+ . get ( view. id )
777
+ . expect ( "View state should exist, we just called ensure_state_exists on it." ) ;
778
+ OverridesUpdateTask {
779
+ view,
780
+ view_state,
781
+ query_result,
782
+ }
783
+ } )
784
+ } )
785
+ . collect :: < Vec < _ > > ( ) ;
786
+
787
+ work_items
788
+ . into_par_iter ( )
789
+ . map (
790
+ |OverridesUpdateTask {
791
+ view,
792
+ view_state,
793
+ mut query_result,
794
+ } | {
795
+ // TODO(andreas): This needs to be done in a store subscriber that exists per view (instance, not class!).
796
+ // Note that right now we determine *all* visualizable entities, not just the queried ones.
797
+ // In a store subscriber set this is fine, but on a per-frame basis it's wasteful.
798
+ let visualizable_entities = view
799
+ . class ( view_class_registry)
800
+ . determine_visualizable_entities (
801
+ maybe_visualizable_entities_per_visualizer,
802
+ store_context. recording ,
803
+ & view_class_registry. new_visualizer_collection ( view. class_identifier ( ) ) ,
804
+ & view. space_origin ,
805
+ ) ;
806
+
807
+ let resolver = re_viewport_blueprint:: DataQueryPropertyResolver :: new (
808
+ view,
809
+ view_class_registry,
810
+ maybe_visualizable_entities_per_visualizer,
811
+ & visualizable_entities,
812
+ indicated_entities_per_visualizer,
813
+ ) ;
814
+
815
+ resolver. update_overrides (
816
+ store_context. blueprint ,
817
+ blueprint_query,
818
+ active_timeline,
819
+ view_class_registry,
820
+ & mut query_result,
821
+ view_state,
822
+ ) ;
823
+
824
+ ( view. id , query_result)
825
+ } ,
826
+ )
827
+ . collect ( )
828
+ }
829
+
763
830
fn table_ui (
764
831
ctx : & ViewerContext < ' _ > ,
765
832
runtime : & AsyncRuntimeHandle ,
0 commit comments