Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 17 additions & 0 deletions examples/coincident-vert-weld/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,3 +33,20 @@ blender --background --python coincident_vert_weld.py --
blender --background --python coincident_vert_weld.py -- --no-duplicate
blender --background --python coincident_vert_weld.py -- --weld
```

## Exit codes

Per-script sequential checks. `9` is a valid check code; there is no rule
against it.

| Code | Meaning |
| --- | --- |
| 0 | Success |
| 1 | Uncaught exception (FATAL wrapper) |
| 2 | argparse / usage; also exporter RNA missing expected glTF kwargs |
| 3 | Pathology missing: coincident shells (`--no-duplicate` lands here) |
| 4 | glTF export handling failed (`--weld` lands here) |

The `blender-smoke` workflow runs the check on Blender 5.2 LTS and 4.5 LTS
(5.1 on the weekly cron, the `needs-5.1` PR label, or manual dispatch).
Smoke does not pass `--no-duplicate` or `--weld`.
24 changes: 21 additions & 3 deletions examples/compositor-glare/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,11 +29,29 @@ absence of any EEVEE bloom toggle.
# Cheap correctness check (two tiny renders) — the CI check:
blender --background --python compositor_glare.py --

# Falsifier: Threshold=10.0. Must exit non-zero (Threshold==1.0).
blender --background --python compositor_glare.py -- --threshold-high

# Also render a still (EEVEE on a GPU host; use --engine cycles on GPU-less hosts):
blender --background --python compositor_glare.py -- --output rings.png
blender --background --python compositor_glare.py -- --output rings.png --engine cycles
```

It exits non-zero on failure (wrong tree plumbing, wrong Glare configuration, a
missing or non-falling halo, or halo pixels that appear without the compositor).
The `blender-smoke` workflow runs the check on Blender 5.2 LTS and 4.5 LTS.
## Exit codes

Per-script sequential checks. `9` is a valid check code; there is no rule
against it.

| Code | Meaning |
| --- | --- |
| 0 | Success |
| 1 | Uncaught exception (FATAL wrapper) |
| 2 | argparse / usage |
| 3 | Compositor tree / Glare / Threshold / link-chain contract (`--threshold-high` lands here) |
| 4 | Check render missing, tube dark, no halo, or halo does not fall off |
| 5 | Halo present with compositing off |
| 6 | `--output` produced no file |

The `blender-smoke` workflow runs the check on Blender 5.2 LTS and 4.5 LTS
(5.1 on the weekly cron, the `needs-5.1` PR label, or manual dispatch).
Smoke does not pass `--output` or `--threshold-high`.
14 changes: 12 additions & 2 deletions examples/compositor-glare/compositor_glare.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,17 @@
the ring silhouette, falls off strictly with distance, and vanishes entirely
when `scene.render.use_compositing` is off.

``--threshold-high`` sets the shared ``Threshold`` input to 10.0 and still
asserts it equals 1.0. That is the falsifier (``--same-axis`` in
export-preset-axis). The 4.x/5.x Type-menu shim is untouched.

By default it runs only the correctness check (two 96x54 single-sample Cycles
renders, compositor on vs off) — the CI smoke check. Pass --output to also
render a still:

