IK override while jumping

This commit is contained in:
SDraw 2022-10-20 00:53:56 +03:00
parent fd48185bdd
commit a2ce54f2fe
No known key found for this signature in database
GPG key ID: BB95B4DAB2BB8BB5
7 changed files with 49 additions and 8 deletions

View file

@ -4,7 +4,7 @@ Merged set of MelonLoader mods for ChilloutVR.
| Full name | Short name | Latest version | Available in [CVRMA](https://github.com/knah/CVRMelonAssistant) | Current Status | Notes | | Full name | Short name | Latest version | Available in [CVRMA](https://github.com/knah/CVRMelonAssistant) | Current Status | Notes |
|-----------|------------|----------------|-----------------------------------------------------------------|----------------|-------| |-----------|------------|----------------|-----------------------------------------------------------------|----------------|-------|
| Avatar Change Info | ml_aci | 1.0.3 | Yes | Working | | Avatar Change Info | ml_aci | 1.0.3 | Yes | Working |
| Avatar Motion Tweaker | ml_amt | 1.1.4 | On review | Working | | Avatar Motion Tweaker | ml_amt | 1.1.5 | On review | Working |
| Desktop Head Tracking | ml_dht | 1.0.7 | On review | Working | | Desktop Head Tracking | ml_dht | 1.0.7 | On review | Working |
| Desktop Reticle Switch | ml_drs | 1.0.0 | Yes | Working | | Desktop Reticle Switch | ml_drs | 1.0.0 | Yes | Working |
| Four Point Tracking | ml_fpt | 1.0.9 | On review | Working | | Four Point Tracking | ml_fpt | 1.0.9 | On review | Working |

View file

@ -43,6 +43,7 @@ namespace ml_amt
m_localTweaker.SetPoseTransitions(Settings.PoseTransitions); m_localTweaker.SetPoseTransitions(Settings.PoseTransitions);
m_localTweaker.SetAdjustedMovement(Settings.AdjustedMovement); m_localTweaker.SetAdjustedMovement(Settings.AdjustedMovement);
m_localTweaker.SetIKOverrideFly(Settings.IKOverrideFly); m_localTweaker.SetIKOverrideFly(Settings.IKOverrideFly);
m_localTweaker.SetIKOverrideJump(Settings.IKOverrideJump);
m_localTweaker.SetDetectEmotes(Settings.DetectEmotes); m_localTweaker.SetDetectEmotes(Settings.DetectEmotes);
} }

View file

