Skip to content

Commit fe7ac0e

Browse files
authored
GPU tensor colormapping (#1841)
* Refactor: introduce struct SliceSelection * Refactor: use SliceSelection inside of ViewTensorState * MVP of tensor colormapping on GPU * Remove old ui code * Support 64-bit tensors by narrowing to f32 * Allow more colormap options * Clippy * Report range errors instead of ignoring them * Sort colormaps * Shorten function name * Create module gpu_bridge * Move some code around * Simnplify API * Create ViewBuilder::new * Fix missing colon in lint.py * fix typos and formatting * Disable texture filtering options for tensors for now * Update docstrings * Add profile scopes * ViewBuilder cleanup * Make ViewBuilder::setup non-Option * Remove Result from thing that cannot fail * Fix colormap numbering * review cleanup * pass in debug_name * Unify the `range` function * typo
1 parent e8e2d9b commit fe7ac0e

File tree

26 files changed

+812
-780
lines changed

26 files changed

+812
-780
lines changed

crates/re_data_store/src/entity_properties.rs

+7-6
Original file line numberDiff line numberDiff line change
@@ -143,23 +143,24 @@ impl ExtraQueryHistory {
143143
pub enum Colormap {
144144
/// Perceptually even
145145
Grayscale,
146+
147+
Inferno,
148+
Magma,
149+
Plasma,
146150
#[default]
147151
Turbo,
148152
Viridis,
149-
Plasma,
150-
Magma,
151-
Inferno,
152153
}
153154

154155
impl std::fmt::Display for Colormap {
155156
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
156157
f.write_str(match self {
157158
Colormap::Grayscale => "Grayscale",
159+
Colormap::Inferno => "Inferno",
160+
Colormap::Magma => "Magma",
161+
Colormap::Plasma => "Plasma",
158162
Colormap::Turbo => "Turbo",
159163
Colormap::Viridis => "Viridis",
160-
Colormap::Plasma => "Plasma",
161-
Colormap::Magma => "Magma",
162-
Colormap::Inferno => "Inferno",
163164
})
164165
}
165166
}

crates/re_log_types/src/data.rs

+19
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,25 @@ impl TensorDataType {
114114
}
115115
}
116116