blender --background --python compositor_glare.py -- # check only
blender --background --python compositor_glare.py -- --output n.png # + render
blender --background --python compositor_glare.py -- # check only
blender --background --python compositor_glare.py -- --threshold-high # must fail
blender --background --python compositor_glare.py -- --output n.png # + render
"""
import bpy
import sys
Expand Down Expand Up @@ -337,9 +342,14 @@ def main():
help="render engine for --output (cycles for GPU-less hosts)")
p.add_argument("--samples", type=int, default=32, help="--output sample count")
p.add_argument("--width", type=int, default=1280, help="--output width; height is width*9/16")
p.add_argument("--threshold-high", action="store_true",
help="falsifier: Threshold=10.0, still assert Threshold==1.0")
args = p.parse_args(argv)

scene, tree, glare = build_scene()
if args.threshold_high:
glare.inputs['Threshold'].default_value = 10.0

code = check_structure(scene, tree, glare)
if code:
return code
Expand Down
22 changes: 22 additions & 0 deletions examples/cross-version-property-delete/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,3 +36,25 @@ the Clear plate tagged and exit 7.

The `--output` render path measures framing against the Layer 1 band via
`examples/gallery_framing.py` (exit 10 on violation) before writing the still.

## Exit codes

Per-script sequential checks. `9` is a valid check code; there is no rule
against it. `10` is the shared framing helper.

| Code | Meaning |
| --- | --- |
| 0 | Success |
| 1 | Uncaught exception (FATAL wrapper) |
| 2 | argparse / usage; also an active object existed after the data-API build |
| 3 | Custom ID property did not land |
| 4 | `property_unset` on a custom ID key did not TypeError, or it deleted the key |
| 5 | `del` did not report removal |
| 6 | Keep plate lost the ID property |
| 7 | Clear plate still has the ID property (`--skip-delete` / `--unset-instead` land here) |
| 10 | Gallery framing violation |
| 12 | `--output` produced no file |

The `blender-smoke` workflow runs the check on Blender 5.2 LTS and 4.5 LTS
(5.1 on the weekly cron, the `needs-5.1` PR label, or manual dispatch).
Smoke does not pass `--output`, `--skip-delete`, or `--unset-instead`.
28 changes: 25 additions & 3 deletions examples/curve-bevel-arc/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,34 @@ and that the depsgraph-evaluated mesh has the deterministic topology (1044 verts
# Cheap correctness check (no render) — the CI check:
blender --background --python curve_bevel_arc.py --

# Falsifier: uncapped tube. Must exit non-zero (use_fill_caps).
blender --background --python curve_bevel_arc.py -- --no-caps

# Also render a still (EEVEE on a GPU host; use --engine cycles on GPU-less hosts):
blender --background --python curve_bevel_arc.py -- --output arc.png
blender --background --python curve_bevel_arc.py -- --output arc.png --engine cycles
```

It exits non-zero on failure (wrong point count, bevel, caps, topology, or span).
The `blender-smoke` workflow runs the check on Blender 5.2 LTS and 4.5 LTS.
## Exit codes

Per-script sequential checks. `9` is a valid check code; there is no rule
against it. `10` is also the shared framing helper.

| Code | Meaning |
| --- | --- |
| 0 | Success |
| 1 | Uncaught exception (FATAL wrapper) |
| 2 | argparse / usage |
| 3 | Spline type is not BEZIER |
| 4 | Bezier point count ≠ 8 |
| 5 | `bevel_depth` ≠ 0.15 |
| 6 | `use_fill_caps` is False (`--no-caps` lands here) |
| 7 | Evaluated vert/face count off measured tessellation |
| 8 | Tube does not rest on the floor |
| 9 | Tube height ≠ 2 × bevel |
| 10 | X span off closed form; also gallery framing violation |
| 11 | `--output` produced no file |

The `--output` render path additionally measures framing against the Layer 1 band via `examples/gallery_framing.py` (exit 10 on violation) before writing the still.
The `blender-smoke` workflow runs the check on Blender 5.2 LTS and 4.5 LTS
(5.1 on the weekly cron, the `needs-5.1` PR label, or manual dispatch).
Smoke does not pass `--output` or `--no-caps`.
14 changes: 11 additions & 3 deletions examples/curve-bevel-arc/curve_bevel_arc.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,14 @@
has no simple closed form, so those two constants pin today's behavior (see
EXPECT_VERTS below for how to re-measure if a future Blender retessellates).

``--no-caps`` leaves ``use_fill_caps`` False and still asserts the ends are
capped. That is the falsifier (``--same-axis`` in export-preset-axis).

By default it runs only the correctness check (no render) — the CI smoke
check. Pass --output to also render a still:

blender --background --python curve_bevel_arc.py -- # check only
blender --background --python curve_bevel_arc.py -- --no-caps # must fail
blender --background --python curve_bevel_arc.py -- --output c.png # + render
"""
import bpy, bmesh, sys, os, math, argparse
Expand All @@ -35,14 +39,15 @@
EXPECT_FACES = 1028


def build():
def build(no_caps=False):
bpy.ops.wm.read_factory_settings(use_empty=True)
curve = bpy.data.curves.new("Arc", 'CURVE')
curve.dimensions = '3D'
curve.bevel_depth = BEVEL
curve.bevel_resolution = BEVEL_RES
curve.resolution_u = RES_U
curve.use_fill_caps = True # solid ends — not a hollow pipe
curve.use_fill_caps = not no_caps # solid ends — not a hollow pipe


spline = curve.splines.new('BEZIER')
spline.bezier_points.add(N_POINTS - 1) # one point exists already
Expand Down Expand Up @@ -231,9 +236,12 @@ def main():
p.add_argument("--output", default=None, help="optional: render a still PNG here")
p.add_argument("--engine", default="eevee", choices=("eevee", "cycles"),
help="render engine for --output (cycles for GPU-less hosts)")
p.add_argument("--no-caps", action="store_true",
help="falsifier: use_fill_caps=False, still assert caps")
args = p.parse_args(argv)

