Streets: sidewalks, road curves, junctions and roundabouts
Deploy web Studio / deploy (push) Successful in 4m31s
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:
1 parent
2442966743
commit
c91d63663b
24 files changed
+989
-29
No files matched your search
@@ -46,24 +46,28 @@ fn prefab_area(o) {
|
||||
}
|
||||
|
||||
fn meta_road() {
|
||||
#{ label: "Road", category: "Ground", icon: "═", shape: "line",
|
||||
help: "A straight road along its length, with a dashed centre line.",
|
||||
#{ label: "Road", category: "Ground", icon: "═", shape: "line", corner: "road_curve",
|
||||
help: "A straight road along its length, with a dashed centre line and sidewalks if you like (left and right looking along local +x). Roads ending on another road's side make a junction; a run drawn corner by corner gets a curve in each corner.",
|
||||
props: [
|
||||
#{ key: "w", type: "float", def: 40.0, min: 2.0, max: 2000.0, step: 1.0, label: "Length (m)" },
|
||||
#{ key: "d", type: "float", def: 6.0, min: 2.0, max: 40.0, step: 0.5, label: "Width (m)" },
|
||||
#{ key: "dashed", type: "bool", def: true, label: "Centre line" },
|
||||
#{ key: "kerb", type: "bool", def: true, label: "Kerb lines" },
|
||||
#{ key: "walk", type: "choice", def: "none", choices: walk_sides(), label: "Sidewalks" },
|
||||
#{ key: "walk_w", type: "float", def: 2.0, min: 0.8, max: 8.0, step: 0.1, label: "Walk width (m)" },
|
||||
] }
|
||||
}
|
||||
fn prefab_road(o) {
|
||||
let p = o.p;
|
||||
let w = p.w / 2.0;
|
||||
let d = p.d / 2.0;
|
||||
layer("ground");
|
||||
let s = sprite();
|
||||
s.flat(rect(-w, -d, w, d), 0.007, "g-asph t");
|
||||
if p.dashed { s.lines([[-w, 0.0, w, 0.0]], 0.012, "dash"); }
|
||||
if p.kerb { s.lines([[-w, -d, w, -d], [-w, d, w, d]], 0.012, "kerb"); }
|
||||
let others = other_street_ends(o);
|
||||
let ends = street_ends(o);
|
||||
let c = line_path([[-p.w / 2.0, 0.0], [p.w / 2.0, 0.0]]);
|
||||
let j0 = street_join(o, ends[0], others);
|
||||
let j1 = street_join(o, ends[1], others);
|
||||
let gaps = street_gaps(o, others);
|
||||
street_path(o, c, j0, j1, gaps);
|
||||
street_info(p, `${num1(p.w)} m long, ${num1(p.d)} m wide`, [j0.meet, j1.meet], gaps[2]);
|
||||
}
|
||||
|
||||
fn meta_parking() {
|
||||
|
||||
Reference in new issue
Block a user