We are excited to announce a new feature on the Hub: Favorites!
You can now add resources to your favorites, and organize your favorites into collections!
You can check out the details in our official announcement!
He took it and ran with it.. lots of improvements and new features:
Usage tips
The built in presets should be useful as starting points for custom presets. You can save your own presets and load them with triggers during a scene's playback.
You can also combine multiple ExpressionRandomizers on the same atom, as long as they're adjusting different morphs.
The better morphs you have available, the better results you will get. You can use morphs from morph packs or create custom morphs with Morph Merge and Split by ceq3. See Using custom morphs below.
Creating a good expression preset
Since the plugin randomizes morph values, it's important to set the Minimum value and Maximum value such that you don't randomly get an overly distorted expression when all morphs happen to hit a very high or very low value. The plugin applies expressions in loops, and at the start of each loop, each morph gets a different random target value within the min-max range.
Here's a workflow that might be useful:
1. set min and max to the same value, e.g. both to 1.00
2. turn off random chances for transitions
Now all morphs that are selected get a new target value at every loop, and always adjust to the same value since min and max are equal. The expression you get now is the most extreme possible expression. If this looks ugly, adjust the max value and toggle morphs on/off until you're happy.
You can also do the same with the min value if you intend to apply negative values on the selected morphs. For most morphs, extreme negative values don't work well since the morphs are designed to be used at positive values. But in theory you can set both min and max to the same negative value and see what the most extreme negative-valued expression is, and again if that looks bad then increase the min value, and/or select different morphs.
With this above method you can pretty easily calibrate the min and max values, so that any expressions that you get with randomization between those min and max is not going to be too extreme.
The plugin searches for morphs from regions that contain "Pose" or "Expressions" (partial match, case sensitive). To get custom morphs to show up in the plugin, just make sure the region contains one of these two, and not any of the below excluded regions.
Morphs don't technically have to be flagged as pose morphs, but it's recommended that they are. Just set "isPoseControl" to "true" in the morph .vmi file.
Morphs whose region contains one of these (partial match, case sensitive) are not recognized by the plugin:
2 slots for storing user presets in plugin memory & scene
save presets to file, load via UI or triggers
vastly improved UI design and user experience
vastly improved UI performance, no more massive fps drops when loading a lot of morphs into the UI
improved randomness, better transitions
lots of small fixes and general improvements
Check the updated description for usage tips and screenshots.
Full update notes
Improved built-in presets
Idle: a subtle, slowly changing smile expression
Flirt: very expressive - some lip biting, smiling, narrowing the eyes, raising eyebrows, flirty looks
Enjoy: eyelid movement, mouth opening and closing, simple smiles - to express satisfaction/pleasure with a bit of surprise mixed in
It will transition the expression smoothly when switching between presets, or when turning morphs on/off.
The built-in presets can be loaded via triggers as well (in the scene, programmatically via other plugins etc.)
User presets and preset file saving/loading
2 slots to save presets in plugin's memory, these are also stored to the scene and the overall person plugins preset
save and load presets to/from file (location: Saves/PluginData/ExpressionRandomizer/Presets)
if preset files exist the correct path within a .var, the .var shows up in the list of shortcuts like with other resource types in VAM
save to new folder: add / to the save name, e.g. "NewFolder/newpreset.json"
load both the memory and file presets with triggers in the scene
Improved UI design and usability
redesigned UI, but still more or less recognizable when comparing to the original
no need for scrolling
paging for the morphs list - much easier to navigate!
region selection popup: filtering is much more powerful now with region, text filter or both (and active only filter as well)
morphs are sorted alphabetically
collision trigger popup is now scrollable and opens upwards
Minimum value can't be more than Maximum value, Maximum value can't be less than Miniumum value
etc., lots of small usability considerations to make sure actions feel intuitive
Morph initial states
Generally the initial states of morphs should be 0 and disabling the plugin's control over morphs should restore that. The earlier version didn't take some situations into account:
morphs are restored to their initial values when the plugin is disabled
initial state is updated when the morph is toggled back on again - in case the morph was adjusted elsewhere/manually while it was not adjusted by the plugin
morphs are saved to scene JSON in their initial states so that loading the scene doesn't put the initial state to whatever generated expression was active when the scene was saved
Excluded morphs:
Joint Correct JCM morphs
Torso region morphs
Hands region morphs
Any morphs with bone morphs (animation not recommended)
Jaw Side-Side morph (doesn't seem to do anything)
Duplicate morphs (based on morph region and displayName; only the first found morph is loaded)
Other:
selecting None on collision trigger popup now correctly clears the trigger action from the previously selected collision trigger
ensure the custom collision trigger action is removed when plugin is removed
respect Freeze Motion/Sound
Improved UI performance
a lot fewer UI elements are created, and there is no longer a big framerate drop when having the UI open if lot of morphs are installed
UI elements are created on demand when entering the UI for the first time
UI loads much more quickly when a lot of morphs are installed
Improved randomness, better transitions
"Random chances for transitions" is now enabled by default
the random chance now applies per-morph, rather than on the entire set of selected morphs - on some frames you might get morphs A, B and D to update, on other frames you might get B, C and D to update, etc., making expressions more dynamic
transition smoothly from one preset to another, or when toggling individual morph on/off - possible to trigger presets or morphs as part of a scene's playback without it looking jerky
Other
removed the weird "animatable morphs" implementation, no idea what that even was and it didn't seem to do anything
master speed slider min value 0.1 instead of 0
reset used expressions at loop to work also for negative morph values
changing gender is detected and a message is printed to recommend reloading the plugin (because opposite gender morphs are loaded)
"Reset used expressions at loop" works also for negative morph values
Technical stuff:
identified morphs are not stored in memory, no need to constantly find the morphs to adjust from among all loaded morphs on the installation (should be a bit fewer hiccups)
round morph values to 3 decimals (reduces number of morph value syncs on geometry with no visual impact)
morph updates now happen per frame instead of per physics update (since that's how VAM updates morphs generally)
always save only non-default plugin parameters values to the person plugin preset save file, preventing a potentially hundreds of morphs long list from being stored unnecessarily