From 51aadb9e4f1446578e2da9a5413a7486b409b16f Mon Sep 17 00:00:00 2001 From: fOuttaMyPaint Date: Sun, 19 Jul 2026 17:16:40 -0400 Subject: [PATCH 1/4] fix: legibilize gltf-export-roundtrip labels at thumbnail scale The AUTHORED and ROUND-TRIP plaques are the render's argument, but the dark metallic text vanished at thumbnail. Diffuse light-grey material and larger type keep the round-trip story readable at 320x180. Render-path only; the check's closed forms and measured values are unchanged and re-verified on 5.1.2 and 4.5.11. README gains the pipeline-arc reference. Signed-off-by: fOuttaMyPaint --- .../assets/gltf-export-roundtrip-hero.webp | Bin 12720 -> 14808 bytes docs/gallery/gltf-export-roundtrip/index.html | 11 +++++++---- examples/gltf-export-roundtrip/README.md | 3 +++ .../gltf_export_roundtrip.py | 10 ++++++---- examples/gltf-export-roundtrip/preview.webp | Bin 11362 -> 12952 bytes 5 files changed, 16 insertions(+), 8 deletions(-) diff --git a/docs/gallery/assets/gltf-export-roundtrip-hero.webp b/docs/gallery/assets/gltf-export-roundtrip-hero.webp index e1502f0a6e6d698e9a25d6a0d102be297b9c11b8..d7fbe283db98eddaa2fde38cdcd976656b049f73 100644 GIT binary patch literal 14808 zcmV;}IVZ+aNk&G{IRF4xMM6+kP&gpOIRF4~DgvDWDgXu00zOeFkVYe>qoyO$DIm}a z32AQJy13$;GY#jT<(v3oguU){@SpvEqg1b`;N9P!{@u#|_;l&(&W1NJ`2+O0@?og` z8()6L{HpkB=SdspOY-ObC;A_6e{$Zay+6Fbe>MLL`m65&==1z{s0Z`!_1$j%fF4@^ zw|@Q*% z(l^34*gnFYF?|w3dP~h_*H3D%9^vO}AT~KOgDA+&*<77&`z!MuNc?ZvUytFfK8Z$6 zLNT@{18hzP#`#+M9u8|;CZ(lFhOb+3zhx0!I6S?gzbzz>w>r(LwZ8K4-N6`xP8#v; zRsv_im2bK;NfQHpOU?|M1Z`N4mXb#WeP-0g`tIZt6Or8e)D$4rJBf~T#8JfdT4R6R6t zZx|)F!wicx7{kWYj}CBx<7E-0U}`%A#$3MXdB?R^kZG(Wyx{SPjh69?+wJF()WS>Y z<8K}Q7^A`8vxa~we#pR?6+#=%^UNz>>d;&~X;=6%`X_Q@Y*L>5r{R}Lgyi7Bo92Lc zCox-*y>wq?IYg2%zk?;`1|Nc5PSsvLo#iR=(lH*pAC1Y$AC2(W<~ie$nH2d4KpSVq z20WKvbDm8*u=Wg@!Q#5{jNF>d{YDt@qV7)0^;YD56zevstj~inFYIdI(CWSTOm2;K zv5F=5Y@8pIIS9G0BjfmI((=M`K;urz_A;+GjNF;f5}E6_5s?nHRlooNQ|qS;ZI}nB zN9H|=@81ClQze&9=+p>^-Bt=R0Ahnfv{!0^?Q1YE9+}Lmmwf?o09|}a^VQHY&_(7? zv3T&B5NQRa$j^%~0kc}KkTQQek^dQJidF$vBz&fGB%nYWKfN_1UjDX~wy4EuBnf=9 zCE)NxhB60BR{($E)15Hg1@d_6maH6LPbi+-Q%aS>az@tc$A4#5^(ar9NIk=O`BTkd zVlx5l&0p{@Y9Q²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 literal 12720 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

A runnable example that builds a sci-fi supply crate — 35 beveled box shells with three material slots and box-mapped UVs — exports it with bpy.ops.export_scene.gltf, parses the file on disk, re-imports it, and verifies the whole round-trip against the depsgraph-evaluated mesh, following depsgraph-and-evaluated-data and headless-batch-scripting.

+

Pipeline arc: modeling/LOD in lod-decimate-chain, weighting in vertex-weight-limit, export here.

What it witnesses: the interchange contracts AI-generated export code most often gets silently wrong.

1. The +Y-up convention is baked into vertex data. glTF is +Y-up, Blender is +Z-up, and export_yup=True (the default) writes (x, y, z) -> (x, z, -y) directly into the POSITION buffer — the node carries no rotation or scale. The check parses the .gltf JSON and asserts the accessor bounds equal the axis-converted evaluated bounding box, and that the node transform is absent. Exporting with export_yup=False ships raw Z-up data every engine displays lying on its back. 2. export_apply=True ships the evaluated mesh, not the base cage. The crate's bevel modifier lives only in the depsgraph; with flat shading and UV seams the exporter splits exactly one vertex per evaluated loop (7,560), so the on-disk POSITION count is an exact witness. export_apply=False silently writes the 624-vertex cage. 3. The round-trip is faithful. Re-imported positions (bit-exact here), loop normals (≤2e-4), box-mapped UVs (≤3e-5), and per-triangle material bindings all match the evaluated mesh. UVs are V-flipped on disk (glTF texture origin is top-left) and flipped back on import — both flips are proven by reading the .bin buffer directly.

Version witness (probed on Blender 4.5.11 LTS and 5.1.2): the operator signatures are byte-identical — 109 exporter properties, 20 importer properties, same defaults — and the exported JSON differs only in asset.generator ("Khronos glTF Blender I/O v4.5.51" vs "v5.1.20"). The example therefore runs identical kwargs on both versions and guards forward drift explicitly: every kwarg it passes must still exist in the operator's RNA, so a future rename fails loudly instead of drifting silently. One genuine 5.x removal surfaced during authoring: Mesh.calc_normals() is gone (loop normals auto-compute on read) — calling it is itself a cross-version hazard, noted in the code.

@@ -680,15 +681,17 @@

Source

