1
0
mirror of https://github.com/emilk/egui.git synced 2026-06-27 23:13:13 -04:00

[epaint] Tessellator: handle sharp path corners better

Switch to bevel joints instead of miter joints for > 90° corners
This commit is contained in:
Emil Ernerfeldt
2021-02-04 18:46:36 +01:00
parent 0f37b009d6
commit 0942a2aa3b
2 changed files with 31 additions and 9 deletions

View File

@@ -35,6 +35,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
### Fixed 🐛
* It is now possible to click widgets even when FPS is very low.
* Tessellator: handle sharp path corners better (switch to bevel instead of miter joints for > 90°).
## 0.8.0 - 2021-01-17 - Grid layout & new visual style

View File

@@ -87,9 +87,21 @@ impl Path {
n1 = n0;
}
let v = (n0 + n1) / 2.0;
let normal = v / v.length_sq(); // TODO: handle VERY sharp turns better
self.add_point(points[i], normal);
let normal = (n0 + n1) / 2.0;
let length_sq = normal.length_sq();
let right_angle_length_sq = 0.5;
let sharper_than_a_right_angle = length_sq < right_angle_length_sq;
if sharper_than_a_right_angle {
// cut off the sharp corner
let center_normal = normal.normalized();
let n0c = (n0 + center_normal) / 2.0;
let n1c = (n1 + center_normal) / 2.0;
self.add_point(points[i], n0c / n0c.length_sq());
self.add_point(points[i], n1c / n1c.length_sq());
} else {
// miter join
self.add_point(points[i], normal / length_sq);
}
}
self.add_point(
points[n - 1],
@@ -115,12 +127,21 @@ impl Path {
n1 = n0;
}
// if n1 == Vec2::zero() {
// continue
// }
let v = (n0 + n1) / 2.0;
let normal = v / v.length_sq(); // TODO: handle VERY sharp turns better
self.add_point(points[i], normal);
let normal = (n0 + n1) / 2.0;
let length_sq = normal.length_sq();
let right_angle_length_sq = 0.5;
let sharper_than_a_right_angle = length_sq < right_angle_length_sq;
if sharper_than_a_right_angle {
// cut off the sharp corner
let center_normal = normal.normalized();
let n0c = (n0 + center_normal) / 2.0;
let n1c = (n1 + center_normal) / 2.0;
self.add_point(points[i], n0c / n0c.length_sq());
self.add_point(points[i], n1c / n1c.length_sq());
} else {
// miter join
self.add_point(points[i], normal / length_sq);
}
}
}
}