Skip to content

Commit e416233

Browse files
TMHSDigitalclaude
andcommitted
fix(examples): warm the vertex-color-ao stage and aim its wedge
Render path only. The blue fill and rim lit the stage cold and the wedge grazed floor the camera barely saw; the rig is now near neutral with the wedge pooled behind the well. Bake, checks and exit codes unchanged. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Signed-off-by: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com>
1 parent 8194269 commit e416233

6 files changed

Lines changed: 41 additions & 10 deletions

File tree

7.83 KB
Loading
9.29 KB
Loading

‎docs/gallery/vertex-color-ao/index.html‎

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -292,6 +292,7 @@ <h2>Hazards found while authoring</h2>
292292
<p>The exit-7 probe earned its keep twice: the depsgraph check originally compared <code>zip(src.data, eva.data)</code>, which stops at the shorter sequence, so a resampled attribute reported a clean <strong>0.0</strong> deviation and the probe exited <strong>0</strong>. The length guard was added because the falsification pass failed to fail.</p>
293293
<p><strong>Version witness:</strong> check output is byte-identical on Blender 4.5.11 LTS and 5.1.2 — same 6966 vertices, same closed-form errors to every printed digit, same storage deviations.</p>
294294
<p><strong>Render as proof:</strong> the well on the dark stage, lit only by the studio rig, with the baked AO multiplied into base colour — the masonry joints, the shaft mouth, the coping undersides and the apron contact all darken from the attribute, not from the lights. The falsification variant (<code>--falsify</code>) writes the same bake <strong>inverted</strong>: sky-facing coping and apron tops go grimy while the recesses and post bases glow, occlusion turned inside out.</p>
295+
<p>The studio rig is presentation only. Its fill and rim used to be strongly blue, which lit the whole stage cold (stage luma 0.243, warmth +0.01 against the calibration set). Its wedge grazed floor the camera barely saw and left a hard-edged patch on the back wall. Both are now near neutral, and the wedge pools warm light on the floor just behind the well from the camera&#x27;s side: luma 0.274, warmth +0.023. The bake, the checks and the exit codes are unchanged.</p>
295296
<h2>Run</h2>
296297
<pre><code>blender --background --python vertex_color_ao.py --
297298
blender --background --python vertex_color_ao.py -- --output well.png
@@ -400,6 +401,8 @@ <h2>Source</h2>
400401
BYTE_MODEL_TOL = <span class="n">1e-6</span> <span class="c"># agreement with the independent sRGB model</span>
401402
SPREAD_MIN = <span class="n">0.25</span> <span class="c"># the asset must actually use its AO range</span>
402403
EXPECT_PARTS = <span class="n">11</span> <span class="c"># asserted before any per-part loop runs (check 0)</span>
404+
WEDGE_AT = (-<span class="n">0.9</span>, <span class="n">3.4</span>, <span class="n">2.0</span>) <span class="c"># render only: warm wedge position</span>
405+
WEDGE_POOL = (-<span class="n">1.8</span>, <span class="n">2.2</span>, <span class="n">0.0</span>) <span class="c"># render only: floor point the wedge pools on</span>
403406

404407

405408
<span class="k">def</span> eevee_engine_id():
@@ -1149,11 +1152,20 @@ <h2>Source</h2>
11491152
ob.rotation_euler = tuple(math.radians(a) <span class="k">for</span> a <span class="k">in</span> rot)
11501153
sc.collection.objects.link(ob)
11511154

