Skip to content

Commit 65146ad

Browse files
TMHSDigitalclaude
andcommitted
fix(showcase): rebuild the anvil to London-pattern proportions
The anvil was a 50 mm face board on a narrow stem over a small plate with a needle horn, 0.18 m tall on 0.62 m long. Reference: a 165 lb Peddinghaus London pattern is 25 in long, 10.5 in tall, 5 in face, 9.25 x 11 in base (height ~0.42 of length). - BODY_H 0.180 -> 0.260 (stated real-world size); face block 75 mm; OUTER_SIZE z refitted 0.489 -> 0.569. - Body is one eight-ring superellipse loft: a broad 0.250 x 0.164 m foot (the most that fits inside the stump's chime), a pinch below mid-height, and a swell along the face into its underside. The heel's underside rises 30 mm to its end. - Horn round-sectioned and table-wide at its root, belly sweeping into the throat; six rings, so waist_reach still finds the body's waist. - Face polish roughness 0.16 -> 0.30 (a mirror of the black stage read as a dark plane); camera raised to look onto the face, aim at bbox middle. 3168 tris, 912 metal faces, collider 134, body 0.621 x 0.260, waist reach 0.8572, foot seat 3 mm. Identical on 5.2.1, 5.1.2 and 4.5.11 (4.5 render too); falsifier exits unchanged (9, 15, 16, 16, 17, 18, 19). Contact-sheet luma 0.206; asset sheet regenerated. Link gate: 122 pages, 0 failures. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
1 parent 3f3a272 commit 65146ad

9 files changed

Lines changed: 204 additions & 160 deletions

File tree

‎docs/gallery/anvil/index.html‎

Lines changed: 98 additions & 71 deletions
Large diffs are not rendered by default.
1.09 KB
Loading
324 Bytes
Loading
212 Bytes
Loading

‎docs/gallery/index.html‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1169,12 +1169,12 @@ <h2><a href="wheelbarrow/">wheelbarrow</a></h2>
11691169
</article>
11701170
<article class="card" data-tags="mesh export showcase" data-kind="showcase" data-category="village" data-name="anvil">
11711171
<a class="card-media" href="anvil/" tabindex="-1" aria-hidden="true">
1172-
<img src="assets/anvil-hero.webp" alt="A forged-steel anvil with a hammer-polished face and a flared, squared waist on a hooped timber stump, a cross-peen hammer on the floor and forge light on its flank." width="1280" height="720" loading="lazy" decoding="async" />
1172+
<img src="assets/anvil-hero.webp" alt="A London-pattern forged anvil with a thick face block, tapered horn and broad flared foot on a hooped oak stand, a cross-peen hammer on the floor beside it." width="1280" height="720" loading="lazy" decoding="async" />
11731173
</a>
11741174
<div class="card-body">
11751175
<h2><a href="anvil/">anvil</a></h2>
11761176
<p class="teaches">A procedural blacksmith anvil on a timber stump through UVs, bake, LOD, collider, and Unity glTF, asserting recomputed budgets rather than an API contract.</p>
1177-
<p class="witnesses"><span class="tag">witnesses</span> Recomputed: 3148 tris, two materials with 1040 wood and 902 metal faces, UVs in 0..1 with zero AABB overlap, outer AABB 0.621×0.414×0.489 m, LOD ratios in band, convex collider 126 tris, hygiene 0, 16 grounded staves, hoop bite 0.003 m, foot-on-head gap 0.003 m, waist corner reach 0.8572, non-empty glTF. --skip-decimate exits 9; --stray-vert 15; --lift-z/--short-staves 16; --float-anvil 17; --round-band 18; --round-waist 19.</p>
1177+
<p class="witnesses"><span class="tag">witnesses</span> Recomputed: 3168 tris, two materials with 1040 wood and 912 metal faces, UVs in 0..1 with zero AABB overlap, outer AABB 0.621×0.414×0.569 m, LOD ratios in band, convex collider 134 tris, hygiene 0, 16 grounded staves, hoop bite 0.003 m, foot-on-head gap 0.003 m, waist corner reach 0.8572, non-empty glTF. --skip-decimate exits 9; --stray-vert 15; --lift-z/--short-staves 16; --float-anvil 17; --round-band 18; --round-waist 19.</p>
11781178
<a class="card-link" href="anvil/">View showcase piece<span class="sr-only"> anvil</span> <span aria-hidden="true">&rarr;</span></a>
11791179
</div>
11801180
</article>

‎showcase/anvil/README.md‎

Lines changed: 32 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -28,14 +28,14 @@ materials, UVs, evaluated LOD, collider, or export file.
2828

2929
| Axis | Declared | Measured (4.5.11 / 5.1.2 / 5.2.1) |
3030
| --- | --- | --- |
31-
| Base triangles | 2500–4500 | 3148 / 3148 / 3148 |
31+
| Base triangles | 2500–4500 | 3168 / 3168 / 3168 |
3232
| LOD1 ratio | 0.32–0.62 of base | 0.5000 / 0.5000 / 0.5000 |
33-
| LOD2 ratio | 0.10–0.35 of base | 0.2198 / 0.2198 / 0.2198 |
34-
| Materials | exactly 2 distinct; ≥400 wood, ≥400 metal faces | 2 slots; 1040 / 902 |
33+
| LOD2 ratio | 0.10–0.35 of base | 0.2197 / 0.2197 / 0.2197 |
34+
| Materials | exactly 2 distinct; ≥400 wood, ≥400 metal faces | 2 slots; 1040 / 912 |
3535
| UVs | in `0..1`, AABB overlap ≤ 1e-5 | in range, overlap 0 |
36-
| Outer AABB | (0.621, 0.414, 0.489) m ± 0.015 | (0.6210, 0.4137, 0.4890), zmin 0 |
37-
| Collider tris | ≤ 280 | 126 |
38-
| Export | written, size > 0 | 254976 / 254976 / 254960 bytes |
36+
| Outer AABB | (0.621, 0.414, 0.569) m ± 0.015 | (0.6210, 0.4137, 0.5690), zmin 0 |
37+
| Collider tris | ≤ 280 | 134 |
38+
| Export | written, size > 0 | 257068 / 257068 / 257052 bytes |
3939

4040
Base triangles dropped from **6616 to 2988** in the quality pass:
4141
overlapping face boxes and a beveled superellipse horn became one
@@ -63,7 +63,7 @@ Recomputed from the generated mesh, not asserted about the script.
6363
| Coplanar disjoint face pairs | 0 | 0 |
6464
| Grounded: `zmin` | within 1e-4 of 0 | 0.0000 |
6565
| Named supports: 16 staves | each `zmin` ≤ 0.001 | 16, stave_z 0.00000 |
66-
| Body plan | 0.621 m long × 0.180 m high ± 0.05 | 0.6210 × 0.1800 |
66+
| Body plan | 0.621 m long × 0.260 m high ± 0.05 | 0.6210 × 0.2600 |
6767
| **Waist form** | corner reach at the pinch ≥ 0.80 (an ellipse is 0.707) | 0.8572 |
6868

6969
### Joint fit and seat
@@ -77,8 +77,8 @@ Recomputed from the generated mesh, not asserted about the script.
7777

7878
The waist was lofted from ellipses, so under the rectangular face it read
7979
as a turned funnel, not a forged anvil. It is now a superellipse section
80-
(exponent 4.5) through seven stations that flare from the foot in to a
81-
pinch and out to the body. **Waist form** measures corner reach at the
80+
(exponent 4.5) through eight stations: a broad foot, in to a pinch, and
81+
out into the underside of the face. **Waist form** measures corner reach at the
8282
narrowest ring: how far a section vertex fills its bounding rectangle's
8383
corner. `--round-waist` restores the ellipse and exits 19 (0.7071).
8484

@@ -94,26 +94,29 @@ render-only cross-peen hammer lies on the floor beside the stump; and a
9494
low warm point light off frame stands in for the forge. The hammer is in
9595
the framing gate's element set, so it has to clear the frame edges too.
9696

97-
A later pass fixed the forging's read, which had been a stack of glued
98-
boxes:
99-
- The waist spreads to 0.54 of the face's length under it, on a softer
100-
flare above the pinch (power 1.35, was 2). At 0.22 it was a stem under
101-
a mushroom cap.
102-
- The slab, table and foot chamfer their corners (4 mm on the low mesh).
103-
Edges with both ends inside the slab outline are hole mouths and stay
104-
sharp.
105-
- The horn grows out of the table: its top runs on from the table top and
106-
its belly sweeps down over six rings. That is still fewer than the
107-
waist's seven, so the waist-form audit keeps finding the waist. A thin
108-
cone on the table's end face read as a funnel on a brick.
109-
- The staves are weathered oak rather than orange pine.
110-
- The hammer is lofted: a chamfered face, a swelled eye, and a peen that
111-
thins into a blade, on an oval, waisted handle.
112-
- The hero turns the stand to 30 degrees so the anvil shows its profile.
113-
At -42 its long axis pointed almost at the camera.
114-
115-
1942 faces, 3148 tris (was 3052), collider 126 (was 134); every budget and
116-
falsifier is unchanged.
97+
A later pass rebuilt the forging to London-pattern proportions. The reference is a
98+
165 lb Peddinghaus: 25 in long, 10.5 in tall, a 5 in face and a
99+
9.25 × 11 in base, so height is about 0.42 of length. The first build
100+
stood 0.18 m on 0.62 m: a 50 mm face board on a narrow stem over a small
101+
plate, with a needle horn.
102+
- The stated body height is now **0.260 m** (`BODY_H`, was 0.180). The
103+
face block is 75 mm thick, and the outer AABB z was refitted from 0.489
104+
to 0.569.
105+
- The body is one superellipse loft of eight rings. It starts at a broad
106+
foot (0.250 × 0.164 m, as large as fits inside the stump's chime),
107+
pinches below mid-height, and swells along the face's length into its
108+
underside. The heel's underside rises 30 mm toward its end.
109+
- The horn is round-sectioned and about as wide as the table at its root.
110+
Its top runs on from the table, and its belly is deep enough to sweep
111+
into the throat. It has six rings, fewer than the body's eight, so the
112+
waist-form audit still finds the waist.
113+
- The face block and table chamfer their corners. Hole mouths stay sharp.
114+
- The polished face is a satin sheen (roughness 0.30). At 0.16 it was a
115+
mirror of the black stage.
116+
- The staves are weathered oak. The hammer is lofted: a chamfered face, a
117+
swelled eye and a peen blade, on an oval handle.
118+
- The hero turns the stand to 30 degrees for the profile, looks down onto
119+
the face, and aims at the bbox middle.
117120

118121
### Falsifiers
119122

‎showcase/anvil/anvil.py‎

Lines changed: 70 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -71,22 +71,29 @@
7171
FOOT_BITE = 0.003
7272
SEAT_GAP_MAX = 0.006
7373

74-
FACE_T = 0.050
74+
# London-pattern proportions, scaled from a 165 lb Peddinghaus (25 in long,
75+
# 10.5 in tall, 5 in face, 9.25 x 11 in base) to this 0.621 m body: height
76+
# is about 0.42 of length. The first build stood 0.18 m on a 0.12 m-wide
77+
# plate with a 50 mm face slab -- a board on a mushroom stem. The foot is
78+
# capped by what fits inside the stump's chime, not by the reference.
79+
FACE_T = 0.075
7580
FACE_W = 0.112
7681
FACE_LEN = 0.280
7782
TABLE_DROP = 0.014
7883
TABLE_LEN = 0.046
7984
HORN_LEN = 0.220
8085
HEEL_LEN = 0.095
8186
FOOT_H = 0.030
82-
FOOT_XY = (0.210, 0.124)
83-
WAIST_H = 0.100
87+
FOOT_XY = (0.250, 0.164)
88+
WAIST_H = 0.155
89+
# Heel underside rises this much toward the heel end, as a forged heel does.
90+
HEEL_TAPER = 0.030
8491
HARDY_HALF = 0.015
8592
PRITCHEL_R = 0.007
8693
N_SECTION = 16
8794
# The waist is a forged block, not a turned cone: a superellipse section
88-
# (exponent WAIST_P) lofted through five stations that flare from the foot
89-
# in to a pinch and out to the body. Corner reach, the most a section vertex
95+
# (exponent WAIST_P) lofted from the foot, in to a pinch and out
96+
# into the underside of the face. Corner reach, the most a section vertex
9097
# fills its bounding rectangle's corner, is 0.707 for an ellipse and about
9198
# 0.86 here; WAIST_REACH_MIN is the floor. --round-waist sets the exponent to
9299
# 2, the old elliptical funnel.
@@ -104,9 +111,10 @@
104111
ZFIGHT_COS = 0.998
105112
BODY_TOL = 0.05
106113
BODY_LEN = 0.621
107-
BODY_H = 0.180
114+
# Stated real-world size: length and height of the 165 lb London pattern above.
115+
BODY_H = 0.260
108116
BBOX_TOL = 0.015
109-
OUTER_SIZE = (0.621, 0.414, 0.489)
117+
OUTER_SIZE = (0.621, 0.414, 0.569)
110118

111119
BASE_TRIS_MIN = 2500
112120
BASE_TRIS_MAX = 4500
@@ -479,9 +487,16 @@ def build_staves(bm, spans, z0, bevel_offset, bevel_segments):
479487

480488

481489
def build_anvil_iron(bm, z_head, float_anvil, bevel_offset, bevel_segments, round_waist=False):
490+
"""London-pattern anvil: one lofted body from foot to face, a slotted
491+
face block with a rising heel, the table step, and a horn.
492+
493+
The body is a single superellipse loft (WAIST_P): a broad foot on the
494+
stump head, flaring in to a pinch a little below mid-height, then
495+
swelling out along the face's length into its underside -- the throat
496+
under the horn and the heel's overhang are what that swell leaves.
497+
"""
482498
z_foot0 = z_head - FOOT_BITE + (FLOAT_ANVIL if float_anvil else 0.0)
483-
z_foot1 = z_foot0 + FOOT_H
484-
z_body0 = z_foot1 + WAIST_H
499+
z_body0 = z_foot0 + FOOT_H + WAIST_H
485500
z_face = z_body0 + FACE_T
486501
hy = FACE_W * 0.5
487502
x_heel = -FACE_LEN * 0.5 - HEEL_LEN
@@ -514,25 +529,19 @@ def build_anvil_iron(bm, z_head, float_anvil, bevel_offset, bevel_segments, roun
514529
],
515530
METAL_IDX,
516531
)
532+
# The heel's underside rises toward its end.
533+
for v in set(bm.verts) - before:
534+
if abs(v.co.x - x_heel) < 1e-6 and abs(v.co.z - z_body0) < 1e-6:
535+
v.co.z += HEEL_TAPER
517536
add_box_solid(
518537
bm,
519538
x_face1 - 0.006, x_table1,
520-
-hy * 0.88, hy * 0.88,
539+
-hy * 0.90, hy * 0.90,
521540
z_body0 + 0.004, z_face - TABLE_DROP,
522541
METAL_IDX,
523542
)
524-
525-
add_box_solid(
526-
bm,
527-
-FOOT_XY[0] * 0.5, FOOT_XY[0] * 0.5,
528-
-FOOT_XY[1] * 0.5, FOOT_XY[1] * 0.5,
529-
z_foot0, z_foot1 + 0.004,
530-
METAL_IDX,
531-
)
532-
# Forged, not sawn: the face, table and foot were sharp-cornered boxes
533-
# and the anvil read as blocks glued in a stack. Chamfer their corners
534-
# (the hardy and pritchel holes keep sharp mouths: an edge with both ends
535-
# strictly inside the slab's outline is a hole edge and is left alone).
543+
# Forged, not sawn: chamfer the face block and table. Hole mouths (both
544+
# ends strictly inside the slab outline) stay sharp.
536545
if bevel_offset > 0.0:
537546
new = set(bm.verts) - before
538547

@@ -550,51 +559,50 @@ def in_hole(v):
550559
profile=0.5, affect="EDGES", clamp_overlap=True,
551560
)
552561

