diff --git a/crates/re_renderer/src/transform.rs b/crates/re_renderer/src/transform.rs index dc06b42c6d07..b3aa4ba95339 100644 --- a/crates/re_renderer/src/transform.rs +++ b/crates/re_renderer/src/transform.rs @@ -36,7 +36,7 @@ pub fn ndc_from_pixel(pixel_coord: glam::Vec2, screen_extent: glam::UVec2) -> gl /// Defines a transformation from a rectangular region of interest into a rectangular target region. /// -/// Transforms map the range of `region_of_interest` to the range of `region`. +/// Transforms the range of `region_of_interest` to the range of `region`. #[derive(Clone, Debug)] pub struct RectTransform { pub region_of_interest: RectF32, diff --git a/crates/re_renderer/src/view_builder.rs b/crates/re_renderer/src/view_builder.rs index e9471b8430e1..d29ed3a2aa5e 100644 --- a/crates/re_renderer/src/view_builder.rs +++ b/crates/re_renderer/src/view_builder.rs @@ -152,6 +152,7 @@ impl Default for AutoSizeConfig { pub struct TargetConfiguration { pub name: DebugLabel, + /// The viewport resolution in physical pixels. pub resolution_in_pixel: [u32; 2], pub view_from_world: macaw::IsoTransform, pub projection_from_view: Projection, diff --git a/crates/re_space_view_spatial/src/ui_2d.rs b/crates/re_space_view_spatial/src/ui_2d.rs index cddd22f4b2e3..0a8b0db49981 100644 --- a/crates/re_space_view_spatial/src/ui_2d.rs +++ b/crates/re_space_view_spatial/src/ui_2d.rs @@ -389,16 +389,16 @@ pub fn view_2d( } fn setup_target_config( - painter: &egui::Painter, + egui_painter: &egui::Painter, canvas_from_ui: RectTransform, space_name: &str, auto_size_config: re_renderer::AutoSizeConfig, any_outlines: bool, pinhole: Option, ) -> anyhow::Result { - let pixels_from_points = painter.ctx().pixels_per_point(); + let pixels_from_points = egui_painter.ctx().pixels_per_point(); let resolution_in_pixel = - gpu_bridge::viewport_resolution_in_pixels(painter.clip_rect(), pixels_from_points); + gpu_bridge::viewport_resolution_in_pixels(egui_painter.clip_rect(), pixels_from_points); anyhow::ensure!(resolution_in_pixel[0] > 0 && resolution_in_pixel[1] > 0); // TODO(#1988): @@ -457,8 +457,8 @@ fn setup_target_config( // Cut to the portion of the currently visible ui area. let mut viewport_transformation = re_renderer::RectTransform { - region_of_interest: egui_rect_to_re_renderer(painter.clip_rect()), - region: egui_rect_to_re_renderer(*canvas_from_ui.from()), + region_of_interest: re_render_rect_from_egui_rect(egui_painter.clip_rect()), + region: re_render_rect_from_egui_rect(*canvas_from_ui.from()), }; // The principal point might not be quite centered. @@ -478,12 +478,12 @@ fn setup_target_config( viewport_transformation, pixels_from_point: pixels_from_points, auto_size_config, - outline_config: any_outlines.then(|| outline_config(painter.ctx())), + outline_config: any_outlines.then(|| outline_config(egui_painter.ctx())), } }) } -fn egui_rect_to_re_renderer(rect: egui::Rect) -> re_renderer::RectF32 { +fn re_render_rect_from_egui_rect(rect: egui::Rect) -> re_renderer::RectF32 { re_renderer::RectF32 { min: glam::vec2(rect.left(), rect.top()), extent: glam::vec2(rect.width(), rect.height()), diff --git a/crates/re_viewer_context/src/gpu_bridge/mod.rs b/crates/re_viewer_context/src/gpu_bridge/mod.rs index 8acbce342007..2df9912f731a 100644 --- a/crates/re_viewer_context/src/gpu_bridge/mod.rs +++ b/crates/re_viewer_context/src/gpu_bridge/mod.rs @@ -117,7 +117,7 @@ pub fn get_or_create_texture<'a>( /// Render the given image, respecting the clip rectangle of the given painter. pub fn render_image( render_ctx: &mut re_renderer::RenderContext, - painter: &egui::Painter, + egui_painter: &egui::Painter, image_rect_on_screen: egui::Rect, colormapped_texture: ColormappedTexture, texture_options: egui::TextureOptions, @@ -127,12 +127,13 @@ pub fn render_image( use re_renderer::renderer::{TextureFilterMag, TextureFilterMin}; - let clip_rect = painter.clip_rect().intersect(image_rect_on_screen); - if !clip_rect.is_positive() { + let viewport = egui_painter.clip_rect().intersect(image_rect_on_screen); + if !viewport.is_positive() { return Ok(()); } // Where in "world space" to paint the image. + // This is an arbitrary selection. let space_rect = egui::Rect::from_min_size(egui::Pos2::ZERO, image_rect_on_screen.size()); let textured_rectangle = re_renderer::renderer::TexturedRect { @@ -156,19 +157,20 @@ pub fn render_image( // ------------------------------------------------------------------------ - let pixels_from_points = painter.ctx().pixels_per_point(); + let pixels_from_points = egui_painter.ctx().pixels_per_point(); let ui_from_space = egui::emath::RectTransform::from_to(space_rect, image_rect_on_screen); let space_from_ui = ui_from_space.inverse(); let space_from_points = space_from_ui.scale().y; - let points_from_pixels = 1.0 / painter.ctx().pixels_per_point(); + let points_from_pixels = 1.0 / egui_painter.ctx().pixels_per_point(); let space_from_pixel = space_from_points * points_from_pixels; - let resolution_in_pixel = viewport_resolution_in_pixels(clip_rect, pixels_from_points); + let resolution_in_pixel = viewport_resolution_in_pixels(viewport, pixels_from_points); anyhow::ensure!(resolution_in_pixel[0] > 0 && resolution_in_pixel[1] > 0); - let camera_position_space = space_from_ui.transform_pos(clip_rect.min); + let camera_position_space = space_from_ui.transform_pos(viewport.min); let top_left_position = glam::vec2(camera_position_space.x, camera_position_space.y); + let target_config = re_renderer::view_builder::TargetConfiguration { name: debug_name.into(), resolution_in_pixel, @@ -191,10 +193,10 @@ pub fn render_image( &[textured_rectangle], )?); - painter.add(new_renderer_callback( + egui_painter.add(new_renderer_callback( render_ctx, view_builder, - clip_rect, + viewport, re_renderer::Rgba::TRANSPARENT, )); diff --git a/crates/re_viewer_context/src/gpu_bridge/re_renderer_callback.rs b/crates/re_viewer_context/src/gpu_bridge/re_renderer_callback.rs index 3b6f87901c66..70ecfd337c89 100644 --- a/crates/re_viewer_context/src/gpu_bridge/re_renderer_callback.rs +++ b/crates/re_viewer_context/src/gpu_bridge/re_renderer_callback.rs @@ -5,7 +5,7 @@ type ViewBuilderMap = slotmap::SlotMap egui::PaintCallback { let composition_view_builder_map = render_ctx @@ -16,7 +16,7 @@ pub fn new_renderer_callback( let view_builder_handle = composition_view_builder_map.insert(Some(view_builder)); egui_wgpu::Callback::new_paint_callback( - clip_rect, + viewport, ReRendererCallback { view_builder: view_builder_handle, clear_color,