pm = bpy.data.materials.new("PlaqueMetal") pm.use_nodes = True pb = pm.node_tree.nodes["Principled BSDF"] - pb.inputs["Base Color"].default_value = (0.16, 0.17, 0.19, 1.0) - pb.inputs["Metallic"].default_value = 0.9 - pb.inputs["Roughness"].default_value = 0.3 + # diffuse light-grey, not metal: the AUTHORED/ROUND-TRIP labels are the + # render's argument and must survive thumbnail scale on the dark floor + pb.inputs["Base Color"].default_value = (0.42, 0.44, 0.48, 1.0) + pb.inputs["Metallic"].default_value = 0.2 + pb.inputs["Roughness"].default_value = 0.6 def plaque(text, x): cu = bpy.data.curves.new("Plaque", 'FONT') cu.body = text cu.align_x = 'CENTER' - cu.size = 0.24 + cu.size = 0.30 cu.extrude = 0.008 ob = bpy.data.objects.new("Plaque", cu) ob.location = (x, -1.55, 0.01) diff --git a/examples/gltf-export-roundtrip/README.md b/examples/gltf-export-roundtrip/README.md index 3f2c31c..4789bf0 100644 --- a/examples/gltf-export-roundtrip/README.md +++ b/examples/gltf-export-roundtrip/README.md @@ -7,6 +7,9 @@ the whole round-trip against the depsgraph-evaluated mesh, following [`depsgraph-and-evaluated-data`](../../skills/depsgraph-and-evaluated-data/SKILL.md) and [`headless-batch-scripting`](../../skills/headless-batch-scripting/SKILL.md). +**Pipeline arc:** modeling/LOD in [`lod-decimate-chain`](../lod-decimate-chain/), +weighting in [`vertex-weight-limit`](../vertex-weight-limit/), export here. + **What it witnesses:** the interchange contracts AI-generated export code most often gets silently wrong. diff --git a/examples/gltf-export-roundtrip/gltf_export_roundtrip.py b/examples/gltf-export-roundtrip/gltf_export_roundtrip.py index 1d6cf42..a888b38 100644 --- a/examples/gltf-export-roundtrip/gltf_export_roundtrip.py +++ b/examples/gltf-export-roundtrip/gltf_export_roundtrip.py @@ -474,15 +474,17 @@ def render_still(authored, roundtrip, path, engine): pm = bpy.data.materials.new("PlaqueMetal") pm.use_nodes = True pb = pm.node_tree.nodes["Principled BSDF"] - pb.inputs["Base Color"].default_value = (0.16, 0.17, 0.19, 1.0) - pb.inputs["Metallic"].default_value = 0.9 - pb.inputs["Roughness"].default_value = 0.3 + # diffuse light-grey, not metal: the AUTHORED/ROUND-TRIP labels are the + # render's argument and must survive thumbnail scale on the dark floor + pb.inputs["Base Color"].default_value = (0.42, 0.44, 0.48, 1.0) + pb.inputs["Metallic"].default_value = 0.2 + pb.inputs["Roughness"].default_value = 0.6 def plaque(text, x): cu = bpy.data.curves.new("Plaque", 'FONT') cu.body = text cu.align_x = 'CENTER' - cu.size = 0.24 + cu.size = 0.30 cu.extrude = 0.008 ob = bpy.data.objects.new("Plaque", cu) ob.location = (x, -1.55, 0.01) diff --git a/examples/gltf-export-roundtrip/preview.webp b/examples/gltf-export-roundtrip/preview.webp index d1f1d23578ee4b423e861149b10dafd5d32c4d20..b0e84d07c5f8883ef07347615f5525421ef627ff 100644 GIT binary patch literal 12952 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 OoTfkLXu1->0000~(;jyK literal 11362 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 From 9a0a84418d21273ecd3712faf6ca8923697008d1 Mon Sep 17 00:00:00 2001 From: fOuttaMyPaint Date: Sun, 19 Jul 2026 17:16:58 -0400 Subject: [PATCH 2/4] fix: anchor vertex-weight-limit accent glow to the pruned zones The teal ring sat on the forearm armor, reading as decoration while the actual pruned zones (the flex boots) stayed unmarked. The boots now carry the teal accent and the bright ring seals the elbow boot, so the glow marks the five-influence zones the limit prunes. Counts, weights, and measured check values are byte-identical; all three falsification probes re-run on the remodel (exits 4/6/8), check green on 5.1.2 and 4.5.11. Signed-off-by: fOuttaMyPaint --- .../assets/vertex-weight-limit-hero.webp | Bin 10932 -> 11488 bytes docs/gallery/vertex-weight-limit/index.html | 11 +++++++---- examples/vertex-weight-limit/README.md | 10 +++++++--- examples/vertex-weight-limit/preview.webp | Bin 9894 -> 10274 bytes .../vertex_weight_limit.py | 8 +++++--- 5 files changed, 19 insertions(+), 10 deletions(-) diff --git a/docs/gallery/assets/vertex-weight-limit-hero.webp b/docs/gallery/assets/vertex-weight-limit-hero.webp index f8d27da4359077acfce8400e2eff538c625dfe10..2ee8f40a89af86562db79e0164a06beaac358019 100644 GIT binary patch literal 11488 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 GAOHX#2R=Rk literal 10932 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 W))cp&Q;FEnlMJ<*?VB$7hX4R>N*(b4 diff --git a/docs/gallery/vertex-weight-limit/index.html b/docs/gallery/vertex-weight-limit/index.html index 0ffa8d2..1faed7d 100644 --- a/docs/gallery/vertex-weight-limit/index.html +++ b/docs/gallery/vertex-weight-limit/index.html @@ -184,10 +184,11 @@

vertex-weight-limit

A runnable example that rigs a mech arm — pedestal mount and pauldron, orange armor shells, ribbed flex boots, wrist, three claw prongs — with deliberately rich five-bone weight bumps in the boots, then enforces the game-engine maximum of four bone influences per vertex through the data API, following mesh-editing-and-bmesh and building on the linear-blend-skinning precedent of armature-bend.

+

Pipeline arc: modeling/LOD in lod-decimate-chain, weighting here, export in gltf-export-roundtrip.

What it witnesses: the skinning constraint every game engine enforces and AI-generated rigging code most often violates silently.

1. The limit is a data-API operation, not a context operator. Instead of bpy.ops.object.vertex_group_limit_total, the example reads each vertex's groups, keeps the top four by weight, VertexGroup.removes the rest, and renormalizes the survivors. Dropping without renormalizing leaves sums at 0.986 — a mesh that shrinks toward the origin under load (the check's measured failure, 1.438e-02 off unit sum). 2. The armature modifier is still exactly linear blend skinning after the limit: every depsgraph-evaluated vertex equals Σ wᵢ · (pose.matrix @ bone.matrix_local.inverted()) @ rest, with the weights read back from the mesh's own deform layer (v.groups) — the weights on the mesh are the contract, not the weights you meant to write. Measured lbs_err = 3.0e-07. 3. Pruning must not damage the pose. Evaluated positions before and after the limit are held within 0.05 (measured 3.0e-03), the pedestal mount stays exactly pinned (Root is unposed), and the pre-limit authoring really carries five influences in the boots — otherwise the witness would be vacuous.

The vertex-group API (v.groups, VertexGroup.add/remove) is stable between Blender 4.5 LTS and 5.1 — the example runs identically on both, which is itself the version witness (measured values match to the digit).

-

The render shows the pruned arm mid-pose: the elbow bellows and wrist boot flex through the bend, the teal accent ring rides the forearm — proof that the limited weights still deform as authored.

+

The render shows the pruned arm mid-pose: the flex boots carry the teal accent — the five-influence zones the limit prunes glow at the elbow and wrist, sealed by the bright ring on the elbow boot — proof that the limited weights still deform as authored.

Run

# Cheap correctness check (no render) — the CI check:
 blender --background --python vertex_weight_limit.py --
@@ -315,8 +316,9 @@ 

Source

(1.82, 0.26), (2.00, 0.24), (2.10, 0.27), (2.16, 0.27), (2.22, 0.24), (2.45, 0.22)], ORANGE), "Elbow") - # teal accent ring inset on the forearm - tag(lathe_part(bm, [(2.10, 0.275), (2.16, 0.275)], ACCENT), "Elbow") + # teal accent ring sealing the elbow boot — the primary + # five-influence zone the limit prunes + tag(lathe_part(bm, [(1.33, 0.245), (1.39, 0.245)], ACCENT), "Elbow") # wrist flex boot + ball (second >4-influence region) tag(lathe_part(bm, [(2.45, 0.21), (2.52, 0.17), (2.60, 0.20), (2.68, 0.16), (2.76, 0.19), (2.84, 0.16), (2.95, 0.15)], RUBBER), "FLEX") @@ -518,7 +520,8 @@

Source