@ -53,6 +53,7 @@ namespace ml_amt
bool m_compatibleAvatar = false; bool m_compatibleAvatar = false;
float m_upright = 1f; float m_upright = 1f;
PoseState m_poseState = PoseState.Standing; PoseState m_poseState = PoseState.Standing;
bool m_grounded = false;
bool m_ikOverrideCrouch = true; bool m_ikOverrideCrouch = true;
float m_crouchLimit = 0.65f; float m_crouchLimit = 0.65f;
@ -65,6 +66,7 @@ namespace ml_amt
bool m_poseTransitions = true; bool m_poseTransitions = true;
bool m_adjustedMovement = true; bool m_adjustedMovement = true;
bool m_ikOverrideFly = true; bool m_ikOverrideFly = true;
bool m_ikOverrideJump = true;
bool m_customLocomotionOffset = false; bool m_customLocomotionOffset = false;
Vector3 m_locomotionOffset = Vector3.zero; Vector3 m_locomotionOffset = Vector3.zero;
@ -78,7 +80,7 @@ namespace ml_amt
{ {
m_parameters = new List<AdditionalParameterInfo>(); m_parameters = new List<AdditionalParameterInfo>();
} }
void Start() void Start()
{ {
Settings.IKOverrideCrouchChange += this.SetIKOverrideCrouch; Settings.IKOverrideCrouchChange += this.SetIKOverrideCrouch;
@ -88,9 +90,10 @@ namespace ml_amt
Settings.PoseTransitionsChange += this.SetPoseTransitions; Settings.PoseTransitionsChange += this.SetPoseTransitions;
Settings.AdjustedMovementChange += this.SetAdjustedMovement; Settings.AdjustedMovementChange += this.SetAdjustedMovement;
Settings.IKOverrideFlyChange += this.SetIKOverrideFly; Settings.IKOverrideFlyChange += this.SetIKOverrideFly;
Settings.IKOverrideJumpChange += this.SetIKOverrideJump;
Settings.DetectEmotesChange += this.SetDetectEmotes; Settings.DetectEmotesChange += this.SetDetectEmotes;
} }
void OnDestroy() void OnDestroy()
{ {
Settings.IKOverrideCrouchChange -= this.SetIKOverrideCrouch; Settings.IKOverrideCrouchChange -= this.SetIKOverrideCrouch;
@ -100,6 +103,7 @@ namespace ml_amt
Settings.PoseTransitionsChange -= this.SetPoseTransitions; Settings.PoseTransitionsChange -= this.SetPoseTransitions;
Settings.AdjustedMovementChange -= this.SetAdjustedMovement; Settings.AdjustedMovementChange -= this.SetAdjustedMovement;
Settings.IKOverrideFlyChange -= this.SetIKOverrideFly; Settings.IKOverrideFlyChange -= this.SetIKOverrideFly;
Settings.IKOverrideJumpChange -= this.SetIKOverrideJump;
Settings.DetectEmotesChange -= this.SetDetectEmotes; Settings.DetectEmotesChange -= this.SetDetectEmotes;
} }
@ -107,6 +111,8 @@ namespace ml_amt
{ {
if(m_avatarReady) if(m_avatarReady)
{ {
m_grounded = (bool)ms_groundedRaw.GetValue(MovementSystem.Instance);
// Update upright // Update upright
Matrix4x4 l_hmdMatrix = PlayerSetup.Instance.transform.GetMatrix().inverse * (PlayerSetup.Instance._inVr ? PlayerSetup.Instance.vrHeadTracker.transform.GetMatrix() : PlayerSetup.Instance.desktopCameraRig.transform.GetMatrix()); Matrix4x4 l_hmdMatrix = PlayerSetup.Instance.transform.GetMatrix().inverse * (PlayerSetup.Instance._inVr ? PlayerSetup.Instance.vrHeadTracker.transform.GetMatrix() : PlayerSetup.Instance.desktopCameraRig.transform.GetMatrix());
float l_currentHeight = Mathf.Clamp((l_hmdMatrix * ms_pointVector).y, 0f, float.MaxValue); float l_currentHeight = Mathf.Clamp((l_hmdMatrix * ms_pointVector).y, 0f, float.MaxValue);
@ -179,10 +185,10 @@ namespace ml_amt
switch(l_param.m_sync) switch(l_param.m_sync)
{ {
case ParameterSyncType.Local: case ParameterSyncType.Local:
PlayerSetup.Instance._animator.SetBool(l_param.m_hash, (bool)ms_groundedRaw.GetValue(MovementSystem.Instance)); PlayerSetup.Instance._animator.SetBool(l_param.m_hash, m_grounded);
break; break;
case ParameterSyncType.Synced: case ParameterSyncType.Synced:
PlayerSetup.Instance.animatorManager.SetAnimatorParameterBool(l_param.m_name, (bool)ms_groundedRaw.GetValue(MovementSystem.Instance)); PlayerSetup.Instance.animatorManager.SetAnimatorParameterBool(l_param.m_name, m_grounded);
break; break;
} }
} }
@ -197,6 +203,7 @@ namespace ml_amt
{ {
m_vrIk = null; m_vrIk = null;
m_locomotionLayer = -1; m_locomotionLayer = -1;
m_grounded = false;
m_avatarReady = false; m_avatarReady = false;
m_compatibleAvatar = false; m_compatibleAvatar = false;
m_poseState = PoseState.Standing; m_poseState = PoseState.Standing;
@ -275,6 +282,7 @@ namespace ml_amt
if(m_detectEmotes && m_emoteActive) if(m_detectEmotes && m_emoteActive)
m_vrIk.solver.IKPositionWeight = 0f; m_vrIk.solver.IKPositionWeight = 0f;
// Game manages VRIK for desktop itself
if(PlayerSetup.Instance._inVr) if(PlayerSetup.Instance._inVr)
{ {
if((m_ikOverrideCrouch && (m_poseState != PoseState.Standing)) || (m_ikOverrideProne && (m_poseState == PoseState.Proning))) if((m_ikOverrideCrouch && (m_poseState != PoseState.Standing)) || (m_ikOverrideProne && (m_poseState == PoseState.Proning)))
@ -282,6 +290,10 @@ namespace ml_amt
if(m_ikOverrideFly && MovementSystem.Instance.flying) if(m_ikOverrideFly && MovementSystem.Instance.flying)
m_vrIk.solver.locomotion.weight = 0f; m_vrIk.solver.locomotion.weight = 0f;
} }
// But not this
if(m_ikOverrideJump && !m_grounded && !MovementSystem.Instance.flying)
m_vrIk.solver.locomotion.weight = 0f;
} }
void OnIKPostUpdate() void OnIKPostUpdate()
@ -332,6 +344,10 @@ namespace ml_amt
{ {
m_ikOverrideFly = p_state; m_ikOverrideFly = p_state;
} }
public void SetIKOverrideJump(bool p_state)
{
m_ikOverrideJump = p_state;
}
public void SetDetectEmotes(bool p_state) public void SetDetectEmotes(bool p_state)
{ {
m_detectEmotes = p_state; m_detectEmotes = p_state;

View file

@ -1,10 +1,10 @@
using System.Reflection; using System.Reflection;
[assembly: AssemblyTitle("AvatarMotionTweaker")] [assembly: AssemblyTitle("AvatarMotionTweaker")]
[assembly: AssemblyVersion("1.1.4")] [assembly: AssemblyVersion("1.1.6")]
[assembly: AssemblyFileVersion("1.1.4")] [assembly: AssemblyFileVersion("1.1.6")]
[assembly: MelonLoader.MelonInfo(typeof(ml_amt.AvatarMotionTweaker), "AvatarMotionTweaker", "1.1.4", "SDraw", "https://github.com/SDraw/ml_mods_cvr")] [assembly: MelonLoader.MelonInfo(typeof(ml_amt.AvatarMotionTweaker), "AvatarMotionTweaker", "1.1.6", "SDraw", "https://github.com/SDraw/ml_mods_cvr")]
[assembly: MelonLoader.MelonGame(null, "ChilloutVR")] [assembly: MelonLoader.MelonGame(null, "ChilloutVR")]
[assembly: MelonLoader.MelonPlatform(MelonLoader.MelonPlatformAttribute.CompatiblePlatforms.WINDOWS_X64)] [assembly: MelonLoader.MelonPlatform(MelonLoader.MelonPlatformAttribute.CompatiblePlatforms.WINDOWS_X64)]
[assembly: MelonLoader.MelonPlatformDomain(MelonLoader.MelonPlatformDomainAttribute.CompatibleDomains.MONO)] [assembly: MelonLoader.MelonPlatformDomain(MelonLoader.MelonPlatformDomainAttribute.CompatibleDomains.MONO)]

View file

@ -17,6 +17,7 @@ Available mod's settings in `Settings - Implementation - Avatar Motion Tweaker`:
* **Prone limit:** defines prone limit; default value - `30`. * **Prone limit:** defines prone limit; default value - `30`.
* Note: Can be overrided by avatar. For this avatar has to have child gameobject with name `ProneLimit`, its Y-axis location will be used as limit, should be in range [0.0, 1.0]. * Note: Can be overrided by avatar. For this avatar has to have child gameobject with name `ProneLimit`, its Y-axis location will be used as limit, should be in range [0.0, 1.0].
* **IK override while flying:** disables legs locomotion/autostep in fly mode; default value - `true`. * **IK override while flying:** disables legs locomotion/autostep in fly mode; default value - `true`.
* **IK override while jumping:** disables legs locomotion/autostep in jump; default value - `true`.
* **Pose transitions:** allows regular avatars animator to transit in crouch/prone states; default value - `true`. * **Pose transitions:** allows regular avatars animator to transit in crouch/prone states; default value - `true`.
* Note: Avatar is considered as regular if its AAS animator doesn't have `Upright` parameter. * Note: Avatar is considered as regular if its AAS animator doesn't have `Upright` parameter.
* **Adjusted pose movement speed:** scales movement speed upon crouching/proning; default value - `true`. * **Adjusted pose movement speed:** scales movement speed upon crouching/proning; default value - `true`.

View file

@ -16,6 +16,7 @@ namespace ml_amt
PoseTransitions, PoseTransitions,
AdjustedMovement, AdjustedMovement,
IKOverrideFly, IKOverrideFly,
IKOverrideJump,
DetectEmotes DetectEmotes
}; };
@ -26,6 +27,7 @@ namespace ml_amt
static bool ms_poseTransitions = true; static bool ms_poseTransitions = true;
static bool ms_adjustedMovement = true; static bool ms_adjustedMovement = true;
static bool ms_ikOverrideFly = true; static bool ms_ikOverrideFly = true;
static bool ms_ikOverrideJump = true;
static bool ms_detectEmotes = true; static bool ms_detectEmotes = true;
static MelonLoader.MelonPreferences_Category ms_category = null; static MelonLoader.MelonPreferences_Category ms_category = null;
@ -38,6 +40,7 @@ namespace ml_amt
static public event Action<bool> PoseTransitionsChange; static public event Action<bool> PoseTransitionsChange;
static public event Action<bool> AdjustedMovementChange; static public event Action<bool> AdjustedMovementChange;
static public event Action<bool> IKOverrideFlyChange; static public event Action<bool> IKOverrideFlyChange;
static public event Action<bool> IKOverrideJumpChange;
static public event Action<bool> DetectEmotesChange; static public event Action<bool> DetectEmotesChange;
public static void Init() public static void Init()
@ -52,6 +55,7 @@ namespace ml_amt
ms_entries.Add(ms_category.CreateEntry(ModSetting.PoseTransitions.ToString(), true)); ms_entries.Add(ms_category.CreateEntry(ModSetting.PoseTransitions.ToString(), true));
ms_entries.Add(ms_category.CreateEntry(ModSetting.AdjustedMovement.ToString(), true)); ms_entries.Add(ms_category.CreateEntry(ModSetting.AdjustedMovement.ToString(), true));
ms_entries.Add(ms_category.CreateEntry(ModSetting.IKOverrideFly.ToString(), true)); ms_entries.Add(ms_category.CreateEntry(ModSetting.IKOverrideFly.ToString(), true));
ms_entries.Add(ms_category.CreateEntry(ModSetting.IKOverrideJump.ToString(), true));
ms_entries.Add(ms_category.CreateEntry(ModSetting.DetectEmotes.ToString(), true)); ms_entries.Add(ms_category.CreateEntry(ModSetting.DetectEmotes.ToString(), true));
Load(); Load();
@ -90,6 +94,7 @@ namespace ml_amt
ms_poseTransitions = (bool)ms_entries[(int)ModSetting.PoseTransitions].BoxedValue; ms_poseTransitions = (bool)ms_entries[(int)ModSetting.PoseTransitions].BoxedValue;
ms_adjustedMovement = (bool)ms_entries[(int)ModSetting.AdjustedMovement].BoxedValue; ms_adjustedMovement = (bool)ms_entries[(int)ModSetting.AdjustedMovement].BoxedValue;
ms_ikOverrideFly = (bool)ms_entries[(int)ModSetting.IKOverrideFly].BoxedValue; ms_ikOverrideFly = (bool)ms_entries[(int)ModSetting.IKOverrideFly].BoxedValue;
ms_ikOverrideJump = (bool)ms_entries[(int)ModSetting.IKOverrideJump].BoxedValue;
ms_detectEmotes = (bool)ms_entries[(int)ModSetting.DetectEmotes].BoxedValue; ms_detectEmotes = (bool)ms_entries[(int)ModSetting.DetectEmotes].BoxedValue;
} }
@ -159,6 +164,13 @@ namespace ml_amt
} }
break; break;
case ModSetting.IKOverrideJump:
{
ms_ikOverrideJump = bool.Parse(p_value);
IKOverrideJumpChange?.Invoke(ms_ikOverrideJump);
}
break;
case ModSetting.DetectEmotes: case ModSetting.DetectEmotes:
{ {
ms_detectEmotes = bool.Parse(p_value); ms_detectEmotes = bool.Parse(p_value);
@ -199,6 +211,10 @@ namespace ml_amt
{ {
get => ms_ikOverrideFly; get => ms_ikOverrideFly;
} }
public static bool IKOverrideJump
{
get => ms_ikOverrideJump;
}
public static bool DetectEmotes public static bool DetectEmotes
{ {
get => ms_detectEmotes; get => ms_detectEmotes;

View file

@ -215,6 +215,13 @@ function inp_toggle_mod_amt(_obj, _callbackName) {
</div> </div>
</div> </div>
<div class ="row-wrapper">
<div class ="option-caption">IK override while jumping: </div>
<div class ="option-input">
<div id="IKOverrideJump" class ="inp_toggle no-scroll" data-current="true"></div>
</div>
</div>
<div class ="row-wrapper"> <div class ="row-wrapper">
<div class ="option-caption">Pose transitions: </div> <div class ="option-caption">Pose transitions: </div>
<div class ="option-input"> <div class ="option-input">