1
- use std:: sync:: Arc ;
1
+ use std:: { collections :: BTreeMap , sync:: Arc } ;
2
2
3
3
use ahash:: HashMap ;
4
4
5
- use re_data_store:: { EntityPath , InstancePathHash } ;
5
+ use nohash_hasher:: IntMap ;
6
+ use re_data_store:: { query_latest_single, EntityPath , InstancePathHash } ;
6
7
use re_log_types:: {
7
8
component_types:: { ClassId , InstanceKey , KeypointId } ,
8
- DecodedTensor ,
9
+ DecodedTensor , DrawOrder , EntityPathHash ,
9
10
} ;
10
11
use re_renderer:: { renderer:: TexturedRect , Color32 , OutlineMaskPreference , Size } ;
11
12
use re_viewer_context:: { auto_color, AnnotationMap , Annotations , SceneQuery , ViewerContext } ;
13
+ use smallvec:: SmallVec ;
12
14
13
15
use crate :: misc:: { mesh_loader:: LoadedMesh , SpaceViewHighlights , TransformCache } ;
14
16
@@ -91,6 +93,21 @@ pub struct SceneSpatial {
91
93
92
94
pub type Keypoints = HashMap < ( ClassId , i64 ) , HashMap < KeypointId , glam:: Vec3 > > ;
93
95
96
+ #[ derive( Default ) ]
97
+ pub struct EntityDepthOffsets {
98
+ pub per_entity : IntMap < EntityPathHash , re_renderer:: DepthOffset > ,
99
+ pub box2d : re_renderer:: DepthOffset ,
100
+ pub lines2d : re_renderer:: DepthOffset ,
101
+ pub image : re_renderer:: DepthOffset ,
102
+ pub points : re_renderer:: DepthOffset ,
103
+ }
104
+
105
+ impl EntityDepthOffsets {
106
+ pub fn get ( & self , ent_path : & EntityPath ) -> Option < re_renderer:: DepthOffset > {
107
+ self . per_entity . get ( & ent_path. hash ( ) ) . cloned ( )
108
+ }
109
+ }
110
+
94
111
impl SceneSpatial {
95
112
pub fn new ( re_ctx : & mut re_renderer:: RenderContext ) -> Self {
96
113
Self {
@@ -103,6 +120,89 @@ impl SceneSpatial {
103
120
}
104
121
}
105
122
123
+ fn determine_depth_offsets (
124
+ ctx : & mut ViewerContext < ' _ > ,
125
+ query : & SceneQuery < ' _ > ,
126
+ ) -> EntityDepthOffsets {
127
+ crate :: profile_function!( ) ;
128
+
129
+ enum DrawOrderTarget {
130
+ Entity ( EntityPathHash ) ,
131
+ DefaultBox2D ,
132
+ DefaultLines2D ,
133
+ DefaultImage ,
134
+ DefaultPoints ,
135
+ }
136
+
137
+ let mut entities_per_draw_order = BTreeMap :: < DrawOrder , SmallVec < [ _ ; 4 ] > > :: new ( ) ;
138
+ for ( ent_path, _) in query. iter_entities ( ) {
139
+ if let Some ( draw_order) = query_latest_single :: < DrawOrder > (
140
+ & ctx. log_db . entity_db ,
141
+ ent_path,
142
+ & ctx. rec_cfg . time_ctrl . current_query ( ) ,
143
+ ) {
144
+ entities_per_draw_order
145
+ . entry ( draw_order)
146
+ . or_default ( )
147
+ . push ( DrawOrderTarget :: Entity ( ent_path. hash ( ) ) ) ;
148
+ }
149
+ }
150
+
151
+ // Push in default draw orders. All of them using the none hash.
152
+ entities_per_draw_order
153
+ . entry ( DrawOrder :: DEFAULT_BOX2D )
154
+ . or_default ( )
155
+ . push ( DrawOrderTarget :: DefaultBox2D ) ;
156
+ entities_per_draw_order
157
+ . entry ( DrawOrder :: DEFAULT_IMAGE )
158
+ . or_default ( )
159
+ . push ( DrawOrderTarget :: DefaultImage ) ;
160
+ entities_per_draw_order
161
+ . entry ( DrawOrder :: DEFAULT_LINES2D )
162
+ . or_default ( )
163
+ . push ( DrawOrderTarget :: DefaultLines2D ) ;
164
+ entities_per_draw_order
165
+ . entry ( DrawOrder :: DEFAULT_POINTS2D )
166
+ . or_default ( )
167
+ . push ( DrawOrderTarget :: DefaultPoints ) ;
168
+
169
+ // Determine re_renderer draw order from this.
170
+ // We want to be as tightly around 0 as possible.
171
+ let mut offsets = EntityDepthOffsets :: default ( ) ;
172
+ let mut draw_order = -( ( entities_per_draw_order. len ( ) / 2 ) as re_renderer:: DepthOffset ) ;
173
+ offsets. per_entity = entities_per_draw_order
174
+ . into_values ( )
175
+ . flat_map ( move |targets| {
176
+ let pairs = targets
177
+ . into_iter ( )
178
+ . filter_map ( |target| match target {
179
+ DrawOrderTarget :: Entity ( entity) => Some ( ( entity, draw_order) ) ,
180
+ DrawOrderTarget :: DefaultBox2D => {
181
+ offsets. box2d = draw_order;
182
+ None
183
+ }
184
+ DrawOrderTarget :: DefaultLines2D => {
185
+ offsets. lines2d = draw_order;
186
+ None
187
+ }
188
+ DrawOrderTarget :: DefaultImage => {
189
+ offsets. image = draw_order;
190
+ None
191
+ }
192
+ DrawOrderTarget :: DefaultPoints => {
193
+ offsets. points = draw_order;
194
+ None
195
+ }
196
+ } )
197
+ . collect :: < SmallVec < [ _ ; 4 ] > > ( ) ;
198
+ draw_order += 1 ;
199
+ pairs
200
+ } )
201
+ . collect ( ) ;
202
+
203
+ offsets
204
+ }
205
+
106
206
/// Loads all 3D objects into the scene according to the given query.
107
207
pub ( crate ) fn load (
108
208
& mut self ,
@@ -133,8 +233,10 @@ impl SceneSpatial {
133
233
& scene_part:: CamerasPart ,
134
234
] ;
135
235
236
+ let depth_offsets = Self :: determine_depth_offsets ( ctx, query) ;
237
+
136
238
for part in parts {
137
- part. load ( self , ctx, query, transforms, highlights) ;
239
+ part. load ( self , ctx, query, transforms, highlights, & depth_offsets ) ;
138
240
}
139
241
140
242
self . primitives . any_outlines = highlights. any_outlines ( ) ;
0 commit comments