553-
# The horn grows out of the table: its top runs on from the table top and
554-
# its belly sweeps down, tapering to a blunt point. A thin cone set on
555-
# the table's end face read as a funnel stuck on a brick.
562+
# Horn: a round-sectioned cone about as wide as the table at its root,
563+
# its top running on from the table top and drooping to a blunt point,
564+
# its belly deep enough at the root to sweep down into the throat. A
565+
# thin flat cone on the table's end read as a needle.
556566
z_top = z_face - TABLE_DROP
557567
horn_rings = []
558568
for dx, ry, rz, drop in (
559-
(-0.018, 0.86, 0.021, 0.000),
560-
(0.030, 0.70, 0.019, 0.002),
561-
(0.075, 0.52, 0.015, 0.005),
562-
(0.120, 0.36, 0.012, 0.009),
563-
(0.165, 0.22, 0.009, 0.013),
569+
(-0.030, 0.88, 0.040, 0.000),
570+
(0.020, 0.74, 0.032, 0.002),
571+
(0.070, 0.56, 0.024, 0.006),
572+
(0.120, 0.38, 0.017, 0.011),
573+
(0.165, 0.22, 0.011, 0.016),
564574
):
565575
horn_rings.append(oval_ring(x_table1 + dx, hy * ry, rz, z_top - rz - drop))
566-
horn_rings.append(oval_ring(x_horn1, 0.009, 0.006, z_top - 0.006 - 0.019))
576+
horn_rings.append(oval_ring(x_horn1, 0.008, 0.007, z_top - 0.007 - 0.021))
567577
horn_verts, _faces = loft_open(bm, horn_rings, METAL_IDX, cap0=True, cap1=True)
568578