obj = build()
obj = build(no_caps=args.no_caps)

code = check(obj)
if code:
return code
Expand Down
28 changes: 19 additions & 9 deletions examples/exit-pre-sidecar/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,16 +12,10 @@ accessing the handler list.

No gallery still. There is no geometry.

**What failure each check would catch:**

- exit 77 — Blender < 5.1 and not `--force-run`
- exit 2 — `--force-run` on 4.5 (`exit_pre` missing)
- harness FAIL missing sidecar — `--silent-handler` / `--no-handler`
- harness FAIL wrong contents — `--wrong-text` (`nope`), `--write-in-main`
(`from-main`), `--atexit-instead` (`atexit-ok`)

The harness checks **contents** (`sidecar_contains=exit_pre-ok`), not
existence only. A file written from `main` or `atexit` is red.
existence only. A file written from `main` or `atexit` is red. Several
falsifiers exit 0 from the script so the **harness** can fail after Blender
dies.

## Run

Expand All @@ -33,3 +27,19 @@ python tests/smoke/run_example.py --name exit-pre-sidecar \
--series 5.2 --min-version 5.1 \
--expect-sidecar /tmp/exit-pre.sidecar --sidecar-contains exit_pre-ok
```

## Exit codes

Per-script sequential checks. `9` is a valid check code; there is no rule
against it. `77` is the smoke skip protocol, not a product check.

| Code | Meaning |
| --- | --- |
| 0 | Success (including `--silent-handler` / `--no-handler` / `--wrong-text` / `--write-in-main` / `--atexit-instead`, which the harness then fails) |
| 1 | Uncaught exception (FATAL wrapper); also `$BDT_SMOKE_SIDECAR` unset |
| 2 | argparse / usage; also `--force-run` on Blender < 5.1 (`exit_pre` missing or unexpectedly present) |
| 77 | `SMOKE_SKIP:` `exit_pre` requires Blender 5.1+ |

The `blender-smoke` workflow runs the check on Blender 5.2 LTS (5.1 on the
weekly cron, the `needs-5.1` PR label, or manual dispatch) and skips on 4.5
LTS. Smoke does not pass the falsifier flags.
27 changes: 23 additions & 4 deletions examples/export-preset-axis/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,26 @@ blender --background --python export_preset_axis.py -- --output beacon.png
blender --background --python export_preset_axis.py -- --output beacon.png --engine cycles
```

It exits non-zero on failure (RNA drift, source not Z-dominant, Unity disk
not converted, Godot disk not Z-up, Unity not standing, Godot not lying,
orientations equal). The `blender-smoke` workflow runs the check on Blender
5.2 LTS and 4.5 LTS (5.1 on the weekly cron).
## Exit codes

Per-script sequential checks. `9` is a valid check code; there is no rule
against it. `10` is the shared framing helper.

| Code | Meaning |
| --- | --- |
| 0 | Success |
| 1 | Uncaught exception (FATAL wrapper) |
| 2 | argparse / usage; also exporter RNA missing expected glTF kwargs |
| 3 | Source mast is not Z-dominant, or tip drifted |
| 4 | glTF reimport produced no mesh |
| 5 | Unity disk POSITION is not `(x, z, -y)`, or Unity node has rotation |
| 6 | Godot disk POSITION is not raw Z-up; also `--output` produced no file |
| 7 | Unity reimport is not standing |
| 8 | Godot reimport is not lying along Y, or reimported tip mismatch |
| 9 | Reimported orientations did not differ (`--same-axis` lands here) |
| 10 | Gallery framing violation |
| 11 | `--same-axis` did not collapse the axis difference |

