Analysis

Kenshi, Saints Row and The Sims, side by side

Kenshi and Saints Row start from the same idea: one base mesh per gender, deformed by named morph targets. From there they head in opposite directions. Kenshi optimises for a world full of NPCs that share one system. Saints Row optimises for one player character that can wear anything. The Sims, a decade earlier, skips deformation altogether: it is a catalogue of whole meshes found by file name.

1 Stage by stage

StageKenshiSaints Row: The ThirdThe Sims
EngineOGRE (forked: adds per-bone "bone size" and "positional size")Volition's engine, DX11, inferred lightingMaxis engine: prerendered objects, real-time 3D characters, SimAntics VM
Base meshOne per race and gender. Head included. 15–17k vertices for humansOne per gender, both with the same 7977-vertex topology. Head includedNone: separate head (~50–80 vertices) and body meshes, picked whole
Slider definitionsEditor XML per race: ranges, targets, mids, variationplayer_creation.xtbl: 110 sliders in 12 sets, each with keysNo sliders. File-name patterns over every character file decide the options
Slider → shapeWeight = value × 0.01, one target (or an opposite pair) per sliderPiecewise ramps (Full / Nill / Neg) per key, possibly several targets per sliderA choice is a (mesh, texture) pair, saved as a text "body string"
When morphs applyBaked once at spawn into a mesh copy. The poses are deletedAccumulated on the CPU into a vertex-buffer copy, incrementally as sliders moveNever: no morphs. Meshes are skinned to a 29-bone skeleton each frame
Body proportionsBone scales on a 30-bone Biped, plus posture via animation clipsMorph targets (fat, muscle, skinny, race), with no bone scalingBaked into each body: fit, fat or skinny bodies; adult or child skeleton
Muscle and fat detailBody normal map blends toward muscular or skinny with physique statsFive normal maps blended per character into a render targetModelled and painted into each body
Skin colourA 1-D RGB ramp multiplied in the shaderAn HSB shift of the base texture in a composite pass, then a matcapThree hand-painted texture sets per head and body; no tinting
Face detailsSwappable head texture (UV island added onto the body)2D layers composited into one texture: eyes, brows, beard, makeup, scarsPainted into the head texture, hair included
HairAttachment mesh sharing the skeleton. Face morphs don't reach itAn item with its own copy of the morph targets, so it follows the headPart of the head mesh and texture
ClothingNot part of character creation (inventory armour)572 items, 3 dyes each, with slot hiding, submesh hiding and flag-driven mesh swapsOutfits are whole bodies: everyday, formal, swim, pyjamas, winter, high fashion; must match the build
NPCsSame system as the player, seeded from a hash of a nameA separate system: authored body + base head + one morph, varied by palette and propsSame lists as the player, drawn uniformly at random; 314 premade characters
RandomnessMSVC rand(), reseeded per NPC face name (deterministic)One engine-wide MT19937 table of 8192 values, clock-seededTwo 32-bit LCGs: one reseeded from the clock per townie, one saved with the game
Races30 data-driven races, from humans to robots, on one skeleton4 race presets, each a morph target set to 1None; three skin tones and two ages split the catalogue

2 Three philosophies

Kenshi: one system for a world

Kenshi needs hundreds of NPCs across 30 races, on an indie budget. Its answer is to make the character system purely data: a race is an XML file plus a mesh, and everyone, from the player to a cannibal to a Hive drone, goes through the same function. The expensive part (a baked mesh) is shared by name, so a whole town of generic Greenlanders needs only five face meshes per gender.

Bone scaling does most of the work: it's cheap and works across races without per-race art. The visible cost is NPC sameness. The face shape pool is tiny, and individuality comes from textures, hair and skin.

Saints Row: one doll for a player

Saints Row's character is the product. The system is built so the player can wear anything at any shape: every garment and hair style ships with its own copy of the morph targets, so proportions carry through. Surface identity (tattoos, makeup, beards, eye colour) is never geometry. It's composited into a single texture, so 18 tattoo areas cost nothing at draw time.

NPCs are deliberately kept out of it. They're authored characters with a palette, which is cheap and art-directable, but no NPC is ever procedurally shaped.

