Hair
Hair is the asset where the cost is not in the mesh. A full head of it is a few hundred cards, and a
card is a flat strip of four to eight vertices. Every budget the studio had counted vertices and
triangles, and hair sails through both.
Our cards are generated in Sisir from a groom, then brought into Blender, where the add-on bakes
their data and checks them. → Grooming
MSH007 is an error at 40000 verts/m² for Character. MSH008 allows a hero mesh 25000
triangles. A full head of hair passes both comfortably and still costs a frame, because what it
costs is overdraw: the same pixel shaded four, six, ten times over as one transparent card after
another is drawn on top of it. A vertex count cannot see that. Neither can a triangle count.
Nothing in the rules caught bad hair until MSH022, and that gap is what this page exists to
close.
So the numbers here are not the usual mesh budgets narrowed for a special case. They are a different
measurement, of a different cost, and they will pass and fail different assets.
Make a Hairstyle walks it in order, from the groom to the baked cards. This page is the
reference behind it.
The one question: how does it move?
Ask it before geometry, before the atlas, before a single card is placed. It decides the geometry,
the bones, the material and the budget together, and the three answers are far enough apart that
starting from the wrong one is a week thrown away rather than an afternoon of rework.
| Tier | Covers | Geometry | Moves | Atlas |
|---|---|---|---|---|
| Painted | stubble, body hair, peach fuzz, brow underlay | none, it is in the skin texture | with the skin | skin set |
| Capped | short hair, beards, brows, lashes | cards, rigid to the head or jaw | only with the head | hair set |
| Groomed | long hair, ponytails, braids, fringes | cards plus a bone chain or physics | yes, independently | hair set |
Body hair is not a card asset at all. Painted is the whole of it: forearm fuzz, stubble, the
soft underlay a brow sits on. It is values in the skin texture, and it costs nothing to draw because
the skin is already being drawn.
That is why there is a Painted tier at all. The alternative is somebody
spending a week carding forearm fuzz, doing careful and competent work, and finding out at review
that the approach was wrong from the first hour. Nothing would have stopped them, because nothing
said.
They are divided by whether anything moves the cards. A waist-length braid pinned to the back is
Capped. A short fringe that swings when the head turns is Groomed. Length is a hint;
the bone chain is the fact.
The budget
Reading that table, it splits into three groups that do different jobs:
How many cards: hero, standard, background |
A Character takes standard unless the collection says otherwise (Card budget in the Hair Cards panel). It is set on the hair collection and it answers a question about the character, not the hairstyle: a background NPC in a ponytail is still background, and a hero's short crop still gets the hero allowance. |
What a card carries: R, G, B, A |
One FLOAT_COLOR attribute called HairData, on points, in sRGB and read raw. Three channels used and one left empty on purpose. → Hair Cards |
What it actually costs: maxOverdrawLayers |
4. How many hair cards a view ray crosses on average, over every pixel the hair covers, seen from 32 directions spread evenly round it. This is the real budget; the card count is a proxy for it. |
How big hair can be: minExtent |
A card set is at least 0.01 m across (a lash set is the smallest a character has) and no longer than grid.characterHeight, because no hair is longer than the character wearing it. The check that catches a unit mistake on import. → Grooming > What OBJ costs, and the three answers |
MSH022 is the rule that measures all of this. It is a warning, like every new rule, with a
tolerance of 0.002. What it can and cannot see, and the one finding worth recognising before you
meet it, is in Hair Cards > What the checks can and cannot see.
→ Check Your Work > When a rule is wrong
Two hairstyles at 160 cards do not cost the same. A bob spreads its cards over a head and
almost nothing overlaps; a waist-length style stacks nearly every card down one silhouette. The
count is the number you can watch going up while you work, so it is the one you will watch.
But maxOverdrawLayers is the one that decides whether the hair is affordable.
Overdraw is an average, and it is measured on request
The limit is compared with the average, not the worst pixel. The worst spot is almost always the
parting, and a limit on it would fail every hairstyle. So the average is budgeted and the peak is
shown beside it. When the mean is within the
limit and the peak is not, the Hair Cards panel says both and draws no tick: that is a groom within
budget with one spot worth looking at, not a clean bill.
Nothing measures it until you press Measure Hair Overdraw in the Hair Cards panel. It is not run
live or on export, because it takes a few seconds on a full head. The result is cleared whenever the
geometry changes, on undo, and when the file is reopened, so it never shows a number for hair that
has since changed. If the panel says not measured yet, overdraw has not been checked.
requireNormalTransfer is true in the same block, and it is the one setting there that is about
how the hair looks rather than what it costs. The import does it on the way in when it is told the
scalp proxy, and MSH022 reports a groom that ships without it.
→ Grooming > Normal transfer from a scalp proxy
Naming
SubCategory names the region, not the style. Hair, Beard, Brows, Lashes, Body. Five
words, and the style goes in the descriptor where every other descriptor goes:
SM_Character_Hair_Ponytail_01
SM_Character_Hair_Fringe_01
SM_Character_Beard_Full_01
SM_Character_Lashes_Upper_01
Not SM_Character_Ponytail_01. A ponytail, a bun and a fringe are all hair, and a library that
files them under three SubCategories is a library where finding the first one does not find the
other two. Region is what somebody searches for; style is what they narrow by once they are
there.
The region is also what decides the folder. WSP005 files an asset by its name, so
Meshes/Character/Hair is the folder that falls out of the name rather than one anybody chooses.
A misfiled hairstyle was a misnamed hairstyle first.
The style is not optional. SM_Character_Beard_01 parses, but with Beard as its descriptor and
no SubCategory at all, so by the grammar it is not a card asset. MSH022 does not check it as
hair; it says why and names the fix, SM_Character_Beard_<Style>_01. The checker can't guess that Beard was meant as the region, because the same naming rule is how
SM_Character_Body_01 is told apart from the cards.
The grammar itself (every token, in order, and which of them are optional) is in
Naming Conventions, and nothing here repeats it.
Which mesh is the cards, and which is the Body
The checks decide by name, once per collection, and every fix uses the same decision:
| Cards | A mesh whose own name gives a hair region. A mesh whose name does not parse at all (hair.001, fresh from an import) takes its collection's region, unless some other mesh in the collection is already named as hair; then it is a helper beside the cards, not more cards. |
| The Body | A mesh whose name says Body, like SM_Character_Body_01 or SM_Character_Body_Scalp_01. Never checked for hair data, and the only mesh the flip and placement checks measure from. A .001 copy is still the Body. |
| Neither | Anything a card mesh transfers its normals from, whatever it is called. Naming it in Transfer Hair Normals is saying it is the scalp. Hats, props and everything else. |
Only a Body is measured from. Measuring from any nearby mesh would give wrong answers: a sword
under the tips would make every card look flipped, and a hat could make a misplaced groom look fine.
With no Body in the collection the flip check reports nothing, and the panel says why. So if the scalp proxy
you transfer normals from should also be what the flip check measures from, name it as a Body.
The words
One word is missing from that list on purpose. Root is not a hair word, because it already means the
part of a plant, and a word cannot mean two things in one vocabulary. In conversation the scalp end
of a card is its root and always will be; in a name it is Scalp.
That is the cost of one shared lexicon rather than one per area, and it is worth paying: the
alternative is a search for Root returning tree assets and hair assets with no way to tell which
sense either of them meant. → The Words We Use
See also
- Hair Cards: what one card is, the channel contract it carries, and the atlas the set shares
- Hair Motion: what reads
R,GandB, and why stiffness is authored rather than measured - Grooming: the groom, which is the source; the cards are a bake, and re-baked when the budget changes
- Make a Hairstyle: the steps, in order
- Characters: the rest of character authoring, most of which is not written down yet
- Naming Conventions: the grammar this page names a region inside
- Check Your Work > When a rule is wrong:
MSH022is a warning, like every new rule