return [ pbr("Gunmetal", (0.11, 0.12, 0.14), 0.9, 0.32), pbr("HazardOrange", (0.82, 0.30, 0.08), 0.10, 0.45), - pbr("FlexRubber", (0.05, 0.05, 0.06), 0.0, 0.85), + pbr("FlexRubber", (0.04, 0.13, 0.17), 0.0, 0.80, + emission=(0.06, 0.30, 0.34), strength=0.38), pbr("TealAccent", (0.03, 0.22, 0.26), 0.0, 0.35, emission=(0.10, 0.65, 0.72), strength=2.2), ] diff --git a/examples/vertex-weight-limit/README.md b/examples/vertex-weight-limit/README.md index 8d080c1..42c0ab3 100644 --- a/examples/vertex-weight-limit/README.md +++ b/examples/vertex-weight-limit/README.md @@ -8,6 +8,9 @@ rich five-bone weight bumps in the boots, then enforces the game-engine building on the linear-blend-skinning precedent of [`armature-bend`](../armature-bend/). +**Pipeline arc:** modeling/LOD in [`lod-decimate-chain`](../lod-decimate-chain/), +weighting here, export in [`gltf-export-roundtrip`](../gltf-export-roundtrip/). + **What it witnesses:** the skinning constraint every game engine enforces and AI-generated rigging code most often violates silently. @@ -32,9 +35,10 @@ The vertex-group API (`v.groups`, `VertexGroup.add`/`remove`) is stable between Blender 4.5 LTS and 5.1 — the example runs identically on both, which is itself the version witness (measured values match to the digit). -The render shows the pruned arm mid-pose: the elbow bellows and wrist boot flex -through the bend, the teal accent ring rides the forearm — proof that the -limited weights still deform as authored. +The render shows the pruned arm mid-pose: the flex boots carry the teal +accent — the five-influence zones the limit prunes glow at the elbow and +wrist, sealed by the bright ring on the elbow boot — proof that the limited +weights still deform as authored. ## Run diff --git a/examples/vertex-weight-limit/preview.webp b/examples/vertex-weight-limit/preview.webp index b07f84b8d38ce738ac5477bd860ad9db09698729..924144bb659dafb477e6dea1763b63682195cad7 100644 GIT binary patch literal 10274 zcmV+-DBagmNk&E*C;$LgMM6+kP&gnCC;$M^n*p5xDzF5j0zOeFkVd1TC#0a!NMP^^ z32AQNVOB%PUc>+QMM{)t73d#(bAUQr`BxsG$lBTX-19x@;;yOtQ_i=`|9k(l>u3Id zu@BVVz`v}YuRV5r!hX|!-ut+Jxc!p%tNt_8H~QE4|4H9xf7*XxFD`#)&)iSkuWLiFK>hkP`^mIlm*F z)BZC#KB5~@j&lW(;M9oS?qa%nnulN_=Y{?mG;eQ>llyLTkQnEV0%^i1eUp?|a!H|p z=O%7{!O*S`z$jdAsi+B+(Y~gkPke$PsqV=TMPO$IFXBgein%_9mE_FHp@SvMB9JuC z@uFs~6Dy;9Y+W1UYo$o@<0hWkDJ%&7eJs@K3Q*R7#w%A;c~n9WA0UZ(aE$fy%s7Mh zlSk&p+v;iQ9Kn?5l>Wj*+0BU8qFBHL))a+q*G^kBVtI}O9WUW*-|}QW%1Q(98<~eP zEO~h&DEa;?E!bZjH2?}I`j;X@dw%y21H@cKvg6r&6RRIx_hh*^^q7}7zYSg<;)QBqTf)%r(d)|b(s2qGqn?<|B0~0SuxD-qkT<4!D4-Yrh)*~hc9Lry2_TRav=5&%)tMJA9$0k zXq75UV$uDPD;;X0G5Az_fmS}m(!eu+JH#1eliFAv)zl%brT|yoer3J@6Ax!L()0r3 ztTm5F<_@|sA_&o12AGO`rRO|IMY7BMQdPs0bxi(IfaR#!pYZHN(@Y*aRyf#AwFju2nGG}xDbtLh*{Ls04v7{3d`;z zfF3a~^DwuZb6IrIfa37nV8(V*#F}tK0U#Sra^fY#?*Rt5cs^>3V_}Mkbo$QN!+Ycz zsRvoxu#1VX{*W^wZM~cX{Ccx0n4_3F=-j^8e%!%g6}J`((KjZz>mL zlN*d@a_lJKPE3eotn3wbQOF7?TBBr}p;7jpnj<1P|F6nL1^1FqAack`&PfxDdk>+)tYQ}XqiO`U_zbCXV*yPDD>R@5 zffoDOdY#jw@u~3vkFM_+@W}57W=lS;*kg@QbcEcpHQ+sbS%=`s2q0zn%p}9s{+l=z z8z(F)eqn$ryc{&>%&v{~H33U}22|$$j2}Tx3$Ta@7170*z)4TKj@I+c|8rW!M#7Gn zqn%iPzEAqZ4%qAuF#Licr}h`A(B1JV%898)$u5);*ej*kASQa}yVMO;#m4$^>2h8X zz!ZFJbc)vM!DEy2JzvBy2DNj7IwnT!f0WHpze3Ep6gO8O;%r(T%_5KfX{D|MVjQc^ zsATN}qm`V79PEhM(!MhpZ(U7iu#1cQGIKpO04b51@L#-kH`>?c+RpY0u;AQ=md$ad zODYI{JoW!2tRDf9bTb8ZGPb|O`Qp*3z^l=|=4W{G7a>E{$Ec12(-RhbIJ&F6;QZwn zNNs7;TDA_a8JE zDd}qqMZPxiG%A8jBTA75r5QTU1JPVAHMyL8Jcmq}-&1<2?Ux=XBGVF?MIYUozs&g^ zR_z)8KlO*7u;C`36pT`%Tx`TVwBLy-uLnKkzMRjsK9Yt}7MGLfwKxPt%$qn<{z@^!k-jl<#W_~@gRX?N- zrZ;4oqgvg!7x6Zi8El#3mS_Q!5xkuc8jkz6HhXX(?F~=j7ai}ifA)8e!U$v~A}P!6 zI{BpHBxsIDPLht{u+7S8X1KSob=h`~>b*Z%=_Yu4qu4)xaD=jlR7TW;we1&=#~trI z%jR&UlO2}=O>}?{*{A`A#6A!+h8t=nXp_KU~k@%G4+;-rH)r?j+{QUh_}$78r5VoFg*_h|%R zJ-f|mUCX;Mg29K|j|jQuq~)yRDArW1$hKF+t{3VC5VdU_)p~UK9ainQ)x*{q@yM;) zaoYBacw$4yK`9!~k=0vUkS6$4a(n`IZ->;Ok*_T>!D>Ane`5eq{XnZeVW5M}624Ly z%;5rT_+vx#1+FvS@a-?QO{JW(;4W4-@NrV@xb1sIrC~Tp6E)0Lz=35ikel#l`}krw^hn5A7q{ynm95y&hXJ>E{s0h>-CI}! zeu6rRoOTFUz($Yod0_FD)%MTmKKe#D+l+BH;9giyNxlFnokw7NW%qUcRNi={zz*RM zrR3mP>d3AYWhu4q$Ls8-!V9bys702ZeJe}0glD(DDCM($j!he}O!;p%nAG<4aJU`! zRNfr*G+9WW)KZzy0|F<(ArW=NjAs9f64Ygoqfk^m1^+R zvJSz=MirpWk}R0-`h4-=`%bW(WlLMy=kWhkh6*6(SA!O>mk_ue?ND`gOfA^;Tsov+ ziLh=SGtJ=aJ|1ZzL(*8#{D z3e)OHRrJ0WE=;G8A$^Xx#=MQC$XGf|1GA_FO*JFqOo7@B1-v9hjz)vp`5k&09?zJq z5_2Sa#Tgmn^`m;QvOx#k0$E9#s1X@BlVwizWvhsm1LIP|uPfS^aX%H&TSB~nxi45? z*zyV=+YreLkt&BvXjAh)M=M%+gH)=tHcMYWmm0b1PeeH|z<(b!9oB@?PT{`K@+nTW zn-h{vS2Pa@o&NMB2`K%;-I8G(YZHj0B)L311H{mgKUoncrHQb>!rLb93N$)9XNy|^ zbbE6vNW2+&AFFkkGtpY#+HhX>%VO9JwY&8VRoqu=Ksr%h_UBfkBz_sM=%T8H46RBv+|{a$i0=rADJm{vJ$IVjDiVW1_C9+YOH%~ zK+U7{bsg{@;hP0wT^!N?c~FBe>#h!wM9|G0qdYw`8;Zs1>4%z`D~LK3yZmM?;SPm( zn5N^7S1||>`r5$bTr=^ZQ+q^uEo(Wn%#-DtyUsp8t!~ku`t~G5&-Gij=UayTU^a2f)A(y0rB@n5$gi2U{f*L?{0v4&;j^=c+ekB zjkyX3k!=I3_>z$&Th{$8*+Z)h&Y<#C8onmSk@1x~>0 zl}Wh+J*{B7zfGkRrp!RY1$fo?A|!|8I*}!Ypid$pEI8hg7_IG-`F`&Wol_jw7Br-_ zk16Sfs%ps17kKh81~|2yXyE*aZo1DZDoI<|+q-7?gveV4LIRiI@*ywq&*3A9IbWYk zwCZpBhyZImeQac|#iUx31*c0y!Y`4UYe`EF+A~qFU-SVJ)J3>z+bQv(uN(v`w&1~G z@c#f+IFU`Lfa9{x+Ts+%jZRXaQF6J)x2^; z|2|I`Qyyc=^ScPIU|7BuOrD$zh9hjaI4W#cNy9F1citIW;ySTi`pGWF)VVD)`O9Ec zWE!Im7j9Y+OA4RyhE&V3iKjjZu%py!24Vw~xrn8}vBy1)ao+Yi*gHsmT| ztAKTVA<<4%e!`L5KT%G6#zdV2_ZzFFxZ#luH3Lwc_AU^-jI^IUS_ONw zN^(ifi_pq2X10gubE=0bP8)zkTjHm|kIr0qOAKGdI>=$5S&is-ZgbcIln~o~w|`&p zdOdZ(rkQmh*U>jJQ8+4LN|5W#d6RBBv(fPB}Zb(iv*>+pl*sW>nhoDam z7y)02us@dxDlVFSg5Sn!3igP}i2`ZtFaR8cGn!>L;~3%l#{K2j)m`3jEo#8Db5&l6 zT#HZrR~y=06nmsRad?AD!1iB6TM8b)_}Ob3Tx2U%K^;_AJuDp`x)t;iwu24VKDr%% z(tiPAa21RYY4Ftk`K8re&dx4P%f%H?hvTRSvH^uK*t?5b%2fu7>EWuxhRKPVV z7J0{KW2zf~Y(*qLFl*wmEs{&*$wa?keziikV!XdBbka@j&WB|3gO0|8>L7vD4y$bq zlIe)|198BRh#~1WRJGX~1o1O%<_B>-O z+=o2*se1Sv;j?_2-*35-s=;q=7={oN`N8q;wmio0LUa9u^oz)>MvqcOw>(ShZCe;> zX5p`FHRgO?)+l8$GFsNG6pzA33K}e_uDPi6i-PPV-dyf73W{2($7b<00oK8ca6fje-1a|*RJ@`UfuxB+RQ79 z_Uo8Flh+4r1+Y2WS)h=n`-1o!W)T!0$GEN-h)qix1HM}c zT+qoNv5hrIkmB=w2QY8rsn;Rv3bT}eU6p+;dCzUlO->hvU&g|zMRDFQEcM#XNJ@>w z{R_EB0bz4Bl_xc2Kgu6W!~##AYa7#Fd^}~Gy_Xj2H`>l@$?)Ujn#b7TR~skiIxMGm zJY0bV0x(p16Z0d9y+Fi0lgc1~11I?Pd|%nqDp&)0dJ3NQZrsM! zDgQq2#Z>N3?2OF6JV0*s`LcVTzL*|E zF1c*WCo8`Gs6RQ!%v|vfPx!}xq87=~L10rP~hP^d<*W0R~}oY-!ki%O9&aUwv?Ir2Z|^!W^2*3wRXkj1Atr z)^ElW>iK;9;EMsTVMr@i%Mu_~B=h#$8qCC@;{UKFG$f+~;^L79re}W&*s^f(_{co9 z@6uENjS#33v7u!_SGvrK8Ab{P(ge}lCqQFJ3E^>Wk@!2b=BdLDRRw!+kC9A4@{8yb zER*PF%+n}zi5x)6MDhB*)z9H92Ek6(JI%f5MrazV%$8iFi~1*fM^D`C^g-kB ze}1H#J=Xpx!Hy?(C*6ZZH$uA5#dMnq==RhoStdUXBC7M6`a@I5qE?!4>2&;J2oSG+ zINEnRyOQ^I-oo(4kic5DTD@=5{|dBxO@j;#w9O!t`>Mvst4j=qgf%M~Vw-A8>83nZ zu2d{5Nk}9(Mr2r3V;!Y^5omFXj(I2;fS9o_TjLg z@5Dvn&b5+S;^#`gwYgQ%Ued%T(2hGX_yaN>Evs5(vhOimqXW~x`svvK?3{|eM>2b9 zT$`%gXwbo|k8AdQ0nhA|zFd&p3*&rm_pLSBIW`6W-pCNsEO!8^%4oD%wqDx$e62$x ztVPUf=wZu+y|b7zkunfpy5W)y;iY7e0y>M^IS*kDJOTG5AVE>r`zjhQO|{6Zh;u@) zf5WC`C`0F}|GCEh>=|AGsv?Q|OFOnr9%qWEuwfVUA$D*sSbOfJP%Z=w^!Zd_ZhVR% zx&kR+nfKRVRgp4Cx>vF5-nr|&TxfsOamU`ZnEP_)fMEla-pS(B4#kyF-b{PG6`Tae z^>5ox^_t{&C2f>0+-&-(_=8b!5Pkv(=H*5ioqJp=h*a!DGERfy!mN+p6t~4z(4@L< z7HUycm|)78zH9m-d>cncvs;V&e%OjRQpM^QzAo=7L%P1QC$C8JJ#%R}gIJ^SH3@{P zVV-Wu3qPZvp5M`$t3;5T+%(`*G0mhx45SuoQ7qW^K+acUnVx1!?KmbIUyf!Cgr^gH z0|_5%4_cOJJU5eQ3O$uoa1@m~L%V7_YcY`+b}Ua?at@ar2xb7@A{e)D{v@D6Zccj; z2A(VoA73w@z~^>2<4E5x2`1ePr$bEt=6UU^-`>y0S>CIxnc%4eyK{#oaA2Mmu-~0$LvxwyQ23O(Jq8zcaQ6YA5xgNn(H3aR24?&PL**_ zd{U}I$phzQWRaZb-s7HR>~&fq0MO!W4Vi!OWvTTSP-}D65z?A}`bt|vLhTo=zfH4hK6n7E-|HVo^#aVFErA@`zV?<9_) zv(?=$9tuiJ8jK}ACqDH5IPx^|%MC-#j;=pb$eOxs5VrWskM3$+%XurOs3DeI;(4ibzBLX*z_~!vuTUcqbRb1m>#mwXj{hF{ofKO?^js zeX+B$?X46GE1`#lD1f}1)@KCA;0Bz^&=j+~-unjkLk(tUdA5be~RQ<3hl@@}@Rg zGjd6s-0eXy*Ayj})TwCO-MnE{QvOaG0Z&fAM4s+Ex~}C=C3WdiGIO-G41EVeGMhNu zdU3gdH%vk5c4$8l9~(WaYb3|q(;rXQPBrV{zW5xq(lYH~ESL3@r7tq333m0GOZd;+ z=@q+@2xINwxpMmh5x*A3WPT<-xlTisgjK7dANXaNA5YN+I+I3lyHVXCIYcRyX^L4M}Du4%^+ijZS9IiVb{I$WTO!{vP`2NzOn zXm|Ap;rOEczhxKeOzF?n)96M=jN)Z72^qDE2EI^nJ4T7ak(1)|{gkBt55aEiI90RV4W zq;9icI1kaZgx4kfZh*qd0!*)^91C5aa;nM5(}7-gdMoR;n@53@$ zoRSV%v0JSL*6IH~T>s)+S7;OGY)g1900@&#D@cPtsH41oW(w)vi;zctIK=gMB0r(S z#eQM@Z0fsn+&r-0WMvGQ*UsxSa#l~Zm|0{#o+|6N& zN5FdTKM|;rtF0I4YHM4t2iNyTTf1hXS6*JWU|395>~ruUmRJ3^2Fa%HGDyrFk6vt| ze~3(!gg`?eT!g-vXR1vk{bb)H?d%!~Z{ z6b%QzY{}@wuE>78bOoLwO(W|=`e?M zfqivxyWO4#K%R-czTI+`7@P2#P-k@WB8~?+Mcmb(29mWD=TW_Qp(sTE)!~Ew_*{rl zF#6Ah>Rk@B3e`ggB}z-s;r$-nn`w;xw^k30T#;4+;w1ny%mb&G;H0s6UrSjfZtrMX z?JEh6j^~5`rVs3tH28j(2N%3_oPU!YM}RIIuvR~x)sr5wgf(YI$09gQ$yXZ&6Jiro z;Y-<^KA>RVW;^EH=*w=uptB;qO)Rw6Z@FdIN5=oh>h<*d>8Sqq5z*|p7u`PyR#>p= zaKpu(qW6PfT0ynK?A}p|!Y})?buW=EdiPQ@t)Z8RnO<<)k*yG1CqBAHB>>|a;yLm3o?yn8 zv8^5v{Y4;@+b&4fnW47%icy1B<5iMVwCGkD;KmLJNoD#?z=_BihTeiQr)H@oJ5-1F z+K)OTsLJC6Cvm0F8nDXZn3Z2{|G=XsBR+4LHEp^Y+}N+rS48s3Op6!Hz?Ys<8o&K` zi9NioWyv0D9&#L95fWo5fS&f2)ND-ZGLGj;@In(|EG}AGT(S4kQdKF$XYlkZhcCd` zzm0j%sC10LG1DTC$)4j}S+$-*zH`BludW?O2BP~C5HopubgY;&qnrpMj0FOu~>f^sOc@s zfhmwjBU=tUI)odBL-Sd{$z&f=a~=qR*YbABqJLkcJi1n4^(-E;~;jPb2V6lqN#Ittc>n2q%ew z`H#`!o1Xp@u%H*P$?5pB~iirofgxBz%MD^ALfsc!jnso?^$#LUfR z$f1{LpsKAfdN#C4tY&a8KosQ!GeDw|k)La`qC$1J{uEwX7GSoTT8=58qwYR9?}2?M z)L@)pYX{8k1LCn1PT{@#dom9|ui)bC9+4{8!?lpxtWU4=(2J6IA>WEVRR*nQJOj>C zcSXxX?;{#UEb$&ZTE&AWI;_yr#{OuLk1H4W;z4086^xUMQoHcU3B!QZE>L0*MPT4$DrZ8r#G5+zhp>j%$8e1 zm6(6x3qIM=DjWq}6)V%uZ`7F3xj1MUJ_S}%Rm*NJ{Sm`#`;MVvtj#3-=!Z60>7ah; z%ED@q7j?E$@J^=Q0e(M8$e%t$Eh-VZ^k?{b+2)A87GO7QQqj^tY?r)O!* zEd{Kl3hn=>C8xIM)M7F?C@KpYoM|4IUi&FqV)e$Q7e`nlRgKIcr*rM{tb=Y%z?#GN~ic~qcp@lCa_3w2j3Q7FC3o$a)o+fVS9XU`qBGQvyxeB5^j5vDDl%A-%?mc zROMB`j!;-AakhstorX1XYQ!NpjiSwHYwd*aLkD1&@`*;pNE`@`GM=>fp5xP?3S7U( zc?%eG{LGN$lrsqA7(bM7g__$kPNuE|5Q@o5oJ}zlhB1T;W;w}&rIhAbS6O+h(;$SJ zAUwLa4A)Z6tfSkv+j(=5H{cS5=PNy)eQ7U)?0tZWEyC%5?G&~YIy$NDb?6Kzt?is# z0=9Pt2xXk!A7i}flwwh*NgWcMFOdWXyDaO9OLwfAr72W;wlpI(==!dN^|6;y0*jL9 zKyZSx12XlyMxLkwsmVPu+?0Edn*I;~)952Sqw2b_!hT3y%Co)bwuUXJxBG3|$A zO^-y)Rl$Z5EQPJEEbbQ!-@;Ou)#1!p_X78UGJa=Tv}&XTS~L z+~ucS^};dJ&$^Z>Po)_{NuR@b+K?Z{D8(cl3yvVj{>}c_6jxC4skO2HDLe<}CJ+;v z!bHw4z+VlViInmM3Qvm4bT%5%P+|}-zhkQdEGUWDEVx2HF4RDU4)evKih_8{8UKsx z`WqHi^8HjaiM;x+h7h}#Q*)}897HclTJ-hZrDRbcc0vkwhWm_=NyBzPpQ0$~B?1Xl zK+bvojV@~xzpRLTQAhRca~-nkm#@8Nfyln_ zlE&-=c(oGYD!ZwfaF{{DVx2Qxf$oAZpC(m@@=|vw#KQyugR^V^9>o+&rpynIxx)xG z@cy|YiJi)cqs_@im^*zdah)%!xEint1?8c3UJ7yl%ruNZ!EgzVm}OBIT?dnH4ed6n zk5bpQYW literal 9894 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 YJ0%5XDPSH59jc6x)-u6OjhH7Q00`Jm6aWAK diff --git a/examples/vertex-weight-limit/vertex_weight_limit.py b/examples/vertex-weight-limit/vertex_weight_limit.py index ff750c6..ccd8d8a 100644 --- a/examples/vertex-weight-limit/vertex_weight_limit.py +++ b/examples/vertex-weight-limit/vertex_weight_limit.py @@ -110,8 +110,9 @@ def tag(rings_verts, bone): (1.82, 0.26), (2.00, 0.24), (2.10, 0.27), (2.16, 0.27), (2.22, 0.24), (2.45, 0.22)], ORANGE), "Elbow") - # teal accent ring inset on the forearm - tag(lathe_part(bm, [(2.10, 0.275), (2.16, 0.275)], ACCENT), "Elbow") + # teal accent ring sealing the elbow boot — the primary + # five-influence zone the limit prunes + tag(lathe_part(bm, [(1.33, 0.245), (1.39, 0.245)], ACCENT), "Elbow") # wrist flex boot + ball (second >4-influence region) tag(lathe_part(bm, [(2.45, 0.21), (2.52, 0.17), (2.60, 0.20), (2.68, 0.16), (2.76, 0.19), (2.84, 0.16), (2.95, 0.15)], RUBBER), "FLEX") @@ -313,7 +314,8 @@ def pbr(name, base, metallic, roughness, emission=None, strength=0.0): return [ pbr("Gunmetal", (0.11, 0.12, 0.14), 0.9, 0.32), pbr("HazardOrange", (0.82, 0.30, 0.08), 0.10, 0.45), - pbr("FlexRubber", (0.05, 0.05, 0.06), 0.0, 0.85), + pbr("FlexRubber", (0.04, 0.13, 0.17), 0.0, 0.80, + emission=(0.06, 0.30, 0.34), strength=0.38), pbr("TealAccent", (0.03, 0.22, 0.26), 0.0, 0.35, emission=(0.10, 0.65, 0.72), strength=2.2), ] From 099ac172ea48cf54a762d2719fd07d06f7d68b23 Mon Sep 17 00:00:00 2001 From: fOuttaMyPaint Date: Sun, 19 Jul 2026 17:17:17 -0400 Subject: [PATCH 3/4] fix: stage vse-cut-list hero as an editing-bay presentation The raw sequencer frame was stylistically the furthest hero from the house look. The render now makes two passes: the authentic VSE program wall (evidence, untouched) and a dark-studio editing bay whose reference monitor displays exactly that frame (presentation). The check and --check-pixels paths are unchanged and green on 5.1.2 and 4.5.11 with identical measured values; the 4.5 render path is proven locally. Includes the explicit-UV fix: the flat screen quad's Generated coords sampled one frame strip; UVs carry the full frame. Signed-off-by: fOuttaMyPaint --- docs/gallery/assets/vse-cut-list-hero.webp | Bin 13416 -> 12276 bytes docs/gallery/vse-cut-list/index.html | 148 ++++++++++++++++++++- examples/vse-cut-list/README.md | 5 +- examples/vse-cut-list/preview.webp | Bin 11464 -> 10812 bytes examples/vse-cut-list/vse_cut_list.py | 146 +++++++++++++++++++- 5 files changed, 285 insertions(+), 14 deletions(-) diff --git a/docs/gallery/assets/vse-cut-list-hero.webp b/docs/gallery/assets/vse-cut-list-hero.webp index d0a70f1565b9dc7e138ea515cae8375adcd7dc2c..5577bab6bd43776eaf90b777469fb4a3e2284c88 100644 GIT binary patch literal 12276 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%0DoQbVloMWxd%!dQ9M|}Rjk;?5&D5`bP^+y4FZ*LP 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 VGxvse-cut-list

