refactor(tools): group the sixty scripts by what they talk to

One directory with sixty scripts stopped being navigable, and the grouping is also the sandbox boundary:

  Tools/unreal/    commandlets and the two map builders, with ue_common.py and ue_placement.py as the
                   shared imports (they need the engine)
  Tools/blender/   builders, exporters, the FBX preset, the MPFB character pipeline, blender_screenshots
                   (they need the Blender Flatpak)
  Tools/review/    the visual loop: render_screenshots.sh, judge_screenshot.py, hero_compare.py,
                   build_comparison_md.py, e2e_asset_check.py, hero_iterate.sh, visual_loop.py,
                   visual_targets.json
  Tools/gen/       image and texture generation: the ComfyUI driver, deterministic texture writers,
                   reference fetching
  Tools/input/     OS-level input injection
  root             _common.py, check-lfs.sh, addon_compat_probe.py, sibling_asset_audit.py, tests/

Every moved script now resolves the repository root as ../.. and puts the tools root plus its siblings on
sys.path, so 'import ue_common' still works from unreal/. The test suite bootstrap does the same for the five
folders. render_screenshots.sh takes the folder as a third argument to run_cmdlet, and the e2e driver,
hero_iterate.sh and the comparison generator were repointed.

51 README rows now link to their new location, the README gains a Layout section naming each folder's
sandbox, and the architecture notes and Blender README follow the moves.

Verified: 108 tests pass, prettier is clean, judge_screenshot.py and hero_compare.py run from their new
homes, and the e2e run was aborted mid-way (it had been rebuilding an empty DemoMap for 15 minutes) and is
being rerun against the new layout.
This commit is contained in:
zwitschi committed 2026-11-10 12:40:30 +01:00
1 parent f681d83736
commit 4d27109668
168 files changed
+799 -407

No files matched your search

+10 -7
View File
@@ -5,7 +5,7 @@ Two reviews in one file:
- **ReviewMap** stages imported assets on their own — individual objects, the Blender import, the camera angles and the lighting comparison. Nothing from the game map is involved.
- **DemoMap** is the actual game map as it is being developed: the street, the buildings, the player and the vehicle in their real placement.
Both capture passes are produced by [`Tools/render_screenshots.sh`](../Tools/render_screenshots.sh); the asset renders come from [`Tools/blender_screenshots.py`](../Tools/blender_screenshots.py).
Both capture passes are produced by [`Tools/review/render_screenshots.sh`](../Tools/render_screenshots.sh); the asset renders come from [`Tools/blender/blender_screenshots.py`](../Tools/blender_screenshots.py).
## Status
@@ -45,10 +45,10 @@ Both capture passes are produced by [`Tools/render_screenshots.sh`](../Tools/ren
### Blender vs in-game
Regenerated by `Tools/build_comparison_md.py`; everything between the markers is rewritten, so edit outside them.
Regenerated by `Tools/review/build_comparison_md.py`; everything between the markers is rewritten, so edit outside them.
- Captures: `Screenshots/review/` and `Screenshots/demo/` (23 files)
- Blender renders: `Screenshots/blender/` (22 files), made by `Tools/blender_screenshots.py`
- Captures: `Screenshots/review/` and `Screenshots/demo/` (26 files)
- Blender renders: `Screenshots/blender/` (22 files), made by `Tools/blender/blender_screenshots.py`
Left is what the engine draws, right is what Blender has. A gap between them is the import problem, not a taste problem: scale, material colour, missing parts and split systems all show up here before they show up in a review.
@@ -56,6 +56,9 @@ Left is what the engine draws, right is what Blender has. A gap between them is
| In-game | Blender | Shot |
| --- | --- | --- |
| <img src="review/hero-compare-facade-front.png" width="520"> | — | `hero-compare-facade-front.png` |
| <img src="review/hero-compare-front.png" width="520"> | — | `hero-compare-front.png` |
| <img src="review/hero-compare-oblique.png" width="520"> | — | `hero-compare-oblique.png` |
| <img src="review/review-character-feet.png" width="520"> | <img src="blender/character-angle-035.png" width="520"> | `review-character-feet.png` |
| <img src="review/review-character.png" width="520"> | <img src="blender/character-angle-035.png" width="520"> | `review-character.png` |
| <img src="review/review-ground-contact.png" width="520"> | — | `review-ground-contact.png` |
@@ -80,7 +83,7 @@ Left is what the engine draws, right is what Blender has. A gap between them is
| <img src="demo/review-demo-vehicle.png" width="520"> | <img src="blender/vehicle-angle-035.png" width="520"> | `review-demo-vehicle.png` |
| <img src="demo/review-demo-wheel.png" width="520"> | — | `review-demo-wheel.png` |
7 of 23 in-game captures have a Blender counterpart; the rest are street and building shots whose meshes come from the Geo pipeline rather than a .blend.
7 of 26 in-game captures have a Blender counterpart; the rest are street and building shots whose meshes come from the Geo pipeline rather than a .blend.
Approval and issue notes are recorded only in the status table at the top of this file.
@@ -246,10 +249,10 @@ What it shows: the arms hang down with a soft elbow bend, the hands sit at hip h
## The iteration loop (uncommitted)
`Tools/visual_loop.py` measures each capture against its reference photograph and turns the deltas into modelling actions for the Blender skill packs:
`Tools/review/visual_loop.py` measures each capture against its reference photograph and turns the deltas into modelling actions for the Blender skill packs:
```bash
python3 Tools/visual_loop.py --compare --iteration 3 # writes Art/reference/iterations/3/
python3 Tools/review/visual_loop.py --compare --iteration 3 # writes Art/reference/iterations/3/
```
That directory is **gitignored**: iterations stay uncommitted until a shot is confirmed, and only confirmed shots are promoted into `Screenshots/demo/`. The feedback file names the affected skill (`blender-modeler`, `archviz`, `materials`, `lookdev`, `camera-cinematography`) so the next modelling pass has a starting point rather than an opinion.