The Sims: a catalogue anyone can extend

The Sims has no deformation at all. The exe builds its head and body lists by matching file names, so every option is a hand-made mesh and texture, and adding one is as easy as dropping files into a folder. That is what made its custom-content scene possible, and it let seven expansions add looks without touching code.

Player and NPC share the catalogue: townies, NPCs and grown-up babies just draw from it at random. The price is that nothing exists between the files, and skin tone splits the catalogue three ways.

3 Same problem, different answers

Making a body bigger

Kenshi

Scale bones. Chest scales Spine2 and pushes the upper arms out through their positional size. Nothing needs re-authoring per race, but the result is only ever a stretch of the base shape.

Saints Row

Blend sculpted targets (body fat +, body muscle +), plus matching normal maps. That gives real fat and muscle silhouettes, but every clothing mesh must carry those targets too, and items cost more to author.

The Sims

Pick a different body. Build (fit, fat, skinny) is baked into each body mesh, and every outfit is authored once per build so it still fits.

Making faces different

Kenshi

17–27 morph targets per race, applied linearly, plus head, neck and jaw bone scales and four head textures. Integer sliders with wide ranges (−200…200) allow extreme results.

Saints Row

About 100 face sliders across 11 sets, finer-grained (separate crown, forehead, brow, ear, cheekbone and jaw regions), with keys that can drive opposite targets and scale weights by up to ×2.

The Sims

Scroll through whole heads: 84–137 per adult gender and skin tone, each a 50–80-vertex mesh with the face and hair painted on.

Colour

Kenshi

Skin is a 1-D ramp (6 stops for Greenlanders), so you can only move along one line of colours. Hair is free HSB.

Saints Row

Skin is one of 55 HSB offsets, including blue, green and gold. Every layer takes one of 117 colours, and every item three of 126. Colour is the biggest source of combinatorial variety.

The Sims

Skin is three texture sets (light, medium, dark), hand-painted per head and body. No tinting anywhere, so a head exists only in the tones it was painted in.

NPCs

Kenshi

Procedural, with the same generator as the player. Five shapes per race, gender and faction weirdness, deterministic across saves. Head texture, skin, hair and bones vary per NPC.

Saints Row

Authored. 223 types, each a fixed look. Per spawn, only the palette colours, props (submeshes switched by VID), head choice and hair tint vary.

The Sims

The player's catalogue, drawn uniformly: a clock-seeded RNG picks gender, skin, body and head for townies. Babies inherit only skin tone, then draw a random child head and body.

4 How much variety

Orders of magnitude contributed by each category. Adding bars multiplies option counts. Hover for details. The table below has the same numbers.

Reading these numbers
They count distinct settings, not visibly different characters. Kenshi's 1089 is mostly integer sliders. Neighbouring values are indistinguishable, so the useful range is far smaller. Saints Row's discrete 10208 is mostly clothing dyes, which are very visible. Kenshi's generic NPCs reach only a sliver of either: 5 face shapes × 4 heads × hair × skin × head bones per race and faction.

What's on disk

The raw meshes and textures behind those numbers. Each game is split into what its creator offers and what only NPCs use. A file shared by both is counted once, under the creator. Texture sizes are the originals in the game's own formats (DDS, peg or BMP), not the demos' downscaled copies. Morphs are blend shapes stored with a mesh.

Kenshi's human body is stored as a plain triangle list (no shared vertices), so its vertex count is three times its triangle count. Kenshi clothing and armour are items, outside character creation, and aren't counted. Saints Row's NPC heads are one base mesh plus one head morph each. The Sims' "NPC only" row also covers pets and the premade characters' own suits. Counted by a script of ours that reads each game's files.

5 Strengths and weaknesses

Kenshi

Strengths

  • One code path for the player and every NPC, so behaviour is consistent and easy to mod
  • Races are pure data: 30 races, from humans to robots and insects, share one skeleton
  • Bone scaling gives body proportions for free across every race and outfit
  • Deterministic NPC faces (name hash) keep saves small and let meshes be shared
  • Baked meshes cost nothing per frame
  • Posture as an animation scrub is cheap and artist-friendly