Hazards discovered while authoring (all witnessed by the checks above):

  • A GAMMA_CROSS asked to outlast its inputs' overlap is silently clamped to the overlap — request length 9 over a (25, 33) overlap, get (25, 33).
  • A scene strip pointing at its own scene is a feedback loop and renders transparent (alpha 0) — the "stage" is silently absent. Source a separate scene.
  • Effect strips consume their inputs: input strips never composite on their own channel, and the effect's transform applies on top of the inputs' transforms. Consumption requires the effect on a channel above its inputs; below, they keep painting independently.
  • An empty bpy_prop_collection is falsy — se.strips or se.sequences silently falls through to the legacy accessor on an empty timeline. Always branch on hasattr.

Version divergence: the whole example is the divergence — gated on the bpy.app.version tuple (>= (5, 0, 0)), never on version_string ("4.5.11 LTS" is not bare semver). Each side asserts its own canonical contract plus the other side's removal/bridge state. Measured values are identical on 4.5.11 and 5.1.1, including the pixel witness.

-

Render: the program wall *is* the sequencer output at frame 29 (mid cross) — crimson A, teal B, amber long-runner C, and the 50/50 cross blend, over the Stage scene strip showing the dark studio. An off-by-one in end-exclusive span math drops its cell to the dark stage; the caption strip carries the closed form. Rendered locally with EEVEE (GPU host); the checks and --check-pixels need no GPU (Cycles CPU).

