Skip to content

Commit bfa2d59

Browse files
TMHSDigitalclaude
andcommitted
fix(showcase): give traffic-cones level tyre and boot rub marks on the cones and their collars
The cones read as new: a clean orange with fine speckle, where a working roadworks set carries the black rubs that tyres, boots and stacking leave round a cone. A quality pass found nothing else worth a remodel (the barricade, lamp, stack and fallen cone read well), so the change is to the cone shaders only: - weathered() takes a rub term: a noise squashed sixteen-fold in height (a Mapping node on object coordinates), thresholded into sparse marks, so each mark runs round the cone like a rub rather than up it - cone PVC: black rubs (0.030, 0.027, 0.025) at 0.92; reflective collars: grey rubs (0.10, 0.095, 0.088) at 0.6, which read as scratched sheeting - no geometry changed; every budget reads exactly as shipped Budgets (5.2.1, unchanged): 45816 tris (45300-46400), LOD 0.5000/0.2200, 11 materials with the same face floors, AABB (3.0365, 2.0374, 1.3354), collider 493, hygiene 0 incl. 0 coplanar cross-shell pairs, 10 supports sunk 1.5 mm, 8 board joints 1.5 mm, 14 collars seated 0.600 mm and 1.400 mm proud, 6 cones plumb, stack pitch 0.036, one assembly of 125 shells. Falsifiers (flag -> measured -> exit), re-proved on 5.2.1 and 4.5.11, identical to the ship run; tris 45816 and envelope unchanged in all: --skip-decimate LOD1 1.0000 9 --stray-vert loose_v 1 15 --lift-z zmin 0.05000 16 --float-cone right cone sink -2.5 mm 16 --gap-board lower front board bite -1.5 mm (both legs) 17 --float-band left cone 6 in collar seat -1.4 mm 18 --lean-cone middle cone tilt 1.431 deg 19 --skew-leg leg mirror 2.500 mm 19 --loose-stack pitch 0.046, bite -0.576..-0.505 mm 20 --loose-lamp 2 components [9, 116] 21 tests/check_falsifier_targets.py --run --only traffic-cones passes. Blender: E:\Blender-Developer-Tools\.scratch\5.2\blender-5.2.1-windows-x64\blender.exe ("Blender 5.2.1 LTS"): default and every falsifier; .scratch\blender-4.5.11-windows-x64 ("Blender 4.5.11 LTS"): default and every falsifier, same measurements; .scratch\blender-5.1.2-windows-x64 ("Blender 5.1.2"): default, same measurements. Gates (5.2.1 renders): - Framing: fill x 0.709, y 0.822; margins l .153 r .137 b .061 t .117 - Asset quality: 11 materials, edge90 0.046, no default names - Contact sheet (docs/gallery/contact-sheets/traffic-cones-contact-sheet.webp): luma 0.2385 (band 0.2369-0.2428), stage 0.2030 (<= 0.2517), warmth +0.0385 (-0.144..+0.105), saturation 0.1932 (0.1525-0.2367); thumbnail legible - Asset sheet (docs/gallery/asset-sheets/traffic-cones.webp): not the least-designed object; the rubs are faint under the sheet's bright studio and read in the hero. Weak point kept: the shared panel's fit still crops the patch's near corner (a limit of scripts/asset_sheet_panel.py on wide flat assets, not of this piece) - build_gallery, check_site_links (122 pages, 0 failures) and every tests/check_*.py pass; generated alt read in docs/gallery/index.html Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
1 parent d46eeec commit bfa2d59

10 files changed

Lines changed: 60 additions & 21 deletions

File tree

