perrillo Posted March 3 Posted March 3 3 hours ago, traison said: See the Targets and Contexts arrays of the "[FacialPreset]" section. https://6988638dc34b0c19d253892b--comforting-moonbeam-c80c4b.netlify.app/expressions.html Thanks a lot, that is what i was looking for.
perrillo Posted March 3 Posted March 3 3 hours ago, traison said: Lipsync to what? This mod produces no spoken words or other such noises. Reading about config file i found this, its what i mean, i guess there´s a way to sync phoneme with sounds from SL escenes. Phoneme Controls lip sync / mouth shape morphs (indices 0-15). [[FacialPreset.Effects]] Type = "Phoneme" Index = 1 TargetValue = 1.0
asdt123123 Posted March 3 Author Posted March 3 This version is purely a WIP. Haven't had much time to work on it, but maybe people have some ideas or find bugs which will save me time. I tested the voice system only for like 10 minutes, so GL Two features: Hooks into CBPC and plays impulses on the butt during penetration. Really WIP, just wanted to see what it'd look like. Whole new highly customizable voice system. Voice system is pretty elaborate. I reverse engineered the .lip files from Skyrim so it actually reads them and accurately plays lip sync for the audio. Well.. As accurate as skyrim's lip files are. Pretty neat. The default voice config isn't very elaborate yet, I got bored. Also its going to clash with sexlab voice sounds because for whatever reason they don't just have a voice toggle per actor. I generated the voices using https://elevenlabs.io Specifically the "Eve - Authentic, Energetic and Happy" voice. I had AI write a detailed tutorial on the config. So might be a little inaccurate: Spoiler # ============================================================================ # PenetratePhysics — Voice Configuration Reference # ============================================================================ # # Place .toml files in: Data/SKSE/Plugins/ppa-voice-configs/ # # FILES ARE LOADED ALPHABETICALLY by filename. If multiple files define # presets, they all merge into one pool. Presets are then sorted by Priority # (highest wins). Use filenames like "00-base.toml", "10-creature.toml" to # control load order when inheritance matters. # # SOUND PATHS are relative to Skyrim's Data/ folder, e.g.: # "Sound/fx/PPA/moans/soft_01.wav" # # LIP SYNC: For every sound file, the engine automatically looks for a # matching .lip file (same path, swapped extension). If found, it drives # facial phoneme animation in sync with the audio. No extra config needed — # just place the .lip next to the audio file. # # WILDCARD PATHS: You can use filesystem wildcards in sound paths. # "Sound/fx/PPA/moans/*.wav" — loads every .wav in that folder # "Sound/fx/PPA/moans/soft_*.wav" — loads only files starting with soft_ # This is the easiest way to add many sounds without listing each one. # ============================================================================ # ── FILE INHERITANCE ──────────────────────────────────────────────────────── # "inherits" lets this file pull in presets from other files BEFORE its own. # Paths are relative to the ppa-voice-configs/ directory. # The engine tracks visited files, so circular references are safe (no loops). # Parent presets load first, then this file's presets are appended after them. inherits = [ "00-base.toml", # Load shared defaults first # "00-creatures.toml", # Uncomment to also inherit creature sounds ] # ── GLOBAL SETTINGS ──────────────────────────────────────────────────────── # These tune the physics-to-audio pipeline. Each file can set these; the # LAST file loaded wins (alphabetical order). Typically only set in one file. [Settings] # Overall volume multiplier applied to every voice sound. 0.0 = silent, 1.0 = full. MasterVolume = 1.0 # How aggressively penetration velocity is smoothed over time. # Lower = more smoothing (laggy but stable). Higher = more reactive. # Range: 0.0–1.0. Default: 0.3 VelocitySmoothFactor = 0.3 # Minimum velocity (units/sec) for a movement to START being considered a thrust. # Below this, the engine treats it as idle/repositioning. Default: 5.0 ThrustStartVelocity = 5.0 # During a thrust cycle the engine tracks insertion vs withdrawal. This is the # minimum ratio of withdrawal-to-insertion distance required for the motion to # count as a real "thrust" (not just a slow push). 0.65 = must pull back at # least 65% of the insertion distance. Default: 0.65 ThrustMinWithdrawalRatio = 0.65 # The peak velocity a thrust must reach to fire an OnThrust trigger. # Filters out slow, gentle motions. Default: 8.0 ThrustMinPeakVelocity = 8.0 # Minimum penetration depth for a thrust to be recognized. Keeps surface-level # rubbing from triggering thrust sounds. Default: 0.5 ThrustMinDepth = 0.5 # ============================================================================ # VOICE PRESETS # ============================================================================ # Each [[VoicePreset]] is one "voice pack" — a set of sounds with conditions # that determine when it plays. At runtime the engine evaluates every preset's # predicates against the actor; the HIGHEST-PRIORITY matching preset wins. # # You can define as many [[VoicePreset]] blocks as you want per file. # ============================================================================ # ── EXAMPLE 1: Basic female moans (lowest priority fallback) ─────────────── [[VoicePreset]] Name = "Female Moans - Default" # Priority determines which preset wins when multiple match. # Higher number = checked first. Ties broken by load order. Priority = 0 # Sound files to randomly pick from each time a sound plays. # Supports wildcards — this loads every .wav in the folder. Sounds = [ "Sound/fx/PPA/female/moans/*.wav", ] # ── Predicates: conditions that must ALL be true for this preset to activate. [VoicePreset.Predicates] # Sex filter. Values: 0 = Male, 1 = Female. # This preset only applies to female actors. Sex = [1] # PenetratedSites — which body parts must be actively penetrated. # Valid sites: "Mouth", "Vagina", "Anus", "HandL", "HandR", "Hands" # # Prefix with "!" to NEGATE (require the site is NOT penetrated): # "!Mouth" means "mouth must NOT be penetrated" # # Multiple non-negated sites are OR'd: ["Vagina", "Anus"] means # "vagina OR anus must be penetrated". Each negated site is its own # independent "must NOT" condition. PenetratedSites = ["Vagina", "Anus"] # ── Triggers: when/how a sound actually fires. # You can have multiple triggers per preset — any one can fire a sound. [[VoicePreset.Triggers]] # "Interval" = fires on a timer. "OnThrust" = fires per thrust. "Random" = periodic dice roll. Type = "Interval" # Seconds between each sound (for Interval type). Interval = 3.0 # ── EXAMPLE 2: Intense moans at deep penetration ────────────────────────── [[VoicePreset]] Name = "Female Moans - Deep" Priority = 10 # Higher than default, so this wins when conditions match Sounds = [ "Sound/fx/PPA/female/moans_deep/deep_01.wav", "Sound/fx/PPA/female/moans_deep/deep_02.wav", "Sound/fx/PPA/female/moans_deep/deep_03.wav", ] [VoicePreset.Predicates] Sex = [1] PenetratedSites = ["Vagina", "Anus"] # Penetration depth range (game units). The sound only matches when the # deepest active penetration falls within [Min, Max]. # Lets you layer soft sounds at shallow depth, loud at deep. PenetrationDepthMin = 8.0 PenetrationDepthMax = 100.0 # Use a large max to mean "8 and above" # Speed range (units/sec). Filters by how fast the penetration is moving. # SpeedMin/SpeedMax = 0.0 means "no limit on that end". SpeedMin = 10.0 SpeedMax = 0.0 # 0 = no upper limit [[VoicePreset.Triggers]] Type = "OnThrust" # Fire once per detected thrust cycle MinDelay = 0.5 # Minimum seconds between sounds (prevents machine-gunning) # ── EXAMPLE 3: Oral-specific gagging sounds ─────────────────────────────── [[VoicePreset]] Name = "Female Gag - Oral" Priority = 20 # Highest so far — oral overrides generic moans Sounds = [ "Sound/fx/PPA/female/oral/*.wav", ] [VoicePreset.Predicates] Sex = [1] # Require mouth penetration, and require vagina/anus are NOT penetrated # (so this only fires during oral-only scenes). PenetratedSites = ["Mouth", "!Vagina", "!Anus"] PenetrationDepthMin = 3.0 PenetrationDepthMax = 100.0 [[VoicePreset.Triggers]] Type = "OnThrust" MinDelay = 0.3 # ── EXAMPLE 4: Male grunts ─────────────────────────────────────────────── [[VoicePreset]] Name = "Male Grunts - Default" Priority = 0 Sounds = [ "Sound/fx/PPA/male/grunts/*.wav", ] [VoicePreset.Predicates] Sex = [0] # Male actors # PenetratingSites — the sites this actor is penetrating WITH (not being # penetrated). Same site names, same negation rules. PenetratingSites = ["Vagina", "Anus", "Mouth"] [[VoicePreset.Triggers]] Type = "OnThrust" MinDelay = 1.0 # You can add a second trigger — e.g. also play randomly between thrusts. [[VoicePreset.Triggers]] Type = "Random" Interval = 5.0 # Check every 5 seconds RandomChance = 30.0 # 30% chance each check (0–100) # ── EXAMPLE 5: Race-specific preset ────────────────────────────────────── [[VoicePreset]] Name = "Khajiit Female - Purring" Priority = 50 # Race-specific overrides generic Sounds = [ "Sound/fx/PPA/khajiit/purr_*.wav", ] [VoicePreset.Predicates] Sex = [1] # Race filter — use "PluginName.esp|0xHexID" format. # The part before | is the plugin name. The part after is the local FormID. # For base Skyrim races, plugin is "Skyrim.esm". # If you omit the plugin (just "0x12345"), it defaults to Skyrim.esm. # Light plugins (.esl) are handled automatically. Races = [ "Skyrim.esm|0x023FE9", # KhajiitRace "Skyrim.esm|0x023FEA", # KhajiitRaceVampire ] PenetratedSites = ["Vagina", "Anus"] [[VoicePreset.Triggers]] Type = "Interval" Interval = 4.0 # ── EXAMPLE 6: Specific NPC by BaseID ──────────────────────────────────── [[VoicePreset]] Name = "Serana Custom Voice" Priority = 100 # Very high — NPC-specific always wins Sounds = [ "Sound/fx/PPA/custom/serana/*.wav", ] [VoicePreset.Predicates] # BaseIDs — target specific NPCs by their base form ID. # Same "Plugin|0xHexID" format as Races. BaseIDs = [ "Dawnguard.esm|0x002B6C", # Serana ] [[VoicePreset.Triggers]] Type = "OnThrust" MinDelay = 0.8 # ── EXAMPLE 7: Girth-dependent sounds ─────────────────────────────────── [[VoicePreset]] Name = "Female Moans - Large Girth" Priority = 15 Sounds = [ "Sound/fx/PPA/female/moans_stretch/*.wav", ] [VoicePreset.Predicates] Sex = [1] PenetratedSites = ["Vagina", "Anus"] # Penis girth range — filters by the girth value of the penetrating actor. # Only matches when girth is between Min and Max. PenisGirthMin = 1.5 PenisGirthMax = 10.0 # Large max = "1.5 and above" [[VoicePreset.Triggers]] Type = "Interval" Interval = 2.5 # ── EXAMPLE 8: Context flags ───────────────────────────────────────────── # Scene contexts are string tags describing the current scene. The available # context strings are hardcoded: # # "Vaginal" "Anal" "Oral" "Aggressive" "FemDom" "Loving" # "Dirty" "Boobjob" "Handjob" "Footjob" "Masturbation" # # These are set by the animation framework based on the active animation. [[VoicePreset]] Name = "Female Moans - Aggressive" Priority = 25 Sounds = [ "Sound/fx/PPA/female/moans_rough/*.wav", ] [VoicePreset.Predicates] Sex = [1] PenetratedSites = ["Vagina", "Anus"] # Contexts — scene tags that must (or must not) be active. # Prefix with "!" to negate. Each entry is checked independently: # "Aggressive" → scene MUST have the Aggressive flag # "!Loving" → scene must NOT have the Loving flag Contexts = ["Aggressive", "!Loving"] [[VoicePreset.Triggers]] Type = "OnThrust" MinDelay = 0.4 # ── EXAMPLE 9: Handjob-specific sounds ─────────────────────────────────── [[VoicePreset]] Name = "Male Grunts - Handjob" Priority = 5 Sounds = [ "Sound/fx/PPA/male/handjob/*.wav", ] [VoicePreset.Predicates] Sex = [0] # "Hands" is a combined site covering both hands. # "HandL" / "HandR" target a specific hand. # This matches whenever hands are involved, even alongside other sites. # Add "!Vagina", "!Anus", etc. if you want handjob-ONLY scenes. PenetratingSites = ["Hands"] [[VoicePreset.Triggers]] Type = "Random" Interval = 3.0 RandomChance = 50.0 # ============================================================================ # QUICK REFERENCE # ============================================================================ # # PREDICATE FIELDS (all optional — omit any you don't need): # ┌──────────────────────┬────────────────────────────────────────────────┐ # │ Field │ Description │ # ├──────────────────────┼────────────────────────────────────────────────┤ # │ Sex │ [0]=Male, [1]=Female │ # │ Races │ ["Plugin.esp|0xHexID", ...] │ # │ BaseIDs │ ["Plugin.esp|0xHexID", ...] │ # │ PenetrationDepthMin │ float — minimum depth to match │ # │ PenetrationDepthMax │ float — maximum depth to match │ # │ │ (must be > Min for the filter to activate) │ # │ SpeedMin │ float — minimum velocity to match │ # │ SpeedMax │ float — maximum velocity (0 = unlimited) │ # │ PenisGirthMin │ float — minimum girth to match │ # │ PenisGirthMax │ float — maximum girth │ # │ │ (must be > Min for the filter to activate) │ # │ PenetratedSites │ ["Vagina","Anus","Mouth","HandL","HandR", │ # │ │ "Hands"] — prefix "!" to negate │ # │ PenetratingSites │ same values as PenetratedSites │ # │ Contexts │ Scene context flags (see list below). │ # │ │ Prefix "!" to negate. │ # └──────────────────────┴────────────────────────────────────────────────┘ # # AVAILABLE CONTEXT STRINGS: # "Vaginal" "Anal" "Oral" "Aggressive" "FemDom" "Loving" # "Dirty" "Boobjob" "Handjob" "Footjob" "Masturbation" # # TRIGGER TYPES: # ┌─────────────┬─────────────────────────────────────────────────────────┐ # │ Type │ Behavior │ # ├─────────────┼─────────────────────────────────────────────────────────┤ # │ "Interval" │ Fires every N seconds (set via Interval field) │ # │ "OnThrust" │ Fires once per detected thrust cycle │ # │ "Random" │ Every Interval seconds, rolls RandomChance% to fire │ # └─────────────┴─────────────────────────────────────────────────────────┘ # All triggers respect MinDelay (minimum gap between sounds). # If no triggers are specified, a default Interval trigger is added. # # FORMID FORMAT: "PluginName.esp|0x00ABCD" # If no plugin specified, defaults to Skyrim.esm. # Light plugins (.esl) are handled automatically. # # DEPTH/GIRTH RANGE NOTE: # DepthMax must be strictly greater than DepthMin for the filter to # activate. Same for GirthMax > GirthMin. If Max <= Min, the predicate # is skipped (not created). # ============================================================================ Not sure how I want to stop Sexlab voices yet. Probably will just intercept their papyrus calls. PPA - Penetration Physics v0.0.31.zip 8
perrillo Posted March 4 Posted March 4 17 minutes ago, asdt123123 said: This version is purely a WIP. Haven't had much time to work on it, but maybe people have some ideas or find bugs which will save me time. I tested the voice system only for like 10 minutes, so GL Two features: Hooks into CBPC and plays impulses on the butt during penetration. Really WIP, just wanted to see what it'd look like. Whole new highly customizable voice system. WTF!, i was just asking for a feature i thinked already exists. Then i get a full update? wow respect and thanks.
traison Posted March 4 Posted March 4 13 minutes ago, asdt123123 said: Not sure how I want to stop Sexlab voices yet. Probably will just intercept their papyrus calls. Would it not make more sense at this point to edit the Papyrus script itself? Having a 3rd party dll hook into Papyrus to stab a SL script to disable select function calls here or there is going to get REALLY confusing 1 year down the line when someone posts a "why aren't my SL voices working" -thread in the tech support forum. I feel like this is feature creep. 17 minutes ago, perrillo said: ...i guess there´s a way to sync phoneme with sounds from SL escenes. Lipsync and phonemes are 2 different things in this case. Phonemes are used to build expressions essentially. Can't remember where the phoneme list is anymore, so here's the definitions as I have them in my own mod: PHO_AAH = 0 PHO_BIG_AAH = 1 PHO_BMP = 2 PHO_CHJ_SH = 3 PHO_DST = 4 PHO_EEE = 5 PHO_EH = 6 PHO_FV = 7 PHO_I = 8 PHO_K = 9 PHO_N = 10 PHO_OH = 11 PHO_OOH_Q = 12 PHO_R = 13 PHO_TH = 14 PHO_W = 15 You can use RaceMenu to demo these live, so that you don't have to trial-n-error it in a text editor. Some advice though: it's not possible to fit anything huge in the mouth with these default options. You'll need MFEE for that.
traison Posted March 4 Posted March 4 33 minutes ago, asdt123123 said: ...its going to clash with sexlab voice sounds because for whatever reason they don't just have a voice toggle per actor. There is, I use it myself in my mods. Here's my function: Function ToggleMuteActors(sslThreadController thread, bool creatures, bool mute) Actor[] actors = thread.Positions int id = 0 While id < actors.Length Actor this = actors[id] If (!IsCreature(this) || creatures) sslActorAlias thisAlias = thread.ActorAlias(this) ; NOTE None does not change the voice. 2nd argument is ForceSilence. thisAlias.SetVoice(none, mute) EndIf id += 1 EndWhile EndFunction
benzay Posted March 4 Posted March 4 wow that is so impressive! especially with the new voice system, would you be open to add support for the enjoyment values from slp+, so that some comments and face expressions can be triggered only if the actor is close to orgasm ( or the other way around). thank you for your time and the expertise you share with us gooners!
bitnuke Posted March 4 Posted March 4 Proposal for the solver: Make it learn how to drive a truck This is an edge issue than only affects 5% of animations. So it might not be worth it, or should be a low priority feature. On the other hand: It's an interesting mathematical problem to solve, and i know hackers love those. Here the problem: Right now the solver only bends towards the target hole (or waypoint). It does not consider bending the opposite direction in advance, to get a better angle. Why go the opposite direction? Well that's how you make a truck go around sharp corners: You steer the other direction first to get a better angle and wider turn. Logically this is easy to detect, and probably only needed for the first node (entry): If a direct turn exceeds a certain angle, and you have penis-segments to spare, try the truck strategy. Multiple ABC anims do this: They have the penis aligned with the hole in a way that would require a sharp 90 degree turn, and do the truck thing. With those stages, if you try to let PPA handle it, it fails miserably. But if you disable it for just that stage, you get no collisions, so the only way to make those anims work right now is, to disable PPA completely (all stages).
shardoom Posted March 4 Posted March 4 15 hours ago, asdt123123 said: This version is purely a WIP. Haven't had much time to work on it, but maybe people have some ideas or find bugs which will save me time. I tested the voice system only for like 10 minutes, so GL Two features: Hooks into CBPC and plays impulses on the butt during penetration. Really WIP, just wanted to see what it'd look like. Whole new highly customizable voice system. Voice system is pretty elaborate. I reverse engineered the .lip files from Skyrim so it actually reads them and accurately plays lip sync for the audio. Well.. As accurate as skyrim's lip files are. Pretty neat. The default voice config isn't very elaborate yet, I got bored. Also its going to clash with sexlab voice sounds because for whatever reason they don't just have a voice toggle per actor. I generated the voices using https://elevenlabs.io Specifically the "Eve - Authentic, Energetic and Happy" voice. I had AI write a detailed tutorial on the config. So might be a little inaccurate: Reveal hidden contents # ============================================================================ # PenetratePhysics — Voice Configuration Reference # ============================================================================ # # Place .toml files in: Data/SKSE/Plugins/ppa-voice-configs/ # # FILES ARE LOADED ALPHABETICALLY by filename. If multiple files define # presets, they all merge into one pool. Presets are then sorted by Priority # (highest wins). Use filenames like "00-base.toml", "10-creature.toml" to # control load order when inheritance matters. # # SOUND PATHS are relative to Skyrim's Data/ folder, e.g.: # "Sound/fx/PPA/moans/soft_01.wav" # # LIP SYNC: For every sound file, the engine automatically looks for a # matching .lip file (same path, swapped extension). If found, it drives # facial phoneme animation in sync with the audio. No extra config needed — # just place the .lip next to the audio file. # # WILDCARD PATHS: You can use filesystem wildcards in sound paths. # "Sound/fx/PPA/moans/*.wav" — loads every .wav in that folder # "Sound/fx/PPA/moans/soft_*.wav" — loads only files starting with soft_ # This is the easiest way to add many sounds without listing each one. # ============================================================================ # ── FILE INHERITANCE ──────────────────────────────────────────────────────── # "inherits" lets this file pull in presets from other files BEFORE its own. # Paths are relative to the ppa-voice-configs/ directory. # The engine tracks visited files, so circular references are safe (no loops). # Parent presets load first, then this file's presets are appended after them. inherits = [ "00-base.toml", # Load shared defaults first # "00-creatures.toml", # Uncomment to also inherit creature sounds ] # ── GLOBAL SETTINGS ──────────────────────────────────────────────────────── # These tune the physics-to-audio pipeline. Each file can set these; the # LAST file loaded wins (alphabetical order). Typically only set in one file. [Settings] # Overall volume multiplier applied to every voice sound. 0.0 = silent, 1.0 = full. MasterVolume = 1.0 # How aggressively penetration velocity is smoothed over time. # Lower = more smoothing (laggy but stable). Higher = more reactive. # Range: 0.0–1.0. Default: 0.3 VelocitySmoothFactor = 0.3 # Minimum velocity (units/sec) for a movement to START being considered a thrust. # Below this, the engine treats it as idle/repositioning. Default: 5.0 ThrustStartVelocity = 5.0 # During a thrust cycle the engine tracks insertion vs withdrawal. This is the # minimum ratio of withdrawal-to-insertion distance required for the motion to # count as a real "thrust" (not just a slow push). 0.65 = must pull back at # least 65% of the insertion distance. Default: 0.65 ThrustMinWithdrawalRatio = 0.65 # The peak velocity a thrust must reach to fire an OnThrust trigger. # Filters out slow, gentle motions. Default: 8.0 ThrustMinPeakVelocity = 8.0 # Minimum penetration depth for a thrust to be recognized. Keeps surface-level # rubbing from triggering thrust sounds. Default: 0.5 ThrustMinDepth = 0.5 # ============================================================================ # VOICE PRESETS # ============================================================================ # Each [[VoicePreset]] is one "voice pack" — a set of sounds with conditions # that determine when it plays. At runtime the engine evaluates every preset's # predicates against the actor; the HIGHEST-PRIORITY matching preset wins. # # You can define as many [[VoicePreset]] blocks as you want per file. # ============================================================================ # ── EXAMPLE 1: Basic female moans (lowest priority fallback) ─────────────── [[VoicePreset]] Name = "Female Moans - Default" # Priority determines which preset wins when multiple match. # Higher number = checked first. Ties broken by load order. Priority = 0 # Sound files to randomly pick from each time a sound plays. # Supports wildcards — this loads every .wav in the folder. Sounds = [ "Sound/fx/PPA/female/moans/*.wav", ] # ── Predicates: conditions that must ALL be true for this preset to activate. [VoicePreset.Predicates] # Sex filter. Values: 0 = Male, 1 = Female. # This preset only applies to female actors. Sex = [1] # PenetratedSites — which body parts must be actively penetrated. # Valid sites: "Mouth", "Vagina", "Anus", "HandL", "HandR", "Hands" # # Prefix with "!" to NEGATE (require the site is NOT penetrated): # "!Mouth" means "mouth must NOT be penetrated" # # Multiple non-negated sites are OR'd: ["Vagina", "Anus"] means # "vagina OR anus must be penetrated". Each negated site is its own # independent "must NOT" condition. PenetratedSites = ["Vagina", "Anus"] # ── Triggers: when/how a sound actually fires. # You can have multiple triggers per preset — any one can fire a sound. [[VoicePreset.Triggers]] # "Interval" = fires on a timer. "OnThrust" = fires per thrust. "Random" = periodic dice roll. Type = "Interval" # Seconds between each sound (for Interval type). Interval = 3.0 # ── EXAMPLE 2: Intense moans at deep penetration ────────────────────────── [[VoicePreset]] Name = "Female Moans - Deep" Priority = 10 # Higher than default, so this wins when conditions match Sounds = [ "Sound/fx/PPA/female/moans_deep/deep_01.wav", "Sound/fx/PPA/female/moans_deep/deep_02.wav", "Sound/fx/PPA/female/moans_deep/deep_03.wav", ] [VoicePreset.Predicates] Sex = [1] PenetratedSites = ["Vagina", "Anus"] # Penetration depth range (game units). The sound only matches when the # deepest active penetration falls within [Min, Max]. # Lets you layer soft sounds at shallow depth, loud at deep. PenetrationDepthMin = 8.0 PenetrationDepthMax = 100.0 # Use a large max to mean "8 and above" # Speed range (units/sec). Filters by how fast the penetration is moving. # SpeedMin/SpeedMax = 0.0 means "no limit on that end". SpeedMin = 10.0 SpeedMax = 0.0 # 0 = no upper limit [[VoicePreset.Triggers]] Type = "OnThrust" # Fire once per detected thrust cycle MinDelay = 0.5 # Minimum seconds between sounds (prevents machine-gunning) # ── EXAMPLE 3: Oral-specific gagging sounds ─────────────────────────────── [[VoicePreset]] Name = "Female Gag - Oral" Priority = 20 # Highest so far — oral overrides generic moans Sounds = [ "Sound/fx/PPA/female/oral/*.wav", ] [VoicePreset.Predicates] Sex = [1] # Require mouth penetration, and require vagina/anus are NOT penetrated # (so this only fires during oral-only scenes). PenetratedSites = ["Mouth", "!Vagina", "!Anus"] PenetrationDepthMin = 3.0 PenetrationDepthMax = 100.0 [[VoicePreset.Triggers]] Type = "OnThrust" MinDelay = 0.3 # ── EXAMPLE 4: Male grunts ─────────────────────────────────────────────── [[VoicePreset]] Name = "Male Grunts - Default" Priority = 0 Sounds = [ "Sound/fx/PPA/male/grunts/*.wav", ] [VoicePreset.Predicates] Sex = [0] # Male actors # PenetratingSites — the sites this actor is penetrating WITH (not being # penetrated). Same site names, same negation rules. PenetratingSites = ["Vagina", "Anus", "Mouth"] [[VoicePreset.Triggers]] Type = "OnThrust" MinDelay = 1.0 # You can add a second trigger — e.g. also play randomly between thrusts. [[VoicePreset.Triggers]] Type = "Random" Interval = 5.0 # Check every 5 seconds RandomChance = 30.0 # 30% chance each check (0–100) # ── EXAMPLE 5: Race-specific preset ────────────────────────────────────── [[VoicePreset]] Name = "Khajiit Female - Purring" Priority = 50 # Race-specific overrides generic Sounds = [ "Sound/fx/PPA/khajiit/purr_*.wav", ] [VoicePreset.Predicates] Sex = [1] # Race filter — use "PluginName.esp|0xHexID" format. # The part before | is the plugin name. The part after is the local FormID. # For base Skyrim races, plugin is "Skyrim.esm". # If you omit the plugin (just "0x12345"), it defaults to Skyrim.esm. # Light plugins (.esl) are handled automatically. Races = [ "Skyrim.esm|0x023FE9", # KhajiitRace "Skyrim.esm|0x023FEA", # KhajiitRaceVampire ] PenetratedSites = ["Vagina", "Anus"] [[VoicePreset.Triggers]] Type = "Interval" Interval = 4.0 # ── EXAMPLE 6: Specific NPC by BaseID ──────────────────────────────────── [[VoicePreset]] Name = "Serana Custom Voice" Priority = 100 # Very high — NPC-specific always wins Sounds = [ "Sound/fx/PPA/custom/serana/*.wav", ] [VoicePreset.Predicates] # BaseIDs — target specific NPCs by their base form ID. # Same "Plugin|0xHexID" format as Races. BaseIDs = [ "Dawnguard.esm|0x002B6C", # Serana ] [[VoicePreset.Triggers]] Type = "OnThrust" MinDelay = 0.8 # ── EXAMPLE 7: Girth-dependent sounds ─────────────────────────────────── [[VoicePreset]] Name = "Female Moans - Large Girth" Priority = 15 Sounds = [ "Sound/fx/PPA/female/moans_stretch/*.wav", ] [VoicePreset.Predicates] Sex = [1] PenetratedSites = ["Vagina", "Anus"] # Penis girth range — filters by the girth value of the penetrating actor. # Only matches when girth is between Min and Max. PenisGirthMin = 1.5 PenisGirthMax = 10.0 # Large max = "1.5 and above" [[VoicePreset.Triggers]] Type = "Interval" Interval = 2.5 # ── EXAMPLE 8: Context flags ───────────────────────────────────────────── # Scene contexts are string tags describing the current scene. The available # context strings are hardcoded: # # "Vaginal" "Anal" "Oral" "Aggressive" "FemDom" "Loving" # "Dirty" "Boobjob" "Handjob" "Footjob" "Masturbation" # # These are set by the animation framework based on the active animation. [[VoicePreset]] Name = "Female Moans - Aggressive" Priority = 25 Sounds = [ "Sound/fx/PPA/female/moans_rough/*.wav", ] [VoicePreset.Predicates] Sex = [1] PenetratedSites = ["Vagina", "Anus"] # Contexts — scene tags that must (or must not) be active. # Prefix with "!" to negate. Each entry is checked independently: # "Aggressive" → scene MUST have the Aggressive flag # "!Loving" → scene must NOT have the Loving flag Contexts = ["Aggressive", "!Loving"] [[VoicePreset.Triggers]] Type = "OnThrust" MinDelay = 0.4 # ── EXAMPLE 9: Handjob-specific sounds ─────────────────────────────────── [[VoicePreset]] Name = "Male Grunts - Handjob" Priority = 5 Sounds = [ "Sound/fx/PPA/male/handjob/*.wav", ] [VoicePreset.Predicates] Sex = [0] # "Hands" is a combined site covering both hands. # "HandL" / "HandR" target a specific hand. # This matches whenever hands are involved, even alongside other sites. # Add "!Vagina", "!Anus", etc. if you want handjob-ONLY scenes. PenetratingSites = ["Hands"] [[VoicePreset.Triggers]] Type = "Random" Interval = 3.0 RandomChance = 50.0 # ============================================================================ # QUICK REFERENCE # ============================================================================ # # PREDICATE FIELDS (all optional — omit any you don't need): # ┌──────────────────────┬────────────────────────────────────────────────┐ # │ Field │ Description │ # ├──────────────────────┼────────────────────────────────────────────────┤ # │ Sex │ [0]=Male, [1]=Female │ # │ Races │ ["Plugin.esp|0xHexID", ...] │ # │ BaseIDs │ ["Plugin.esp|0xHexID", ...] │ # │ PenetrationDepthMin │ float — minimum depth to match │ # │ PenetrationDepthMax │ float — maximum depth to match │ # │ │ (must be > Min for the filter to activate) │ # │ SpeedMin │ float — minimum velocity to match │ # │ SpeedMax │ float — maximum velocity (0 = unlimited) │ # │ PenisGirthMin │ float — minimum girth to match │ # │ PenisGirthMax │ float — maximum girth │ # │ │ (must be > Min for the filter to activate) │ # │ PenetratedSites │ ["Vagina","Anus","Mouth","HandL","HandR", │ # │ │ "Hands"] — prefix "!" to negate │ # │ PenetratingSites │ same values as PenetratedSites │ # │ Contexts │ Scene context flags (see list below). │ # │ │ Prefix "!" to negate. │ # └──────────────────────┴────────────────────────────────────────────────┘ # # AVAILABLE CONTEXT STRINGS: # "Vaginal" "Anal" "Oral" "Aggressive" "FemDom" "Loving" # "Dirty" "Boobjob" "Handjob" "Footjob" "Masturbation" # # TRIGGER TYPES: # ┌─────────────┬─────────────────────────────────────────────────────────┐ # │ Type │ Behavior │ # ├─────────────┼─────────────────────────────────────────────────────────┤ # │ "Interval" │ Fires every N seconds (set via Interval field) │ # │ "OnThrust" │ Fires once per detected thrust cycle │ # │ "Random" │ Every Interval seconds, rolls RandomChance% to fire │ # └─────────────┴─────────────────────────────────────────────────────────┘ # All triggers respect MinDelay (minimum gap between sounds). # If no triggers are specified, a default Interval trigger is added. # # FORMID FORMAT: "PluginName.esp|0x00ABCD" # If no plugin specified, defaults to Skyrim.esm. # Light plugins (.esl) are handled automatically. # # DEPTH/GIRTH RANGE NOTE: # DepthMax must be strictly greater than DepthMin for the filter to # activate. Same for GirthMax > GirthMin. If Max <= Min, the predicate # is skipped (not created). # ============================================================================ Not sure how I want to stop Sexlab voices yet. Probably will just intercept their papyrus calls. PPA - Penetration Physics v0.0.31.zip 6.92 MB · 1 download Are you an actual wizard??
asdt123123 Posted March 4 Author Posted March 4 1 hour ago, bitnuke said: Proposal for the solver: Make it learn how to drive a truck This is an edge issue than only affects 5% of animations. So it might not be worth it, or should be a low priority feature. On the other hand: It's an interesting mathematical problem to solve, and i know hackers love those. The algorithm is extremely complex already. You're just discussing a basic spline algorithm essentially. Which isn't possible with 90% of penises because they don't paint vertex weights well which results in PPA moving it, but the penis not actually visually appearing in that position. That would only be possible if PPA had greater control of the vertexes, otherwise it's just asking for problems. On the surface level the logic probably seems straight forward: Point penis at X. But realistically there's hundreds of variables and annoying skyrim logic to deal with on top of the already complex math. 16 hours ago, traison said: Would it not make more sense at this point to edit the Papyrus script itself? Having a 3rd party dll hook into Papyrus to stab a SL script to disable select function calls here or there is going to get REALLY confusing 1 year down the line when someone posts a "why aren't my SL voices working" -thread in the tech support forum. No it's pretty straight forward. Hijacks the sound functions from the engine on papyrus to install a middle man to control whether the sound should be discarded or not. I'll try what you suggested though, it's just annoying since there's P+, Sexlab, and other scripts that modify sexlab's scripts which sometimes screw with the logic. 4 hours ago, benzay said: would you be open to add support for the enjoyment values from slp+, so that some comments and face expressions can be triggered only if the actor is close to orgasm ( or the other way around). In the official release maybe. Biggest issue is: Newer P+ enjoyment gets added, user says "Why is my Sexlab (That doesn't have it) not working with this?". Or "Why is my 2 year old P+ version not working with this?". Not sure if OStim has something similar either. I want to avoid headaches where possible, people don't like to read. 3
DaMan1 Posted March 4 Posted March 4 When playing with ppa voiceses, should i disable sexlab voices? Or do they need to work together? the moans and stuff kinda sound funny in v30. gonna try v31 now
benzay Posted March 4 Posted March 4 1 hour ago, asdt123123 said: In the official release maybe. Biggest issue is: Newer P+ enjoyment gets added, user says "Why is my Sexlab (That doesn't have it) not working with this?". Or "Why is my 2 year old P+ version not working with this?". Not sure if OStim has something similar either. I want to avoid headaches where possible, people don't like to read. i get that! to argue my case a bit more, ostim has "excitement" which serves the same purpose, and vanilla sexlab/2 year old p+ don't have separate orgasm at all unless you use SLSO, that has a way to track enjoyment. but i get that it can be a headache to add and to deal with users, i won't insist much more! thank you again for your mod and your answer!
bitnuke Posted March 4 Posted March 4 Reproducable bug in 0.0.30. Probably just an oversight: If you set all stages and actors of an animation to not be handled by PPA, it should go all hands-off and let other mods/frameworks take control, right? Well, it will still prevent sexlab from using the open mouth expression. Only by disabling the expression system globally in the config (or turning the mod off with the hotkey), does the sexlab open-mouth feature work again. So this means there's no way to make blowjob anims work the old fashioned way - at least not on a per animation basis.
bitnuke Posted March 4 Posted March 4 (edited) 1 hour ago, hxjaid78 said: Your mod works perfectly for me, including the facial openings and hole penetration (laughs), but I have a serious problem that I can't fix on my own and I wanted to know if anyone else has had this experience. Does anyone know how to make the Sexlab animations stop being misaligned in terms of height or distance between my MCPc and another actor? This only happens in the UBE body (custom race Imperial or Nord UBE) Either my character is misaligned in height (e.g., blowjob in the air, or is further away... I've already activated all the Sexlab options to correct this (Even Actors Height), I've already deactivated Race/Gender specific animations to keep the Animation Editor in the Global Profile, I've use console command (setscale 1.0) and my problem still persists I've even tried Fix Heels and Sexlab Scaler and nothing I realize that the framework can't activate the correct scaling for both or all the actors participating in the animation, I've even tried uninstalling the whole game and reinstalling a few mods in new game and nothing Of course, Sexlab and most animation packs were made based on vanilla bodies and their derivatives (cbbe, unnp, bhunp, 3ba), but it seems that when it comes to UBE, things get complicated Ask in the sexlab topic? This mod doesn't handle actor alignment or scaling. That all handled by sexlab. And yes, it's a well-known problem. Happens all the time. Edited March 4 by bitnuke
asdt123123 Posted March 5 Author Posted March 5 On 3/3/2026 at 3:59 PM, asdt123123 said: This version is purely a WIP. Haven't had much time to work on it, but maybe people have some ideas or find bugs which will save me time. I tested the voice system only for like 10 minutes, so GL Two features: Hooks into CBPC and plays impulses on the butt during penetration. Really WIP, just wanted to see what it'd look like. Whole new highly customizable voice system. Voice system is pretty elaborate. I reverse engineered the .lip files from Skyrim so it actually reads them and accurately plays lip sync for the audio. Well.. As accurate as skyrim's lip files are. Pretty neat. The default voice config isn't very elaborate yet, I got bored. Also its going to clash with sexlab voice sounds because for whatever reason they don't just have a voice toggle per actor. I generated the voices using https://elevenlabs.io Specifically the "Eve - Authentic, Energetic and Happy" voice. I had AI write a detailed tutorial on the config. So might be a little inaccurate: Reveal hidden contents # ============================================================================ # PenetratePhysics — Voice Configuration Reference # ============================================================================ # # Place .toml files in: Data/SKSE/Plugins/ppa-voice-configs/ # # FILES ARE LOADED ALPHABETICALLY by filename. If multiple files define # presets, they all merge into one pool. Presets are then sorted by Priority # (highest wins). Use filenames like "00-base.toml", "10-creature.toml" to # control load order when inheritance matters. # # SOUND PATHS are relative to Skyrim's Data/ folder, e.g.: # "Sound/fx/PPA/moans/soft_01.wav" # # LIP SYNC: For every sound file, the engine automatically looks for a # matching .lip file (same path, swapped extension). If found, it drives # facial phoneme animation in sync with the audio. No extra config needed — # just place the .lip next to the audio file. # # WILDCARD PATHS: You can use filesystem wildcards in sound paths. # "Sound/fx/PPA/moans/*.wav" — loads every .wav in that folder # "Sound/fx/PPA/moans/soft_*.wav" — loads only files starting with soft_ # This is the easiest way to add many sounds without listing each one. # ============================================================================ # ── FILE INHERITANCE ──────────────────────────────────────────────────────── # "inherits" lets this file pull in presets from other files BEFORE its own. # Paths are relative to the ppa-voice-configs/ directory. # The engine tracks visited files, so circular references are safe (no loops). # Parent presets load first, then this file's presets are appended after them. inherits = [ "00-base.toml", # Load shared defaults first # "00-creatures.toml", # Uncomment to also inherit creature sounds ] # ── GLOBAL SETTINGS ──────────────────────────────────────────────────────── # These tune the physics-to-audio pipeline. Each file can set these; the # LAST file loaded wins (alphabetical order). Typically only set in one file. [Settings] # Overall volume multiplier applied to every voice sound. 0.0 = silent, 1.0 = full. MasterVolume = 1.0 # How aggressively penetration velocity is smoothed over time. # Lower = more smoothing (laggy but stable). Higher = more reactive. # Range: 0.0–1.0. Default: 0.3 VelocitySmoothFactor = 0.3 # Minimum velocity (units/sec) for a movement to START being considered a thrust. # Below this, the engine treats it as idle/repositioning. Default: 5.0 ThrustStartVelocity = 5.0 # During a thrust cycle the engine tracks insertion vs withdrawal. This is the # minimum ratio of withdrawal-to-insertion distance required for the motion to # count as a real "thrust" (not just a slow push). 0.65 = must pull back at # least 65% of the insertion distance. Default: 0.65 ThrustMinWithdrawalRatio = 0.65 # The peak velocity a thrust must reach to fire an OnThrust trigger. # Filters out slow, gentle motions. Default: 8.0 ThrustMinPeakVelocity = 8.0 # Minimum penetration depth for a thrust to be recognized. Keeps surface-level # rubbing from triggering thrust sounds. Default: 0.5 ThrustMinDepth = 0.5 # ============================================================================ # VOICE PRESETS # ============================================================================ # Each [[VoicePreset]] is one "voice pack" — a set of sounds with conditions # that determine when it plays. At runtime the engine evaluates every preset's # predicates against the actor; the HIGHEST-PRIORITY matching preset wins. # # You can define as many [[VoicePreset]] blocks as you want per file. # ============================================================================ # ── EXAMPLE 1: Basic female moans (lowest priority fallback) ─────────────── [[VoicePreset]] Name = "Female Moans - Default" # Priority determines which preset wins when multiple match. # Higher number = checked first. Ties broken by load order. Priority = 0 # Sound files to randomly pick from each time a sound plays. # Supports wildcards — this loads every .wav in the folder. Sounds = [ "Sound/fx/PPA/female/moans/*.wav", ] # ── Predicates: conditions that must ALL be true for this preset to activate. [VoicePreset.Predicates] # Sex filter. Values: 0 = Male, 1 = Female. # This preset only applies to female actors. Sex = [1] # PenetratedSites — which body parts must be actively penetrated. # Valid sites: "Mouth", "Vagina", "Anus", "HandL", "HandR", "Hands" # # Prefix with "!" to NEGATE (require the site is NOT penetrated): # "!Mouth" means "mouth must NOT be penetrated" # # Multiple non-negated sites are OR'd: ["Vagina", "Anus"] means # "vagina OR anus must be penetrated". Each negated site is its own # independent "must NOT" condition. PenetratedSites = ["Vagina", "Anus"] # ── Triggers: when/how a sound actually fires. # You can have multiple triggers per preset — any one can fire a sound. [[VoicePreset.Triggers]] # "Interval" = fires on a timer. "OnThrust" = fires per thrust. "Random" = periodic dice roll. Type = "Interval" # Seconds between each sound (for Interval type). Interval = 3.0 # ── EXAMPLE 2: Intense moans at deep penetration ────────────────────────── [[VoicePreset]] Name = "Female Moans - Deep" Priority = 10 # Higher than default, so this wins when conditions match Sounds = [ "Sound/fx/PPA/female/moans_deep/deep_01.wav", "Sound/fx/PPA/female/moans_deep/deep_02.wav", "Sound/fx/PPA/female/moans_deep/deep_03.wav", ] [VoicePreset.Predicates] Sex = [1] PenetratedSites = ["Vagina", "Anus"] # Penetration depth range (game units). The sound only matches when the # deepest active penetration falls within [Min, Max]. # Lets you layer soft sounds at shallow depth, loud at deep. PenetrationDepthMin = 8.0 PenetrationDepthMax = 100.0 # Use a large max to mean "8 and above" # Speed range (units/sec). Filters by how fast the penetration is moving. # SpeedMin/SpeedMax = 0.0 means "no limit on that end". SpeedMin = 10.0 SpeedMax = 0.0 # 0 = no upper limit [[VoicePreset.Triggers]] Type = "OnThrust" # Fire once per detected thrust cycle MinDelay = 0.5 # Minimum seconds between sounds (prevents machine-gunning) # ── EXAMPLE 3: Oral-specific gagging sounds ─────────────────────────────── [[VoicePreset]] Name = "Female Gag - Oral" Priority = 20 # Highest so far — oral overrides generic moans Sounds = [ "Sound/fx/PPA/female/oral/*.wav", ] [VoicePreset.Predicates] Sex = [1] # Require mouth penetration, and require vagina/anus are NOT penetrated # (so this only fires during oral-only scenes). PenetratedSites = ["Mouth", "!Vagina", "!Anus"] PenetrationDepthMin = 3.0 PenetrationDepthMax = 100.0 [[VoicePreset.Triggers]] Type = "OnThrust" MinDelay = 0.3 # ── EXAMPLE 4: Male grunts ─────────────────────────────────────────────── [[VoicePreset]] Name = "Male Grunts - Default" Priority = 0 Sounds = [ "Sound/fx/PPA/male/grunts/*.wav", ] [VoicePreset.Predicates] Sex = [0] # Male actors # PenetratingSites — the sites this actor is penetrating WITH (not being # penetrated). Same site names, same negation rules. PenetratingSites = ["Vagina", "Anus", "Mouth"] [[VoicePreset.Triggers]] Type = "OnThrust" MinDelay = 1.0 # You can add a second trigger — e.g. also play randomly between thrusts. [[VoicePreset.Triggers]] Type = "Random" Interval = 5.0 # Check every 5 seconds RandomChance = 30.0 # 30% chance each check (0–100) # ── EXAMPLE 5: Race-specific preset ────────────────────────────────────── [[VoicePreset]] Name = "Khajiit Female - Purring" Priority = 50 # Race-specific overrides generic Sounds = [ "Sound/fx/PPA/khajiit/purr_*.wav", ] [VoicePreset.Predicates] Sex = [1] # Race filter — use "PluginName.esp|0xHexID" format. # The part before | is the plugin name. The part after is the local FormID. # For base Skyrim races, plugin is "Skyrim.esm". # If you omit the plugin (just "0x12345"), it defaults to Skyrim.esm. # Light plugins (.esl) are handled automatically. Races = [ "Skyrim.esm|0x023FE9", # KhajiitRace "Skyrim.esm|0x023FEA", # KhajiitRaceVampire ] PenetratedSites = ["Vagina", "Anus"] [[VoicePreset.Triggers]] Type = "Interval" Interval = 4.0 # ── EXAMPLE 6: Specific NPC by BaseID ──────────────────────────────────── [[VoicePreset]] Name = "Serana Custom Voice" Priority = 100 # Very high — NPC-specific always wins Sounds = [ "Sound/fx/PPA/custom/serana/*.wav", ] [VoicePreset.Predicates] # BaseIDs — target specific NPCs by their base form ID. # Same "Plugin|0xHexID" format as Races. BaseIDs = [ "Dawnguard.esm|0x002B6C", # Serana ] [[VoicePreset.Triggers]] Type = "OnThrust" MinDelay = 0.8 # ── EXAMPLE 7: Girth-dependent sounds ─────────────────────────────────── [[VoicePreset]] Name = "Female Moans - Large Girth" Priority = 15 Sounds = [ "Sound/fx/PPA/female/moans_stretch/*.wav", ] [VoicePreset.Predicates] Sex = [1] PenetratedSites = ["Vagina", "Anus"] # Penis girth range — filters by the girth value of the penetrating actor. # Only matches when girth is between Min and Max. PenisGirthMin = 1.5 PenisGirthMax = 10.0 # Large max = "1.5 and above" [[VoicePreset.Triggers]] Type = "Interval" Interval = 2.5 # ── EXAMPLE 8: Context flags ───────────────────────────────────────────── # Scene contexts are string tags describing the current scene. The available # context strings are hardcoded: # # "Vaginal" "Anal" "Oral" "Aggressive" "FemDom" "Loving" # "Dirty" "Boobjob" "Handjob" "Footjob" "Masturbation" # # These are set by the animation framework based on the active animation. [[VoicePreset]] Name = "Female Moans - Aggressive" Priority = 25 Sounds = [ "Sound/fx/PPA/female/moans_rough/*.wav", ] [VoicePreset.Predicates] Sex = [1] PenetratedSites = ["Vagina", "Anus"] # Contexts — scene tags that must (or must not) be active. # Prefix with "!" to negate. Each entry is checked independently: # "Aggressive" → scene MUST have the Aggressive flag # "!Loving" → scene must NOT have the Loving flag Contexts = ["Aggressive", "!Loving"] [[VoicePreset.Triggers]] Type = "OnThrust" MinDelay = 0.4 # ── EXAMPLE 9: Handjob-specific sounds ─────────────────────────────────── [[VoicePreset]] Name = "Male Grunts - Handjob" Priority = 5 Sounds = [ "Sound/fx/PPA/male/handjob/*.wav", ] [VoicePreset.Predicates] Sex = [0] # "Hands" is a combined site covering both hands. # "HandL" / "HandR" target a specific hand. # This matches whenever hands are involved, even alongside other sites. # Add "!Vagina", "!Anus", etc. if you want handjob-ONLY scenes. PenetratingSites = ["Hands"] [[VoicePreset.Triggers]] Type = "Random" Interval = 3.0 RandomChance = 50.0 # ============================================================================ # QUICK REFERENCE # ============================================================================ # # PREDICATE FIELDS (all optional — omit any you don't need): # ┌──────────────────────┬────────────────────────────────────────────────┐ # │ Field │ Description │ # ├──────────────────────┼────────────────────────────────────────────────┤ # │ Sex │ [0]=Male, [1]=Female │ # │ Races │ ["Plugin.esp|0xHexID", ...] │ # │ BaseIDs │ ["Plugin.esp|0xHexID", ...] │ # │ PenetrationDepthMin │ float — minimum depth to match │ # │ PenetrationDepthMax │ float — maximum depth to match │ # │ │ (must be > Min for the filter to activate) │ # │ SpeedMin │ float — minimum velocity to match │ # │ SpeedMax │ float — maximum velocity (0 = unlimited) │ # │ PenisGirthMin │ float — minimum girth to match │ # │ PenisGirthMax │ float — maximum girth │ # │ │ (must be > Min for the filter to activate) │ # │ PenetratedSites │ ["Vagina","Anus","Mouth","HandL","HandR", │ # │ │ "Hands"] — prefix "!" to negate │ # │ PenetratingSites │ same values as PenetratedSites │ # │ Contexts │ Scene context flags (see list below). │ # │ │ Prefix "!" to negate. │ # └──────────────────────┴────────────────────────────────────────────────┘ # # AVAILABLE CONTEXT STRINGS: # "Vaginal" "Anal" "Oral" "Aggressive" "FemDom" "Loving" # "Dirty" "Boobjob" "Handjob" "Footjob" "Masturbation" # # TRIGGER TYPES: # ┌─────────────┬─────────────────────────────────────────────────────────┐ # │ Type │ Behavior │ # ├─────────────┼─────────────────────────────────────────────────────────┤ # │ "Interval" │ Fires every N seconds (set via Interval field) │ # │ "OnThrust" │ Fires once per detected thrust cycle │ # │ "Random" │ Every Interval seconds, rolls RandomChance% to fire │ # └─────────────┴─────────────────────────────────────────────────────────┘ # All triggers respect MinDelay (minimum gap between sounds). # If no triggers are specified, a default Interval trigger is added. # # FORMID FORMAT: "PluginName.esp|0x00ABCD" # If no plugin specified, defaults to Skyrim.esm. # Light plugins (.esl) are handled automatically. # # DEPTH/GIRTH RANGE NOTE: # DepthMax must be strictly greater than DepthMin for the filter to # activate. Same for GirthMax > GirthMin. If Max <= Min, the predicate # is skipped (not created). # ============================================================================ Not sure how I want to stop Sexlab voices yet. Probably will just intercept their papyrus calls. PPA - Penetration Physics v0.0.31.zip 6.92 MB · 1 download Updater 2: Syncing the lips with the audio better Fixed some bugs Disable Sexlab voice once a PPA voice is played once Added a better random voice picker to avoid playing repeated sounds too often PPA - Penetration Physics v0.0.31.zip 5
BonitaMussolini Posted March 5 Posted March 5 a couple weeks ago i had an older version of PPA installed and had found an override that allowed you to choose creature targets (i.e. what hole the creature should target) and completely forgot to grab that override before updating this mod. anyone have an override that works for Baka or Animal_SOS_ABC or an idea of where to find it? i grabbed one from the support pages but when i hit backspace it still says theyre not a valid actor for PPA. I also tried manually adding the bones for creatures as the "add support" guide in the main mod page says but still no luck. any help would be awesome. To the author and yall that are creating these overrides and offsets for different mods, yall are AWESOME! keep up the fantastic work!
neverend1065 Posted March 5 Posted March 5 Love it! gonna try 0.31 version next. Is there a way to increase clit and vagbottom collision multiplier? the current hole shape seems more wide than circular. (i currently disabled those bones so that cbpc can move them, but not as accurate as yours) Also, which bones are used for the hip bump? i want to make it impact sooner. thanks/
Moonpaw Posted March 5 Posted March 5 When the physics handling is active, i get some weird belly bulging jittering, when i turn it off the belly doesnt jitter. Any ideas? Im using CBPC but ive disabled all belly bulging in that mod, but cant find any options for this mod? Any help is appreciated
gezzzy Posted March 5 Posted March 5 I've managed to get race overrides to work for custom body races. Is there an individual actor override as well?
asdt123123 Posted March 6 Author Posted March 6 (edited) On 3/4/2026 at 6:01 PM, asdt123123 said: Updater 2: Syncing the lips with the audio better Fixed some bugs Disable Sexlab voice once a PPA voice is played once Added a better random voice picker to avoid playing repeated sounds too often PPA - Penetration Physics v0.0.31.zip 6.93 MB · 2 downloads Update 3: For the actor selector and what not, it just uses raw vertex data now. All the skyrim systems have annoying limitations. Obviously a lot heavier to raycast against a literal mesh, but I doubt it'll be noticeable since it's only for selecting actors. Lmk if it works for SE and VR. I only tested for AE. Should be pixel precise now (Ignores hair though). You can select a bow string even now. In terms of the voice system, when it's officially released. It will be a separate mod entirely that just uses PPA. Hopefully people will create some cool voice packs. Sexlab is side by side with OStim these days now. PPA - Penetration Physics v0.0.31.zip Edited March 6 by asdt123123 13
hxjaid78 Posted March 6 Posted March 6 On 3/4/2026 at 7:39 PM, bitnuke said: Ask in the sexlab topic? This mod doesn't handle actor alignment or scaling. That all handled by sexlab. And yes, it's a well-known problem. Happens all the time. I reinstalled sexlab on MCM and it improved things a bit, it would be interesting if one day the modders of their animation packs made new updates now based on the PPA, this mod is revolutionary and fantastic, it practically solves a lot of things in relation to alignment and correct physics for inside the genitals and mouths. And obviously sexlab should remove several of those animations from the default pack that are quite outdated and some don't even work properly anymore.
General Goods Posted March 7 Posted March 7 8 hours ago, asdt123123 said: Update 3: For the actor selector and what not, it just uses raw vertex data now. All the skyrim systems have annoying limitations. Obviously a lot heavier to raycast against a literal mesh, but I doubt it'll be noticeable since it's only for selecting actors. Lmk if it works for SE and VR. I only tested for AE. Should be pixel precise now (Ignores hair though). You can select a bow string even now. In terms of the voice system, when it's officially released. It will be a separate mod entirely that just uses PPA. Hopefully people will create some cool voice packs. Sexlab is side by side with OStim these days now. PPA - Penetration Physics v0.0.31.zipFetching info... The selector seems to be working quite a bit better now, but i didnt test too extensively. Also asking again if it would be possible to also save the speed adjustments to the custom config like tags. 1
bitnuke Posted March 7 Posted March 7 On 3/6/2026 at 7:11 PM, asdt123123 said: Update 3: For the actor selector and what not, it just uses raw vertex data now. All the skyrim systems have annoying limitations. Just tested it with some of the most difficult to select races in the past. Result: It's not perfect, but 90% better than before, which is more than good enough. Now if only i had something like this before tagging 600 animations :-) Quote Obviously a lot heavier to raycast against a literal mesh, but I doubt it'll be noticeable since it's only for selecting actors. I mean it's only when the player presses a button to open a menu. As long as it doesn't cause hickup with other mods, like desyncing anims, i wouldn't worry about performance for something like this. What i would monitor however is crashes: I have mods that do dozens of raycasts per second, like Splashes of Storms, and they never cause issues. On the other hand, i also tried mods in the past that would regularily crash skyrim on raycasts. So far i haven't had issues like that with the new version. Just worth keeping an eye on.
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now