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
Built, not yet play-tested

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

CombinationOutcomeEffect
n/nwildNothing
Zeb/nshadow-stripedThe full map at 45% — faint bands a shade off the body colour
Zeb/Zebzebra-stripedThe 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.

RegionWhat a real zebra hasWhat 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:

common/coat/pattern/ZebraStripes.java
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.

#KnobRangeEffect
1nextLong()The band field’s warp and width seed.
2spacing2.0 – 3.6 body unitsCentre-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.
3duty0.42 – 0.60 of a periodHow much of each period is dark band. Around a half is even stripe and gap.
4bend0.4 – 1.3 units of warpHow far the noise may bend a band off its plane.
5leg reach0.45 – 1.00 of each legHow 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.

The floor on the spacing is the sheet, not the animal

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.

The contrast with magic zebra is not stylistic

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 ZebraStripes being 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.
Source: common/genetics/genes/NaturalZebraGene.java, common/coat/pattern/ZebraStripes.java