The `blender-smoke` workflow runs the check on Blender 5.2 LTS and 4.5 LTS
(5.1 on the weekly cron, the `needs-5.1` PR label, or manual dispatch).
Smoke does not pass `--output` or `--same-axis`.
20 changes: 20 additions & 0 deletions examples/gn-bundle-roundtrip/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -43,3 +43,23 @@ not read at thumbnail.
blender --background --python gn_bundle_roundtrip.py --
blender --background --python gn_bundle_roundtrip.py -- --force-run
```

## Exit codes

Per-script sequential checks. `9` is a valid check code; there is no rule
against it. `77` is the smoke skip protocol, not a product check.

| Code | Meaning |
| --- | --- |
| 0 | Success |
| 1 | Uncaught exception (FATAL wrapper) |
| 2 | argparse / usage; carrier mesh rewritten; `--legacy-rna` on 5.x |
| 3 | Evaluated vert/face count off closed form (`--mismatch`) |
| 4 | Unpacked Scale/Offset x-extent off (`--bypass`) |
| 5 | `bundle_mark` missing or off closed form |
| 77 | `SMOKE_SKIP:` Bundles require Blender 5.0+ |

The `blender-smoke` workflow runs the check on Blender 5.2 LTS (5.1 on the
weekly cron, the `needs-5.1` PR label, or manual dispatch) and skips on 4.5
LTS. Smoke does not pass `--bypass`, `--legacy-rna`, `--mismatch`, or
`--force-run`.
22 changes: 22 additions & 0 deletions examples/gn-zone-iterate/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -40,3 +40,25 @@ blender --background --python gn_zone_iterate.py -- --output zones.png

The `--output` render path measures framing via `examples/gallery_framing.py`
(exit 10 on violation).

## Exit codes

Per-script sequential checks. `9` is a valid check code; there is no rule
against it. `10` is the shared framing helper.

| Code | Meaning |
| --- | --- |
| 0 | Success |
| 1 | Uncaught exception (FATAL wrapper) |
| 2 | argparse / usage; also carrier mesh was rewritten |
| 3 | Repeat evaluated vert/face count off closed form |
| 4 | Repeat X-centers off closed form |
| 5 | For Each evaluated vert/face count off closed form |
| 6 | For Each Z-centers off closed form |
| 10 | Gallery framing violation |
| 12 | `--output` produced no file |

The `blender-smoke` workflow runs the check on Blender 5.2 LTS and 4.5 LTS
(5.1 on the weekly cron, the `needs-5.1` PR label, or manual dispatch).
Smoke does not pass `--output`, `--no-offset`, `--unpair-foreach`, or
`--unpair-repeat`.
26 changes: 23 additions & 3 deletions examples/gp-lineart-contour/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,11 +36,31 @@ not zeroing strokes (exit 6), flags-off or restore failure (exit 7).
# Depsgraph contour check — the CI check:
blender --background --python gp_lineart_contour.py --

# Falsifier: use_contour off. Must exit non-zero.
blender --background --python gp_lineart_contour.py -- --no-contour

# Also render the gallery still:
blender --background --python gp_lineart_contour.py -- --output lineart.png
```

It exits non-zero on failure. The `blender-smoke` workflow runs the check on
Blender 5.2 LTS and 4.5 LTS.
## Exit codes

Per-script sequential checks. `9` is a valid check code; there is no rule
against it. `10` is the shared framing helper.

| Code | Meaning |
| --- | --- |
| 0 | Success |
| 1 | Uncaught exception (FATAL wrapper) |
| 2 | argparse / usage; also GPv3 collection address contract |
| 3 | LINEART `thickness` / `radius` trap for this Blender |
| 4 | LINEART type, source, or `use_contour` (`--no-contour` lands here) |
| 5 | Evaluated contour too thin |
| 6 | Cleared `source_object` still produced strokes |
| 7 | Contour+crease off still produced strokes, or restore failed |
| 8 | `--output` produced no file |
| 10 | Gallery framing violation |

The `--output` render path additionally measures framing against the Layer 1 band via `examples/gallery_framing.py` (exit 10 on violation) before writing the still.
The `blender-smoke` workflow runs the check on Blender 5.2 LTS and 4.5 LTS
(5.1 on the weekly cron, the `needs-5.1` PR label, or manual dispatch).
Smoke does not pass `--output` or `--no-contour`.
14 changes: 14 additions & 0 deletions examples/gp-lineart-contour/gp_lineart_contour.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,15 @@
The check evaluates the modifier through the depsgraph (no bake required)
and asserts stroke/point lower bounds against the known failure modes above.

``--no-contour`` clears ``use_contour`` after the modifier is built and
still asserts it is True. That is the falsifier (``--same-axis`` in
export-preset-axis). The GPv3 address shim and the thickness/radius trap
are untouched.

By default it runs the correctness check only. Pass --output to render:

blender --background --python gp_lineart_contour.py --
blender --background --python gp_lineart_contour.py -- --no-contour
blender --background --python gp_lineart_contour.py -- --output l.png
"""
import bpy, bmesh, sys, os, math, argparse
Expand Down Expand Up @@ -415,10 +421,18 @@ def main():
choices=("eevee", "cycles"),
help="render engine for --output",
)
p.add_argument(
"--no-contour",
action="store_true",
help="falsifier: use_contour=False, still assert True",
)
args = p.parse_args(argv)

print(f"binary version: {bpy.app.version} ({bpy.app.version_string})")
sc, crystal, la_ob, mod = build_scene()
if args.no_contour:
mod.use_contour = False

code = check(sc, crystal, la_ob, mod)
if code:
return code
Expand Down
Loading
Loading