+

Render: the program wall *is* the sequencer output at frame 29 (mid cross) — crimson A, teal B, amber long-runner C, and the 50/50 cross blend, over the Stage scene strip showing the dark studio. An off-by-one in end-exclusive span math drops its cell to the dark stage; the caption strip carries the closed form. The hero presents that authentic frame on a reference monitor in a dark-studio editing bay — the pixels on the screen are the genuine sequencer output (evidence); only the bay around them is staged (presentation). Rendered locally with EEVEE (GPU host); the checks and --check-pixels need no GPU (Cycles CPU).

Run

# Cheap correctness check (no render) — the CI check:
 blender --background --python vse_cut_list.py --
@@ -245,16 +245,17 @@ 

Source

The check builds a deterministic cut list, asserts every span against its closed form on each version's canonical accessors, then proves the spans, wiring, colors, and transforms survive a save/reload round-trip. Pass ---output to render the program wall staged inside the studio — the mosaic -IS the sequencer output sampled mid-cross — and --check-pixels to assert -the compositing contract on a tiny render (cell colors and input -consumption), the way CI does: +--output to render the authentic program wall (the sequencer output +sampled mid-cross) presented on a reference monitor in the dark-studio +editing bay, and --check-pixels to assert the compositing contract on a +tiny render (cell colors and input consumption), the way CI does: blender --background --python vse_cut_list.py -- blender --background --python vse_cut_list.py -- --check-pixels blender --background --python vse_cut_list.py -- --output vse.png """ -import bpy, sys, os, math, argparse, tempfile, warnings +import bpy, sys, os, math, argparse, tempfile, warnings, shutil +import mathutils IS_5X = bpy.app.version >= (5, 0, 0) @@ -629,11 +630,144 @@

