﻿BBB Urban Road - design and use

Profile family: TrProfile_BBB_Urban
Based on C:/trainsim/routes/bbb/TrackProfiles/RdProfile.stf.
Created using documentation, parser, renderer, and ACE converter from the main
C:/Users/pgade/Documents/NetbeansProjects/TSRE5vc directory.

Use in TSRE
1. Route > Reload Track Profiles (restart if a texture was already cached).
2. Select TrProfile_BBB_Urban in the road ShapeTemplate/profile selector.
3. For an explicitly standalone 4 m surface, select TrProfile_BBB_Urban_single.
The main family retains the original 3 m lane geometry. The single variant
retains the original 4 m road geometry. LEFT/RIGHT add only their outside
sidewalk; MIDDLE has no sidewalk or lamps. MAIN/SINGLE have both sidewalks,
with lamps only on their +X/right side in the authored road direction.
No existing road objects were reassigned, and RdProfile.stf was not modified.

2D method
Polyline cross-sections form both paved sidewalks and beveled granite curbs.
Each outer edge gains a 0.20 m curb plus 2.00 m of paving (2.20 m total).
Road edge is at Y=0.04; curb/paving begins at Y=0.20, giving a 0.16 m rise.
Paving rises to Y=0.24 at the outside, giving 2 percent fall toward the road.
Sidewalk texture repeats every 2 m; granite texture repeats every 1 m.
Outer fascia extends to Y=-0.08 to hide the edge at normal terrain height.
The original road vertices, road.ace mapping, gauge, chord control,
CompleteReplacement policy and superelevation setting are retained.

3D method
Triangulated OBJ streetlamp: 288 triangles, capped tapered pole, curved arm,
rectangular lantern, ivory glass underside, zinc mounting base/service panel.
The lamp mesh is 7.82 m tall above its foot; top is approximately Y=8.054 m.
Foot is 1.90 m beyond the road edge at Y=0.234. The arm faces inward.
Template3D Repeat, Shared, First; PathFrameMode Upright.
Spacing 30 m, Phase 5 m: copies at 5, 35, 65... m within each generated path.
Spacing/phase restart for each road object/path; they are not route-wide.
A path shorter than 5 m has no lamp. Reverse path direction reverses the side.
These are textured meshes, without dynamic illumination or a night glow pass.

Distance levels (CompleteReplacement)
0-600 m: road, sidewalks, curbs and lamps.
600-1200 m: road, sidewalks and curbs.
1200-2000 m: original road surface.
Each distance level explicitly repeats all retained components.

Files in route
TrackProfiles/TrProfile_BBB_Urban.stf
TrackProfiles/meshes/bbb_urban_streetlamp.obj
TEXTURES/bbb_urban_paving.ace (1024 x 1024)
TEXTURES/bbb_urban_curb.ace (512 x 512)
TEXTURES/bbb_urban_lamp.ace (1024 x 1024)
All ACEs: RGB, full mip chain, lossless zlib envelope, opaque.

Texture design
Images generated with the built-in imagegen tool. Paving: warm grey staggered
stone/concrete slabs. Lamp atlas: anthracite powder coat, ivory prismatic
glass, granite and zinc. The curb is an interior crop of the granite quadrant.
Source PNGs, exact generation prompts, authoring/validation source, reports,
and a software-rendered geometry preview are in the main repository at:
build/bbb-urban-road/
The UVs use TSRE's image-top V=0 convention and inset atlas regions to reduce
bleeding. Paving and atlas are normalized to power-of-two dimensions for ACE.

Validation
- Source STF/OBJ validator passed: 5 roles in one STF, one OBJ, 288 triangles.
- Real TSRE parser accepted all five profile roles.
- 25 real engine geometry checks passed: straight, both curve directions,
  uphill and downhill for every role; finite straight/curve vertices; shared
  lamp counts and upright transforms on slopes.
- All three ACE conversions and readbacks succeeded with pixel-exact equality.
- Main TSRE orts-profile regression suite: 63 passed, 0 failed.
- Software preview inspected for sidewalk/lamp placement. It is an inspection
  render of generated meshes, not a screenshot from the route editor.
- In-editor visual acceptance, LOD transition inspection, road intersections,
  and save/reload placement checks remain to be performed on chosen roads.
- Inherited notices: OptSpecular0 uses TSRE default lighting; PositionControl
  is parsed but profile-specific superelevation deformation is not applied.