569-
pinch_hy = 0.030
570-
pinch_hx = 0.060
571-
t_pinch = 0.48
572-
foot_hx, foot_hy = FOOT_XY[0] * 0.42, FOOT_XY[1] * 0.46
573-
# The waist carries the face: it spreads to most of the face's length
574-
# under it. At 0.22 of the face it was a stem under a mushroom cap.
575-
body_hx, body_hy = FACE_LEN * 0.54, hy * 0.84
579+
# Body: (t up the body, half-length, half-width, centre x). Eight rings,
580+
# more than the horn's six, so the waist-form audit finds the waist.
581+
foot_hx, foot_hy = FOOT_XY[0] * 0.5, FOOT_XY[1] * 0.5
576582
expo = 2.0 if round_waist else WAIST_P
577-
real_waist = []
578-
for t in (0.0, 0.14, 0.30, t_pinch, 0.64, 0.82, 1.0):
579-
# concave flare: quadratic from the pinch out to each end
580-
if t <= t_pinch:
581-
k = ((t_pinch - t) / t_pinch) ** 2
582-
hx, hy_w = pinch_hx + (foot_hx - pinch_hx) * k, pinch_hy + (foot_hy - pinch_hy) * k
583-
else:
584-
# Shoulders: a softer power above the pinch, so the body swells
585-
# up into the face instead of flaring only at its last ring.
586-
k = ((t - t_pinch) / (1.0 - t_pinch)) ** 1.35
587-
hx, hy_w = pinch_hx + (body_hx - pinch_hx) * k, pinch_hy + (body_hy - pinch_hy) * k
588-
z = z_foot1 + (z_body0 + 0.002 - z_foot1) * t
583+
stations = (
584+
(0.00, foot_hx, foot_hy, 0.0),
585+
(0.10, foot_hx * 0.97, foot_hy * 0.97, 0.0),
586+
(0.20, foot_hx * 0.78, foot_hy * 0.76, 0.0),
587+
(0.34, foot_hx * 0.60, foot_hy * 0.58, 0.0),
588+
(0.48, 0.068, 0.040, 0.0),
589+
(0.64, 0.082, 0.045, -0.006),
590+
(0.82, 0.118, 0.051, -0.014),
591+
(1.00, 0.168, hy * 0.97, -0.022),
592+
)
593+
body = []
594+
z_top_ring = z_body0 + 0.002
595+
for t, hx, hy_w, cx in stations:
596+
z = z_foot0 + (z_top_ring - z_foot0) * t
589597
ring = []
590598
for i in range(N_SECTION):
591599
a = i * (2.0 * math.pi / N_SECTION)
592600
c, sn = math.cos(a), math.sin(a)
593-
x = hx * math.copysign(abs(c) ** (2.0 / expo), c)
601+
x = cx + hx * math.copysign(abs(c) ** (2.0 / expo), c)
594602
y = hy_w * math.copysign(abs(sn) ** (2.0 / expo), sn)
595603
ring.append(Vector((x, y, z)))
596-
real_waist.append(ring)
597-
loft_open(bm, real_waist, METAL_IDX, cap0=True, cap1=True)
604+
body.append(ring)
605+
loft_open(bm, body, METAL_IDX, cap0=True, cap1=True)
598606
return z_foot0, z_face, list(horn_verts)
599607

