abstreet/game/src/debug/objects.rs

131 lines
4.1 KiB
Rust
Raw Normal View History

use crate::helpers::ID;
use crate::render::DrawMap;
2019-04-26 02:40:26 +03:00
use crate::ui::UI;
use ezgui::{EventCtx, GfxCtx, Key, Line, Text};
use map_model::Map;
use sim::{AgentID, CarID, Sim};
2019-04-26 02:40:26 +03:00
pub struct ObjectDebugger {
2019-02-19 02:21:43 +03:00
debug_tooltip_key_held: bool,
}
2019-04-26 02:40:26 +03:00
impl ObjectDebugger {
pub fn new() -> ObjectDebugger {
ObjectDebugger {
2019-02-19 02:21:43 +03:00
debug_tooltip_key_held: false,
}
}
2019-04-26 02:40:26 +03:00
pub fn event(&mut self, ctx: &mut EventCtx, ui: &UI) {
2019-02-19 02:21:43 +03:00
if self.debug_tooltip_key_held {
self.debug_tooltip_key_held = !ctx.input.key_released(Key::RightControl);
} else {
self.debug_tooltip_key_held = ctx
.input
.unimportant_key_pressed(Key::RightControl, "hold to show debug tooltips");
}
if let Some(ref id) = ui.primary.current_selection {
2018-12-17 20:51:31 +03:00
if ctx.input.contextual_action(Key::D, "debug") {
dump_debug(
id.clone(),
&ui.primary.map,
&ui.primary.sim,
&ui.primary.draw_map,
);
}
}
}
2018-10-22 19:43:48 +03:00
2019-04-26 02:40:26 +03:00
pub fn draw(&self, g: &mut GfxCtx, ui: &UI) {
2019-02-19 02:21:43 +03:00
if self.debug_tooltip_key_held {
if let Some(pt) = g.canvas.get_cursor_in_map_space() {
2019-04-29 19:27:43 +03:00
if let Some(gps) = pt.to_gps(ui.primary.map.get_gps_bounds()) {
2019-02-19 02:21:43 +03:00
let mut txt = Text::new();
2019-09-06 23:58:04 +03:00
txt.add(Line(pt.to_string()));
txt.add(Line(gps.to_string()));
txt.add(Line(format!("{:?}", g.canvas.get_cursor_in_screen_space())));
2019-09-06 23:58:04 +03:00
txt.add(Line(format!("zoom: {}", g.canvas.cam_zoom)));
g.draw_mouse_tooltip(&txt);
2019-02-19 02:21:43 +03:00
}
}
}
2018-10-22 19:43:48 +03:00
}
}
fn dump_debug(id: ID, map: &Map, sim: &Sim, draw_map: &DrawMap) {
match id {
ID::Road(id) => {
map.get_r(id).dump_debug();
}
ID::Lane(id) => {
map.get_l(id).dump_debug();
sim.debug_lane(id);
}
ID::Intersection(id) => {
map.get_i(id).dump_debug();
sim.debug_intersection(id, map);
}
ID::Turn(id) => {
map.get_t(id).dump_debug();
}
ID::Building(id) => {
map.get_b(id).dump_debug();
for (cars, descr) in vec![
(
sim.get_parked_cars_by_owner(id),
format!("currently parked cars are owned by {}", id),
),
(
sim.get_offstreet_parked_cars(id),
format!("cars are parked inside {}", id),
),
] {
println!(
"{} {}: {:?}",
cars.len(),
descr,
cars.iter().map(|p| p.vehicle.id).collect::<Vec<CarID>>()
);
}
}
ID::Car(id) => {
sim.debug_car(id);
if let Some(t) = sim.agent_to_trip(AgentID::Car(id)) {
println!("Trip log for {}", t);
for ev in sim.get_analytics().get_trip_log(t) {
println!("- {}", ev);
}
}
}
ID::Pedestrian(id) => {
sim.debug_ped(id);
if let Some(t) = sim.agent_to_trip(AgentID::Pedestrian(id)) {
println!("Trip log for {}", t);
for ev in sim.get_analytics().get_trip_log(t) {
println!("- {}", ev);
}
}
}
ID::PedCrowd(members) => {
println!("Crowd with {} members", members.len());
for p in members {
sim.debug_ped(p);
}
}
ID::ExtraShape(id) => {
let es = draw_map.get_es(id);
for (k, v) in &es.attributes {
println!("{} = {}", k, v);
}
println!("associated road: {:?}", es.road);
}
ID::BusStop(id) => {
map.get_bs(id).dump_debug();
}
ID::Area(id) => {
map.get_a(id).dump_debug();
}
}
}