Maturity: Draft. Consolidated on 27 September 2026 from the installed 2.31 game (the REDmod TweakDB sources, the player and preview entities, player_, ui_, woman_, woman_ and .animgraph, the body, feet and nails resources), the decompiled scripts, WolvenKit 9.0.1 and the Studio's own offline measurements on the reference profile's V. Nothing here has runtime evidence yet. Grades follow the knowledge rules: source engine, framework or tool source or decompiled scripts, resource extracted game or mod resources, wiki Modding Docs, runtime running game, [offline] our own tool runs and measurements, hypothesis not yet established. Hashes, commands and the numbers behind each claim are in the deformation rig evaluator evidence.
This page answers which puppet shows V in the creator and the inventory, which idles those screens play on her body, how the game moves the body's helper joints under any pose, and why a clip belongs with a feet state. How the body is assembled is in body rendering; photo-mode poses in poses; the face's idles in facial expressions.
1. The preview puppets
| Screen | TweakDB record | Female entity | Appearance | Grade |
|---|---|---|---|---|
| Character creator | Character.Player_ | base\ | character_ | resource REDmod player_ |
| Inventory | Character.Player_ | ep1\ ([EP1]) | as V is dressed | resource REDmod player_ |
| Gender selection | (the creator's first screen) | base\ | — | resource listed in the creator's UI resources; its puppet setup unread |
player_ has three animated components resource: root (woman_, player_, with ui_ through TPP Player Animation Setup), deformations (woman_ and .animgraph, its control binding naming root) and breasts (woman_ and .animgraph, bound to deformations). The photo-mode puppet has the same deformations component (poses §4).
2. The preview idles
The paperdoll body graph picks a clip per screen from AnimFeature_, which the preview controllers set from the camera slot [source: entityPreviewGameController.script]. Its state machines and screen switches loop these clips of ui_ resource:
| Studio entry | Clip (body) | Length | Graph state and flags | Face loop | Feet it's authored for |
|---|---|---|---|---|---|
| Creator close-up | ui_ | 12.33 s | state machine closeup (characterCreation_, _, _, _, _, _ pick one-shots from it) | ui_ (22.07 s) | the creator puppet's lifted feet |
| Creator close-up, eyes section | ui_ | 12.33 s | closeup with characterCreation_ set (the eye camera: eyes, eyebrows, lash colour, eye makeup rows) | the face graph's one-shot ui_ (4.00 s) once, then ui_ (facial animation §6) | lifted |
| Creator full body | ui_ | 15.73 s | state machine fullbody (after the one-shot ui_) | ui_ (22.07 s) | lifted |
| Creator nails | ui_ | 4.70 s | state loop (characterCreation_: ui_ → loop → _) | none in the face set | lifted |
| Gender selection | ui_ | 15.63 s | played directly by the screens' switch | none in the face set | not established |
| Inventory | UI_ | 11.07 s | state Idle (inventoryScreen; _ and _ play ui_ / ui_ once) | ui_ after the one-shot ui_ (facial expressions §5) | V's own (flat when barefoot) |
- One-shots, not idles:
ui_,check_ boots ui_,check_ pants ui_,check_ jacket ui_,closeup_ to_ fullbody ui_, the section showcases,fullbody_ to_ closeup ui_andexpose_ hand_ start _resource.end - Weapon idles: 53 looping clips (
handgun_,idle katana_, …) play in the inventory's weapon view with the held weapon resource; the Studio draws no weapon, so it doesn't offer them.idle ui_is in the set but not in the body graph resource.expose_ teeth - The inventory idle is the relaxed standing loop the in-game inventory shows: the hips turned about 40° from the camera, the head turned back towards it by 0 to 12° as the weight shifts, the left foot turned out [offline:
UI_sampled at seven phases].full_ shot - Their formats resource:
ui_,closeup_ shot ui_andexpose_ hand_ loop ui_are SIMD clips (gender_ selection animAnimationBufferSimd: every frame of every joint, rotations quantised to 16 bits, laid out four joints at a time);ui_andfullbody_ shot UI_are compressed clips like the photo-mode poses.full_ shot woman_keys all of them; WolvenKit's clip export gives the skeleton's nodes the rig's A pose (base.rig aPoseLS), not its reference pose [offline: within 6 × 10⁻⁸]. - What the Studio used before was the close-up body clip on every framing, including the whole-body view [source: the Studio].
How the Studio reads them
Natively, on both hosts, with no Python [source: the Studio, 28 September]. The idle host (idle-host.ts) reads the third-person player entity (PLAYER_, with its ArchiveXL patches), takes its root animated component's graph (player_) and animation sets, finds the looping clip of each preview screen in the graph (previewIdles in idle-body.ts: the rule tools/ applied), decodes each clip from the first set that holds it (anim-set.ts, SIMD and compressed), and serves each idle's body as every frame on the rig (GET /, a xfs/ record). The page builds the skeleton from the rig's A pose and plays the frames as it plays a moving pose (platform/). The graph holds blend curves the reader doesn't decode, so it is read leniently: those properties are left out (the answer names them), and nesting up to 4,096 levels is allowed for its node chain. What was read is cached under <resolver cache>/ by the installation's fingerprint; a warm start answers without opening the game. The head's joints follow Head through the face skeleton's own parents (FACE_, read natively).
- The oracle [offline:
tools/, game 2.31, direct route]: against the Python preparation (WolvenKit's export), the catalogue is identical (6 entries, the 53 weapon idles left out alike), the 345-joint ancestry identical, and for all five body clips every exported key agrees within 1.1 × 10⁻⁷ m and 2.1 × 10⁻⁶ (quaternion component), every joint's world position within 0.004 mm and rotation within 0.0006° at every frame the page plays, and the rest within 6 × 10⁻⁸. The same holds on the reference MO2 route. Rendered side by side in the browser (the face's motion off on both), the native and Python idles differ by more than 8 of 255 levels on at most 0.01 % of the 3D view's pixels at 0, 3, 6.5 and 10 s [offline:native-idle-oracle.ts tools/, private captures]. The opt-in testidle-source-look.ts tests/holds those tolerances. Reading the idles takes about 0.2 s once the route is open, a body 60 ms; a warm start reads the disk cache in 5 ms [offline].native-idle-oracle.test.ts - The face is native too [source: the Studio, 28 September]. Each idle's face clip is read from the creator puppet's face set and solved on the host by XF Studio's own facial solver when the idle is first chosen (
GET /, aapi/ idles?face=<id> xfs/record; facial animation §5); the blink and the live Expressions face are solved the same way. No Python on either host.face-motion-1 XFS_(withIDLE_ SOURCE=prepared XFS_) plays the Python preparation instead, as the oracle.PREPARED_ MOTION=on - Poses play on the same rig, so they now work wherever the idle does, the desktop app included.
3. The deformation rig
The main rig (woman_, 71 joints) is what every body clip keys. Every body mesh is also skinned to some of the 114 helper joints (deltoids, latissimus, scapula and chest muscles, twist joints of the thighs, calves, upper arms and wrists, knuckles, elbows, buttocks, groin, knees) that no clip keys resource. woman_ holds them (181 joints) with their parents: the latissimus, scapula and chest joints under Spine3, the knee and calf joints under LeftLeg, the elbow and wrist joints under LeftForeArm resource. The body meshes are bound in the rig's aPoseMS (within 0.26 mm and 0.8°); its boneTransforms are another pose [offline].
The graph is one linear chain of 420 nodes: the reference pose and the shared main pose, into model space, then the constraints, then back to local space resource. The chain's node kinds and what the Studio infers they compute [hypothesis, checked as below]:
| Node | Count | Computes |
|---|---|---|
StackTransformsExtender / …Shrinker | 7 each | Adds temporary transforms (_), each at its parent times its reference offset; the shrinker removes them |
TwistConstraint | 10 | The twist of B relative to A about A's front axis; each output joint turns by positiveScale or negativeScale of it about its own axis (the thigh keeps 10 % of the thigh's twist near the hip; the wrist joints take 37, 65 and 73 % of the hand's) |
PointConstraint | 46 | The weighted mean of its sources' positions (preprocessedWeights); rotation kept |
OrientConstraint | 31 | Its sources' rotations blended in turn by preprocessedWeights; position kept |
AimConstraint_ / _ | 78 / 14 | Turns forwardAxisLS at the target, upAxisLS towards the up object (or the up object's rotated upTransformVector) |
SetBoneTransform | 72 | The joint at its source times the offset (WholeTransform) |
SimpleSpline | 44 | The joint on the quadratic curve start → middle → end at defaultProgress, or at a float track's value |
SimpleBounce | 90 | A measure: X of the end in the start's space; offset + (multiplier or negativeMultiplier) × X, written into each output's channels (position, Euler rotation in degrees or scale, each scaled) in its parent's space, or into a float track; a rotation measure reads degrees too. It drives muscle bulges and slides, not only jiggle; its delay and smoothing are dynamics |
TranslationLimit | 8 | Clamps the joint's position in its parent's space |
The check: with the main joints in the A pose, these semantics give back the A pose for 179 of the 181 rig joints within 0.5 mm and 1°, and for the other two (l/) within 2°. That holds whatever the helper joints held on input, so every helper joint is fully determined by the graph [offline]. The twist sign, the bounce slopes and the spline's curve only act away from the A pose, where no capture has checked them yet.
Rotation channels are degrees [offline; hypothesis until capture ask 2]: the only bounces that write rotations are the elbow correctives (l/ at −200 and l/ at −300 per metre of the elbow's bend measure, RotZ). The measure is about 5–25 mm in bent-elbow poses, so the turn is 1–7° in degrees but 60–400° in radians, while the same measure scales those muscles by only 0.9 to 1.2. Read as radians they turned the elbow inside out under every bent-elbow pose (PREV-149); the A-pose check can't tell the units apart, because at rest the measure is on the zero slope. The engine's EulerAngles are degrees throughout.
The breasts rig is a simulation (dangles, drag, collision ellipsoids, blends and a static switch on a visual tag) resource; it isn't a constraint chain and the Studio leaves it out. At rest its joints keep the pose the deformation rig gives them hypothesis.
How the Studio uses it [source: the Studio]:
- The host reads the player entity (
PLAYER_, with every ArchiveXL patch) and takes each animated component bound to another animated component. It compiles each rig and graph, read natively, into a program (ENTITIES deformation-rig.ts) and serves it beside the character record (rigs). - The idle (
idle-animation.ts) runs each program on the clip's pose every frame, about 0.3 ms. It drives each joint a program solves through a virtual driver. Without a program, helper joints fall back to the rig segment nearest them (nearestDriver). The drawn parts' dangle components (hair with physics) come after the rigs: their chain joints follow their own rig parents, or their simulation with Hair physics on (hair physics §4), and never fall tonearestDriver. - Poses play on the same rigs. A photo-mode pose chosen in the Poses panel is a body clip on the idle's rig (
src/, poses §9), so each program runs on the posed joints exactly as on an idle's. Strong poses are where the inferred semantics away from the A pose (twist sign, bounce slopes, the spline's curve) first show; capture ask 2 checks them.pose-clip.ts - What it fixes: under the nearest-segment fallback, the latissimus, scapula and chest-side joints turned with the upper arm, so lowering the arms from the bind pose pulled the torso's sides in under the ribs. With the rig, the vertices mostly weighted to them move in by 11 mm on average in the close-up idle, against 38 mm before (17 against 44 in the inventory idle) [offline: the reference V's body posed both ways].
4. Feet states and the idles
The creator resource has two feet groups, flat_ (the garment mesh l0_) and lifted_ (the body's own chunks 5–7 through l0_) resource. The flat mesh is modelled flat, with its sole near the floor, around a skeleton whose foot is raised: the ankle stands 11.8 cm above the floor in the A pose. The lifted feet are modelled with the heel 5 to 8 cm up resource. So a clip suits one feet state:
| Clip | Ankle | Flat feet posed | Lifted feet posed |
|---|---|---|---|
ui_, ui_ | 6 cm; the foot turns 21° while the toes turn 5° | heel 5 cm through the floor, toes bent up by about 16° | flat on the floor |
UI_ (inventory) | 11.7 cm, as in the A pose | flat on the floor | heel raised, as inside a shoe |
ui_ | 6.5 cm | heel and toes below the floor | toes below the floor |
[offline: each clip sampled at t = 0, both meshes skinned]
This agrees with the puppets:
- The creator puppet's appearance,
character_, is a body group that listscreation lifted_resource, so the creator's idles pose lifted feet flat.feet - The inventory and gameplay use
flat_when no footwear is worn [wiki: ArchiveXL'sfeet {feet}table], and the inventory idle keeps the foot where the flat mesh was modelled.
What the Studio does [source: the Studio]:
- While a creator idle plays, the character request says
puppet: "creator"(xfs/), and the host draws V's bare feet as that group lists them (character-request-8 bodyStateFor). - With the inventory idle, or Still (the bind pose, where the flat mesh stands flat), the feet follow the footwear.
- Footwear always lifts them.
When a mod masks the lifted feet out. The lifted-feet choice follows the skin tone (link skin color): each skin tone has its own definition in l0_, which draws the body component's chunks 5–7 (the lower shins and feet) through a parts override on t0_ [resource: vanilla 2.31, basegame_ and basegame_]. On the reference profile two mods ship their own copy of that .app (a UV texture framework, which wins, and a toggleable-feet mod) in which the first skin tone's plain definition (l0_) sets that override's chunk mask to 0, while its tone variants (…_ and the rest) keep vanilla's mask [resource: read natively from each archive]. A parts override's chunk mask only hides (ArchiveXL ANDs it; the Modding Docs' .app page: "You can't un-hide something via partsOverrides") source wiki, and the garment feet components those copies add hide their own chunks unless a worn item's tag rule shows them. So a barefoot V on the first skin tone, which is the creator's default choice, stands without lower shins in the creator on that profile [source + resource; runtime untested: test ask 5]. The Studio draws the same, and the Character panel says so: "Feet not shown: your installed game files hide this part for this choice, as the game would."
Before this: a barefoot V wore flat feet under the close-up clip, so her heels sank through the floor and her toes bent: the crushed feet of the report [offline].
5. The nails' skin
A nails morph mod ships a0_ and _, each with an embedded base mesh of 1,120 vertices, and each vertex is skinned wholly to one fingertip joint (LeftHandThumb2, LeftHandIndex3, …Middle3, …Ring3, …Pinky3) [resource: the base blob's PS_/PS_ stream]. WolvenKit 9.0.1 writes that skin when it exports the morph target with the game folder, and leaves it out without it [offline]. The Studio's first export runs without the game folder (PIPE-106), which is why the nails came out rigid and were bound whole to one bone at their centre (rigid-body-part), floating beside the fingers. A morph target whose GLB has no skin is now exported again from its own raw copy with the game folder (MorphTargetSkin), so the nails follow the fingertips as in the game [source: the Studio]. This answers body rendering open question 5: the morph-target export, not the mod.
Open questions
- What does each helper joint look like in game in strong poses (raised arms, kneeling, sitting)? The graph's semantics are checked at the A pose only; the twist sign and the bounce slopes act away from it (capture ask 2).
- Does the gender-selection screen's puppet use lifted feet, and does it stand on a raised floor (its clip puts even the lifted toes 4 cm under the Studio's floor)?
- Does the game evaluate
SimpleBouncesmoothing towards the static value the Studio uses, and is the breasts simulation at rest identical to the deformation rig's output? - Which face clip plays with the nails and gender-selection loops? The face set has neither, and the Studio keeps the close-up's face.
In-game test asks
Batch with the next session. Record the game version, ArchiveXL, and the body, UV and nails mods in use.
- Inventory idle against the Studio. Inventory, V without clothing (underwear on), the default camera: capture three phases a few seconds apart. Compare with the Studio's whole-body view with the Body source on Inventory: stance, arm spread, gaze direction, flat feet.
- Helper joints. Photo mode, arms raised and a kneeling pose: close-ups of a shoulder, the torso's side under the ribs and a knee, against the Studio (when poses can play there).
- Creator feet. Creator, body page, full-body view, barefoot: the feet must stand flat (the lifted mesh under the creator's clip), as the Studio's Creator full body entry shows them.
- Nails. Creator nails section with long nails: each nail must sit on its fingertip through the hand loop.
- Feet on the first skin tone (profile with the UV texture framework). Creator, body page, full-body view, barefoot: choose the first skin tone, then the second. Expected from the files: lower shins and feet missing on the first, present on the second. If the first shows feet in game, the engine keeps a cooked component's own chunk mask against a part-scoped override (the
.app's cooked components keep vanilla's mask), and the resolver's rule R7 must apply part-scoped overrides only to the part's own components.
Related pages
Body rendering · Photo-mode poses · Facial expressions · Worn clothing · Pose library design · CC idle · Deformation rig evaluator evidence