Regenerate the Atlas MFD paper doll from its Radar art
The Atlas was the worst-fitting mapping left in the tree at 0.795. Its Radar
sheet is detailed and correct, but its MFD sheet is a much cruder silhouette
with loose boxes and pieces that do not meet, so no coordinate edit could fix
it - the artwork itself was the limit.
Because the two authoring pipelines are 1024->320 and 1024->400, the MFD is
exactly 0.8x the Radar. That makes the whole MFD sheet derivable: threshold the
Radar art, fill each component's interior holes to get a solid silhouette,
scale by 0.8, and scale texuv3/offset3 by the same factor. The pieces are then
spread outward from the CT centre so nothing collides, with CT and HD anchored
and each L/R pair mirrored exactly.
Reviewed adjustments on top of that: torsos and legs down 3, arms down 5, S2
down and right 3, and S1 reseated into the notch in RT.
Three things worth recording, all now in MFD-RADAR-MAPPINGS.md:
- Collisions must be tested on PIXELS, not bounding boxes. These silhouettes
are concave, so a piece can nest into a neighbour's notch while the boxes
overlap heavily. The S1 position that the box test rejected outright has
zero touching pixels.
- The right leg carried a hole the left leg did not. Replacing its art with a
horizontally flipped copy of the left leg makes them identical - 7612 px
each - and the placement is mirrored about the CT centre to match.
- The CT art under HD plus a 1px ring is blacked out, so the head reads as a
separate part rather than a patch on the torso. Verified as "CT pixels
within 1px of HD == 0".
S1 and S2 remain deliberately asymmetric (22x20 and 21x50, different places).
That is faithful to the Radar and to the chassis, which declares both specials
with their own erf assets.
atlas mfd 0.795 -> 0.956, no cross-piece clipping, no zone overlaps
whole tree 130 combinations, mean 0.950, minimum now 0.851
Note this replaces shipped art with generated art, unlike the earlier commits
which restored intent. It is reversible via git. Confirm it on a physical MFD
before applying the same technique to the other crude sheets (thor, loki,
bushwacker, solitaire and similar all sit in the 0.85-0.90 band).
Requires a Windows VC6 rebuild of MW4.exe; loose hsh art needs no repack.
Co-authored-by: Claude Opus 5 (Anthropic) <noreply@anthropic.com>
Co-authored-by: GitHub Copilot <copilot@github.com>
This commit is contained in:
co-authored by
Claude Opus 5
GitHub Copilot
parent
a26ff967d8
commit
7d71d2a771
@@ -8,7 +8,7 @@ float texuv2[65][11][4]={
|
|||||||
{{252,144,316,320},{ 23,144, 87,320},{250, 67,328,114},{ 11, 67, 90,114},{102, 61,155,133},{185, 61,238,133},{137,178,203,293},{ 0, 0, 0, 0},{163, 75,177, 79},{144,144,196,168},{126, 8,214, 56}}, // M_Ares
|
{{252,144,316,320},{ 23,144, 87,320},{250, 67,328,114},{ 11, 67, 90,114},{102, 61,155,133},{185, 61,238,133},{137,178,203,293},{ 0, 0, 0, 0},{163, 75,177, 79},{144,144,196,168},{126, 8,214, 56}}, // M_Ares
|
||||||
{{216,138,332,336},{ 4,138,120,326},{242, 14,324,114},{ 12, 14, 82, 90},{140,200,158,262},{174,200,202,262},{126, 14,208,186},{ 0, 0, 0, 0},{156,294,178,302},{ 0, 0, 0, 0},{ 0, 0, 0, 0}}, // M_Argus
|
{{216,138,332,336},{ 4,138,120,326},{242, 14,324,114},{ 12, 14, 82, 90},{140,200,158,262},{174,200,202,262},{126, 14,208,186},{ 0, 0, 0, 0},{156,294,178,302},{ 0, 0, 0, 0},{ 0, 0, 0, 0}}, // M_Argus
|
||||||
{{282,148,332,334},{ 6,148, 56,334},{266, 10,332,116},{ 6, 10, 74,116},{ 98, 22,136,120},{206, 22,246,120},{144,180,194,330},{ 0, 0, 0, 0},{158,140,180,156},{148, 10,190, 48},{ 0, 0, 0, 0}}, // M_Assassin2
|
{{282,148,332,334},{ 6,148, 56,334},{266, 10,332,116},{ 6, 10, 74,116},{ 98, 22,136,120},{206, 22,246,120},{144,180,194,330},{ 0, 0, 0, 0},{158,140,180,156},{148, 10,190, 48},{ 0, 0, 0, 0}}, // M_Assassin2
|
||||||
{{174,153,225,345},{111,153,162,345},{219, 33,276,153},{ 60, 33,117,153},{126, 45,150,144},{186, 45,210,144},{ 6, 24, 54,198},{ 0, 0, 0, 0},{144, 9,162, 18},{291,111,309,129},{252,195,273,252}}, // M_Atlas
|
{{280,208,336,402},{102,197,158,391},{341, 13,400,138},{ 19, 11, 78,138},{130, 21,173,128},{282, 21,325,128},{206, 40,250,214},{ 0, 0, 0, 0},{210, 5,226, 14},{ 94, 94,117,115},{349,174,371,226}}, // M_Atlas
|
||||||
{{198,174,240,316},{ 12,174, 56,316},{198, 42,248, 90},{ 12, 42, 46, 86},{ 60, 42, 86,118},{158, 42,186,118},{ 96, 42,144,174},{ 0, 0, 0, 0},{120,202,128,210},{116,238,132,254},{ 0, 0, 0, 0}}, // M_Avatar
|
{{198,174,240,316},{ 12,174, 56,316},{198, 42,248, 90},{ 12, 42, 46, 86},{ 60, 42, 86,118},{158, 42,186,118},{ 96, 42,144,174},{ 0, 0, 0, 0},{120,202,128,210},{116,238,132,254},{ 0, 0, 0, 0}}, // M_Avatar
|
||||||
{{186,156,237,336},{ 96,156,147,336},{237, 24,294,168},{ 57, 24, 93,162},{ 99, 39,150,129},{186, 39,234,129},{312, 48,375,207},{ 0, 0, 0, 0},{159, 24,177, 39},{ 0, 0, 0, 0},{ 0, 0, 0, 0}}, // M_Awesome
|
{{186,156,237,336},{ 96,156,147,336},{237, 24,294,168},{ 57, 24, 93,162},{ 99, 39,150,129},{186, 39,234,129},{312, 48,375,207},{ 0, 0, 0, 0},{159, 24,177, 39},{ 0, 0, 0, 0},{ 0, 0, 0, 0}}, // M_Awesome
|
||||||
{{217,174,272,320},{ 67,174,123,320},{279, 79,331,181},{ 9, 79, 60,180},{ 82, 77,111,150},{231, 84,259,150},{129, 22,208,204},{ 0, 0, 0, 0},{152,222,186,247},{242, 30,261, 65},{ 24,205, 55,286}}, // M_Battlemaster
|
{{217,174,272,320},{ 67,174,123,320},{279, 79,331,181},{ 9, 79, 60,180},{ 82, 77,111,150},{231, 84,259,150},{129, 22,208,204},{ 0, 0, 0, 0},{152,222,186,247},{242, 30,261, 65},{ 24,205, 55,286}}, // M_Battlemaster
|
||||||
@@ -78,7 +78,7 @@ int offset2[65][11][2]={
|
|||||||
{{181,256},{ 94,256},{240,172},{ 21,173},{103,173},{184,172},{137,178},{ 0, 0},{163,187},{144,239},{126,130}}, // M_Ares
|
{{181,256},{ 94,256},{240,172},{ 21,173},{103,173},{184,172},{137,178},{ 0, 0},{163,187},{144,239},{126,130}}, // M_Ares
|
||||||
{{176,138},{ 42,138},{224, 24},{ 54, 30},{124, 38},{194, 38},{128, 14},{ 0, 0},{156, 48},{ 0, 0},{ 0, 0}}, // M_Argus
|
{{176,138},{ 42,138},{224, 24},{ 54, 30},{124, 38},{194, 38},{128, 14},{ 0, 0},{156, 48},{ 0, 0},{ 0, 0}}, // M_Argus
|
||||||
{{190,142},{ 98,142},{216, 48},{ 56, 48},{120, 22},{180, 22},{144, 36},{ 0, 0},{158, 70},{148, 10},{ 0, 0}}, // M_Assassin2
|
{{190,142},{ 98,142},{216, 48},{ 56, 48},{120, 22},{180, 22},{144, 36},{ 0, 0},{158, 70},{148, 10},{ 0, 0}}, // M_Assassin2
|
||||||
{{174,143},{111,143},{216, 23},{ 63, 23},{126, 35},{186, 35},{147, 14},{ 0, 0},{144, 29},{117,101},{207,140}}, // M_Atlas
|
{{172,133},{101,133},{223, 19},{ 46, 15},{103, 24},{182, 25},{142, 3},{ 0, 0},{146, 22},{ 98,102},{211,133}}, // M_Atlas
|
||||||
{{138,108},{ 60,108},{168, 40},{ 40, 40},{ 76, 28},{140, 28},{ 96, 6},{ 0, 0},{116, 16},{112, 78},{ 0, 0}}, // M_Avatar
|
{{138,108},{ 60,108},{168, 40},{ 40, 40},{ 76, 28},{140, 28},{ 96, 6},{ 0, 0},{116, 16},{112, 78},{ 0, 0}}, // M_Avatar
|
||||||
{{186,151},{ 96,151},{234, 19},{ 60, 19},{ 99, 34},{186, 34},{138, 43},{ 0, 0},{159, 55},{ 0, 0},{ 0, 0}}, // M_Awesome
|
{{186,151},{ 96,151},{234, 19},{ 60, 19},{ 99, 34},{186, 34},{138, 43},{ 0, 0},{159, 55},{ 0, 0},{ 0, 0}}, // M_Awesome
|
||||||
{{182,168},{103,168},{226, 67},{ 64, 66},{121, 70},{191, 77},{131, 14},{ 0, 0},{154, 53},{195, 42},{ 81,105}}, // M_Battlemaster
|
{{182,168},{103,168},{226, 67},{ 64, 66},{121, 70},{191, 77},{131, 14},{ 0, 0},{154, 53},{195, 42},{ 81,105}}, // M_Battlemaster
|
||||||
|
|||||||
Binary file not shown.
+36
-1
@@ -680,6 +680,38 @@ Hard-won, all of which produced a wrong answer at least once during this work:
|
|||||||
- **`str.replace` on a config file hits every match.** An override keyed `("behemoth","mfd","LA")`
|
- **`str.replace` on a config file hits every match.** An override keyed `("behemoth","mfd","LA")`
|
||||||
existed in two dicts and a single replace corrupted both. Anchor edits or rewrite the file.
|
existed in two dicts and a single replace corrupted both. Anchor edits or rewrite the file.
|
||||||
|
|
||||||
|
## Regenerating a crude MFD sheet from the Radar art
|
||||||
|
|
||||||
|
Some original chassis have a much cruder MFD sheet than their Radar sheet, with loose boxes and
|
||||||
|
pieces that do not meet. Because the two pipelines are `1024->320` and `1024->400`, the MFD is
|
||||||
|
exactly **0.8x the Radar**, so a whole MFD sheet and its rows can be regenerated from the Radar:
|
||||||
|
|
||||||
|
1. Take the Radar exploded BMP, threshold it, and fill each component's interior holes to get a
|
||||||
|
solid silhouette.
|
||||||
|
2. Scale by **0.8**, resample, re-threshold, and place at the upper-left of a 512x512 canvas.
|
||||||
|
3. Scale `texuv3` and `offset3` by the same 0.8 to get `texuv2` and `offset2`.
|
||||||
|
4. Spread the pieces outward from the CT centre so nothing collides, keeping `CT` and `HD`
|
||||||
|
anchored, then mirror each L/R pair exactly about the CT centre.
|
||||||
|
5. Review and nudge by eye.
|
||||||
|
|
||||||
|
Things this exposed that are worth reusing:
|
||||||
|
|
||||||
|
- **Test collisions on pixels, not bounding boxes.** These are concave silhouettes; a piece can
|
||||||
|
nest into a notch in its neighbour while the boxes overlap heavily. On the Atlas, a position
|
||||||
|
the box test rejected outright had **zero** touching pixels.
|
||||||
|
- **A mismatched pair can be fixed by mirroring the better one.** The Atlas's right leg had a
|
||||||
|
hole its left leg did not; replacing the right leg's art with a horizontally flipped copy of
|
||||||
|
the left gives identical pieces (verified by equal pixel counts).
|
||||||
|
- **Cut the head out of the CT.** Blacking out the CT's art under `HD` plus a 1px ring makes the
|
||||||
|
head read as a separate part instead of a patch on the torso. Verify with "CT pixels within
|
||||||
|
1px of HD == 0".
|
||||||
|
- **`S1`/`S2` are often asymmetric by design.** The Atlas's are 22x20 and 21x50 in different
|
||||||
|
places, faithfully inherited from the Radar. Do not force them into a mirrored pair.
|
||||||
|
|
||||||
|
Applied to the Atlas (Mech ID 6) on 2026-08-09: fit **0.795 -> 0.956**, no cross-piece clipping,
|
||||||
|
assembled footprint 236x321 against the previous 210x321. This is generated art, not authored
|
||||||
|
art; confirm it on a physical MFD before repeating the technique on other chassis.
|
||||||
|
|
||||||
## Common mistakes
|
## Common mistakes
|
||||||
|
|
||||||
- Drawing MFD boxes on the raw 1024 image instead of the transformed 340 working canvas.
|
- Drawing MFD boxes on the raw 1024 image instead of the transformed 340 working canvas.
|
||||||
@@ -705,4 +737,7 @@ Hard-won, all of which produced a wrong answer at least once during this work:
|
|||||||
the measurement files, never to the artwork.
|
the measurement files, never to the artwork.
|
||||||
- Concluding a zone is broken from a low IoU without first lowering the blob-area threshold, or
|
- Concluding a zone is broken from a low IoU without first lowering the blob-area threshold, or
|
||||||
from a low `HD` score, which is normal.
|
from a low `HD` score, which is normal.
|
||||||
- Editing `MW4/hsh` instead of the source tree `Gameleap/mw4/hsh`.
|
- Editing `MW4/hsh` instead of the source tree `Gameleap/mw4/hsh`.
|
||||||
|
- Writing a runtime BMP to a lower-cased path. Several destinations are capitalised on this
|
||||||
|
case-sensitive checkout (`Atlas.bmp`, `Fafnir.bmp`); resolve the existing filename first.
|
||||||
|
- Testing piece collisions with bounding boxes. These silhouettes are concave; use pixel masks.
|
||||||
Reference in New Issue
Block a user