mirror of
https://github.com/a-b-street/abstreet.git
synced 2024-11-28 12:12:00 +03:00
rotate labels on buses, now that i figured out how to do it reasonably on roads
This commit is contained in:
parent
77fa6eb43d
commit
bfd1b9c190
@ -135,13 +135,14 @@ impl DrawCar {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if let Some(line) = input.label {
|
if let Some(line) = input.label {
|
||||||
// TODO Would rotation make any sense? Or at least adjust position/size while turning.
|
|
||||||
// Buses are a constant length, so hardcoding this is fine.
|
// Buses are a constant length, so hardcoding this is fine.
|
||||||
|
let (pt, angle) = input.body.dist_along(Distance::meters(9.0));
|
||||||
draw_default.append(
|
draw_default.append(
|
||||||
Text::from(Line(line).fg(cs.bus_label))
|
Text::from(Line(line).fg(cs.bus_label))
|
||||||
.render_to_batch(prerender)
|
.render_to_batch(prerender)
|
||||||
.scale(0.07)
|
.scale(0.07)
|
||||||
.centered_on(input.body.dist_along(Distance::meters(9.0)).0),
|
.centered_on(pt)
|
||||||
|
.rotate(angle.reorient()),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -77,19 +77,12 @@ impl Renderable for DrawRoad {
|
|||||||
// even easier, just skip the center lines?
|
// even easier, just skip the center lines?
|
||||||
let txt = Text::from(Line(name).fg(app.cs.road_center_line))
|
let txt = Text::from(Line(name).fg(app.cs.road_center_line))
|
||||||
.bg(app.cs.driving_lane);
|
.bg(app.cs.driving_lane);
|
||||||
let (pt, mut angle) = r.center_pts.dist_along(r.center_pts.length() / 2.0);
|
let (pt, angle) = r.center_pts.dist_along(r.center_pts.length() / 2.0);
|
||||||
let theta = angle.normalized_degrees().rem_euclid(360.0);
|
|
||||||
if theta > 90.0 {
|
|
||||||
angle = angle.opposite();
|
|
||||||
}
|
|
||||||
if theta > 270.0 {
|
|
||||||
angle = angle.opposite();
|
|
||||||
}
|
|
||||||
batch.append(
|
batch.append(
|
||||||
txt.render_to_batch(g.prerender)
|
txt.render_to_batch(g.prerender)
|
||||||
.scale(0.1)
|
.scale(0.1)
|
||||||
.centered_on(pt)
|
.centered_on(pt)
|
||||||
.rotate(angle),
|
.rotate(angle.reorient()),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -58,6 +58,17 @@ impl Angle {
|
|||||||
((self.normalized_degrees() - other.normalized_degrees() + 540.0) % 360.0) - 180.0;
|
((self.normalized_degrees() - other.normalized_degrees() + 540.0) % 360.0) - 180.0;
|
||||||
rotation.abs() < within_degrees
|
rotation.abs() < within_degrees
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// I don't know how to describe what this does. Use for rotating labels in map-space and making
|
||||||
|
// sure the text is never upside-down.
|
||||||
|
pub fn reorient(self) -> Angle {
|
||||||
|
let theta = self.normalized_degrees().rem_euclid(360.0);
|
||||||
|
if theta > 90.0 || theta > 270.0 {
|
||||||
|
self.opposite()
|
||||||
|
} else {
|
||||||
|
self
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl fmt::Display for Angle {
|
impl fmt::Display for Angle {
|
||||||
|
Loading…
Reference in New Issue
Block a user