mirror of
https://github.com/a-b-street/abstreet.git
synced 2025-01-05 13:05:06 +03:00
new traffic signal arrow styles and phase spinner
This commit is contained in:
parent
87a2c82ba6
commit
c925eff8b9
@ -4,7 +4,7 @@ use crate::render::{
|
|||||||
OUTLINE_THICKNESS,
|
OUTLINE_THICKNESS,
|
||||||
};
|
};
|
||||||
use abstutil::Timer;
|
use abstutil::Timer;
|
||||||
use ezgui::{Color, Drawable, GeomBatch, GfxCtx, Prerender};
|
use ezgui::{Color, Drawable, GeomBatch, GfxCtx, Line, Prerender, Text};
|
||||||
use geom::{Angle, Distance, Line, PolyLine, Polygon, Pt2D, Time, EPSILON_DIST};
|
use geom::{Angle, Distance, Line, PolyLine, Polygon, Pt2D, Time, EPSILON_DIST};
|
||||||
use map_model::{
|
use map_model::{
|
||||||
Intersection, IntersectionID, IntersectionType, Map, Road, RoadWithStopSign, Turn, TurnID,
|
Intersection, IntersectionID, IntersectionType, Map, Road, RoadWithStopSign, Turn, TurnID,
|
||||||
@ -18,7 +18,7 @@ pub struct DrawIntersection {
|
|||||||
zorder: isize,
|
zorder: isize,
|
||||||
|
|
||||||
draw_default: Drawable,
|
draw_default: Drawable,
|
||||||
pub draw_traffic_signal: RefCell<Option<(Drawable, Time)>>,
|
pub draw_traffic_signal: RefCell<Option<(Time, Drawable, Text, Pt2D)>>,
|
||||||
// Only for traffic signals
|
// Only for traffic signals
|
||||||
pub crosswalks: Vec<(TurnID, GeomBatch)>,
|
pub crosswalks: Vec<(TurnID, GeomBatch)>,
|
||||||
}
|
}
|
||||||
@ -144,15 +144,22 @@ impl Renderable for DrawIntersection {
|
|||||||
let mut maybe_redraw = self.draw_traffic_signal.borrow_mut();
|
let mut maybe_redraw = self.draw_traffic_signal.borrow_mut();
|
||||||
let recalc = maybe_redraw
|
let recalc = maybe_redraw
|
||||||
.as_ref()
|
.as_ref()
|
||||||
.map(|(_, t)| *t != ctx.sim.time())
|
.map(|(t, _, _, _)| *t != ctx.sim.time())
|
||||||
.unwrap_or(true);
|
.unwrap_or(true);
|
||||||
if recalc {
|
if recalc {
|
||||||
let (_, phase, t) = signal.current_phase_and_remaining_time(ctx.sim.time());
|
let (idx, phase, t) = signal.current_phase_and_remaining_time(ctx.sim.time());
|
||||||
let mut batch = GeomBatch::new();
|
let mut batch = GeomBatch::new();
|
||||||
draw_signal_phase(phase, self.id, Some(t), &mut batch, ctx);
|
draw_signal_phase(phase, self.id, Some(t), &mut batch, ctx);
|
||||||
*maybe_redraw = Some((g.prerender.upload(batch), ctx.sim.time()));
|
*maybe_redraw = Some((
|
||||||
|
ctx.sim.time(),
|
||||||
|
g.prerender.upload(batch),
|
||||||
|
Text::from(Line(format!("{}", idx + 1)).roboto()),
|
||||||
|
ctx.map.get_i(self.id).polygon.center(),
|
||||||
|
));
|
||||||
}
|
}
|
||||||
g.redraw(&maybe_redraw.as_ref().unwrap().0);
|
let (_, batch, txt, pt) = maybe_redraw.as_ref().unwrap();
|
||||||
|
g.redraw(batch);
|
||||||
|
g.draw_text_at_mapspace(txt, *pt);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -20,11 +20,12 @@ pub fn draw_signal_phase(
|
|||||||
) {
|
) {
|
||||||
let protected_color = ctx
|
let protected_color = ctx
|
||||||
.cs
|
.cs
|
||||||
.get_def("turn protected by traffic signal", Color::GREEN);
|
.get_def("turn protected by traffic signal", Color::hex("#72CE36"));
|
||||||
let yield_color = ctx.cs.get_def(
|
let yield_bg_color = ctx.cs.get_def(
|
||||||
"turn that can yield by traffic signal",
|
"turn that can yield by traffic signal",
|
||||||
Color::rgba(255, 105, 180, 0.8),
|
Color::rgba(76, 167, 233, 0.3),
|
||||||
);
|
);
|
||||||
|
let yield_outline_color = Color::hex("#4CA7E9");
|
||||||
|
|
||||||
let signal = ctx.map.get_traffic_signal(i);
|
let signal = ctx.map.get_traffic_signal(i);
|
||||||
for (id, crosswalk) in &ctx.draw_map.get_i(i).crosswalks {
|
for (id, crosswalk) in &ctx.draw_map.get_i(i).crosswalks {
|
||||||
@ -35,6 +36,27 @@ pub fn draw_signal_phase(
|
|||||||
|
|
||||||
match ctx.opts.traffic_signal_style {
|
match ctx.opts.traffic_signal_style {
|
||||||
TrafficSignalStyle::GroupArrows => {
|
TrafficSignalStyle::GroupArrows => {
|
||||||
|
for g in &phase.yield_groups {
|
||||||
|
if g.crosswalk.is_none() {
|
||||||
|
batch.push(
|
||||||
|
yield_bg_color,
|
||||||
|
signal.turn_groups[g]
|
||||||
|
.geom
|
||||||
|
.make_arrow(BIG_ARROW_THICKNESS * 2.0)
|
||||||
|
.unwrap(),
|
||||||
|
);
|
||||||
|
batch.extend(
|
||||||
|
yield_outline_color,
|
||||||
|
signal.turn_groups[g]
|
||||||
|
.geom
|
||||||
|
.make_arrow_outline(
|
||||||
|
BIG_ARROW_THICKNESS * 2.0,
|
||||||
|
BIG_ARROW_THICKNESS / 2.0,
|
||||||
|
)
|
||||||
|
.unwrap(),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
for g in &phase.protected_groups {
|
for g in &phase.protected_groups {
|
||||||
if g.crosswalk.is_none() {
|
if g.crosswalk.is_none() {
|
||||||
batch.push(
|
batch.push(
|
||||||
@ -46,20 +68,6 @@ pub fn draw_signal_phase(
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for g in &phase.yield_groups {
|
|
||||||
if g.crosswalk.is_none() {
|
|
||||||
batch.extend(
|
|
||||||
yield_color,
|
|
||||||
signal.turn_groups[g]
|
|
||||||
.geom
|
|
||||||
.make_arrow_outline(
|
|
||||||
BIG_ARROW_THICKNESS * 2.0,
|
|
||||||
BIG_ARROW_THICKNESS / 2.0,
|
|
||||||
)
|
|
||||||
.unwrap(),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
TrafficSignalStyle::Icons => {
|
TrafficSignalStyle::Icons => {
|
||||||
for g in DrawTurnGroup::for_i(i, ctx.map) {
|
for g in DrawTurnGroup::for_i(i, ctx.map) {
|
||||||
@ -89,7 +97,7 @@ pub fn draw_signal_phase(
|
|||||||
}
|
}
|
||||||
TurnPriority::Yield => {
|
TurnPriority::Yield => {
|
||||||
batch.extend(
|
batch.extend(
|
||||||
yield_color,
|
yield_outline_color,
|
||||||
turn.geom
|
turn.geom
|
||||||
.make_arrow_outline(
|
.make_arrow_outline(
|
||||||
BIG_ARROW_THICKNESS * 2.0,
|
BIG_ARROW_THICKNESS * 2.0,
|
||||||
@ -108,30 +116,24 @@ pub fn draw_signal_phase(
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
let radius = Distance::meters(0.5);
|
let radius = Distance::meters(2.0);
|
||||||
let box_width = (2.5 * radius).inner_meters();
|
|
||||||
let box_height = (6.5 * radius).inner_meters();
|
|
||||||
let center = ctx.map.get_i(i).polygon.center();
|
let center = ctx.map.get_i(i).polygon.center();
|
||||||
let top_left = center.offset(-box_width / 2.0, -box_height / 2.0);
|
|
||||||
let percent = time_left.unwrap() / phase.duration;
|
let percent = time_left.unwrap() / phase.duration;
|
||||||
// TODO Tune colors.
|
// TODO Tune colors.
|
||||||
batch.push(
|
batch.push(
|
||||||
ctx.cs.get_def("traffic signal box", Color::grey(0.5)),
|
ctx.cs.get_def("traffic signal box", Color::grey(0.5)),
|
||||||
Polygon::rectangle(box_width, box_height).translate(top_left.x(), top_left.y()),
|
Circle::new(center, 1.2 * radius).to_polygon(),
|
||||||
);
|
);
|
||||||
batch.push(
|
batch.push(
|
||||||
Color::RED,
|
ctx.cs
|
||||||
Circle::new(center.offset(0.0, -2.0 * radius.inner_meters()), radius).to_polygon(),
|
.get_def("traffic signal spinner", Color::hex("#F2994A"))
|
||||||
|
.alpha(0.3),
|
||||||
|
Circle::new(center, radius).to_polygon(),
|
||||||
);
|
);
|
||||||
batch.push(Color::grey(0.4), Circle::new(center, radius).to_polygon());
|
|
||||||
batch.push(
|
batch.push(
|
||||||
Color::YELLOW,
|
ctx.cs.get("traffic signal spinner"),
|
||||||
Circle::new(center, radius).to_partial_polygon(percent),
|
Circle::new(center, radius).to_partial_polygon(percent),
|
||||||
);
|
);
|
||||||
batch.push(
|
|
||||||
Color::GREEN,
|
|
||||||
Circle::new(center.offset(0.0, 2.0 * radius.inner_meters()), radius).to_polygon(),
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct TrafficSignalDiagram {
|
pub struct TrafficSignalDiagram {
|
||||||
|
Loading…
Reference in New Issue
Block a user