ExpressionRouter β Advanced Facial Expression Control for Virt-a-Mate

Build Dynamic Emotions with Layered Control and Precision Animation
ExpressionRouter is a powerful plugin for Virt-a-Mate that lets you create, organize, and animate facial expressions with precision and flexibility.
Built on a multi-tab system, it supports real-time blending, smooth transitions, randomization, and full preset control β with deep per-tab customization.
You can load and save presets per tab, or use the built-in Save Mood / Load Mood buttons to manage all 17 tabs at once using a single mood preset file.
---
Try it with VamEssentials Orgasm Morphs

Orgasm Morphs - Morphs -
150 Orgasm Morphs (75 Female, 75 Male/Futa) plus some additional orgasm related morphs. 25 Orgasm Morph Set with 3 options on each: Eyes Open, Eyes Closed, Eyes Rolled Back for a total of 75 that can be used on Female models and 75 that can be...

VamEssentials Orgasm 01-25 Open are added to Group 1 (25 Count)
VamEssentials Orgasm 01-25 Closed are added to Group 2 and VamEssentials Orgasm 01-25 Rolled are added to Group 2 (50 Count)
The Preset is then saved as Orgasm 1-25 Open Closed Rolled or whatever you prefer to reload it.
I shared this Mood preset on the Discussion here you can download to try out if interested...
Plugins + Scripts - ExpressionRouter
VamEssentials submitted a new resource: ExpressionRouter - Create, Organize, and Animate Facial Expressions with Real Time Blending & Randomization Options π§ ExpressionRouter β Advanced Facial Expression Control for Virt-a-Mate ExpressionRouter is a powerful plugin for Virt-a-Mate that lets...

---

Tabs T1βT10 are general-purpose expression layers. You can assign morphs from either All Morphs or your Favorites (these are morphs you've marked as favorites in VaM's morph browser).
If you enable Random on a tab, it will cycle through tabs T1βT10 and skip any tabs that have no morphs on them if you only want to use 3 tabs for example.
ExpressionRouter also includes dedicated tabs for Brows, Lashes, Eyes, Nose, Mouth, Lips, and Tongue.
These tabs are not included in Random Tab Switching β so you can leave them running persistently or toggle them on and off as needed.
Each of these tabs intelligently filters morphs by relevant keywords and does not restrict bone morphs, giving you full control over complex expressions.
This lets you mix randomness with consistency. For example:
β’ Run random full-face expressions across Tabs 1β10.
β’ Keep the Tongue tab active for subtle movement like rolling around and curling in the mouth for added realism.
β’ Add Lips motion for natural curves and flexing for added realism.
With ExpressionRouter, you can fine-tune each layer to bring even more realism and life to your characters.

Add the plugin to an Empty Atom or on a Person. Open it and on Tab 1, search All Morphs or Favorites for "smile". Click one in the drop down and click +Add Morph. Check Active to start playback. It will go from 0 to 0.7 by default, you can adjust the settings. While that is Active, you can then start layering in more Morphs in Group 2 or other tabs or find whatever combination works best for you. If you find a combination you like on one tab, you can save it as a preset. For the Tongue tab try adding everything except Tongue Length at first and test it out for idle Tongue movement. For the Lips tab try "CurvyLips" for idle lip flexing. If you use multiple tabs, you can save them all as a group under Save Mood.
---

ExpressionRouter fully supports triggers and Timeline integration.
β’ All tabs (T1βT10, Brows, Lashes, Eyes, Nose, Mouth, Lips, Tongue) appear in the trigger menu in Timeline or on buttons.
β’ Toggle Active states and Random mode via trigger or buttons.
β’ Reset/Stop fades out morphs smoothly before turning off a tab.
β’ Stop All fades everything back down smoothly and unchecks all Active and the Random toggle.
You can also trigger the following actions:
LoadPresetFromPath β load a specific preset into a tab.
LoadMoodFromPath β load an entire 17-tab mood in one step.
ExpressionRouter can be placed on a Person atom or on an Empty atom and routed via dropdown.
This allows you to preload multiple moods, trigger them dynamically, and swap emotional states during scenes.

β’ Keeps your Person atom uncluttered β especially helpful when using multiple ExpressionRouter instances.
β’ Lets you dedicate a single Empty atom purely for expression routing.
β’ Can be saved as an Atom Preset and reloaded easily into any scene.
β’ Makes it safer to merge load between scenes without risking plugin conflicts or overwriting settings on a Person atom.
---

Each tab is a layer with independent morphs, playback, and sliders. Use tabs to layer emotions or segment expressions by region.

