Natural gene / codominant
Zebra striping
A real zebra’s pattern, made the way a real zebra makes it: the dark bands are the horse’s own colour and the gaps have the pigment taken out of them. So a striped black is black and white, a striped chestnut is red and white, and a striped palomino is gold and white — and none of that needed a line of code, because the gene never picks a colour. It only decides where there is less of one.
What it does
What to look for: zebra stripes in the horse's own colour. The dark bands are whatever the horse already was and the pale gaps have the colour taken out, so a striped black is black and white, a striped chestnut is red and white, and a striped palomino is gold and white.
That is the difference from magic zebra, which paints its stripes hard black regardless of the horse underneath. Put this on an interesting base coat and it stays interesting.
Crossing two of them
Its gene carrot
- Gene key
- horsegenetics.natural_zebra
- Priority
- 68 — after every gene that decides the base colour, before the white-spotting loci
- Alleles
- Zeb n
- Outcomes
- wild,
shadow-striped,zebra-striped - Inheritance
- codominant — one copy is visible, two are louder
- Default allele
- n
- Wild frequency
- 1 in 60 per allele — so about 3% of wild horses are shadow-striped and 0.03% fully striped
- Founder draws
- 1 × nextFloat()
- Deterministic
- no when expressed
- Epigenetic draws
- 1 long + 4 nextFloat
- Field
- coat.pattern.ZebraStripes
The sample bakes read as a zebra from every angle in an orthographic unwrap, and the foal mesh carries the same map at its own scale. What has not been seen is a striped horse on the actual 3D model, in the world, at distance — which is where a body-space pattern usually goes wrong. Checklist on To be verified.
Codominant, and the carrier is not invisible
| Combination | Outcome | Effect |
|---|---|---|
n/n | wild | Nothing |
Zeb/n | shadow-striped | The full map at 45% — faint bands a shade off the body colour |
Zeb/Zeb | zebra-striped | The same map, gaps taken all the way to white |
One copy suppresses melanin part of the way rather than all of it, which is what a plains zebra’s shadow stripes look like: faint brownish bands between the strong ones, on some southern populations. So the locus has three phenotypes you can tell apart on sight, and a player can see that a horse is worth breeding before they have the pair. Both outcomes run the same painter and draw the same five epigenetic knobs, differing only in the strength — so a shadow-striped mare and her fully striped foal wear the same pattern at two intensities, and the two expressions cannot drift apart.
The stripe map, region by region
A zebra’s stripes are not one field of parallel bars. They are a developmental map expressed over a three-dimensional body: the same patterning machinery lands differently on differently-shaped anatomy, so the direction changes with the region. A dark dorsal stripe along the spine acts as the central organiser, and most torso stripes descend from it, changing direction, width and density as they pass over curved anatomy.
| Region | What a real zebra has | What ZebraStripes draws |
|---|---|---|
| Back / topline | A narrow continuous dark dorsal stripe from mane to tail. Side stripes meet it at near-right angles rather than crossing it. | CoatRegions.dorsalStripe, taken as a max against the band field so it always wins — the organiser, shared with dun. |
| Barrel / flank | Broad vertical or gently rear-slanting bands running down from the spine, bending with the ribs, forking and tapering at the lower end. | A phase in body-space X, warped by BodyNoise and width-modulated so bands swell, taper and fork. |
| Rump / hindquarters | The most species-diagnostic area: transverse arcs, chevrons, or a concentric bull’s-eye. The stripes wrap the thigh rather than continuing as straight torso bars. | The phase is lerped from X to a radius about the hip over the rear third — see below. |
| Belly / underside | Reduced, tapered or absent; many plains forms have a plainly white belly, Grévy’s a white-to-ash one. | Coverage is faded to zero over the bottom fifth of the barrel box, so the bands taper out instead of banding the underside. |
| Neck | Narrower, denser and more sharply contrasting than farther back; they curve round the throat as the column tapers. | The same field at 0.72× the spacing, with the foot of each band trailing 1.6 units behind its top. |
| Head | Narrow vertical and diagonal facial stripes shaped around eyes, forehead and nostrils; a dark nose. | 0.60× the spacing, plus a solid dark muzzle. The curving round the eye is not modelled — see the note on resolution. |
| Legs | Torso bands reorganise into horizontal rings round the limb. The inside of the leg is much less striped. | A phase in y rather than x, damped to 45% on the inner face, fading out below the per-horse legReach. |
| Ears, tail | Ears carry their own striping; the tail ends in a dark tuft. | A band or two across the ear; the tail returns solid dark. |
The rump is one lerp, and no special case
The hardest thing on that list is the hindquarters, because a field of parallel planes structurally cannot produce an arc. It turns out not to need a second field:
double radial = Math.sqrt(dx * dx + dy * dy); // distance from a point on the hip
double toArcs = 1.0 - smooth01(fx / RUMP_END); // 1 at the rump, 0 by the flank
double along = point.x() + (radial - point.x()) * toArcs;
A vertical band is a plane of constant x. An arc round the hip is a
circle of constant radius from a point on it. Both are a phase, so
the two are simply lerped — and every intermediate value between them is one of
the angled, curving bands a real zebra wears over the flank, which is the part that a
field built out of planes and a field built out of circles both get wrong on their
own.
The five epigenetic knobs
Drawn off the expressing copy, in this order. A foal that inherits the copy inherits the pattern exactly.
| # | Knob | Range | Effect |
|---|---|---|---|
| 1 | nextLong() | — | The band field’s warp and width seed. |
| 2 | spacing | 2.0 – 3.6 body units | Centre-to-centre on the barrel. The adult barrel is 22 units long, a foal’s 14 — so a foal wears fewer, and that is right. |
| 3 | duty | 0.42 – 0.60 of a period | How much of each period is dark band. Around a half is even stripe and gap. |
| 4 | bend | 0.4 – 1.3 units of warp | How far the noise may bend a band off its plane. |
| 5 | leg reach | 0.45 – 1.00 of each leg | How far down the rings go. The low end is a plains zebra, whose lower legs go plain; the high end is a Grévy’s, ringed to the hoof. |
Those last two are where the real species differences live. A plains zebra has moderately broad bands, often reduced on the lower leg and belly. Grévy’s has the narrowest, densest striping of the living zebras, continued to the hooves. A mountain zebra sits between, with cleaner high-contrast bands. Rather than model three species, the gene draws from a range that spans them, so two striped horses can look like different animals.
A real zebra’s facial stripes are finer than anything here, and its stripes curve purposefully around the eyes and nostrils. The coat is two texels to the body unit: below about half a unit per band the pattern stops being stripes and starts being noise, which is what the first pass at the head did. The narrow spacing and the dark muzzle are what carry the read; anything finer is below the resolution of the sheet.
The chevron is load-bearing
The phase carries a small slant on |z|, bending each band into a shallow
chevron over the back. This is the same trick BodyStripes
uses and for the same reason: without it, every face perpendicular to X — the
chest, the rump, the front and back of every leg — sits at one
phase and renders as a flat band of solid stripe or solid coat. It is
symmetric left to right, so the horse does not look lopsided.
Symmetry is the right answer here and the wrong one for brindle, which is why the two genes do not share a field. A zebra’s two sides broadly match; a brindle horse’s deliberately do not.
Which way round a zebra is
Ask which of a zebra’s two colours is the animal and which is the marking, and the biology answers plainly. Hair follicles carry melanocytes; in the dark bands they deposit melanin into the growing hair, and in the white ones signalling suppresses that. The white stripe is not a white pigment — it is an absence of the dark one, and the dark state is the default. A zebra is a dark animal with the colour taken out in bands.
That is exactly the shape of phase 1, which may only ever
take pigment away, and it is why this gene can be natural at all. It whitens the
gaps through PigmentField.whiten and never touches the bands.
The horse underneath — whatever extension,
agouti, the dilutions and grey
have made of it by priority 68 — is the striping.
Magic zebra runs in phase 3 and
adds black on the bands. That is the only way to stripe a
cremello or a dominant white, which have no pigment
left to remove — and it is the only way an invented gene could
work, because phase 1 cannot add. The two read the same body map from opposite
directions: this one whitens 1 - coverage, that one blackens
coverage. A horse can carry both and show both.
Not modelled
- Species. There is one locus, not a plains / mountain / Grévy’s trichotomy — the knob ranges span them instead.
- Facial stripes that curve round the eye and nostril. Below the sheet’s resolution; the head gets narrow bands and a dark muzzle.
- A reaction–diffusion simulation. Zebra striping is usually
modelled as a Turing pattern — local chemical signals producing repeated
spacing without any gene specifying “stripe number 17 here”. What that
buys visually at this resolution is spacing and contrast, both of which are knobs
here, so the coat is drawn directly rather than simulated. The
consequence of the Turing account that does matter is modelled: the
pattern changes shape with body geometry, which is the whole point of
ZebraStripesbeing a body map. - Stripes as an individual fingerprint. They are, in the sense that every horse’s stored values give it its own arrangement — but nothing in the mod identifies a horse by them.
common/genetics/genes/NaturalZebraGene.java,
common/coat/pattern/ZebraStripes.java