117+
#[inline]
118+
pub fn min_value(&self) -> f64 {
119+
match self {
120+
Self::U8 => u8::MIN as _,
121+
Self::U16 => u16::MIN as _,
122+
Self::U32 => u32::MIN as _,
123+
Self::U64 => u64::MIN as _,
124+
125+
Self::I8 => i8::MIN as _,
126+
Self::I16 => i16::MIN as _,
127+
Self::I32 => i32::MIN as _,
128+
Self::I64 => i64::MIN as _,
129+
130+
Self::F16 => f16::MIN.into(),
131+
Self::F32 => f32::MIN as _,
132+
Self::F64 => f64::MIN,
133+
}
134+
}
135+
117136
#[inline]
118137
pub fn max_value(&self) -> f64 {
119138
match self {

crates/re_renderer/examples/2d.rs

+33-39
Original file line numberDiff line numberDiff line change
@@ -225,25 +225,22 @@ impl framework::Example for Render2D {
225225
vec![
226226
// 2d view to the left
227227
{
228-
let mut view_builder = ViewBuilder::default();
229-
view_builder
230-
.setup_view(
231-
re_ctx,
232-
TargetConfiguration {
233-
name: "2D".into(),
234-
resolution_in_pixel: splits[0].resolution_in_pixel,
235-
view_from_world: macaw::IsoTransform::IDENTITY,
236-
projection_from_view: Projection::Orthographic {
237-
camera_mode:
238-
view_builder::OrthographicCameraMode::TopLeftCornerAndExtendZ,
239-
vertical_world_size: splits[0].resolution_in_pixel[1] as f32,
240-
far_plane_distance: 1000.0,
241-
},
242-
pixels_from_point,
243-
..Default::default()
228+
let mut view_builder = ViewBuilder::new(
229+
re_ctx,
230+
TargetConfiguration {
231+
name: "2D".into(),
232+
resolution_in_pixel: splits[0].resolution_in_pixel,
233+
view_from_world: macaw::IsoTransform::IDENTITY,
234+
projection_from_view: Projection::Orthographic {
235+
camera_mode:
236+
view_builder::OrthographicCameraMode::TopLeftCornerAndExtendZ,
237+
vertical_world_size: splits[0].resolution_in_pixel[1] as f32,
238+
far_plane_distance: 1000.0,
244239
},
245-
)
246-
.unwrap();
240+
pixels_from_point,
241+
..Default::default()
242+
},
243+
);
247244
view_builder.queue_draw(&line_strip_draw_data);
248245
view_builder.queue_draw(&point_draw_data);
249246
view_builder.queue_draw(&rectangle_draw_data);
@@ -258,7 +255,6 @@ impl framework::Example for Render2D {
258255
},
259256
// and 3d view of the same scene to the right
260257
{
261-
let mut view_builder = ViewBuilder::default();
262258
let seconds_since_startup = time.seconds_since_startup();
263259
let camera_rotation_center = screen_size.extend(0.0) * 0.5;
264260
let camera_position = glam::vec3(
@@ -267,27 +263,25 @@ impl framework::Example for Render2D {
267263
seconds_since_startup.cos(),
268264
) * screen_size.x.max(screen_size.y)
269265
+ camera_rotation_center;
270-
view_builder
271-
.setup_view(
272-
re_ctx,
273-
view_builder::TargetConfiguration {
274-
name: "3D".into(),
275-
resolution_in_pixel: splits[1].resolution_in_pixel,
276-
view_from_world: macaw::IsoTransform::look_at_rh(
277-
camera_position,
278-
camera_rotation_center,
279-
glam::Vec3::Y,
280-
)
281-
.unwrap(),
282-
projection_from_view: Projection::Perspective {
283-
vertical_fov: 70.0 * std::f32::consts::TAU / 360.0,
284-
near_plane_distance: 0.01,
285-
},
286-
pixels_from_point,
287-
..Default::default()
266+
let mut view_builder = ViewBuilder::new(
267+
re_ctx,
268+
view_builder::TargetConfiguration {
269+
name: "3D".into(),
270+
resolution_in_pixel: splits[1].resolution_in_pixel,
271+
view_from_world: macaw::IsoTransform::look_at_rh(
272+
camera_position,
273+
camera_rotation_center,
274+
glam::Vec3::Y,
275+
)
276+
.unwrap(),
277+
projection_from_view: Projection::Perspective {
278+
vertical_fov: 70.0 * std::f32::consts::TAU / 360.0,
279+
near_plane_distance: 0.01,
288280
},
289-
)
290-
.unwrap();
281+
pixels_from_point,
282+
..Default::default()
283+
},
284+
);
291285
let command_buffer = view_builder
292286
.queue_draw(&line_strip_draw_data)
293287
.queue_draw(&point_draw_data)

crates/re_renderer/examples/depth_cloud.rs

+36-42
Original file line numberDiff line numberDiff line change
@@ -110,28 +110,25 @@ impl RenderDepthClouds {
110110
builder.to_draw_data(re_ctx).unwrap()
111111
};
112112

113-
let mut view_builder = ViewBuilder::default();
114-
view_builder
115-
.setup_view(
116-
re_ctx,
117-
view_builder::TargetConfiguration {
118-
name: "Point Cloud".into(),
119-
resolution_in_pixel,
120-
view_from_world: IsoTransform::look_at_rh(
121-
self.camera_position,
122-
Vec3::ZERO,
123-
Vec3::Y,
124-
)
125-
.unwrap(),
126-
projection_from_view: Projection::Perspective {
127-
vertical_fov: 70.0 * std::f32::consts::TAU / 360.0,
128-
near_plane_distance: 0.01,
129-
},
130-
pixels_from_point,
131-
..Default::default()
113+
let mut view_builder = ViewBuilder::new(
114+
re_ctx,
115+
view_builder::TargetConfiguration {
116+
name: "Point Cloud".into(),
117+
resolution_in_pixel,
118+
view_from_world: IsoTransform::look_at_rh(
119+
self.camera_position,
120+
Vec3::ZERO,
121+
Vec3::Y,
122+
)
123+
.unwrap(),
124+
projection_from_view: Projection::Perspective {
125+
vertical_fov: 70.0 * std::f32::consts::TAU / 360.0,
126+
near_plane_distance: 0.01,
132127
},
133-
)
134-
.unwrap();
128+
pixels_from_point,
129+
..Default::default()
130+
},
131+
);
135132

136133
let command_buffer = view_builder
137134
.queue_draw(&GenericSkyboxDrawData::new(re_ctx))
@@ -191,28 +188,25 @@ impl RenderDepthClouds {
191188
)
192189
.unwrap();
193190

194-
let mut view_builder = ViewBuilder::default();
195-
view_builder
196-
.setup_view(
197-
re_ctx,
198-
view_builder::TargetConfiguration {
199-
name: "Depth Cloud".into(),
200-
resolution_in_pixel,
201-
view_from_world: IsoTransform::look_at_rh(
202-
self.camera_position,
203-
Vec3::ZERO,
204-
Vec3::Y,
205-
)
206-
.unwrap(),
207-
projection_from_view: Projection::Perspective {
208-
vertical_fov: 70.0 * std::f32::consts::TAU / 360.0,
209-
near_plane_distance: 0.01,
210-
},
211-
pixels_from_point,
212-
..Default::default()
191+
let mut view_builder = ViewBuilder::new(
192+
re_ctx,
193+
view_builder::TargetConfiguration {
194+
name: "Depth Cloud".into(),
195+
resolution_in_pixel,
196+
view_from_world: IsoTransform::look_at_rh(
197+
self.camera_position,
198+
Vec3::ZERO,
199+
Vec3::Y,
200+
)
201+
.unwrap(),
202+
projection_from_view: Projection::Perspective {
203+
vertical_fov: 70.0 * std::f32::consts::TAU / 360.0,
204+
near_plane_distance: 0.01,
213205
},
214-
)
215-
.unwrap();
206+
pixels_from_point,
207+
..Default::default()
208+
},
209+
);
216210

217211
let command_buffer = view_builder
218212
.queue_draw(&GenericSkyboxDrawData::new(re_ctx))

crates/re_renderer/examples/framework.rs

+5-8
Original file line numberDiff line numberDiff line change
@@ -288,14 +288,11 @@ impl<E: Example + 'static> Application<E> {
288288
});
289289

290290
for draw_result in &draw_results {
291-
draw_result
292-
.view_builder
293-
.composite(
294-
&self.re_ctx,
295-
&mut composite_pass,
296-
draw_result.target_location,
297-
)
298-
.expect("Failed to composite view main surface");
291+
draw_result.view_builder.composite(
292+
&self.re_ctx,
293+
&mut composite_pass,
294+
draw_result.target_location,
295+
);
299296
}
300297
};
301298

crates/re_renderer/examples/multiview.rs

+1-2
Original file line numberDiff line numberDiff line change
@@ -210,8 +210,7 @@ impl Multiview {
210210
draw_data: &D,
211211
index: u32,
212212
) -> (ViewBuilder, wgpu::CommandBuffer) {
213-
let mut view_builder = ViewBuilder::default();
214-
view_builder.setup_view(re_ctx, target_cfg).unwrap();
213+
let mut view_builder = ViewBuilder::new(re_ctx, target_cfg);
215214

216215
if self
217216
.take_screenshot_next_frame_for_view

crates/re_renderer/examples/outlines.rs

+23-30
Original file line numberDiff line numberDiff line change
@@ -40,44 +40,37 @@ impl framework::Example for Outlines {
4040
time: &framework::Time,
4141
pixels_from_point: f32,
4242
) -> Vec<framework::ViewDrawResult> {
43-
let mut view_builder = ViewBuilder::default();
44-
4543
if !self.is_paused {
4644
self.seconds_since_startup += time.last_frame_duration.as_secs_f32();
4745
}
4846
let seconds_since_startup = self.seconds_since_startup;
4947
// TODO(#1426): unify camera logic between examples.
5048
let camera_position = glam::vec3(1.0, 3.5, 7.0);
5149

52-
view_builder
53-
.setup_view(
54-
re_ctx,
55-
TargetConfiguration {
56-
name: "OutlinesDemo".into(),
57-
resolution_in_pixel: resolution,
58-
view_from_world: macaw::IsoTransform::look_at_rh(
59-
camera_position,
60-
glam::Vec3::ZERO,
61-
glam::Vec3::Y,
62-
)
63-
.unwrap(),
64-
projection_from_view: Projection::Perspective {
65-
vertical_fov: 70.0 * std::f32::consts::TAU / 360.0,
66-
near_plane_distance: 0.01,
67-
},
68-
pixels_from_point,
69-
outline_config: Some(OutlineConfig {
70-
outline_radius_pixel: (seconds_since_startup * 2.0).sin().abs() * 10.0
71-
+ 2.0,
72-
color_layer_a: re_renderer::Rgba::from_rgb(1.0, 0.6, 0.0),
73-
color_layer_b: re_renderer::Rgba::from_rgba_unmultiplied(
74-
0.25, 0.3, 1.0, 0.5,
75-
),
76-
}),
77-
..Default::default()
50+
let mut view_builder = ViewBuilder::new(
51+
re_ctx,
52+
TargetConfiguration {
53+
name: "OutlinesDemo".into(),
54+
resolution_in_pixel: resolution,
55+
view_from_world: macaw::IsoTransform::look_at_rh(
56+
camera_position,
57+
glam::Vec3::ZERO,
58+
glam::Vec3::Y,
59+
)
60+
.unwrap(),
61+
projection_from_view: Projection::Perspective {
62+
vertical_fov: 70.0 * std::f32::consts::TAU / 360.0,
63+
near_plane_distance: 0.01,
7864
},
79-
)
80-
.unwrap();
65+
pixels_from_point,
66+
outline_config: Some(OutlineConfig {
67+
outline_radius_pixel: (seconds_since_startup * 2.0).sin().abs() * 10.0 + 2.0,
68+
color_layer_a: re_renderer::Rgba::from_rgb(1.0, 0.6, 0.0),
69+
color_layer_b: re_renderer::Rgba::from_rgba_unmultiplied(0.25, 0.3, 1.0, 0.5),
70+
}),
71+
..Default::default()
72+
},
73+
);
8174

8275
let outline_mask_large_mesh = match ((seconds_since_startup * 0.5) as u64) % 5 {
8376
0 => OutlineMaskPreference::NONE,

crates/re_renderer/examples/picking.rs

+19-23
Original file line numberDiff line numberDiff line change
@@ -118,33 +118,29 @@ impl framework::Example for Picking {
118118
}
119119
}
120120

121-
let mut view_builder = ViewBuilder::default();
122-
123121
// TODO(#1426): unify camera logic between examples.
124122
let camera_position = glam::vec3(1.0, 3.5, 7.0);
125123

126-
view_builder
127-
.setup_view(
128-
re_ctx,
129-
TargetConfiguration {
130-
name: "OutlinesDemo".into(),
131-
resolution_in_pixel: resolution,
132-
view_from_world: macaw::IsoTransform::look_at_rh(
133-
camera_position,
134-
glam::Vec3::ZERO,
135-
glam::Vec3::Y,
136-
)
137-
.unwrap(),
138-
projection_from_view: Projection::Perspective {
139-
vertical_fov: 70.0 * std::f32::consts::TAU / 360.0,
140-
near_plane_distance: 0.01,
141-
},
142-
pixels_from_point,
143-
outline_config: None,
144-
..Default::default()
124+
let mut view_builder = ViewBuilder::new(
125+
re_ctx,
126+
TargetConfiguration {
127+
name: "OutlinesDemo".into(),
128+
resolution_in_pixel: resolution,
129+
view_from_world: macaw::IsoTransform::look_at_rh(
130+
camera_position,
131+
glam::Vec3::ZERO,
132+
glam::Vec3::Y,
133+
)
134+
.unwrap(),
135+
projection_from_view: Projection::Perspective {
136+
vertical_fov: 70.0 * std::f32::consts::TAU / 360.0,
137+
near_plane_distance: 0.01,
145138
},
146-
)
147-
.unwrap();
139+
pixels_from_point,
140+
outline_config: None,
141+
..Default::default()
142+
},
143+
);
148144

149145
// Use an uneven number of pixels for the picking rect so that there is a clearly defined middle-pixel.
150146
// (for this sample a size of 1 would be sufficient, but for a real application you'd want to use a larger size to allow snapping)

0 commit comments

Comments
 (0)