• Hi Guest!

    We are extremely excited to announce the release of our first Beta for VaM2, the next generation of Virt-A-Mate which is currently in development.
    To participate in the Beta, a subscription to the Entertainer or Creator Tier is required. Once subscribed, download instructions can be found here.

    Click here for information and guides regarding the VaM2 beta. Join our Discord server for more announcements and community discussion about VaM2.
ExpressionRouter β€” Advanced Facial Expression Control for Virt-a-Mate

ExpressionRouter_Icon.png


🎨 Create, Blend, and Randomize Facial Expressions in Real Time
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
In the example below is one way I use it with VamEssentials Orgasm Morphs. Open means the Eyes are open, Close means Eyes are closed, and Rolled means the eyes are Rolled back or up. They are numbered as sets so they blend better together per set. What this basically does is keep all the eyes Open in one group, and anything else in the other. You could put just closed, just rolled, or in this example below I put all closed and rolled in Group 2.

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...

ExpressionRouter_Preview_1.jpg


---

πŸ™‹ How Does ExpressionRouter Work?

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.

🧐 How Can I Test This Out Right Away?
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.

---

⚑ Trigger Support β€” Timeline & Buttons

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.

πŸ’‘ Benefits of Adding ExpressionRouter on an Empty Atom

β€’ 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.

---

πŸ”„ Expression Layers & Use Cases

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

βœ… Great for:
β€’ 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.

---

πŸ“Š Plugin Comparison β€” ExpressionRouter vs SilverExpressionTool vs ExpressionRandomizer

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

βœ… Shared Features Across All Three Plugins
FeatureExpressionRouterSilverExpressionToolExpressionRandomizer
🎲 Random Expression Playbackβœ… Yesβœ… Yesβœ… Yes
🧬 Morph-Based Expression Controlβœ… Yesβœ… Yesβœ… Yes
🎭 General Morph Selection / Filteringβœ… Yesβœ… Yesβœ… Yes
🧍 Attaches to Person Atomβœ… Yesβœ… Yesβœ… Yes
πŸ’Ύ Scene Save Compatibilityβœ… Yesβœ… Yesβœ… Yes
βš™οΈ Triggerable (manual or via scene)βœ… Yes⚠️ Partialβœ… Yes

---

πŸ”„ ExpressionRouter Advantages
FeatureExpressionRouterSilverExpressionToolExpressionRandomizer
πŸ“š Multi-Tab Layersβœ… Yes (10+ tabs)❌ No❌ No
✨ Random Mode (Per-Tab + Global)βœ… Yes❌ Noβœ… Global only
πŸŽ›οΈ Dual Morph Groups per Tabβœ… Yes❌ No❌ No
🦴 Bone Morph Supportβœ… Yes⚠️ Partial❌ Filters out
πŸ’Ύ Load Morph Presets via Buttons/Timelineβœ… Full Support❌ No⚠️ Settings Only/Not Full Morph Lists
πŸ“ Custom Morph List Optionβœ… Yesβœ… Yes❌ No direct control
πŸ”§ Single Morph Optionβœ… Add/remove freely⚠️ Best used with 3+❌ Toggle regions only
🌈 Smooth Morph Transitionsβœ… Eased interpolation⚠️ No interpolation/fade⚠️ No per-morph easing
🧩 Tab UI with Independent Layers/Controlsβœ… Yes❌ No❌ No
πŸ§ͺ Real-Time Slider Responseβœ… Yes❌ Requires Restart❌ No
πŸ“ˆ Graph-like Oscillation & Live Playbackβœ… Yes❌ No❌ No

πŸ’‘ What β€œDual Morph Groups per Tab” Means

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.

---

πŸ”‚ What "Single Morph Option" Means

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.

---

πŸ“ˆ What does "Graph-like Oscillation & Live Playback" Mean:

β€’ 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.

🧰 UI Improvements

β€’ 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.

---

πŸ’‘ Morph Enhancements

β€’ 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.

---

πŸ’¬ Feedback & Questions

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.

---

πŸ™ Credits & Licensing

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
Author
VamEssentials
Views
3,086
Downloads
1,209
Favorites
8
Packages
1
Total size
0.09 MB
Version
1
First release
Last update

More resources from VamEssentials

Share this resource

Latest reviews

Positive
Version: 1
I haven't even tried it yet but looks amazing, and this detailed write-up alone is worth 5 stars
Upvote 1
Positive
Version: 1
Finally! A triggereable expression manager, separated from timeline animations. God bless you enlightened people!
Upvote 0
Positive
Version: 1
I'm gonna have to spend some more time tinkering with this but from what I've seen so far it's pretty nice. Randomized expression plugins have always been part of my "essential plugins" list 😍
Upvote 0
Positive
Version: 1
This is a plugin I've been waiting for to appear for a long time.
That's cool.
Upvote 0
Positive
Version: 1
Holy DAMN bro! Amazing work! I loved reading through your description too, very informative and well put together!
Upvote 0
Positive
Version: 1
This has a lot of potential and am looking forward to try it out 🀩
Upvote 0
Back
Top Bottom