Source

return os.path.exists(path) and os.path.getsize(path) > 0 +def build_bay(sc, frame_path): + """The editing-bay presentation: a reference monitor on a desk in the + dark studio, its screen showing the AUTHENTIC sequencer frame. The pixels + on the screen are the evidence (rendered by the VSE above); the bay is + only the designed presentation around them.""" + import bmesh + + def box(name, size, loc, mat): + me = bpy.data.meshes.new(name) + bm = bmesh.new() + try: + bmesh.ops.create_cube(bm, size=1.0, + matrix=mathutils.Matrix.Diagonal((*size, 1.0))) + bm.to_mesh(me) + finally: + bm.free() + me.materials.append(mat) + ob = bpy.data.objects.new(name, me) + ob.location = loc + sc.collection.objects.link(ob) + return ob + + def pbr(name, base, metallic, roughness): + mat = bpy.data.materials.new(name) + mat.use_nodes = True + b = mat.node_tree.nodes["Principled BSDF"] + b.inputs["Base Color"].default_value = (*base, 1.0) + b.inputs["Metallic"].default_value = metallic + b.inputs["Roughness"].default_value = roughness + return mat + + gunmetal = pbr("BayMetal", (0.08, 0.09, 0.10), 0.7, 0.40) + deskmat = pbr("DeskTop", (0.05, 0.05, 0.06), 0.0, 0.80) + + # desk slab, stand, and the monitor bezel (screen face toward -Y) + box("Desk", (2.80, 1.10, 0.72), (0.0, 0.0, 0.36), deskmat) + box("StandBase", (0.70, 0.50, 0.06), (0.0, 0.05, 0.75), gunmetal) + box("Stand", (0.18, 0.12, 0.50), (0.0, 0.05, 0.99), gunmetal) + box("Bezel", (2.06, 0.09, 1.30), (0.0, 0.0, 1.89), gunmetal) + + # the screen: one unlit quad sampling the authentic frame end to end — + # emission only, so the VSE pixels read exactly as the sequencer wrote them + img = bpy.data.images.load(frame_path) + smat = bpy.data.materials.new("ProgramScreen") + smat.use_nodes = True + nt = smat.node_tree + nt.nodes.clear() + out = nt.nodes.new("ShaderNodeOutputMaterial") + em = nt.nodes.new("ShaderNodeEmission") + tex = nt.nodes.new("ShaderNodeTexImage") + tex.image = img + tc = nt.nodes.new("ShaderNodeTexCoord") + nt.links.new(tc.outputs["UV"], tex.inputs["Vector"]) + nt.links.new(tex.outputs["Color"], em.inputs["Color"]) + nt.links.new(em.outputs["Emission"], out.inputs["Surface"]) + sme = bpy.data.meshes.new("Screen") + bm = bmesh.new() + try: + q = [bm.verts.new(p) for p in ((-0.96, -0.048, 1.35), (0.96, -0.048, 1.35), + (0.96, -0.048, 2.43), (-0.96, -0.048, 2.43))] + # explicit UVs, not Generated: the quad is flat in Y, so Generated's + # image-V is a constant and the screen samples one strip of the frame + uv_layer = bm.loops.layers.uv.new("UVMap") + f = bm.faces.new(q) + for li, l in enumerate(f.loops): + l[uv_layer].uv = ((0.0, 0.0), (1.0, 0.0), (1.0, 1.0), (0.0, 1.0))[li] + bm.to_mesh(sme) + finally: + bm.free() + sme.materials.append(smat) + sob = bpy.data.objects.new("Screen", sme) + sc.collection.objects.link(sob) + + # a small desk-lip caption, the bay's only typography + cmat = pbr("CaptionGrey", (0.42, 0.44, 0.48), 0.2, 0.6) + cu = bpy.data.curves.new("BayCaption", "FONT") + cu.body = "PROGRAM" + cu.align_x = "CENTER" + cu.size = 0.10 + cu.extrude = 0.004 + cob = bpy.data.objects.new("BayCaption", cu) + cob.location = (0.0, -0.40, 0.73) + cob.data.materials.append(cmat) + sc.collection.objects.link(cob) + + +def render_bay(sc, path, engine, w, h): + """Render the editing bay. The camera moves to a three-quarter view of + the monitor; everything else reuses the house stage.""" + cam_data = bpy.data.cameras.new("BayCam") + cam_data.lens = 52.0 + cam = bpy.data.objects.new("BayCam", cam_data) + cam.location = (2.0, -5.2, 1.72) + sc.collection.objects.link(cam) + target = bpy.data.objects.new("BayAim", None) + target.location = (0.0, 0.0, 1.28) + sc.collection.objects.link(target) + con = cam.constraints.new("TRACK_TO") + con.target = target + sc.camera = cam + + sc.render.engine = "CYCLES" if engine == "cycles" else eevee_engine_id() + if engine == "cycles": + sc.cycles.samples = 64 + sc.cycles.use_denoising = False + else: + try: + sc.eevee.taa_render_samples = 64 + except AttributeError: + pass + sc.render.resolution_x = w + sc.render.resolution_y = h + sc.render.resolution_percentage = 100 + sc.render.image_settings.file_format = "PNG" + sc.render.filepath = path + # Standard keeps both the stage saturated and the on-screen frame true + sc.view_settings.view_transform = "Standard" + bpy.ops.render.render(write_still=True, scene=sc.name) + return os.path.exists(path) and os.path.getsize(path) > 0 + + def render_still(path, engine): + """Two passes: the authentic sequencer frame (evidence), then the + editing-bay presentation with that exact frame on the monitor screen.""" sc = bpy.context.scene build_cut_list(sc) build_stage(bpy.data.scenes["Stage"]) - return render_frame(sc, path, engine, RENDER_W, RENDER_H) + tmp = tempfile.mkdtemp(prefix="vse_frame_") + try: + frame_path = os.path.join(tmp, "program.png") + if not render_frame(sc, frame_path, engine, RENDER_W, RENDER_H): + return False + bay = bpy.data.scenes.new("Bay") + build_stage(bay) # the house dark studio, lights included + build_bay(bay, frame_path) + return render_bay(bay, path, engine, RENDER_W, RENDER_H) + finally: + shutil.rmtree(tmp, ignore_errors=True) # pixels live on in the blend def near(got, want, tol): diff --git a/examples/vse-cut-list/README.md b/examples/vse-cut-list/README.md index 557f7af..cc0ecbb 100644 --- a/examples/vse-cut-list/README.md +++ b/examples/vse-cut-list/README.md @@ -87,7 +87,10 @@ identical on 4.5.11 and 5.1.1, including the pixel witness. cross) — crimson A, teal B, amber long-runner C, and the 50/50 cross blend, over the Stage scene strip showing the dark studio. An off-by-one in end-exclusive span math drops its cell to the dark stage; the caption strip -carries the closed form. Rendered locally with EEVEE (GPU host); the checks +carries the closed form. The hero presents that authentic frame on a +reference monitor in a dark-studio editing bay — the pixels on the screen +are the genuine sequencer output (evidence); only the bay around them is +staged (presentation). Rendered locally with EEVEE (GPU host); the checks and `--check-pixels` need no GPU (Cycles CPU). ## Run diff --git a/examples/vse-cut-list/preview.webp b/examples/vse-cut-list/preview.webp index 852620290a8ff575cf55fee51765c1f577bc0088..e03381bfa2e0a18fff0b3489613900668cd23d3b 100644 GIT binary patch literal 10812 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 G0002HxDy8e literal 11464 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 (5, 0, 0) @@ -418,11 +419,144 @@ def render_frame(sc, path, engine, w, h): return os.path.exists(path) and os.path.getsize(path) > 0 +def build_bay(sc, frame_path): + """The editing-bay presentation: a reference monitor on a desk in the + dark studio, its screen showing the AUTHENTIC sequencer frame. The pixels + on the screen are the evidence (rendered by the VSE above); the bay is + only the designed presentation around them.""" + import bmesh + + def box(name, size, loc, mat): + me = bpy.data.meshes.new(name) + bm = bmesh.new() + try: + bmesh.ops.create_cube(bm, size=1.0, + matrix=mathutils.Matrix.Diagonal((*size, 1.0))) + bm.to_mesh(me) + finally: + bm.free() + me.materials.append(mat) + ob = bpy.data.objects.new(name, me) + ob.location = loc + sc.collection.objects.link(ob) + return ob + + def pbr(name, base, metallic, roughness): + mat = bpy.data.materials.new(name) + mat.use_nodes = True + b = mat.node_tree.nodes["Principled BSDF"] + b.inputs["Base Color"].default_value = (*base, 1.0) + b.inputs["Metallic"].default_value = metallic + b.inputs["Roughness"].default_value = roughness + return mat + + gunmetal = pbr("BayMetal", (0.08, 0.09, 0.10), 0.7, 0.40) + deskmat = pbr("DeskTop", (0.05, 0.05, 0.06), 0.0, 0.80) + + # desk slab, stand, and the monitor bezel (screen face toward -Y) + box("Desk", (2.80, 1.10, 0.72), (0.0, 0.0, 0.36), deskmat) + box("StandBase", (0.70, 0.50, 0.06), (0.0, 0.05, 0.75), gunmetal) + box("Stand", (0.18, 0.12, 0.50), (0.0, 0.05, 0.99), gunmetal) + box("Bezel", (2.06, 0.09, 1.30), (0.0, 0.0, 1.89), gunmetal) + + # the screen: one unlit quad sampling the authentic frame end to end — + # emission only, so the VSE pixels read exactly as the sequencer wrote them + img = bpy.data.images.load(frame_path) + smat = bpy.data.materials.new("ProgramScreen") + smat.use_nodes = True + nt = smat.node_tree + nt.nodes.clear() + out = nt.nodes.new("ShaderNodeOutputMaterial") + em = nt.nodes.new("ShaderNodeEmission") + tex = nt.nodes.new("ShaderNodeTexImage") + tex.image = img + tc = nt.nodes.new("ShaderNodeTexCoord") + nt.links.new(tc.outputs["UV"], tex.inputs["Vector"]) + nt.links.new(tex.outputs["Color"], em.inputs["Color"]) + nt.links.new(em.outputs["Emission"], out.inputs["Surface"]) + sme = bpy.data.meshes.new("Screen") + bm = bmesh.new() + try: + q = [bm.verts.new(p) for p in ((-0.96, -0.048, 1.35), (0.96, -0.048, 1.35), + (0.96, -0.048, 2.43), (-0.96, -0.048, 2.43))] + # explicit UVs, not Generated: the quad is flat in Y, so Generated's + # image-V is a constant and the screen samples one strip of the frame + uv_layer = bm.loops.layers.uv.new("UVMap") + f = bm.faces.new(q) + for li, l in enumerate(f.loops): + l[uv_layer].uv = ((0.0, 0.0), (1.0, 0.0), (1.0, 1.0), (0.0, 1.0))[li] + bm.to_mesh(sme) + finally: + bm.free() + sme.materials.append(smat) + sob = bpy.data.objects.new("Screen", sme) + sc.collection.objects.link(sob) + + # a small desk-lip caption, the bay's only typography + cmat = pbr("CaptionGrey", (0.42, 0.44, 0.48), 0.2, 0.6) + cu = bpy.data.curves.new("BayCaption", "FONT") + cu.body = "PROGRAM" + cu.align_x = "CENTER" + cu.size = 0.10 + cu.extrude = 0.004 + cob = bpy.data.objects.new("BayCaption", cu) + cob.location = (0.0, -0.40, 0.73) + cob.data.materials.append(cmat) + sc.collection.objects.link(cob) + + +def render_bay(sc, path, engine, w, h): + """Render the editing bay. The camera moves to a three-quarter view of + the monitor; everything else reuses the house stage.""" + cam_data = bpy.data.cameras.new("BayCam") + cam_data.lens = 52.0 + cam = bpy.data.objects.new("BayCam", cam_data) + cam.location = (2.0, -5.2, 1.72) + sc.collection.objects.link(cam) + target = bpy.data.objects.new("BayAim", None) + target.location = (0.0, 0.0, 1.28) + sc.collection.objects.link(target) + con = cam.constraints.new("TRACK_TO") + con.target = target + sc.camera = cam + + sc.render.engine = "CYCLES" if engine == "cycles" else eevee_engine_id() + if engine == "cycles": + sc.cycles.samples = 64 + sc.cycles.use_denoising = False + else: + try: + sc.eevee.taa_render_samples = 64 + except AttributeError: + pass + sc.render.resolution_x = w + sc.render.resolution_y = h + sc.render.resolution_percentage = 100 + sc.render.image_settings.file_format = "PNG" + sc.render.filepath = path + # Standard keeps both the stage saturated and the on-screen frame true + sc.view_settings.view_transform = "Standard" + bpy.ops.render.render(write_still=True, scene=sc.name) + return os.path.exists(path) and os.path.getsize(path) > 0 + + def render_still(path, engine): + """Two passes: the authentic sequencer frame (evidence), then the + editing-bay presentation with that exact frame on the monitor screen.""" sc = bpy.context.scene build_cut_list(sc) build_stage(bpy.data.scenes["Stage"]) - return render_frame(sc, path, engine, RENDER_W, RENDER_H) + tmp = tempfile.mkdtemp(prefix="vse_frame_") + try: + frame_path = os.path.join(tmp, "program.png") + if not render_frame(sc, frame_path, engine, RENDER_W, RENDER_H): + return False + bay = bpy.data.scenes.new("Bay") + build_stage(bay) # the house dark studio, lights included + build_bay(bay, frame_path) + return render_bay(bay, path, engine, RENDER_W, RENDER_H) + finally: + shutil.rmtree(tmp, ignore_errors=True) # pixels live on in the blend def near(got, want, tol): From 2690e058a21690744b2ae32c427f92d08fcc0d88 Mon Sep 17 00:00:00 2001 From: fOuttaMyPaint Date: Sun, 19 Jul 2026 17:17:32 -0400 Subject: [PATCH 4/4] docs: cross-reference the pipeline arc and commit the audit contact sheet MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit lod-decimate-chain's README gains the modeling/LOD - weighting - export stage references (the other two arc READMEs carry theirs in their fix commits), and the combined seven-cell audit contact sheet — four audited heroes beside the pinned calibration set — is committed per the contact-sheet gate. Signed-off-by: fOuttaMyPaint --- .../game-pipeline-audit-contact-sheet.webp | Bin 0 -> 56774 bytes docs/gallery/lod-decimate-chain/index.html | 1 + examples/lod-decimate-chain/README.md | 4 ++++ 3 files changed, 5 insertions(+) create mode 100644 docs/gallery/contact-sheets/game-pipeline-audit-contact-sheet.webp diff --git a/docs/gallery/contact-sheets/game-pipeline-audit-contact-sheet.webp b/docs/gallery/contact-sheets/game-pipeline-audit-contact-sheet.webp new file mode 100644 index 0000000000000000000000000000000000000000..c3a0f6327e7d0874c5a06e144d618dabf9dc473c GIT binary patch literal 56774 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