600608

@@ -1463,7 +1471,9 @@ def polish_face(mat):
14631471
ramp.inputs["From Min"].default_value = 0.82
14641472
ramp.inputs["From Max"].default_value = 0.97
14651473
nt.links.new(sep.outputs["Z"], ramp.inputs["Value"])
1466-
for sock_name, bright in (("Base Color", (0.50, 0.50, 0.52, 1.0)), ("Roughness", 0.16)):
1474+
# Roughness 0.30, not a mirror: at 0.16 the face reflected the black
1475+
# stage and read as a dark plane; a hammered face is a satin sheen.
1476+
for sock_name, bright in (("Base Color", (0.58, 0.58, 0.60, 1.0)), ("Roughness", 0.30)):
14671477
sock = bsdf.inputs[sock_name]
14681478
src = sock.links[0].from_socket if sock.is_linked else None
14691479
mix = nt.nodes.new("ShaderNodeMix")
@@ -1619,10 +1629,14 @@ def light(name, loc, energy, size, col, rot):
16191629
cam_data = bpy.data.cameras.new("Cam")
16201630
cam_data.lens = 50.0
16211631
cam = bpy.data.objects.new("Cam", cam_data)
1622-
cam.location = (span * 1.61, -span * 2.35, span * 1.32)
1632+
# High enough to look onto the working face: the hardy and pritchel holes
1633+
# and the hammer-polished steel are how an anvil is read from above.
1634+
cam.location = (span * 1.61, -span * 2.35, span * 1.72)
16231635
scene.collection.objects.link(cam)
16241636
aim = bpy.data.objects.new("Aim", None)
1625-
aim.location = (0.02 * span, 0.0, 0.5 * (bb[2] + bb[5]) + 0.04 * span)
1637+
# Aim at the bbox middle: the anvil stands 0.08 m taller than it did, and
1638+
# the old +0.04 span lift pushed the stump's foot off the bottom edge.
1639+
aim.location = (0.02 * span, 0.0, 0.5 * (bb[2] + bb[5]) - 0.01 * span)
16261640
scene.collection.objects.link(aim)
16271641
con = cam.constraints.new("TRACK_TO")
16281642
con.target = aim

