Facial Expression System

Define facial presets that react to active penetration targets, scene contexts, penetrator size and girth, and penetration depth.

Overview

A facial preset is a group of morph effects. The resolver chooses one winning preset per actor, then applies its effects to phonemes, expressions, modifiers, and optional MFEE morphs.

Presets are part of RaceConfig. That means default-inheriting override files keep inherited presets and append their own. The list is sorted by priority after loading.

Placement

Place root defaults in accurate-penetration.toml or place race-specific entries in ppa-override-configs.

# Root config or single override file
[[FacialPreset]]
Targets = ["Mouth"]
Priority = 10
# Inside an array-style RaceConfig override
[[Override]]
Races = ["Skyrim.esm|013745"]

[[Override.FacialPreset]]
Targets = ["Mouth"]
Priority = 10
Inheritance

Because presets are appended to the inherited list, use Inherits = "" on a RaceConfig override when you need the actor to start with no inherited facial presets.

Structure

[[FacialPreset]]
Targets = ["Mouth"]
Priority = 50
Smoothing = 8.0
OverridePhonemes = true

[[FacialPreset.Effects]]
Type = "Phoneme"
Index = 1
TargetValue = 0.8

[[FacialPreset.Effects]]
Type = "Modifier"
Index = 12
TargetValue = 0.5

Preset Fields

PropertyTypeDescription
Targetsstring or string[]Optional active targets. Accepted values are Mouth, Vagina, Anus, and Hands. If omitted, the preset can match any active target.
Contextsstring or string[]Optional scene context flags. All listed contexts must be present.
PenisSizeMinfloatMinimum penetrator size. 0 disables the minimum.
PenisSizeMaxfloatMaximum penetrator size. 0 disables the maximum.
PenisGirthMinfloatMinimum penetrator girth. 0 disables the minimum.
PenisGirthMaxfloatMaximum penetrator girth. 0 disables the maximum.
PriorityintHigher priority wins among matching presets.
SmoothingfloatHow quickly morph values approach the target. Default is 8.0.
OverridePhonemesboolZeros phonemes not driven by the winning preset. Legacy alias OverridePhoneme is still accepted.
OverrideExpressionsboolZeros expressions not driven by the winning preset.
OverrideModifiersboolZeros modifiers not driven by the winning preset.
Targets Are Optional

The loader does not require Targets. A targetless preset can match any active target and uses the strongest active target input for size, girth, and depth calculations.

Effect Fields

PropertyTypeDescription
TypestringPhoneme, Expression, Modifier, or MFEE. Defaults to Phoneme if omitted or invalid.
IndexintNumeric morph index for phoneme, expression, and modifier effects.
MorphCategorystringMFEE category name.
MorphNamestringMFEE morph name.
TargetValuefloatValue reached at full effect strength. Default is 1.0.
MinTargetValuefloatStarting value when depth scaling is active. Default is 0.0.
MinPenetrationDepthfloatDepth where scaling starts. Negative values are clamped to 0.0.
MaxPenetrationDepthfloatDepth where scaling reaches TargetValue. Negative values are clamped to 0.0.

If MinPenetrationDepth is greater than MaxPenetrationDepth and max is above zero, the loader swaps them.

Depth Scaling

An effect uses depth scaling when MaxPenetrationDepth is greater than MinPenetrationDepth. The value interpolates from MinTargetValue to TargetValue across that depth range.

[[FacialPreset.Effects]]
Type = "Expression"
Index = 15
MinTargetValue = 0.2
TargetValue = 1.0
MinPenetrationDepth = 2.0
MaxPenetrationDepth = 10.0

Scene Contexts

These strings are accepted by the settings loader. A preset with multiple contexts requires all of them.

ContextDescriptionNotes
VaginalVaginal scene context.Can be combined with tone tags.
AnalAnal scene context.
OralOral scene context.
AggressiveAggressive scene context.
FemDomFemale-dominant scene context.
LovingLoving scene context.
DirtyDirty scene context.
BoobjobBoobjob context.
HandjobHandjob context.
FootjobFootjob context.
MasturbationMasturbation context.
[[FacialPreset]]
Targets = ["Vagina"]
Contexts = ["Vaginal", "Aggressive"]
Priority = 20

Selection

The update loop chooses one active preset per actor.

1

The preset must match at least one active target, or have no targets.

2

Context, size, and girth conditions must pass.

3

The highest priority matching preset wins.

When a preset has multiple targets, size, girth, and depth calculations use the maximum values among the relevant active target inputs.

MFEE

MFEE effects use MorphCategory and MorphName instead of a numeric index.

[[FacialPreset.Effects]]
Type = "MFEE"
MorphCategory = "Misc"
MorphName = "Biting_lips"
TargetValue = 100.0
Scale

Standard Skyrim phoneme, expression, and modifier effects normally use a 0.0 to 1.0 scale. MFEE morphs commonly use a 0 to 100 scale.

Morph Reference

Phonemes 0-15

0 Aah
1 BigAah
2 BMP
3 ChJSh
4 DST
5 Eee
6 Eh
7 FV
8 I
9 K
10 N
11 Oh
12 OohQ
13 R
14 Th
15 W

Expressions 0-16

0 Dialogue Anger
1 Dialogue Fear
2 Dialogue Happy
3 Dialogue Sad
4 Dialogue Surprise
5 Dialogue Puzzled
6 Dialogue Disgusted
7 Mood Neutral
8 Mood Anger
9 Mood Fear
10 Mood Happy
11 Mood Sad
12 Mood Surprise
13 Mood Puzzled
14 Mood Disgusted
15 Combat Shout
16 Combat Anger

Modifiers 0-13

0 Blink Left
1 Blink Right
2 Brow Down Left
3 Brow Down Right
4 Brow In Left
5 Brow In Right
6 Brow Up Left
7 Brow Up Right
8 Look Down
9 Look Left
10 Look Right
11 Look Up
12 Squint Left
13 Squint Right

Example: Basic Mouth

Default-style oral preset

Drives a blended open-mouth shape and zeroes other phonemes while active.

[[FacialPreset]]
Targets = ["Mouth"]
Priority = 99999
OverridePhonemes = true
Smoothing = 8.0

[[FacialPreset.Effects]]
Type = "Phoneme"
Index = 0
TargetValue = 0.75

[[FacialPreset.Effects]]
Type = "Phoneme"
Index = 1
TargetValue = 0.75

[[FacialPreset.Effects]]
Type = "Phoneme"
Index = 5
TargetValue = 1.0

Example: Context Variant

[[FacialPreset]]
Targets = ["Vagina"]
Contexts = ["Aggressive"]
Priority = 25
OverrideExpressions = true
OverrideModifiers = true

[[FacialPreset.Effects]]
Type = "Expression"
Index = 15
MinTargetValue = 0.2
TargetValue = 1.0
MinPenetrationDepth = 2.0
MaxPenetrationDepth = 12.0

Example: Override File

This override starts from a blank RaceConfig, defines its own race predicate, and adds only the facial presets shown here.

Inherits = ""
Races = ["SomeRaceMod.esp|001234"]

[[FacialPreset]]
Targets = ["Mouth"]
Priority = 10

[[FacialPreset.Effects]]
Type = "MFEE"
MorphCategory = "Misc"
MorphName = "EXPR2_Mouth_Open_Wide"
TargetValue = 90.0