A runnable example that builds a retro toy rocket — a lathed body with an ogive nose, three swept fin plates, a porthole, every dimension a closed form — and evaluates it at LOD0/1/2 through the Decimate modifier via the depsgraph, following depsgraph-and-evaluated-data and mesh-editing-and-bmesh.

+

Pipeline arc: modeling/LOD here, weighting in vertex-weight-limit, export in gltf-export-roundtrip.

What it witnesses: the modifier-based LOD contract that game asset pipelines rely on.

1. Decimate is non-destructive and lives in the depsgraph. The evaluated mesh carries the reduction; the original datablock is byte-identical before and after evaluation. The check proves both — evaluated counts drop while obj.data keeps the closed-form counts (1,147 verts / 2,260 tris) — and every evaluated reference is released with to_mesh_clear(). An LOD chain that bakes the reduction into obj.data destroys the asset's LOD0. 2. The COLLAPSE ratio is a target, not a guarantee. Each LOD's evaluated triangle count must land within 5% of ratio x base_tris — measured 0.00% at ratio 0.5 (1,130 tris) and 0.44% at ratio 0.18 (405 tris). A stacked second Decimate halves the effective ratio (50% excursion, caught); a dropped modifier leaves evaluated == original (caught). 3. LODs preserve silhouette-critical dimensions. Height (3.12) and fin span are the rocket's readability; the evaluated bbox holds the base bbox within 1e-3 at every level (measured 7.7e-6). Decimate has no vertex pinning, so this is a real risk, not a formality: at an aggressive ratio 0.02 the nose tip collapses (bbox drift 0.0206, caught).

The Decimate modifier API (decimate_type='COLLAPSE', ratio) is stable between Blender 4.5 LTS and 5.1 — the example runs identically on both, which is itself the version witness (measured values match to the digit).

diff --git a/examples/lod-decimate-chain/README.md b/examples/lod-decimate-chain/README.md index e591c41..dfd8dc3 100644 --- a/examples/lod-decimate-chain/README.md +++ b/examples/lod-decimate-chain/README.md @@ -6,6 +6,10 @@ evaluates it at LOD0/1/2 through the Decimate modifier via the depsgraph, following [`depsgraph-and-evaluated-data`](../../skills/depsgraph-and-evaluated-data/SKILL.md) and [`mesh-editing-and-bmesh`](../../skills/mesh-editing-and-bmesh/SKILL.md). +**Pipeline arc:** modeling/LOD here, weighting in +[`vertex-weight-limit`](../vertex-weight-limit/), export in +[`gltf-export-roundtrip`](../gltf-export-roundtrip/). + **What it witnesses:** the modifier-based LOD contract that game asset pipelines rely on.