You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Commit 60506e8
Browse filesBrowse the repository at this point in the historyBrowse files
fix(showcase): all 76 pieces run the asset-quality floors; lint enforces it
showcase/README.md makes check_asset_quality part of the asset gate, but 37
of 76 pieces never called it, including wheelbarrow and apothecary-shelf
from the pinned asset-quality reference set, and 9 pieces added after the
rule landed.
- Each of the 37 now imports gallery_asset_quality and calls
check_asset_quality right after its framing gate, with the hero and stage
copied from that piece's own check_framing call. The helper's 11 is
remapped to the piece's next free exit (20-26, computed from its README
table and every int it already returns), and the README exit table gains
that row.
- tests/check_render_gates.py also fails any showcase/*/*.py that does not
import gallery_asset_quality and call check_asset_quality. 76/76 pass;
removing the call from sundial reports it.
- examples/gallery_asset_quality.py: the report printed "aq_materials ...
FAIL" when only the dominant-material share exceeded 0.75, while the gate
(correctly) passed and printed aq_ok. Dominant share is a dropped floor
(docs/VISUAL-STYLE.md § Asset quality, printed as information), so the
line now marks the material count and labels the share
informational-only. Gate behavior unchanged.
- showcase/README.md names the lint; gallery pages regenerated for the
inlined source.
Proof (local, .scratch/blender-5.2.1-windows-x64, 5.2.1 LTS, EEVEE): each of
the 37 rendered via its README --output command: 37/37 exit 0 with aq_ok
(fence-kit's FenceWood@1.00 dominant share is the informational line above).
No floor bound, so no model needed fixing and no exemption was recorded;
the committed heroes are unchanged because the gates only run before the
render.
Closes#341
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Copy file name to clipboardExpand all lines: docs/gallery/anvil/index.html
+14-4Lines changed: 14 additions & 4 deletions
Original file line number
Diff line number
Diff line change
@@ -98,15 +98,15 @@ <h2 id="run">Run<a class="anchor" href="#run" aria-label="Link to this section">
98
98
<p>Smoke passes no flags.</p>
99
99
<h2id="exit-codes">Exit codes<aclass="anchor" href="#exit-codes" aria-label="Link to this section">#</a></h2>
100
100
<p>File-local. <code>9</code> is a valid check code. <code>10</code> is reserved for <code>gallery_framing.check_framing</code> on the <code>--output</code> path. <code>15</code>–<code>19</code> are the hygiene and joint-fit family.</p>
101
-
<divclass="table-wrap"><table><thead><tr><thscope="col">Code</th><thscope="col">Meaning</th></tr></thead><tbody><tr><td>0</td><td>Success</td></tr><tr><td>1</td><td>Uncaught exception (FATAL wrapper)</td></tr><tr><td>2</td><td>argparse / usage</td></tr><tr><td>3</td><td>Mesh did not build / no UV layer</td></tr><tr><td>4</td><td>Base triangle count outside range</td></tr><tr><td>5</td><td>Material count ≠ 2 distinct slots, or a face-count floor missed</td></tr><tr><td>6</td><td>UVs outside 0..1</td></tr><tr><td>7</td><td>UV AABB overlap above tolerance</td></tr><tr><td>8</td><td>World AABB off declared outer size</td></tr><tr><td>9</td><td>LOD ratio band (<code>--skip-decimate</code> lands here)</td></tr><tr><td>10</td><td>Framing gate (render path only)</td></tr><tr><td>11</td><td>Collider triangle count above ceiling</td></tr><tr><td>12</td><td>Bake did not finish or image has no data</td></tr><tr><td>13</td><td>Export file missing or empty</td></tr><tr><td>14</td><td><code>--output</code> produced no file</td></tr><tr><td>15</td><td>Mesh hygiene: loose, non-manifold, zero-area, doubles, n-gons, z-fight</td></tr><tr><td>16</td><td>Not grounded: bounding box <code>zmin</code> off 0, or a named stave floats</td></tr><tr><td>17</td><td>Joint fit: foot-on-head gap (<code>--float-anvil</code>)</td></tr><tr><td>18</td><td>Seat: hoop bite band (<code>--round-band</code>)</td></tr><tr><td>19</td><td>Body length or height off the stated real-world size, or waist form (<code>--round-waist</code>)</td></tr></tbody></table></div>
101
+
<divclass="table-wrap"><table><thead><tr><thscope="col">Code</th><thscope="col">Meaning</th></tr></thead><tbody><tr><td>0</td><td>Success</td></tr><tr><td>1</td><td>Uncaught exception (FATAL wrapper)</td></tr><tr><td>2</td><td>argparse / usage</td></tr><tr><td>3</td><td>Mesh did not build / no UV layer</td></tr><tr><td>4</td><td>Base triangle count outside range</td></tr><tr><td>5</td><td>Material count ≠ 2 distinct slots, or a face-count floor missed</td></tr><tr><td>6</td><td>UVs outside 0..1</td></tr><tr><td>7</td><td>UV AABB overlap above tolerance</td></tr><tr><td>8</td><td>World AABB off declared outer size</td></tr><tr><td>9</td><td>LOD ratio band (<code>--skip-decimate</code> lands here)</td></tr><tr><td>10</td><td>Framing gate (render path only)</td></tr><tr><td>11</td><td>Collider triangle count above ceiling</td></tr><tr><td>12</td><td>Bake did not finish or image has no data</td></tr><tr><td>13</td><td>Export file missing or empty</td></tr><tr><td>14</td><td><code>--output</code> produced no file</td></tr><tr><td>15</td><td>Mesh hygiene: loose, non-manifold, zero-area, doubles, n-gons, z-fight</td></tr><tr><td>16</td><td>Not grounded: bounding box <code>zmin</code> off 0, or a named stave floats</td></tr><tr><td>17</td><td>Joint fit: foot-on-head gap (<code>--float-anvil</code>)</td></tr><tr><td>18</td><td>Seat: hoop bite band (<code>--round-band</code>)</td></tr><tr><td>19</td><td>Body length or height off the stated real-world size, or waist form (<code>--round-waist</code>)</td></tr><tr><td>20</td><td>Gallery asset-quality violation (render path; the floors' 11 is remapped here)</td></tr></tbody></table></div>
102
102
</section>
103
103
<sectionclass="detail-section src" id="source">
104
104
<h2>Source</h2>
105
105
<divclass="src-meta">
106
106
<code>showcase/anvil/anvil.py</code>
107
-
<span>1717 lines · <ahref="https://github.com/TMHSDigital/Blender-Developer-Tools/tree/main/showcase/anvil/anvil.py">View on GitHub →</a></span>
107
+
<span>1722 lines · <ahref="https://github.com/TMHSDigital/Blender-Developer-Tools/tree/main/showcase/anvil/anvil.py">View on GitHub →</a></span>
108
108
</div>
109
-
<divclass="code" data-lines="1717">
109
+
<divclass="code" data-lines="1722">
110
110
<preclass="gutter" aria-hidden="true">1
111
111
2
112
112
3
@@ -1823,7 +1823,12 @@ <h2>Source</h2>
1823
1823
1714
1824
1824
1715
1825
1825
1716
1826
-
1717</pre><preclass="code-lines"><spanclass="s">"""Game-ready blacksmith anvil — a showcase piece, not an example.
1826
+
1717
1827
+
1718
1828
+
1719
1829
+
1720
1830
+
1721
1831
+
1722</pre><preclass="code-lines"><spanclass="s">"""Game-ready blacksmith anvil — a showcase piece, not an example.
1827
1832
1828
1833
Asserts budget conformance of a procedural London-pattern anvil on a
<divclass="table-wrap"><table><thead><tr><thscope="col">Flag</th><thscope="col">Target budget</th><thscope="col">Breaks</th><thscope="col">Exit</th></tr></thead><tbody><tr><td><code>--skip-decimate</code></td><td>LOD1 ratio</td><td>drops the DECIMATE modifiers, LOD1 ratio goes to 1.0000</td><td>9</td></tr><tr><td><code>--stray-vert</code></td><td>mesh hygiene</td><td>adds one loose vertex inside the carcass</td><td>15</td></tr><tr><td><code>--lift-z</code></td><td>grounded zmin</td><td>lifts the whole mesh 50 mm</td><td>16</td></tr><tr><td><code>--float-side</code></td><td>named sides</td><td>lifts the left side 5 mm; the right side still grounds the AABB</td><td>16</td></tr><tr><td><code>--short-shelves</code></td><td>dado bite</td><td>stops the three shelves 4 mm short of the sides; −4.0 mm</td><td>17</td></tr><tr><td><code>--pop-corks</code></td><td>closure bite</td><td>lifts every cork and lid 10 mm; −5.0 mm</td><td>17</td></tr><tr><td><code>--pull-knobs</code></td><td>knob bite</td><td>pulls every knob 8 mm out of its front; −4.0 mm</td><td>17</td></tr><tr><td><code>--float-jars</code></td><td>vessel seat</td><td>lifts every vessel 6 mm off its shelf; −5.0 to −4.2 mm</td><td>18</td></tr><tr><td><code>--lift-drawers</code></td><td>drawer seat</td><td>lifts the drawer fronts 3 mm; −1.0 mm</td><td>18</td></tr><tr><td><code>--float-labels</code></td><td>label seat</td><td>builds every label 1.1 mm off its body; −1.1 mm</td><td>18</td></tr><tr><td><code>--tall-flask</code></td><td>headroom</td><td>stretches the middle-shelf flask 1.20 into the shelf above; −5.5 mm</td><td>20</td></tr><tr><td><code>--crowd-jars</code></td><td>vessel overlaps</td><td>draws the bottom shelf's jars to 0.55 of their spacing; 3 overlaps</td><td>21</td></tr><tr><td><code>--uniform-vessels</code></td><td>form spread</td><td>one radius and height for every vessel; 1.000 / 1.000</td><td>22</td></tr><tr><td><code>--sharp-rail</code></td><td>edge treatment</td><td>leaves the top rail unchamfered; 12 right-angle edges</td><td>23</td></tr></tbody></table></div>
89
89
<h2id="exit-codes">Exit codes<aclass="anchor" href="#exit-codes" aria-label="Link to this section">#</a></h2>
90
90
<p>File-local and sequential. <code>9</code> is a valid check code. <code>1</code> is the FATAL wrapper — a crash, never a named check. <code>19</code> (plumb and real-world size) is reserved across pieces and unused here.</p>
91
-
<divclass="table-wrap"><table><thead><tr><thscope="col">Code</th><thscope="col">Meaning</th></tr></thead><tbody><tr><td>0</td><td>Success</td></tr><tr><td>1</td><td>Uncaught exception (FATAL wrapper)</td></tr><tr><td>2</td><td>argparse / usage</td></tr><tr><td>3</td><td>Mesh did not build, or has no UV layer</td></tr><tr><td>4</td><td>Base triangle count outside band</td></tr><tr><td>5</td><td>Material slots, or a material's face floor</td></tr><tr><td>6</td><td>UVs outside 0..1</td></tr><tr><td>7</td><td>UV AABB overlap above tolerance</td></tr><tr><td>8</td><td>Outer AABB off declared size</td></tr><tr><td>9</td><td>LOD1 or LOD2 ratio outside band (<code>--skip-decimate</code>)</td></tr><tr><td>10</td><td>Framing gate (<code>examples/gallery_framing.py</code>, render path only)</td></tr><tr><td>11</td><td>Collider triangles above ceiling</td></tr><tr><td>12</td><td>Normal bake failed or produced no image data</td></tr><tr><td>13</td><td>glTF export missing or empty</td></tr><tr><td>14</td><td><code>--output</code> produced no file</td></tr><tr><td>15</td><td>Mesh hygiene (<code>--stray-vert</code>)</td></tr><tr><td>16</td><td>Grounded zmin, or a side floating (<code>--lift-z</code>, <code>--float-side</code>)</td></tr><tr><td>17</td><td>Dado, closure or knob bite (<code>--short-shelves</code>, <code>--pop-corks</code>, <code>--pull-knobs</code>)</td></tr><tr><td>18</td><td>Vessel, drawer or label seat (<code>--float-jars</code>, <code>--lift-drawers</code>, <code>--float-labels</code>)</td></tr><tr><td>20</td><td>Headroom under the member above (<code>--tall-flask</code>)</td></tr><tr><td>21</td><td>Vessels overlap each other or the carcass (<code>--crowd-jars</code>)</td></tr><tr><td>22</td><td>Form spread below floor (<code>--uniform-vessels</code>)</td></tr><tr><td>23</td><td>Right-angle wood edges (<code>--sharp-rail</code>)</td></tr></tbody></table></div>
91
+
<divclass="table-wrap"><table><thead><tr><thscope="col">Code</th><thscope="col">Meaning</th></tr></thead><tbody><tr><td>0</td><td>Success</td></tr><tr><td>1</td><td>Uncaught exception (FATAL wrapper)</td></tr><tr><td>2</td><td>argparse / usage</td></tr><tr><td>3</td><td>Mesh did not build, or has no UV layer</td></tr><tr><td>4</td><td>Base triangle count outside band</td></tr><tr><td>5</td><td>Material slots, or a material's face floor</td></tr><tr><td>6</td><td>UVs outside 0..1</td></tr><tr><td>7</td><td>UV AABB overlap above tolerance</td></tr><tr><td>8</td><td>Outer AABB off declared size</td></tr><tr><td>9</td><td>LOD1 or LOD2 ratio outside band (<code>--skip-decimate</code>)</td></tr><tr><td>10</td><td>Framing gate (<code>examples/gallery_framing.py</code>, render path only)</td></tr><tr><td>11</td><td>Collider triangles above ceiling</td></tr><tr><td>12</td><td>Normal bake failed or produced no image data</td></tr><tr><td>13</td><td>glTF export missing or empty</td></tr><tr><td>14</td><td><code>--output</code> produced no file</td></tr><tr><td>15</td><td>Mesh hygiene (<code>--stray-vert</code>)</td></tr><tr><td>16</td><td>Grounded zmin, or a side floating (<code>--lift-z</code>, <code>--float-side</code>)</td></tr><tr><td>17</td><td>Dado, closure or knob bite (<code>--short-shelves</code>, <code>--pop-corks</code>, <code>--pull-knobs</code>)</td></tr><tr><td>18</td><td>Vessel, drawer or label seat (<code>--float-jars</code>, <code>--lift-drawers</code>, <code>--float-labels</code>)</td></tr><tr><td>20</td><td>Headroom under the member above (<code>--tall-flask</code>)</td></tr><tr><td>21</td><td>Vessels overlap each other or the carcass (<code>--crowd-jars</code>)</td></tr><tr><td>22</td><td>Form spread below floor (<code>--uniform-vessels</code>)</td></tr><tr><td>23</td><td>Right-angle wood edges (<code>--sharp-rail</code>)</td></tr><tr><td>24</td><td>Gallery asset-quality violation (render path; the floors' 11 is remapped here)</td></tr></tbody></table></div>
92
92
<h2id="run-it">Run it<aclass="anchor" href="#run-it" aria-label="Link to this section">#</a></h2>
93
93
<pre><code># Budget check, no render. ~4.5 s on 5.1 and 5.2.
0 commit comments