β’ Passive facial movement during idle scenes.
β’ Natural variation during dialog or looping sequences.
β’ Precise emotion tuning for closeups.
β’ Quick testing of morphs with real-time feedback.
---

Before diving into differences, here's what they all support:

Feature | ExpressionRouter | SilverExpressionTool | ExpressionRandomizer |
---|---|---|---|
![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() |
---

Feature | ExpressionRouter | SilverExpressionTool | ExpressionRandomizer |
---|---|---|---|
![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() |

In ExpressionRouter, each tab (or expression layer) includes two separate morph groups:
β’ Group 1
β’ Group 2
Each group has:
β’ Its own list of morphs
β’ Its own set of sliders for:
βββ’ Speed (blend rate)
βββ’ Min/Max Intensity
βββ’ Hold Time (duration)
Both groups blend independently but simultaneously, giving you two expression streams per tab that you can layer, alternate, or mix creatively.
This allows more nuanced emotional blending β for example:
β’ One group could run slow relaxed idle blinking.
β’ The other could randomize cheek lifts or subtle smiles.
---

Many users have requested the ability to play just one morph (like a smile or blink), smoothly and repeatedly, without needing a full morph sequence or random pool.
This is especially useful for:
β’ Triggered reactions (e.g., a single smile, wink or blush).
β’ Subtle idle movements (like eye flutters or tongue flicks).
ExpressionRouter supports this directly through its Single Morph Oscillation Mode:
β’ When a group contains only one morph, it does a smart single morph detection and smoothly oscillates between Min β Max β Min
β’ Playback respects Speed, Hold Time, and Min/Max Intensity sliders
β’ Sliders respond live during playback β no need to stop/restart
β’ Perfect for expressive idle loops or morph showcase setups
If a single morph is added to each group, like tongue length (Group 1) and tongue curl (Group 2) the tongue will stick out and curl.
SilverExpressionTool recommends you have 3 morphs+ and does not directly support loading of a single morph.
ExpressionRandomizer does not support single morph control.
It operates by toggling regions (e.g., Eyes, Mouth) and randomly selects from internal morph lists. You canβt isolate or play one specific morph on its own.
---

β’ Movements feel smooth, natural, and rhythmic β like a living expression, not a hard switch.
β’ You can adjust sliders in real time β no need to stop and restart playback for the changes to be updated and applied.
This creates a graph-like or breathing motion effect, perfect for idle expressions like subtle lip curls, eye twitches, or tongue flicks.
ExpressionRouter treats expression playback like animation curves β not just toggles.

β’ Segmented layout: Group 1 / Group 2 side-by-side for clarity.
β’ Morph lists: Displayed one-per-line for easier viewing editing.
β’ Morph count: Displays total count above each Group box as a confirmation of adding deleting morphs in the list.
β’ Real-time slider response: Adjust values during playback.
β’ Trigger-friendly preset loading: via LoadPresetFromPath or LoadMoodFromPath action.
β’ Favorites dropdown: for quick reuse of common morphs.
---

β’ Single Morph Oscillation Mode β auto-loops Min β Max β Min with smooth transitions.
β’ Extended Value Range β for single morph playback, sliders support -1 to 2 for stronger expressions.
β’ Safe Value Clamping β group blending/random mode is always kept within 0β1 range.
β’ Duplicate Morph Support β freely add the same morph multiple times for weighted selection or weighted randomization.
β’ Soft Fade-Out β morphs fade out smoothly when stopped or reset.
β’ Morph Cleanup on Preset Load β Loading a new preset clears old active morphs. The plugin resets and replaces the list, preventing leftover expressions from running and stacking.
---

I welcome feedback, bug reports, or feature requests! Please post them on the discussion forum for this plugin. If you like this plugin, please consider leaving a positive review as it took a lot of work to create. Thank you so much.
---

ExpressionRouter uses, adapts and/or found inspiration from these awesome resources, which it would not be possible without:
β’ ClockwiseSilver β SilverExpressionTool (CC-BY-SA)
β’ VamTimbo β ExpressionRandomizer (FC)
β’ MacGruber β Utils (CC-BY)
β’ 14mhz β CustomTabUI (CC-BY)
β’ OpenMoji Project β Tab icons (brows, eyes, mouth, tongue, etc.) from OpenMoji, licensed under CC BY-SA 4.0 β Β© HfG SchwΓ€bisch GmΓΌnd
β’ Icons8 β Eyelash icon (link), used under free license with attribution β Β© Icons8