1
1
use itertools:: Itertools as _;
2
2
use rand:: Rng ;
3
3
use re_renderer:: {
4
+ renderer:: MeshInstance ,
4
5
view_builder:: { Projection , TargetConfiguration , ViewBuilder } ,
5
- Color32 , GpuReadbackIdentifier , IntRect , PickingLayerInstanceId , PickingLayerProcessor ,
6
- PointCloudBuilder , Size ,
6
+ Color32 , GpuReadbackIdentifier , IntRect , PickingLayerId , PickingLayerInstanceId ,
7
+ PickingLayerProcessor , PointCloudBuilder , Size ,
7
8
} ;
8
9
9
10
mod framework;
@@ -18,6 +19,8 @@ struct PointSet {
18
19
struct Picking {
19
20
point_sets : Vec < PointSet > ,
20
21
picking_position : glam:: UVec2 ,
22
+ model_mesh_instances : Vec < MeshInstance > ,
23
+ mesh_is_hovered : bool ,
21
24
}
22
25
23
26
fn random_color ( rnd : & mut impl rand:: Rng ) -> Color32 {
@@ -34,6 +37,12 @@ fn random_color(rnd: &mut impl rand::Rng) -> Color32 {
34
37
/// Identifiers don't need to be unique and we don't have anything interesting to distinguish here!
35
38
const READBACK_IDENTIFIER : GpuReadbackIdentifier = 0 ;
36
39
40
+ /// Mesh ID used for picking. Uses the entire 64bit range for testing.
41
+ const MESH_ID : PickingLayerId = PickingLayerId {
42
+ object : re_renderer:: PickingLayerObjectId ( 0x1234_5678_9012_3456 ) ,
43
+ instance : re_renderer:: PickingLayerInstanceId ( 0x3456_1234_5678_9012 ) ,
44
+ } ;
45
+
37
46
impl framework:: Example for Picking {
38
47
fn title ( ) -> & ' static str {
39
48
"Picking"
@@ -43,10 +52,10 @@ impl framework::Example for Picking {
43
52
self . picking_position = position_in_pixel;
44
53
}
45
54
46
- fn new ( _re_ctx : & mut re_renderer:: RenderContext ) -> Self {
55
+ fn new ( re_ctx : & mut re_renderer:: RenderContext ) -> Self {
47
56
let mut rnd = <rand:: rngs:: StdRng as rand:: SeedableRng >:: seed_from_u64 ( 42 ) ;
48
57
let random_point_range = -5.0_f32 ..5.0_f32 ;
49
- let point_count = 10000 ;
58
+ let point_count = 1000 ;
50
59
51
60
// Split point cloud into several batches to test picking of multiple objects.
52
61
let point_sets = ( 0 ..2 )
@@ -72,9 +81,13 @@ impl framework::Example for Picking {
72
81
} )
73
82
. collect_vec ( ) ;
74
83
84
+ let model_mesh_instances = crate :: framework:: load_rerun_mesh ( re_ctx) ;
85
+
75
86
Picking {
76
87
point_sets,
88
+ model_mesh_instances,
77
89
picking_position : glam:: UVec2 :: ZERO ,
90
+ mesh_is_hovered : false ,
78
91
}
79
92
}
80
93
@@ -93,7 +106,12 @@ impl framework::Example for Picking {
93
106
+ ( picking_result. rect . extent . y / 2 ) * picking_result. rect . extent . x )
94
107
as usize ] ;
95
108
96
- if picked_pixel. object . 0 != 0 {
109
+ self . mesh_is_hovered = false ;
110
+ if picked_pixel == MESH_ID {
111
+ self . mesh_is_hovered = true ;
112
+ } else if picked_pixel. object . 0 != 0
113
+ && picked_pixel. object . 0 <= self . point_sets . len ( ) as u64
114
+ {
97
115
let point_set = & mut self . point_sets [ picked_pixel. object . 0 as usize - 1 ] ;
98
116
point_set. radii [ picked_pixel. instance . 0 as usize ] = Size :: new_scene ( 0.1 ) ;
99
117
point_set. colors [ picked_pixel. instance . 0 as usize ] = Color32 :: DEBUG_COLOR ;
@@ -139,10 +157,9 @@ impl framework::Example for Picking {
139
157
. schedule_picking_rect ( re_ctx, picking_rect, READBACK_IDENTIFIER , ( ) , false )
140
158
. unwrap ( ) ;
141
159
142
- let mut builder = PointCloudBuilder :: < ( ) > :: new ( re_ctx) ;
143
-
160
+ let mut point_builder = PointCloudBuilder :: < ( ) > :: new ( re_ctx) ;
144
161
for ( i, point_set) in self . point_sets . iter ( ) . enumerate ( ) {
145
- builder
162
+ point_builder
146
163
. batch ( format ! ( "Random Points {i}" ) )
147
164
. picking_object_id ( re_renderer:: PickingLayerObjectId ( i as u64 + 1 ) ) // offset by one since 0=default=no hit
148
165
. add_points (
@@ -153,7 +170,29 @@ impl framework::Example for Picking {
153
170
. colors ( point_set. colors . iter ( ) . cloned ( ) )
154
171
. picking_instance_ids ( point_set. picking_ids . iter ( ) . cloned ( ) ) ;
155
172
}
156
- view_builder. queue_draw ( & builder. to_draw_data ( re_ctx) . unwrap ( ) ) ;
173
+ view_builder. queue_draw ( & point_builder. to_draw_data ( re_ctx) . unwrap ( ) ) ;
174
+
175
+ let instances = self
176
+ . model_mesh_instances
177
+ . iter ( )
178
+ . map ( |instance| MeshInstance {
179
+ gpu_mesh : instance. gpu_mesh . clone ( ) ,
180
+ mesh : None ,
181
+ world_from_mesh : glam:: Affine3A :: from_translation ( glam:: vec3 ( 0.0 , 0.0 , 0.0 ) ) ,
182
+ picking_layer_id : MESH_ID ,
183
+ additive_tint : if self . mesh_is_hovered {
184
+ Color32 :: DEBUG_COLOR
185
+ } else {
186
+ Color32 :: TRANSPARENT
187
+ } ,
188
+ ..Default :: default ( )
189
+ } )
190
+ . collect_vec ( ) ;
191
+
192
+ view_builder. queue_draw ( & re_renderer:: renderer:: GenericSkyboxDrawData :: new ( re_ctx) ) ;
193
+ view_builder
194
+ . queue_draw ( & re_renderer:: renderer:: MeshDrawData :: new ( re_ctx, & instances) . unwrap ( ) ) ;
195
+
157
196
view_builder. queue_draw ( & re_renderer:: renderer:: GenericSkyboxDrawData :: new ( re_ctx) ) ;
158
197
159
198
let command_buffer = view_builder
0 commit comments