Skip to content

Commit

Permalink
Refactor: turn ClippedShape from struct-enum to a normal struct (#3225
Browse files Browse the repository at this point in the history
)
  • Loading branch information
emilk authored Aug 10, 2023
1 parent 66cbb61 commit 83c1849
Show file tree
Hide file tree
Showing 5 changed files with 26 additions and 13 deletions.
8 changes: 4 additions & 4 deletions crates/egui/src/layers.rs
Original file line number Diff line number Diff line change
Expand Up @@ -127,15 +127,15 @@ impl PaintList {
#[inline(always)]
pub fn add(&mut self, clip_rect: Rect, shape: Shape) -> ShapeIdx {
let idx = ShapeIdx(self.0.len());
self.0.push(ClippedShape(clip_rect, shape));
self.0.push(ClippedShape { clip_rect, shape });
idx
}

pub fn extend<I: IntoIterator<Item = Shape>>(&mut self, clip_rect: Rect, shapes: I) {
self.0.extend(
shapes
.into_iter()
.map(|shape| ClippedShape(clip_rect, shape)),
.map(|shape| ClippedShape { clip_rect, shape }),
);
}

Expand All @@ -148,12 +148,12 @@ impl PaintList {
/// and then later setting it using `paint_list.set(idx, cr, frame);`.
#[inline(always)]
pub fn set(&mut self, idx: ShapeIdx, clip_rect: Rect, shape: Shape) {
self.0[idx.0] = ClippedShape(clip_rect, shape);
self.0[idx.0] = ClippedShape { clip_rect, shape };
}

/// Translate each [`Shape`] and clip rectangle by this much, in-place
pub fn translate(&mut self, delta: Vec2) {
for ClippedShape(clip_rect, shape) in &mut self.0 {
for ClippedShape { clip_rect, shape } in &mut self.0 {
*clip_rect = clip_rect.translate(delta);
shape.translate(delta);
}
Expand Down
2 changes: 1 addition & 1 deletion crates/epaint/benches/benchmark.rs
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ fn tessellate_circles(c: &mut Criterion) {
for _ in 0..10_000 {
let clip_rect = Rect::from_min_size(Pos2::ZERO, Vec2::splat(1024.0));
let shape = Shape::circle_filled(Pos2::new(10.0, 10.0), r, Color32::WHITE);
clipped_shapes.push(ClippedShape(clip_rect, shape));
clipped_shapes.push(ClippedShape { clip_rect, shape });
}
}
assert_eq!(clipped_shapes.len(), 100_000);
Expand Down
9 changes: 5 additions & 4 deletions crates/epaint/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -90,13 +90,14 @@ impl Default for TextureId {
///
/// Everything is using logical points.
#[derive(Clone, Debug, PartialEq)]
pub struct ClippedShape(
pub struct ClippedShape {
/// Clip / scissor rectangle.
/// Only show the part of the [`Shape`] that falls within this.
pub emath::Rect,
pub clip_rect: emath::Rect,

/// The shape
pub Shape,
);
pub shape: Shape,
}

/// A [`Mesh`] or [`PaintCallback`] within a clip rectangle.
///
Expand Down
2 changes: 1 addition & 1 deletion crates/epaint/src/stats.rs
Original file line number Diff line number Diff line change
Expand Up @@ -183,7 +183,7 @@ impl PaintStats {
stats.shape_vec.element_size = ElementSize::Heterogenous; // nicer display later

stats.shapes = AllocInfo::from_slice(shapes);
for ClippedShape(_, shape) in shapes {
for ClippedShape { shape, .. } in shapes {
stats.add(shape);
}
stats
Expand Down
18 changes: 15 additions & 3 deletions crates/epaint/src/tessellator.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1036,15 +1036,24 @@ impl Tessellator {
clipped_shape: ClippedShape,
out_primitives: &mut Vec<ClippedPrimitive>,
) {
let ClippedShape(new_clip_rect, new_shape) = clipped_shape;
let ClippedShape {
clip_rect: new_clip_rect,
shape: new_shape,
} = clipped_shape;

if !new_clip_rect.is_positive() {
return; // skip empty clip rectangles
}

if let Shape::Vec(shapes) = new_shape {
for shape in shapes {
self.tessellate_clipped_shape(ClippedShape(new_clip_rect, shape), out_primitives);
self.tessellate_clipped_shape(
ClippedShape {
clip_rect: new_clip_rect,
shape,
},
out_primitives,
);
}
return;
}
Expand Down Expand Up @@ -1641,7 +1650,10 @@ fn test_tessellator() {
shapes.push(Shape::mesh(mesh));

let shape = Shape::Vec(shapes);
let clipped_shapes = vec![ClippedShape(rect, shape)];
let clipped_shapes = vec![ClippedShape {
clip_rect: rect,
shape,
}];

let font_tex_size = [1024, 1024]; // unused
let prepared_discs = vec![]; // unused
Expand Down

0 comments on commit 83c1849

Please sign in to comment.