Maturity: Draft. Consolidated from the vanilla 2.31 cheek resources (female first), the other vanilla face-decal meshes, the installed face-makeup mods, the Modding Docs and a read-only audit of the Studio's makeup engine, all on 26 September 2026. Its only runtime evidence is the consumer-group observation in §3, from the first session. Evidence grades follow the knowledge rules: source, resource, wiki, runtime, hypothesis. Provenance, hashes and measurements are in the brows and cheeks evidence.
This page covers vanilla cheek makeup (blush, freckles and the metallic cheek colours), how face decals share the face and combine, how mods add face makeup, and how the head's UV layout constrains a Studio cheek feature. Per-option templates for every head decal are tabulated in head CC rendering §1; decal shader arithmetic is in materials and shaders §2.4 and §4.5; brows have their own page, eyebrows. The design options built on these facts are in the brows and cheeks brief.
1. Vanilla cheek makeup
| Step | Vanilla female | Grade |
|---|---|---|
| Creator option | Switcher makeupCheeks (Off + 24) → appearance options makeupCheeks_ in slot makeupCheeks_, link makeupCheeks color. Choices 1–4 are freckles (4 colours), 5–24 blush makeup_ (16 colours). Group face (and character_). | resource wiki |
.app | …\ | resource |
| Geometry | One shared mesh for every freckle and blush style: …\ with hx_; two chunks, face and nose (§2) | resource |
| Material chain | mesh local instance → makeup\ (style: DiffuseTexture hx_, often a per-style alpha or colour tweak) → cheeks_ (colour: DiffuseColor, a default alpha 1–3, AlphaMaskContrast 0, DepthThreshold 0.5, white SecondaryMask at influence 0, identity UV transform, normal alpha 0) → base\ (EMP_) | resource |
| Textures | One mask per style, not an atlas: white RGB with coverage in alpha, each covering both cheek islands and the nose. Cooked one mip below their header size: 256² for most styles, 512² for styles 11, 12, 16, 17, 18 and 13a. Freckles hx_ (256, 512, 512, 512). 21 diffuse masks plus two metal masks. | resource |
Strength varies per look resource. DiffuseAlpha is not a fixed 2: over the 640 blush chunk materials it is 2 in 204, 3 in 162, 1 in 96 and 0.5–4 in the rest, because the masks are faint (style 01's alpha peaks at 0.31) and the alpha multiplies them before the coverage clamp. Freckles use DiffuseAlpha 0.3–1.0 and DepthThreshold 0.9975.
Vanilla already has a metallic, highlighter-like blush resource. It corrects the earlier statement that cheeks write no normal or roughness:
| Looks | Surface write |
|---|---|
| Gold and silver, all 20 blush styles | White MetalnessTexture, RoughnessMetalnessAlpha 0.1–1 (metal from white.xbm or the masks hx_/m16), roughness from engine\ (4 × 4, R = 129, flagged sRGB: 0.51 read raw, about 0.22 if the sampler decodes it hypothesis) |
| Silver | Also NormalAlpha 0.6 of the flat normal.xbm, blending mode 0.5 |
| Style 16, every colour | The m16 metal mask at surface alpha 0.4 |
| Styles 15 and 17, most colours | Surface alpha 0.1 plus normal alpha 0.6 |
Everything else is colour only and keeps the skin's roughness. There is no vanilla contour, bronzer or separate highlighter resource [resource, name search of the four appearance archives].
What the looks are wiki. The character-creator cheat sheet's screenshot character_ (page, manavortex with an update by nutboy) shows freckles over cheeks and nose (01–04) and blush that is as much face paint as blush: soft cheek washes, a band across the nose bridge (07), hard-edged panels (11, 12) and stars (14). The page's counts (Off + 14) predate 2.31's 24.
2. The vanilla face-decal meshes
Every vanilla face decal is a copy of head vertices lifted along the head's normals and skinned with the head's weights; each has one LOD resource (materials §2.4 item 6). What differs is the footprint, the lift and the UV layout:
| Mesh | Footprint | Lift | UV layout | Density (mm per UV unit) | Vanilla texel |
|---|---|---|---|---|---|
Eye makeup hx_ | Lids and surrounds, both eyes | 0.40 mm | Own; both eyes overlap | 66 | 0.065 mm at 1024 |
Cheeks chunk 0 (face) …makeup_ | Both cheeks, from just under the eyes downward: 890 vertices, 9,775 mm² | 0.40 mm | Own; both cheeks share one area, u 0.352–0.987, v 0.201–0.857 | 153 (u 175, v 136) | about 0.6 mm at 256², 0.3 mm at 512² |
| Cheeks chunk 1 (nose) | Nose from brow level to the tip: 443 vertices, 1,888 mm² | 0.40 mm | Own, one island, u 0.013–0.508, v 0.079–0.627 | 127 | as above |
Brows heb_ | Brow strip: 390 vertices, 2,508 mm² | 0.35 mm | Own; both brows share one area | 48.6 | 0.14 mm at 512 × 256 |
| XF Studio expanded eye plate | Lids, brows, upper cheeks: 1,620 vertices, 3,010 faces | 0.40 mm (Build) | Head UV0, window u 0.273–0.727, v 0.179–0.324 (glTF) | 405–569 | 0.13 × 0.12 mm through the 2048 × 512 window |
Not every face decal sits at 0.40 mm: the scar mesh is lifted 0.31 mm and the facial tattoos about 0.2 mm (tattoos §2).
The freckles mesh has no forehead or temple coverage. Its face chunk also carries 16 face-cyberware appearances (designs 01–08 through cyberware_ with normals and surface writes) and a metal_ default appearance resource, which is why face cyberware and cheek makeup can share geometry (CC file chain §4).
The same regions in head UV0 (glTF V, measured by matching each decal vertex to its head vertex) resource:
| Region | Head UV0 bounds | Density there | Inside the eye plate's faces |
|---|---|---|---|
| Brows | u 0.316–0.684, v 0.173–0.248 | 418 mm/UV | 89 % of brow vertices |
| Cheeks (face chunk) | u 0.283–0.717, v 0.210–0.405; left and right sides are separate (u < 0.473 and > 0.527) | 509 mm/UV (u 589, v 459) | 58 % of cheek vertices (the upper cheek and cheekbone) |
| Nose (nose chunk) | u 0.426–0.574, v 0.173–0.337 | 420 mm/UV | 11 % |
Head UV0 is not mirrored, so anything cut in head UV0 is left/right independent, unlike the vanilla cheek and brow meshes.
The eye opening is a thin slit in head UV0 [observed, measured on the prepared female-average plate, 27 September 2026]. The plate's boundary has six loops: its outer edge on each side (67 vertices, u 0.291–0.481 and 0.519–0.709), a small separate island on each side (17 vertices, u 0.273–0.316 and 0.684–0.727), and one interior hole per eye, the opening (29 vertices; u 0.374–0.428 and 0.572–0.626, v 0.2456–0.2568). The opening is about 1 cm tall in 3D but encloses only about 7 × 10⁻⁶ UV² (a sliver roughly 0.002 V across at its widest), because the rolled lid margins take the UV around it. That margin strip holds 76 zero-area UV triangles, the slit's own boundary is not a simple polygon in UV (it touches and folds), and its interior overlaps margin triangles in places. Consequences for tools: a UV step of 0.001 across the slit spans the whole opening in 3D; a curve that hugs the lash line in UV can dip into the slit; and makeup painted in the slit has no geometry, so it never shows. The Studio's surface editor bridges the opening with a membrane triangulated from the rim's positions on their best-fit plane, used only for drags and for placing controls (editor invariants, eye openings). Numbers from uvHoleBridges in projects/ over the derived head.glb.
3. How face decals combine
- Separate draws, one blend each source resource. Eye makeup, lipstick, cheeks, pimples, scars, tattoos, face cyberware and brows are separate components, each its own
post_decal draw. Each blends its colour into the G-buffer in square-root space (gbuffer SrcAlpha/onInvSrcAlpha √colour), its roughness and metalness linearly under one shared alpha (a decal that writes roughness also blends metalness towards its own value), and its normal by its own mode; the deferred light then shades the combined pixel once, as Subsurface skin (materials §2.4, decal reference §6). Where two decals overlap, the later one blends over the earlier result. - Coverage curves differ by template source.
mesh_anddecal mesh_square their (filtered) coverage, so their masks store √coverage; the gradient-recolour family (hair caps, the Colour-shifting route) uses linear coverage. A feature that mixes templates on one face must encode each mask for its own template (decal reference §2.1).decal_ double_ diffuse - How CDPR calibrates makeup finishes resource. Matte is a partial push to roughness 1.0 (lipstick, 35–40 % surface weight); gloss keeps the skin's roughness (glossy lipstick adds only metalness 1 at 5 %); metallic is metalness 1 at roughness ≈ 0.51 if its texture is read raw, ≈ 0.22 if decoded (gold and silver blush; open question 1); eye makeup is 0.50 at full weight with noise-broken coverage. Cheek finishes on a Studio plate can start from these (decal reference §3).
- Order resource hypothesis. Every vanilla face decal is
EMP_; the order between decals of one priority is unknown (head CC rendering open question 2). The preview's fallback is the creator option order, then the Studio's authored plate on top. The lifts (0.40 mm for makeup, 0.35 mm for brows) keep each decal clear of the skin for the depth test; they do not decide order, because decals do not write depth.Normal - Overlaps that matter resource. The cheek face chunk starts just under the eyes and overlaps the eye-makeup surrounds and the eye plate's lower edge (58 % of cheek vertices lie inside the plate's faces); the nose chunk runs up to brow level. Lipstick does not overlap the cheeks.
- Metal switches off skin SSS source. A pixel whose blended metalness exceeds 0.1 skips the subsurface blur. The vanilla gold, silver and style-16 blush looks cross that line at their soft edges, which makes them a natural in-game check of the seam (materials open question 4).
- Consumer group resource runtime. Cheeks, eye makeup, lips and piercings are
face-group options; brows are head (TPP) options. An XF eye-makeup option that sat only incharacter_showed in the creator but not in photo mode (CC file chain §2; capture: finish board results).customization
4. How mods add face makeup
No installed mod adds cheek makeup through the character creator, extends makeupCheeks, or adds a cheek selector; the installed face-makeup mods are all eye or lip products resource (evidence). Three routes are in use:
| Route | Example | Mechanism | Trade-off |
|---|---|---|---|
| Worn item | KOZMETIX by meluminary (lips, liner); Limerence × AllieKat Winterkissed (glitter eyeshadow) | A TweakXL clothing item (Items.GenericFaceClothing) in an outfit or Equipment-EX face slot, whose entity draws a decal mesh. KOZMETIX ships no geometry: resource.patch merges material-only meshes into the vanilla lip and eye-makeup meshes, resource.link aliases its morph paths to the vanilla makeup morphs, and a visual tag hides the vanilla lipstick's chunks. Colours come from one @dynamic material with a {material} shade path. | Combines with any creator look and can be changed in the wardrobe; is not part of the creator, the save's appearance node or photo-mode face presets |
| Same-path replacement | Limerence Liners, Alliekat's Eyeshadow Remix, Arkhe's brow Material Edit | Ships vanilla depot paths for masks or .mi files | Replaces vanilla looks for V and NPCs; conflicts per path |
| CCXL option | (eye colours, brows, hair; no cheek example installed) | Named merge into a vanilla switcher, or a new option | Part of the creator and the save; the wiki's CCXL overview (manavortex and redacted-c01; edited by icxrus) lists makeupCheeks / makeupCheeks_ among the established switchers and recommends extending them wiki |
The wiki's scopes and extensions guide (manavortex) shows the makeup pattern for colour extension (@context MakeupBaseMaterial, @makeup → *…\, one small colour .mi each) and warns that several styles in one mesh block later colour extension wiki. Vanilla cheeks are exactly that non-extensible shape: 24 styles on one mesh.
5. What this means for a Studio cheek feature
| Fact | Implication |
|---|---|
| The layered-makeup engine (recipe, raster, compiler, finishes) works in head UV0 and cuts plates from head faces by native face ID | A cheek plate is a new plate recipe with the same lift and skin-byte rules; nothing in the engine is eye-only except the plate recipe, the 2048 × 512 window, starter shapes, the default UV view, the single plate in the scene and the hard-wired u → 1 − u mirror (evidence, Studio audit). |
| The cheeks span u 0.283–0.717, v 0.210–0.405 in head UV0 at about 589 × 459 mm per UV unit | A 2048 × 1024 window over that rectangle gives about 0.13 × 0.09 mm per texel, the eye plate's density and four to seven times finer than most vanilla blush (two to three times the 512² styles); 2048 × 512 gives 0.13 × 0.18 mm. |
| The vanilla freckles mesh has its own mirrored UV at 153 mm/UV | Authoring on it needs a head-UV → cheek-UV resample at Build, is symmetric by construction and cannot reach temples, forehead or jaw; at 1024² it gives about 0.17 × 0.13 mm. No new geometry. |
| 58 % of the cheek lies inside the eye plate already | Cheekbone highlight and under-eye colour are drawable today on the eye plate; a separate cheek plate that overlaps it meets the unknown same-priority order in game. A cheek plate cut from faces outside the eye plate avoids the overlap but splits looks along the plate edge. |
| Vanilla gold, silver and style-16 blush write metalness and roughness | Engine precedent for Satin, Metallic and Shimmer highlighter on cheeks with the same mesh_ routes as the eye plate. |
| The Colour-shifting route's template has no UV transform | On cheeks it stays on the 1024 head atlas, about 0.58 mm per texel; that suits a soft duochrome wash, not a sharp edge. mesh_ has the same Fresnel term with the UV transform and squared coverage, so moving the route there would give cheeks the window's density too (decal reference §5.2). |
| Dark partial coverage blends in square-root space (≈ 2a − a² for dark over skin) | Contour and bronzer need gentler coverage than a linear painter suggests; the preview already blends this way. |
Open questions
- Is
hairdefault_(flagged sRGB, R = 129) sampled decoded? It sets the vanilla metallic blush's roughness at about 0.51 or about 0.22.u.xbm - What decides the draw order of two
EMP_face decals that overlap (cheeks and eye makeup under the eye; an XF cheek plate and the XF eye plate)?Normal - Does the freckles mesh's
DepthThreshold0.9975 on freckles (0.5 on blush) change how they sit near the nose and eye sockets? - Can a
face-group CCXL option added tomakeupCheekscarry a single authored definition (no colour row) cleanly in the creator UI? - What are the head UV0 bounds of the whole front face (forehead to chin), for sizing a whole-face plate?
In-game test asks
Batch into one prepared session; record game, ArchiveXL and whether Phantom Liberty is installed.
- Metallic blush. Creator, blush style 5 in gold, then silver, then brown: under a light moved across the face, gold and silver should show a moving highlight and brown none. Close-up of the soft edge for a visible SSS seam where metalness crosses 0.1.
- Cheek over eye makeup. Eye makeup style 5 black with blush style 10 (a colour contrasting with black): capture the band just under the lower lid to see which draws on top.
- Blush strength. Blush style 5 (alpha 3) and style 1 (alpha 1) in the same colour: one frontal frame each under fixed light, to anchor the preview's alpha clamp.
Related pages
Eyebrows · Head CC rendering · CC file chain · Materials and shaders · Glitter in game · Evidence · Brows and cheeks brief