1152-
<span class="c"># VISUAL-STYLE Layer 2 rig, energies scaled to a ~1.9 m subject</span>
1153-
light(<span class="s">&quot;Key&quot;</span>, (-<span class="n">2.3</span>, -<span class="n">2.4</span>, <span class="n">3.6</span>), <span class="n">430.0</span>, <span class="n">3.0</span>, (<span class="n">1.0</span>, <span class="n">0.96</span>, <span class="n">0.9</span>), (<span class="n">40</span>, <span class="n">0</span>, -<span class="n">42</span>))
1154-
light(<span class="s">&quot;Fill&quot;</span>, (<span class="n">3.0</span>, -<span class="n">2.0</span>, <span class="n">1.2</span>), <span class="n">78.0</span>, <span class="n">5.0</span>, (<span class="n">0.75</span>, <span class="n">0.85</span>, <span class="n">1.0</span>), (<span class="n">70</span>, <span class="n">0</span>, <span class="n">54</span>))
1155-
light(<span class="s">&quot;Rim&quot;</span>, (-<span class="n">0.9</span>, <span class="n">3.0</span>, <span class="n">2.6</span>), <span class="n">240.0</span>, <span class="n">2.0</span>, (<span class="n">0.6</span>, <span class="n">0.78</span>, <span class="n">1.0</span>), (-<span class="n">54</span>, <span class="n">0</span>, <span class="n">196</span>))
1156-
light(<span class="s">&quot;Wedge&quot;</span>, (<span class="n">0.3</span>, <span class="n">5.0</span>, <span class="n">0.7</span>), <span class="n">300.0</span>, <span class="n">5.0</span>, (<span class="n">1.0</span>, <span class="n">0.76</span>, <span class="n">0.5</span>), (-<span class="n">86</span>, <span class="n">0</span>, <span class="n">182</span>))
1155+
<span class="c"># VISUAL-STYLE Layer 2 rig, energies scaled to a ~1.9 m subject. The fill</span>
1156+
<span class="c"># and rim used to be strongly blue and lit the whole stage cold (stage</span>
1157+
<span class="c"># luma 0.243, warmth +0.01 against the calibration set); they are now</span>
1158+
<span class="c"># near neutral and weaker, and the warm wedge carries the back wall.</span>
1159+
light(<span class="s">&quot;Key&quot;</span>, (-<span class="n">2.3</span>, -<span class="n">2.4</span>, <span class="n">3.6</span>), <span class="n">400.0</span>, <span class="n">3.0</span>, (<span class="n">1.0</span>, <span class="n">0.95</span>, <span class="n">0.88</span>), (<span class="n">40</span>, <span class="n">0</span>, -<span class="n">42</span>))
1160+
light(<span class="s">&quot;Fill&quot;</span>, (<span class="n">3.0</span>, -<span class="n">2.0</span>, <span class="n">1.2</span>), <span class="n">45.0</span>, <span class="n">5.0</span>, (<span class="n">0.88</span>, <span class="n">0.92</span>, <span class="n">1.0</span>), (<span class="n">70</span>, <span class="n">0</span>, <span class="n">54</span>))
1161+
light(<span class="s">&quot;Rim&quot;</span>, (-<span class="n">0.9</span>, <span class="n">3.0</span>, <span class="n">2.6</span>), <span class="n">170.0</span>, <span class="n">2.0</span>, (<span class="n">0.85</span>, <span class="n">0.88</span>, <span class="n">0.95</span>), (-<span class="n">54</span>, <span class="n">0</span>, <span class="n">196</span>))
1162+
light(<span class="s">&quot;Wedge&quot;</span>, (<span class="n">0.3</span>, <span class="n">5.0</span>, <span class="n">0.7</span>), <span class="n">150.0</span>, <span class="n">4.0</span>, (<span class="n">1.0</span>, <span class="n">0.70</span>, <span class="n">0.40</span>), (-<span class="n">86</span>, <span class="n">0</span>, <span class="n">182</span>))
1163+
<span class="c"># The wedge pool lands on the floor behind the well as the hero camera</span>
1164+
<span class="c"># sees it; at its old grazing angle it lit floor the camera barely saw.</span>
1165+
wedge = sc.objects[<span class="s">&quot;Wedge&quot;</span>]
1166+
wedge.location = WEDGE_AT
1167+
wedge.rotation_euler = (Vector(WEDGE_POOL) - Vector(WEDGE_AT)).to_track_quat(
1168+
<span class="s">&quot;-Z&quot;</span>, <span class="s">&quot;Y&quot;</span>).to_euler()
11571169
<span class="k">return</span> floor, wall
11581170

