Track the two crowd rolls as _sheet_crowd3/3b — _refcheck is scratch and they are the only copy of the art

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
wuwiandClaude Opus 5 committed 2026-08-21 13:31:29 +02:00
1 parent 5f53a686c8
commit 1ad2898530
4 files changed
+12 -6

No files matched your search

+4 -3
View File
@@ -4,7 +4,8 @@
# uv run --with pillow --with numpy --with scipy python assets/_crowdpass.py # install
# uv run --with pillow --with numpy --with scipy python assets/_crowdpass.py --review # to _refcheck
#
# INPUT assets/_refcheck/crowd_seat.png + crowd_clap.png (see `_crowdroll.py`)
# INPUT assets/_sheet_crowd3.png + _sheet_crowd3b.png — the two rolls (see `_crowdroll.py`),
# tracked, because _refcheck is scratch and these are the only copy of the art
# OUTPUT assets/x_crowd{,2}.png · x_crowd_c{,2}.png · x_crowd_h{,2}.png · src/crowd.js
#
# THE PROBLEM THIS SOLVES. Ask a generator for "the same picture with some arms raised" and about a
@@ -158,8 +159,8 @@ def write_table(boxes, h, w):
def main(review):
A = np.asarray(Image.open(os.path.join(REFCHECK, 'crowd_seat.png')).convert('RGB'))
B = np.asarray(Image.open(os.path.join(REFCHECK, 'crowd_clap.png')).convert('RGB'))
A = np.asarray(Image.open(os.path.join(HERE, '_sheet_crowd3.png')).convert('RGB'))
B = np.asarray(Image.open(os.path.join(HERE, '_sheet_crowd3b.png')).convert('RGB'))
arms, lab = raisers(A, B)
h, w = A.shape[:2]
+8 -3
View File
@@ -1,9 +1,12 @@
# _crowdroll.py — roll the crowd sheet itself: the SEATED master, and the arms-up frame of it.
#
# uv run --with pillow --with requests python assets/_crowdroll.py seat # -> _refcheck/crowd_seat.png
# uv run --with pillow --with requests python assets/_crowdroll.py clap # from the seated master
# uv run --with pillow --with requests python assets/_crowdroll.py clap # from that seated roll
#
# Then `_crowdpass.py` turns the two into an honest pair and grades them into the three courts.
# _refcheck is SCRATCH. A roll you decide to keep is copied to `assets/_sheet_crowd3.png` (seated)
# and `_sheet_crowd3b.png` (arms up) — those two are the tracked art, they are what `_crowdpass.py`
# reads, and they are the only copy there is. Then `_crowdpass.py` turns them into an honest pair
# and grades them into the three courts.
#
# WHY A SECOND SCRIPT. `_regen.py` cuts SPRITES out of a magenta field — every line of its canvas
# block is about isolating figures on a key colour. The crowd is the opposite job: one continuous
@@ -117,7 +120,9 @@ if __name__ == '__main__':
os.makedirs(OUT, exist_ok=True)
what = sys.argv[1] if len(sys.argv) > 1 else 'seat'
if what == 'seat':
ref = sys.argv[2] if len(sys.argv) > 2 else os.path.join(OUT, 'crowd_layout.png')
# the layout reference defaults to the seated master in the repo, so a re-roll keeps the
# stand's geometry rather than inventing a new one every time
ref = sys.argv[2] if len(sys.argv) > 2 else os.path.join(HERE, '_sheet_crowd3.png')
roll(SEAT, ref, os.path.join(OUT, 'crowd_seat.png'))
elif what == 'clap':
roll(CLAP, os.path.join(OUT, 'crowd_seat.png'), os.path.join(OUT, 'crowd_clap.png'))
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB