Streets: sidewalks, road curves, junctions and roundabouts
Deploy web Studio / deploy (push) Successful in 4m31s

Roads take sidewalks (none, both, left, right): 12 cm high paving with
kerb faces drawn where they face the viewer. Road curve (radius, angle,
left/right) carries a street round a bend; centre lines are true arcs
when cut and offset, so curve joints are seamless. A road ending on
another road's centre line opens that road's kerb and sidewalk (T
junction); two roads ending at one corner close it. Roundabout: ring
radius and width, one or two lanes, up to four arms with flared kerbs,
splitter islands, give-way lines on the entry side (traffic on the left
or right) and a central island with apron.

Studio: a road run drawn corner by corner gets a curve in each corner
(prefab meta `corner`). Tooltips list the streets each one meets.
Engine: open `polyline` primitive (Prim::Poly open) so dashes run on
round curves. examples/streets and a Streets demo in the web Studio;
MCP guidance, docs. ROADMAP: backlog 5-7 done; multi-select and the
hosted copy marked done.

Tests: Rust 72, Studio 113, web 95.
This commit is contained in:
grabowski committed 2026-10-25 12:32:52 +07:00
1 parent 2442966743
commit c91d63663b
24 files changed
+989 -29

No files matched your search

+7 -2
View File
@@ -72,8 +72,8 @@ fn demo_passes_the_check() {
assert!(f.is_empty(), "{f:?}");
}
/// The house and factory demos: every view draws every object without warnings or
/// depth-sort cycles (walls and belts must not overlap), and the projects pass the check.
/// The house, factory and streets demos: every view draws every object without warnings
/// or depth-sort cycles (walls and belts must not overlap), and the projects pass the check.
#[test]
fn house_demo_renders_every_view_cleanly() {
example_renders_every_view_cleanly("house");
@@ -84,6 +84,11 @@ fn factory_demo_renders_every_view_cleanly() {
example_renders_every_view_cleanly("factory");
}
#[test]
fn streets_demo_renders_every_view_cleanly() {
example_renders_every_view_cleanly("streets");
}
fn example_renders_every_view_cleanly(name: &str) {
let p = Project::load(
Path::new(env!("CARGO_MANIFEST_DIR"))