‎showcase/anvil/preview.webp‎

284 Bytes
Loading

‎showcase/gallery.json‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -196,8 +196,8 @@
196196
"dir": "showcase/anvil",
197197
"category": "village",
198198
"teaches": "A procedural blacksmith anvil on a timber stump through UVs, bake, LOD, collider, and Unity glTF, asserting recomputed budgets rather than an API contract.",
199-
"alt": "A forged-steel anvil with a hammer-polished face and a flared, squared waist on a hooped timber stump, a cross-peen hammer on the floor and forge light on its flank.",
200-
"witnessesFix": "Recomputed: 3148 tris, two materials with 1040 wood and 902 metal faces, UVs in 0..1 with zero AABB overlap, outer AABB 0.621×0.414×0.489 m, LOD ratios in band, convex collider 126 tris, hygiene 0, 16 grounded staves, hoop bite 0.003 m, foot-on-head gap 0.003 m, waist corner reach 0.8572, non-empty glTF. --skip-decimate exits 9; --stray-vert 15; --lift-z/--short-staves 16; --float-anvil 17; --round-band 18; --round-waist 19.",
199+
"alt": "A London-pattern forged anvil with a thick face block, tapered horn and broad flared foot on a hooped oak stand, a cross-peen hammer on the floor beside it.",
200+
"witnessesFix": "Recomputed: 3168 tris, two materials with 1040 wood and 912 metal faces, UVs in 0..1 with zero AABB overlap, outer AABB 0.621×0.414×0.569 m, LOD ratios in band, convex collider 134 tris, hygiene 0, 16 grounded staves, hoop bite 0.003 m, foot-on-head gap 0.003 m, waist corner reach 0.8572, non-empty glTF. --skip-decimate exits 9; --stray-vert 15; --lift-z/--short-staves 16; --float-anvil 17; --round-band 18; --round-waist 19.",
201201
"hero": "docs/gallery/assets/anvil-hero.webp",
202202
"preview": "showcase/anvil/preview.webp",
203203
"tags": [

0 commit comments

Comments
 (0)