11591171

‎examples/vertex-color-ao/README.md‎

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,14 @@ attribute, not from the lights. The falsification variant (`--falsify`) writes
107107
the same bake **inverted**: sky-facing coping and apron tops go grimy while the
108108
recesses and post bases glow, occlusion turned inside out.
109109

110+
The studio rig is presentation only. Its fill and rim used to be strongly
111+
blue, which lit the whole stage cold (stage luma 0.243, warmth +0.01 against
112+
the calibration set). Its wedge grazed floor the camera barely saw and left a
113+
hard-edged patch on the back wall. Both are now near neutral, and the wedge
114+
pools warm light on the floor just behind the well from the camera's side:
115+
luma 0.274, warmth +0.023. The bake, the checks and the exit codes are
116+
unchanged.
117+
110118
## Run
111119

112120
```bash
7.02 KB
Loading

‎examples/vertex-color-ao/vertex_color_ao.py‎

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,8 @@
9090
BYTE_MODEL_TOL = 1e-6 # agreement with the independent sRGB model
9191
SPREAD_MIN = 0.25 # the asset must actually use its AO range
9292
EXPECT_PARTS = 11 # asserted before any per-part loop runs (check 0)
93+
WEDGE_AT = (-0.9, 3.4, 2.0) # render only: warm wedge position
94+
WEDGE_POOL = (-1.8, 2.2, 0.0) # render only: floor point the wedge pools on
9395

9496

9597
def eevee_engine_id():
@@ -839,11 +841,20 @@ def light(name, loc, energy, size, col, rot):
839841
ob.rotation_euler = tuple(math.radians(a) for a in rot)
840842
sc.collection.objects.link(ob)
841843

842-
# VISUAL-STYLE Layer 2 rig, energies scaled to a ~1.9 m subject
843-
light("Key", (-2.3, -2.4, 3.6), 430.0, 3.0, (1.0, 0.96, 0.9), (40, 0, -42))
844-
light("Fill", (3.0, -2.0, 1.2), 78.0, 5.0, (0.75, 0.85, 1.0), (70, 0, 54))
845-
light("Rim", (-0.9, 3.0, 2.6), 240.0, 2.0, (0.6, 0.78, 1.0), (-54, 0, 196))
846-
light("Wedge", (0.3, 5.0, 0.7), 300.0, 5.0, (1.0, 0.76, 0.5), (-86, 0, 182))
844+
# VISUAL-STYLE Layer 2 rig, energies scaled to a ~1.9 m subject. The fill
845+
# and rim used to be strongly blue and lit the whole stage cold (stage
846+
# luma 0.243, warmth +0.01 against the calibration set); they are now
847+
# near neutral and weaker, and the warm wedge carries the back wall.
848+
light("Key", (-2.3, -2.4, 3.6), 400.0, 3.0, (1.0, 0.95, 0.88), (40, 0, -42))
849+
light("Fill", (3.0, -2.0, 1.2), 45.0, 5.0, (0.88, 0.92, 1.0), (70, 0, 54))
850+
light("Rim", (-0.9, 3.0, 2.6), 170.0, 2.0, (0.85, 0.88, 0.95), (-54, 0, 196))
851+
light("Wedge", (0.3, 5.0, 0.7), 150.0, 4.0, (1.0, 0.70, 0.40), (-86, 0, 182))
852+
# The wedge pool lands on the floor behind the well as the hero camera
853+
# sees it; at its old grazing angle it lit floor the camera barely saw.
854+
wedge = sc.objects["Wedge"]
855+
wedge.location = WEDGE_AT
856+
wedge.rotation_euler = (Vector(WEDGE_POOL) - Vector(WEDGE_AT)).to_track_quat(
857+
"-Z", "Y").to_euler()
847858
return floor, wall
848859

849860

0 commit comments

Comments
 (0)