Weaknesses

  • Only 5 face shapes per race, gender and weirdness for generic NPCs
  • Morphs don't update normals, so strong shapes are lit wrongly
  • Hair and beard meshes ignore face morphs and can clip
  • Bone scaling can only stretch, not reshape (no fat or muscle silhouettes)
  • The skin is a single ramp, and some races have one stop
  • Quirks: a truncated-hash mesh cache, robot races with dead face sliders, posture blending with idle anims

Saints Row: The Third

Strengths

  • Everything follows the body: hair and all 572 items carry the morph targets
  • Huge expressive range, especially in colour: 55 skins, 117-colour layers, 3 dyes per item
  • The runtime composite makes unlimited makeup and tattoos cost one texture and one draw
  • Blended normal maps sell body type without extra geometry
  • Flags and VID hiding solve clipping (hat hair, sleeves, hoods) in data
  • Creator UI logic is plain Lua over a small C API, so it's easy to follow

Weaknesses

  • NPCs get none of it: no procedural NPC faces or bodies
  • Content cost: male and female meshes, morph copies and textures per item (1151 meshes)
  • CPU morph accumulation and a 2048×1024 composite target per customised character
  • Matcap shading is stylised and view-dependent rather than physically lit
  • Data slips ship: wrong VID lists, two hair textures with no real opacity
  • Few race presets (4). Ethnicity is a single morph target

The Sims

Strengths

  • Trivial to extend: a new head or body is three files with the right names
  • Every option is hand-crafted, so nothing looks broken or uncanny
  • Tiny runtime cost: ~50–80-vertex heads, one texture each, no morphs or composites
  • Player and NPCs share one catalogue; townies and children need no extra art
  • Choices save as readable text (body strings), easy to edit and debug

Weaknesses

  • Nothing between options: no sliders, no tinting, no mixing
  • Skin tone splits the catalogue (292 light heads against 200 dark), and children get a quarter of the heads
  • Every outfit must be authored per build and skin tone
  • Children don't resemble their parents beyond skin tone
  • Clock-seeded townies made in a burst share a gender; the last name in each list never appears

6 What each system can't make

Kenshi can't…

  • give a generic NPC a unique face shape (outside the five)
  • make a fat or muscular silhouette, only scaled limbs
  • give hair or a beard that follows a morphed jaw or skull
  • colour skin outside the race's ramp
  • dress a character at creation

Saints Row can't…

  • make an NPC that isn't one of the 223 authored looks
  • change height or limb length (there's no bone scaling)
  • combine two items in one slot, or two layers in one composite slot
  • vary NPC height (Variation is 0 everywhere)
  • replay a randomised character (clock-seeded table)

The Sims can't…

  • make any face or body that isn't a shipped (or downloaded) file
  • offer a head in a skin tone it wasn't painted in
  • pass a face or body shape from parent to child
  • change hair separately from the head
  • dress a body in an outfit made for another build

7 Lessons for building your own

  1. Separate shape, proportion and surface. Morph targets for shape, bone scales for proportion, composited textures for surface detail. Each scales differently, and Kenshi and Saints Row each use at least two of the three.
  2. Make everything that touches the body carry the body's morphs (Saints Row), or accept clipping and design around it (Kenshi's hair).
  3. Seed NPC generation from stable names (Kenshi) to get deterministic, shareable results. Put the individual variation in cheap channels: textures, colours, props.
  4. Composite surface detail into one texture (Saints Row). Layers cost nothing per frame and multiply variety enormously.
  5. Use bone scaling and morphs together. Kenshi's bones give height and limb length that Saints Row lacks. Saints Row's targets give silhouettes that Kenshi lacks.
  6. Recompute or blend normals. Kenshi shows the cost of not doing it, and Saints Row's normal-map blend shows a cheap fix.
  7. File names can be a data model (The Sims). Matching names against patterns made content packs and fan content free to add, with no tables to update.
  8. Don't seed from the clock per item. The Sims reseeds for every townie, so townies made within half a second share their first draw. Seed once and keep the stream.
  9. Validate data at build time. All three games ship slips (wrong paths, wrong VIDs, a stub race, broken opacity channels) that only a runtime fallback hides.