‎README.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@ Budget-conformance props. Not examples. Conventions: [`showcase/README.md`](show
169169
<a href="showcase/palm-tree/"><img src="showcase/palm-tree/preview.webp" width="24%" alt="Palm tree: a coconut palm leaning on a raised disc of beach sand, its ringed trunk curving up to a crown of drooping pinnate fronds over green coconuts, fallen coconuts, a frond and driftwood below" /></a>
170170
<a href="showcase/wingback-armchair/"><img src="showcase/wingback-armchair/preview.webp" width="24%" alt="Wingback armchair: an oxblood leather wingback with a deep-button tufted back, rolled arms trimmed with brass nailheads and a piped seat cushion, beside a side table with a brass reading lamp and books on a fringed rug" /></a>
171171
<a href="showcase/planet-rover/"><img src="showcase/planet-rover/preview.webp" width="24%" alt="Planet rover: a six-wheeled rocker-bogie rover with gold-foil sides, a camera mast, a dish antenna and a finned power unit, its arm drilling a boulder on red-grey regolith" /></a>
172-
<a href="showcase/traffic-cones/"><img src="showcase/traffic-cones/preview.webp" width="24%" alt="Traffic cones: orange cones with white reflective collars on a patch of asphalt with a worn white line, three standing in a row, three nested in a stack and one knocked over showing its open base, before a striped A-frame barricade with an amber warning lamp" /></a>
172+
<a href="showcase/traffic-cones/"><img src="showcase/traffic-cones/preview.webp" width="24%" alt="Traffic cones: scuffed orange cones with rub-marked white reflective collars on a patch of asphalt with a worn white line, three standing in a row, three nested in a stack and one knocked over showing its open base, before a striped A-frame barricade with an amber warning lamp" /></a>
173173
<a href="showcase/mushroom-stump/"><img src="showcase/mushroom-stump/preview.webp" width="24%" alt="Mushroom stump: a sawn tree stump with a stepped felling cut and torn hinge fibres, peeled bark with curling flakes, moss, banded shelf fungi, honey mushroom clusters, red fly agarics, ferns and fallen leaves on a sloping soil disc" /></a>
174174
<a href="showcase/go-kart/"><img src="showcase/go-kart/preview.webp" width="24%" alt="Go-kart: blue go-kart on a patch of track asphalt before a red and white kerb: moulded nose, side pods and a front panel with a white plate, red tube chassis, black seat, finned engine." /></a>
175175
<a href="showcase/broadleaf-oak/"><img src="showcase/broadleaf-oak/preview.webp" width="24%" alt="Broadleaf oak: a mature oak with a massive buttressed trunk and crooked limbs reaching out under a broad dome of lumpy dark-green leaf cushions, on a grassy mound with roots, tufts and fallen leaves" /></a>
48 Bytes
Loading
178 Bytes
Loading
-26 Bytes
Loading

‎docs/gallery/index.html‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1686,7 +1686,7 @@ <h2><a href="planet-rover/">planet-rover</a></h2>
16861686
</article>
16871687
<article class="card" data-tags="mesh export showcase" data-kind="showcase" data-category="vehicles" data-name="traffic-cones">
16881688
<a class="card-media" href="traffic-cones/" tabindex="-1" aria-hidden="true">
1689-
<img src="assets/traffic-cones-hero.webp" alt="Orange cones on a patch of asphalt, three in a row, three stacked and one knocked over showing its open base, before a striped A-frame barricade with an amber lamp." width="1280" height="720" loading="lazy" decoding="async" />
1689+
<img src="assets/traffic-cones-hero.webp" alt="Scuffed orange cones on a patch of asphalt, three in a row, three stacked and one knocked over showing its open base, before a striped A-frame barricade with an amber lamp." width="1280" height="720" loading="lazy" decoding="async" />
16901690
</a>
16911691
<div class="card-body">
16921692
<h2><a href="traffic-cones/">traffic-cones</a></h2>

‎docs/gallery/traffic-cones/index.html‎

Lines changed: 37 additions & 13 deletions
Large diffs are not rendered by default.

‎showcase/gallery.json‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -856,7 +856,7 @@
856856
"dir": "showcase/traffic-cones",
857857
"category": "vehicles",
858858
"teaches": "A procedural roadworks set on a cut-out patch of asphalt — a broken-edged asphalt slab with a worn white road line and two sealed tar cracks; seven 720 mm PVC traffic cones, each a hollow lathed body with a moulded bead and a rolled lip round an open tip, bonded into a square rubber base with chamfered corners, a raked top, a collar, four moulded lugs and a recess underneath, and hooped with 4 in and 6 in retroreflective collars; three standing in a taper line, three nested in a stack whose wall thickness sets the nesting pitch, and one knocked over onto the edge of its base and the lip of its tip, its roll solved so both touch; a folding A-frame barricade of four square steel legs hinged in pairs on pivot bolts, spread by pinned straps on spacers, each foot in a rubber pad, carrying two boards on each face split on 45-degree lines into orange and white retroreflective stripes and bolted to the legs; and a warning lamp with amber fresnel lenses on a bracket bolted to the top board — through UVs, bake, LOD, collider, and Unity glTF, asserting recomputed budgets rather than an API contract.",
859-
"alt": "Orange cones on a patch of asphalt, three in a row, three stacked and one knocked over showing its open base, before a striped A-frame barricade with an amber lamp.",
859+
"alt": "Scuffed orange cones on a patch of asphalt, three in a row, three stacked and one knocked over showing its open base, before a striped A-frame barricade with an amber lamp.",
860860
"witnessesFix": "Recomputed: 45816 tris, eleven materials with 6048 cone PVC, 4088 reflective, 8096 rubber, 596 asphalt, 56 road paint, 496 tar, 64 orange sheeting, 384 board, 2912 steel, 720 black plastic and 696 lens faces, UVs in 0..1 with zero AABB overlap, outer AABB 3.037×2.037×1.335 m, zmin 0, hygiene 0 including zero coplanar cross-shell pairs, all 10 supports (five cone bases, the fallen cone's body and four barricade pads) 1.5 mm into the slab (band 0.8–3.0 mm), 4 boards biting their legs 1.5 mm at all 8 joints (band 0.8–3.0 mm), 14 collars seated 0.600 mm into their bodies and 1.400 mm proud, 6 upright cones 0.0000° off plumb at 0.720 m on bases 0.356 m across the flats, the barricade's 4 legs mirrored within 0.0001 mm, one stack of 3 at a 0.036 m pitch with each inner wall bearing 0.847–1.105 mm on the wall below (band 0.4–2.0 mm), one connected assembly of 125 shells, LOD ratios in band, collider 493 tris, non-empty glTF. --skip-decimate exits 9; --stray-vert 15; --lift-z 16; --float-cone 16; --gap-board 17; --float-band 18; --lean-cone 19; --skew-leg 19; --loose-stack 20; --loose-lamp 21.",
861861
"hero": "docs/gallery/assets/traffic-cones-hero.webp",
862862
"preview": "showcase/traffic-cones/preview.webp",

‎showcase/traffic-cones/README.md‎

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,10 @@ their boundaries are hard edges on a flat face and cannot z-fight. Every
191191
cone, board and leg carries a `PartTone` face attribute that the shaders
192192
read to move each part between two tones, so no two cones are the same
193193
orange. Grime rises from the slab on every part; scuffs are sparse and
194-
small. The steel is galvanised, grey and rough, with a studio reflection
194+
small. The cone PVC and its collars also carry level rub marks, black on
195+
the orange and grey on the sheeting: a noise squashed sixteen-fold in
196+
height, so each mark runs round the cone like a tyre or boot rub rather
197+
than up it. The steel is galvanised, grey and rough, with a studio reflection
195198
term so it does not read as plastic on a dark stage.
196199

197200
## Exit codes
94 Bytes
Loading

‎showcase/traffic-cones/traffic_cones.py‎

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1133,10 +1133,12 @@ def _gray(v):
11331133

11341134
def weathered(name, col_a, col_b, rough, dirt_col, dirt_top, dirt_amt, scuff_col, scuff_amt,
11351135
scuff_scale=38.0, metallic=0.0, rough_var=0.08, bump=0.0, bump_scale=600.0,
1136-
coat=0.0):
1136+
coat=0.0, rub=0.0, rub_col=(0.030, 0.027, 0.025, 1.0)):
11371137
"""A designed surface: a per-part tone between two colours (the PartTone
11381138
face attribute), grime rising from the slab to ``dirt_top``, sparse
1139-
scuffs, roughness breakup and an optional fine bump."""
1139+
scuffs, ``rub``: level black tyre and boot rubs (a noise squashed flat,
1140+
so each mark runs round the part, not up it), roughness breakup and an
1141+
optional fine bump."""
11401142
mat = bpy.data.materials.new(name)
11411143
mat.use_nodes = True
11421144
nt = mat.node_tree
@@ -1170,6 +1172,15 @@ def weathered(name, col_a, col_b, rough, dirt_col, dirt_top, dirt_amt, scuff_col
11701172
sr = _ramp(nt, 0.60, _gray(0.0), 0.70, _gray(scuff_amt))
11711173
nt.links.new(sn.outputs["Fac"], sr.inputs["Fac"])
11721174
col = _mix(nt, sr.outputs["Color"], grime, scuff_col)
1175+
if rub > 0.0:
1176+
mp = nt.nodes.new("ShaderNodeMapping")
1177+
mp.inputs["Scale"].default_value = (1.0, 1.0, 16.0)
1178+
nt.links.new(coord.outputs["Object"], mp.inputs["Vector"])
1179+
rn = _node(nt, "ShaderNodeTexNoise", Scale=3.2, Detail=6.0, Roughness=0.62)
1180+
nt.links.new(mp.outputs["Vector"], rn.inputs["Vector"])
1181+
rk = _ramp(nt, 0.635, _gray(0.0), 0.700, _gray(rub))
1182+
nt.links.new(rn.outputs["Fac"], rk.inputs["Fac"])
1183+
col = _mix(nt, rk.outputs["Color"], col, rub_col)
11731184
nt.links.new(col, bsdf.inputs["Base Color"])
11741185
rr = _ramp(nt, 0.30, _gray(max(0.03, rough - rough_var)), 0.70,
11751186
_gray(min(0.95, rough + rough_var)))
@@ -1342,10 +1353,11 @@ def set_materials():
13421353
plastic, amber lens. Shared by the check and the render."""
13431354
cone = weathered("ConePVC", (0.90, 0.19, 0.012, 1.0), (0.74, 0.20, 0.040, 1.0), 0.46,
13441355
(0.13, 0.085, 0.050, 1.0), 0.26, 0.85, (0.30, 0.10, 0.04, 1.0), 0.55,
1345-
scuff_scale=26.0, coat=0.15)
1356+
scuff_scale=26.0, coat=0.15, rub=0.92)
13461357
reflect = weathered("ReflectiveWhite", (0.78, 0.78, 0.76, 1.0), (0.66, 0.66, 0.63, 1.0), 0.30,
13471358
(0.36, 0.32, 0.26, 1.0), 0.40, 0.60, (0.50, 0.50, 0.49, 1.0), 0.65,
1348-
scuff_scale=70.0, bump=0.12, bump_scale=900.0)
1359+
scuff_scale=70.0, bump=0.12, bump_scale=900.0, rub=0.6,
1360+
rub_col=(0.10, 0.095, 0.088, 1.0))
13491361
rubber = weathered("RubberBase", (0.036, 0.035, 0.034, 1.0), (0.050, 0.048, 0.045, 1.0), 0.78,
13501362
(0.17, 0.155, 0.14, 1.0), 0.03, 0.55, (0.10, 0.098, 0.095, 1.0), 0.8,
13511363
scuff_scale=20.0, bump=0.25, bump_scale=400.0)

0 commit comments

Comments
 (0)