So this update is a smallfix for compabability with a range of different plugins.
Following has been adressed :
Implemented / confirmed
Body and face shaping morphs are not captured or applied, and geometry storables are stripped from PresetManager JSON
Expression morphs use a curated list only, and reset to baseline rather than default
Eye bone controllers, lEyeControl and rEyeControl, are excluded from all five capture and restore paths
Eye bones are excluded through EXCLUDED_BONES
Eye gaze, eyeTargetControl, is saved as part of the pose
Morph stacking between poses is prevented through the baseline reset system
Character swap detection uses a fingerprint system that clears stale baselines
Duplicate morph versions from different packages are deduplicated with HashSet
Orifice Dynamic is excluded from capture for compatibility
Old saved poses remain safe because geometry is stripped at apply time
Skin, hair, clothing, and materials are filtered out in ShouldStorableBeIncluded
This should fix most issues but as always if you guys should find more please tell
PoseSaver Update v2.5
Bug Fixes & Improvements:
- Fixed morph stacking issue where switching between poses would accumulate morphs instead of cleanly transitioning
- Fixed duplicate morph versions being captured from loaded packages
- Fixed character swap distortion — changing characters on a scene no longer causes face/body deformation from stale pose data
- Fixed eye dislocation when switching characters — eye controllers and eye bones are now fully excluded from pose capture/restore
- Fixed expression morphs resetting character's Look settings (e.g., squinted eyes reverting to default)
- Expressions now use a curated morph list instead of broad keyword matching, preventing face shape morphs from being incorrectly captured
- Added baseline system that remembers each character's original morph state and restores correctly between poses
- Added automatic character change detection — baselines are cleared and recaptured when swapping characters on the same atom
- Removed Tags feature (unused complexity) — Categories remain for pose organization
- Added custom category creation with editable text input
Huge thank you to Yzila95
UPDATE V2.4 - BUG FIXES
Fix 1 — Body morph stacking: ApplyMorphsFromJSON now resets pose morphs to their baseline value when they're NOT in the new pose. This undoes previous pose changes while preserving Look morphs (baseline captures them).
Fix 2 — Expression morph stacking: All three expression restore paths (RestoreFacialExpressions, ApplyFacialExpressionsSimple, BuildExpressionTransition) now scan ALL expression morphs via GetMorphs() + IsExpressionMorphName, not just the curated list. This ensures dynamically-discovered expression morphs from previous poses get reset/transitioned too.
Fix 3 — Duplicate morph versions: Both body morph capture and expression morph dynamic discovery now deduplicate by morphName. If v1 and v7 of the same morph exist, only the first encountered is saved — preventing the multiplied morph entries Syrinxo reported.
PoseSaver Update 2.3
File Organization
Facial Expression Improvements
- Reorganized plugin files into subfolders (Core/, UI/, Helpers/) — only the .cslist shows up when adding the plugin, keeping things clean
Pose Mirroring
- Expressions now blend smoothly during pose transitions instead of snapping instantly
- Added min/max clamping so morph values stay within safe ranges
- Dynamic morph discovery — captures all expression morphs, not just a hardcoded list
- Geometry caching for better performance when reading/writing morphs
Category Management
- New "Mirror Pose" button in pose edit — creates a left/right flipped copy of any pose
- Mirrors controllers, hand morphs, and facial expressions (swaps Left/Right)
Pose Randomizer
- Create custom categories directly from the pose edit screen
- Dynamic category list — any category you create shows up in the filter dropdown
- New "Random Pose" button — loads a random pose from your filtered list
- Avoids repeating the same pose twice in a row
- Triggerable by other plugins via the "Load Random Pose" action
PoseSaver Update 2.2
New Features:
Files Changed:
- Facial Expression Saving — PoseSaver now captures and restores facial expressions (brows, eyes, mouth, jaw, tongue, phonemes, and general expressions like Happy, Sad, Angry, etc.) along with poses. Works for both main poses and per-camera poses. Enabled by default with a toggle in Advanced Options to turn it off. Over 40 expression morphs supported. Fully backward compatible — older saves load without issues.
- VR Thumbnail Support — Pose thumbnails now display inside the VR headset instead of only appearing on the desktop monitor. The plugin auto-detects VR mode and creates a world-space canvas positioned in front of the user's view. Includes a "Reposition VR Thumbnails" button in Advanced Options to re-center the thumbnails to your current view. VR controller interaction with pose buttons is fully supported.
Compatibility:
- PoseData.cs — Facial expression capture/restore system, morph list, serialization
- PoseScreenCanvas.cs — Rewritten for VR world-space canvas support
- PoseSaver.cs — VR helper methods, preset merge for facial expressions
- PoseUI.cs — Facial expression toggle and VR reposition button in Advanced Options
- Fully backward compatible with existing saves and presets
- No new dependencies
- C# 6 compliant
ok so playing with posesaver and animatis i found a bug :
The trigger data was being saved correctly inside camJc["onEnterTrigger"], but when loading, the code was passing the
entire camera object camJc instead of extracting the trigger data first.
This caused the triggers to not find their data and appear empty after reload. - good thing is ive fixed it and if you had saved scenes with these triggers then it will work now(Tested)
![]()
![]()
![]()
PoseSaver Update - Camera System Overhaul
New Features
1. Camera-Specific Dialogs (Like BodyLanguage)
- Each camera angle can now have its own speech bubbles/dialogs
- Dialogs play automatically when switching to that camera
- Supports "Play on Enter" vs "Play on Exit" timing
- Full dialog editor: text, person, delay, lifetime, thinking vs speaking
2. Camera-Specific Poses
- Each camera can store its own character pose
- "Capture Pose" button saves current character position to that camera
- "Apply pose on camera load" toggle controls automatic application
- Pose includes controllers and hand morphs
3. Camera Triggers
- "On Enter Trigger" - fires when switching TO this camera
- "On Exit Trigger" - fires when switching FROM this camera
- Access VaM's full trigger system for each camera angle
4. Improved Camera Tab UI (VR-Friendly)
- Replaced long list of cameras with dropdown selector
- "Select Camera" dropdown shows all cameras with active marker (►)
- Only selected camera's controls displayed below
- Much more compact and easier to navigate in VR
5. Automatic First Camera
- New poses automatically include "Camera 1" with current view
- Users no longer need to manually add the first camera
- Reduces confusion for new users
6. Camera Checkpoint Playback
- Added "▶ Play Checkpoints" button to start camera animation
- Added "■ Stop Checkpoints" button to stop playback
- Loop toggle now works properly with play/stop controls
7. First Camera Auto-Load
- When a pose loads, camera 0 automatically activates
- Triggers camera 0's pose, dialogs, and triggers
- Clicking thumbnails to cycle cameras works correctly
Bug Fixes
Critical: Fixed "Nothing Works" Bug
- Fixed silent failures when applying poses - the plugin now properly reports errors instead of doing nothing
- Added null checks for PoseSaver.singleton throughout PoseData.cs to prevent silent failures in:
- ApplyPose() - pose loading
- ApplyCamera() - camera application
- Trigger save/load operations
Fixed UI Crashes (NullReferenceExceptions)
- Fixed syntax error (duplicate closing brace) in CreateFilterUI
- Added null checks on all UI element creation to prevent crashes when VaM fails to create UI elements
- Fixed methods: CreateAdvancedOptionsSection, CreateFilterUI, CreatePoseGrid, CreatePoseCreationSection,
CreateMorphBaselineSection, CreateTransitionSettingsSection, CreateFlowNavigationSection,
CreatePresetManagementSection
UI Improvements
Camera Buttons Repositioned
- Camera angle buttons now appear BELOW the thumbnail instead of on top
- Cleaner look, easier to see the pose thumbnail (as requested by users)
Notes
What is saved in each pose:
- Body pose (controllers, bones)
- Hand/finger morphs (enabled by default)
- Pose morphs from Custom/Atom/Person/Morphs
- Camera positions (optional)
- Plugin states (DISABLED by default - enable in pose edit to save plugin states like HJ/BJ/Kiss)
Triggers Tab: For executing VaM actions when entering/exiting poses - use this for dynamic control (start/stop
animations, fire triggers) when you need actions that can't be saved as state.
PoseSaver v1.9- Maintenance & Logging Cleanup Update + save/load fix.
This update focuses on code cleanup and better diagnostics, with no behavioral changes to core features.
Fixes & Improvements
1) Reduced Verbose Debug Logging (PoseSaver.cs)
- Removed 8 “PoseSaver Flow:” debug spam messages that cluttered the console
- Kept only essential error output
- Result: cleaner console output during normal use (less noise while navigating the UI/flow)
2) Removed Dead / Disabled “Smart Pose Analyzer” Code (PoseData.cs)
- Deleted ~100 lines of commented-out code marked “TEMPORARILY DISABLED FOR DEBUGGING”
- Included removal of:
- commented field declarations (e.g., poseCategory, affectedRegions)
- the fully commented AnalyzePoseData() method
- commented save/load fragments inside Store() / Load()
- references to a non-existent BodyPartHelper
- Result: cleaner codebase and smaller file size (no more abandoned stubs)
3) Improved Error Messages & Diagnostics
- Made the “no atom data” error in ApplyPose() more helpful
- Added clearer diagnostic logging for scene load failures
- Improved preset file loading messages so users can better understand what happened
No Changes Needed (Confirmed Solid)
- Good error handling overall
- Proper texture cleanup (destroyed after use)
- Proper Destroy() cleanup patterns
- No obvious memory leaks or duplicate code patterns
- Good coroutine usage for async operations
- Trigger system still initialized correctly
- After cleanup, logging is user-friendly without debug spam
File Size / Stats
Before
- PoseData.cs: 2,825 lines
- PoseSaver.cs: 1,236 lines
- Total: 8,008 lines
After
- PoseData.cs: 2,730 lines (-95)
- PoseSaver.cs: 1,229 lines (-7)
- Total: 7,906 lines (-102 lines cleaned)