Preserve crouch and prone

Code simplification and possible pose copying fix
Reworked finger tracking
This commit is contained in:
SDraw 2023-08-05 21:58:29 +03:00
parent 4608f9f7bf
commit 1efcb8aaee
No known key found for this signature in database
GPG key ID: BB95B4DAB2BB8BB5
19 changed files with 194 additions and 206 deletions

View file

@ -7,10 +7,10 @@ Merged set of MelonLoader mods for ChilloutVR.
| [Desktop Head Tracking](/ml_dht/README.md)| ml_dht | - | ✔ Yes<br>:warning:Broken | | [Desktop Head Tracking](/ml_dht/README.md)| ml_dht | - | ✔ Yes<br>:warning:Broken |
| [Desktop Reticle Switch](/ml_drs/README.md)| ml_drs | 1.0.1 [:arrow_down:](../../releases/latest/download/ml_drs.dll)| ✔ Yes | | [Desktop Reticle Switch](/ml_drs/README.md)| ml_drs | 1.0.1 [:arrow_down:](../../releases/latest/download/ml_drs.dll)| ✔ Yes |
| [Extended Game Notifications](/ml_egn/README.md) | ml_egn | 1.0.3 [:arrow_down:](../../releases/latest/download/ml_egn.dll)| ✔ Yes | | [Extended Game Notifications](/ml_egn/README.md) | ml_egn | 1.0.3 [:arrow_down:](../../releases/latest/download/ml_egn.dll)| ✔ Yes |
| [Leap Motion Extension](/ml_lme/README.md)| ml_lme | 1.4.0 [:arrow_down:](../../releases/latest/download/ml_lme.dll)| ✔ Yes | | [Leap Motion Extension](/ml_lme/README.md)| ml_lme | 1.4.1 [:arrow_down:](../../releases/latest/download/ml_lme.dll)| ✔ Yes<br>:hourglass_flowing_sand: Update review |
| [Pickup Arm Movement](/ml_pam/README.md)| ml_pam | 1.0.6 [:arrow_down:](../../releases/latest/download/ml_pam.dll)| ✔ Yes | | [Pickup Arm Movement](/ml_pam/README.md)| ml_pam | 1.0.6 [:arrow_down:](../../releases/latest/download/ml_pam.dll)| ✔ Yes |
| [Player Movement Copycat](/ml_pmc/README.md)| ml_pmc | 1.0.1 [:arrow_down:](../../releases/latest/download/ml_pmc.dll)| ✔ Yes | | [Player Movement Copycat](/ml_pmc/README.md)| ml_pmc | 1.0.2 [:arrow_down:](../../releases/latest/download/ml_pmc.dll)| ✔ Yes<br>:hourglass_flowing_sand: Update review |
| [Player Ragdoll Mod](/ml_prm/README.md)| ml_prm | 1.0.6 [:arrow_down:](../../releases/latest/download/ml_prm.dll)| ✔ Yes | | [Player Ragdoll Mod](/ml_prm/README.md)| ml_prm | 1.0.7 [:arrow_down:](../../releases/latest/download/ml_prm.dll)| ✔ Yes<br>:hourglass_flowing_sand: Update review |
**Archived mods:** **Archived mods:**
| Full name | Short name | Notes | | Full name | Short name | Notes |

View file

@ -123,7 +123,7 @@ namespace ml_lme
{ {
if(base.InputEnabled) if(base.InputEnabled)
{ {
GestureMatcher.LeapData l_data = LeapManager.Instance.GetLatestData(); LeapParser.LeapData l_data = LeapManager.Instance.GetLatestData();
if(l_data.m_leftHand.m_present) if(l_data.m_leftHand.m_present)
{ {
@ -265,7 +265,7 @@ namespace ml_lme
{ {
if(Settings.Input) if(Settings.Input)
{ {
GestureMatcher.LeapData l_data = LeapManager.Instance.GetLatestData(); LeapParser.LeapData l_data = LeapManager.Instance.GetLatestData();
if(l_data.m_leftHand.m_present && (!m_inVR || !Utils.IsLeftHandTracked() || !Settings.FingersOnly)) if(l_data.m_leftHand.m_present && (!m_inVR || !Utils.IsLeftHandTracked() || !Settings.FingersOnly))
{ {
@ -391,8 +391,10 @@ namespace ml_lme
} }
} }
void SetFingersInput(GestureMatcher.HandData p_hand, bool p_left) void SetFingersInput(LeapParser.HandData p_hand, bool p_left)
{ {
// Game has spreads in range of [0;1], but mod now operates in range of [-1;1]
// So spreads will be normalized towards game's range
if(p_left) if(p_left)
{ {
_inputManager.fingerCurlLeftThumb = p_hand.m_bends[0]; _inputManager.fingerCurlLeftThumb = p_hand.m_bends[0];
@ -400,11 +402,11 @@ namespace ml_lme
_inputManager.fingerCurlLeftMiddle = p_hand.m_bends[2]; _inputManager.fingerCurlLeftMiddle = p_hand.m_bends[2];
_inputManager.fingerCurlLeftRing = p_hand.m_bends[3]; _inputManager.fingerCurlLeftRing = p_hand.m_bends[3];
_inputManager.fingerCurlLeftPinky = p_hand.m_bends[4]; _inputManager.fingerCurlLeftPinky = p_hand.m_bends[4];
_inputManager.fingerSpreadLeftThumb = p_hand.m_spreads[0]; _inputManager.fingerSpreadLeftThumb = 1f - (p_hand.m_spreads[0] * 0.5f + 0.5f);
_inputManager.fingerSpreadLeftIndex = p_hand.m_spreads[1]; _inputManager.fingerSpreadLeftIndex = 1f - (p_hand.m_spreads[1] * 0.5f + 0.5f);
_inputManager.fingerSpreadLeftMiddle = p_hand.m_spreads[2]; _inputManager.fingerSpreadLeftMiddle = 1f - (p_hand.m_spreads[2] * 0.5f + 0.5f);
_inputManager.fingerSpreadLeftRing = p_hand.m_spreads[3]; _inputManager.fingerSpreadLeftRing = 1f - (p_hand.m_spreads[3] * 0.5f + 0.5f);
_inputManager.fingerSpreadLeftPinky = p_hand.m_spreads[4]; _inputManager.fingerSpreadLeftPinky = 1f - (p_hand.m_spreads[4] * 0.5f + 0.5f);
} }
else else
{ {
@ -413,11 +415,11 @@ namespace ml_lme
_inputManager.fingerCurlRightMiddle = p_hand.m_bends[2]; _inputManager.fingerCurlRightMiddle = p_hand.m_bends[2];
_inputManager.fingerCurlRightRing = p_hand.m_bends[3]; _inputManager.fingerCurlRightRing = p_hand.m_bends[3];
_inputManager.fingerCurlRightPinky = p_hand.m_bends[4]; _inputManager.fingerCurlRightPinky = p_hand.m_bends[4];
_inputManager.fingerSpreadRightThumb = p_hand.m_spreads[0]; _inputManager.fingerSpreadRightThumb = 1f - (p_hand.m_spreads[0] * 0.5f + 0.5f);
_inputManager.fingerSpreadRightIndex = p_hand.m_spreads[1]; _inputManager.fingerSpreadRightIndex = 1f - (p_hand.m_spreads[1] * 0.5f + 0.5f);
_inputManager.fingerSpreadRightMiddle = p_hand.m_spreads[2]; _inputManager.fingerSpreadRightMiddle = 1f - (p_hand.m_spreads[2] * 0.5f + 0.5f);
_inputManager.fingerSpreadRightRing = p_hand.m_spreads[3]; _inputManager.fingerSpreadRightRing = 1f - (p_hand.m_spreads[3] * 0.5f + 0.5f);
_inputManager.fingerSpreadRightPinky = p_hand.m_spreads[4]; _inputManager.fingerSpreadRightPinky = 1f - (p_hand.m_spreads[4] * 0.5f + 0.5f);
} }
} }
@ -430,11 +432,11 @@ namespace ml_lme
_inputManager.fingerCurlLeftMiddle = 0f; _inputManager.fingerCurlLeftMiddle = 0f;
_inputManager.fingerCurlLeftRing = 0f; _inputManager.fingerCurlLeftRing = 0f;
_inputManager.fingerCurlLeftPinky = 0f; _inputManager.fingerCurlLeftPinky = 0f;
_inputManager.fingerSpreadLeftThumb = 0f; _inputManager.fingerSpreadLeftThumb = 0.5f;
_inputManager.fingerSpreadLeftIndex = 0f; _inputManager.fingerSpreadLeftIndex = 0.5f;
_inputManager.fingerSpreadLeftMiddle = 0f; _inputManager.fingerSpreadLeftMiddle = 0.5f;
_inputManager.fingerSpreadLeftRing = 0f; _inputManager.fingerSpreadLeftRing = 0.5f;
_inputManager.fingerSpreadLeftPinky = 0f; _inputManager.fingerSpreadLeftPinky = 0.5f;
} }
else else
{ {
@ -443,11 +445,11 @@ namespace ml_lme
_inputManager.fingerCurlRightMiddle = 0f; _inputManager.fingerCurlRightMiddle = 0f;
_inputManager.fingerCurlRightRing = 0f; _inputManager.fingerCurlRightRing = 0f;
_inputManager.fingerCurlRightPinky = 0f; _inputManager.fingerCurlRightPinky = 0f;
_inputManager.fingerSpreadRightThumb = 0f; _inputManager.fingerSpreadRightThumb = 0.5f;
_inputManager.fingerSpreadRightIndex = 0f; _inputManager.fingerSpreadRightIndex = 0.5f;
_inputManager.fingerSpreadRightMiddle = 0f; _inputManager.fingerSpreadRightMiddle = 0.5f;
_inputManager.fingerSpreadRightRing = 0f; _inputManager.fingerSpreadRightRing = 0.5f;
_inputManager.fingerSpreadRightPinky = 0f; _inputManager.fingerSpreadRightPinky = 0.5f;
} }
} }

View file

@ -12,7 +12,7 @@ namespace ml_lme
public static LeapManager Instance { get; private set; } = null; public static LeapManager Instance { get; private set; } = null;
Leap.Controller m_leapController = null; Leap.Controller m_leapController = null;
GestureMatcher.LeapData m_leapData = null; LeapParser.LeapData m_leapData = null;
LeapTracking m_leapTracking = null; LeapTracking m_leapTracking = null;
LeapTracked m_leapTracked = null; LeapTracked m_leapTracked = null;
@ -24,7 +24,7 @@ namespace ml_lme
Instance = this; Instance = this;
m_leapController = new Leap.Controller(); m_leapController = new Leap.Controller();
m_leapData = new GestureMatcher.LeapData(); m_leapData = new LeapParser.LeapData();
DontDestroyOnLoad(this); DontDestroyOnLoad(this);
@ -90,12 +90,12 @@ namespace ml_lme
if(m_leapController.IsConnected) if(m_leapController.IsConnected)
{ {
Leap.Frame l_frame = m_leapController.Frame(); Leap.Frame l_frame = m_leapController.Frame();
GestureMatcher.GetFrameData(l_frame, m_leapData); LeapParser.ParseFrame(l_frame, m_leapData);
} }
} }
} }
public GestureMatcher.LeapData GetLatestData() => m_leapData; public LeapParser.LeapData GetLatestData() => m_leapData;
// Device events // Device events
void OnLeapDeviceInitialized(object p_sender, Leap.DeviceEventArgs p_args) void OnLeapDeviceInitialized(object p_sender, Leap.DeviceEventArgs p_args)

View file

@ -2,15 +2,24 @@
namespace ml_lme namespace ml_lme
{ {
static class GestureMatcher static class LeapParser
{ {
readonly static Vector2[] ms_fingerLimits = readonly static Vector2[] ms_bendLimits =
{ {
new Vector2(-50f, 0f), new Vector2(0f, 90f),
new Vector2(-20f, 30f), new Vector2(0f, 180f),
new Vector2(-15f, 15f), new Vector2(0f, 180f),
new Vector2(-10f, 20f), new Vector2(0f, 180f),
new Vector2(-10f, 25f) new Vector2(0f, 180f)
};
readonly static Vector2[] ms_spreadLimits =
{
new Vector2(-25f, 25f), // Unity's default limits
new Vector2(-20f, 20f),
new Vector2(-7.5f, 7.5f),
new Vector2(-7.5f, 7.5f),
new Vector2(-20f, 20f)
}; };
public class HandData public class HandData
@ -68,7 +77,7 @@ namespace ml_lme
} }
} }
public static void GetFrameData(Leap.Frame p_frame, LeapData p_data) public static void ParseFrame(Leap.Frame p_frame, LeapData p_data)
{ {
p_data.Reset(); p_data.Reset();
@ -93,30 +102,31 @@ namespace ml_lme
// Bends // Bends
foreach(Leap.Finger l_finger in p_hand.Fingers) foreach(Leap.Finger l_finger in p_hand.Fingers)
{ {
Quaternion l_prevSegment = Quaternion.identity; Quaternion l_parentRot = Quaternion.identity;
float l_angle = 0f; float l_angle = 0f;
foreach(Leap.Bone l_bone in l_finger.bones) foreach(Leap.Bone l_bone in l_finger.bones)
{ {
p_data.m_fingerPosition[(int)l_finger.Type * 4 + (int)l_bone.Type] = l_bone.PrevJoint; int l_index = (int)l_finger.Type * 4 + (int)l_bone.Type;
p_data.m_fingerRotation[(int)l_finger.Type * 4 + (int)l_bone.Type] = l_bone.Rotation; p_data.m_fingerPosition[l_index] = l_bone.PrevJoint;
p_data.m_fingerRotation[l_index] = l_bone.Rotation;
if(l_bone.Type == Leap.Bone.BoneType.TYPE_METACARPAL) if(l_bone.Type == Leap.Bone.BoneType.TYPE_METACARPAL)
{ {
l_prevSegment = l_bone.Rotation; l_parentRot = l_bone.Rotation;
continue; continue;
} }
Quaternion l_diff = Quaternion.Inverse(l_prevSegment) * l_bone.Rotation; Quaternion l_localRot = Quaternion.Inverse(l_parentRot) * l_bone.Rotation;
l_prevSegment = l_bone.Rotation; float l_angleDiff = l_localRot.eulerAngles.x;
float l_angleDiff = l_diff.eulerAngles.x;
if(l_angleDiff > 180f) if(l_angleDiff > 180f)
l_angleDiff -= 360f; l_angleDiff -= 360f;
l_angle += l_angleDiff; l_angle += l_angleDiff;
l_parentRot = l_bone.Rotation;
} }
p_data.m_bends[(int)l_finger.Type] = Utils.InverseLerpUnclamped(0f, (l_finger.Type == Leap.Finger.FingerType.TYPE_THUMB) ? 90f : 180f, l_angle); p_data.m_bends[(int)l_finger.Type] = Utils.InverseLerpUnclamped(ms_bendLimits[(int)l_finger.Type].x, ms_bendLimits[(int)l_finger.Type].y, l_angle);
} }
// Spreads // Spreads
@ -126,24 +136,17 @@ namespace ml_lme
Leap.Bone l_child = l_finger.Bone(Leap.Bone.BoneType.TYPE_PROXIMAL); Leap.Bone l_child = l_finger.Bone(Leap.Bone.BoneType.TYPE_PROXIMAL);
Quaternion l_diff = Quaternion.Inverse(l_parent.Rotation) * l_child.Rotation; Quaternion l_diff = Quaternion.Inverse(l_parent.Rotation) * l_child.Rotation;
// Spread - local Y rotation, but thumb is obnoxious // Spread - local Y rotation
float l_angle = 360f - l_diff.eulerAngles.y; float l_angle = l_diff.eulerAngles.y;
if(l_angle > 180f) if(l_angle > 180f)
l_angle -= 360f; l_angle -= 360f;
// Pain
if(p_hand.IsRight) if(p_hand.IsRight)
l_angle *= -1f; l_angle *= -1f;
if(l_finger.Type != Leap.Finger.FingerType.TYPE_THUMB) p_data.m_spreads[(int)l_finger.Type] = Utils.InverseLerpUnclamped(ms_spreadLimits[(int)l_finger.Type].x, ms_spreadLimits[(int)l_finger.Type].y, l_angle) * 2f - 1f;
{ if((l_finger.Type != Leap.Finger.FingerType.TYPE_THUMB) && (p_data.m_bends[(int)l_finger.Type] >= 0.8f))
if(l_angle < 0f) p_data.m_spreads[(int)l_finger.Type] = Mathf.Lerp(p_data.m_spreads[(int)l_finger.Type], 0f, (p_data.m_bends[(int)l_finger.Type] - 0.8f) * 5f);
p_data.m_spreads[(int)l_finger.Type] = 0.5f * Utils.InverseLerpUnclamped(ms_fingerLimits[(int)l_finger.Type].x, 0f, l_angle);
else
p_data.m_spreads[(int)l_finger.Type] = 0.5f + 0.5f * Utils.InverseLerpUnclamped(0f, ms_fingerLimits[(int)l_finger.Type].y, l_angle);
}
else
p_data.m_spreads[(int)l_finger.Type] = Utils.InverseLerpUnclamped(ms_fingerLimits[(int)l_finger.Type].x, ms_fingerLimits[(int)l_finger.Type].y, l_angle);
} }
p_data.m_grabStrength = Mathf.Clamp01((p_data.m_bends[1] + p_data.m_bends[2] + p_data.m_bends[3] + p_data.m_bends[4]) * 0.25f); p_data.m_grabStrength = Mathf.Clamp01((p_data.m_bends[1] + p_data.m_bends[2] + p_data.m_bends[3] + p_data.m_bends[4]) * 0.25f);

View file

@ -72,7 +72,7 @@ namespace ml_lme
{ {
if(m_enabled) if(m_enabled)
{ {
GestureMatcher.LeapData l_data = LeapManager.Instance.GetLatestData(); LeapParser.LeapData l_data = LeapManager.Instance.GetLatestData();
if((m_leftArmIK != null) && (m_rightArmIK != null)) if((m_leftArmIK != null) && (m_rightArmIK != null))
{ {
@ -126,7 +126,7 @@ namespace ml_lme
{ {
if(m_enabled && !m_inVR && (m_poseHandler != null)) if(m_enabled && !m_inVR && (m_poseHandler != null))
{ {
GestureMatcher.LeapData l_data = LeapManager.Instance.GetLatestData(); LeapParser.LeapData l_data = LeapManager.Instance.GetLatestData();
Vector3 l_hipsLocalPos = m_hips.localPosition; Vector3 l_hipsLocalPos = m_hips.localPosition;
Quaternion l_hipsLocalRot = m_hips.localRotation; Quaternion l_hipsLocalRot = m_hips.localRotation;
@ -141,62 +141,62 @@ namespace ml_lme
} }
// Tracking update // Tracking update
void UpdateFingers(GestureMatcher.LeapData p_data) void UpdateFingers(LeapParser.LeapData p_data)
{ {
if(p_data.m_leftHand.m_present) if(p_data.m_leftHand.m_present)
{ {
UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.LeftThumb1Stretched, Mathf.LerpUnclamped(0.85f, -0.85f, p_data.m_leftHand.m_bends[0])); UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.LeftThumb1Stretched, -0.5f-p_data.m_leftHand.m_bends[0]);
UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.LeftThumb2Stretched, Mathf.LerpUnclamped(0.85f, -0.85f, p_data.m_leftHand.m_bends[0])); UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.LeftThumb2Stretched, 0.7f - p_data.m_leftHand.m_bends[0] * 2f);
UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.LeftThumb3Stretched, Mathf.LerpUnclamped(0.85f, -0.85f, p_data.m_leftHand.m_bends[0])); UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.LeftThumb3Stretched, 0.7f - p_data.m_leftHand.m_bends[0] * 2f);
UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.LeftThumbSpread, Mathf.LerpUnclamped(-1.5f, 1.0f, p_data.m_leftHand.m_spreads[0])); // Ok UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.LeftThumbSpread, -p_data.m_leftHand.m_spreads[0]);
UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.LeftIndex1Stretched, Mathf.LerpUnclamped(0.7f, -1f, p_data.m_leftHand.m_bends[1])); UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.LeftIndex1Stretched, 0.5f - p_data.m_leftHand.m_bends[1]);
UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.LeftIndex2Stretched, Mathf.LerpUnclamped(0.7f, -1f, p_data.m_leftHand.m_bends[1])); UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.LeftIndex2Stretched, 0.7f - p_data.m_leftHand.m_bends[1] * 2f);
UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.LeftIndex3Stretched, Mathf.LerpUnclamped(0.7f, -1f, p_data.m_leftHand.m_bends[1])); UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.LeftIndex3Stretched, 0.7f - p_data.m_leftHand.m_bends[1] * 2f);
UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.LeftIndexSpread, Mathf.LerpUnclamped(1f, -1f, p_data.m_leftHand.m_spreads[1])); // Ok UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.LeftIndexSpread, p_data.m_leftHand.m_spreads[1]);
UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.LeftMiddle1Stretched, Mathf.LerpUnclamped(0.7f, -1f, p_data.m_leftHand.m_bends[2])); UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.LeftMiddle1Stretched, 0.5f - p_data.m_leftHand.m_bends[2]);
UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.LeftMiddle2Stretched, Mathf.LerpUnclamped(0.7f, -1f, p_data.m_leftHand.m_bends[2])); UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.LeftMiddle2Stretched, 0.7f - p_data.m_leftHand.m_bends[2] * 2f);
UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.LeftMiddle3Stretched, Mathf.LerpUnclamped(0.7f, -1f, p_data.m_leftHand.m_bends[2])); UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.LeftMiddle3Stretched, 0.7f - p_data.m_leftHand.m_bends[2] * 2f);
UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.LeftMiddleSpread, Mathf.LerpUnclamped(2f, -2f, p_data.m_leftHand.m_spreads[2])); UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.LeftMiddleSpread, p_data.m_leftHand.m_spreads[2]);
UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.LeftRing1Stretched, Mathf.LerpUnclamped(0.7f, -1f, p_data.m_leftHand.m_bends[3])); UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.LeftRing1Stretched, 0.5f - p_data.m_leftHand.m_bends[3]);
UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.LeftRing2Stretched, Mathf.LerpUnclamped(0.7f, -1f, p_data.m_leftHand.m_bends[3])); UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.LeftRing2Stretched, 0.7f - p_data.m_leftHand.m_bends[3] * 2f);
UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.LeftRing3Stretched, Mathf.LerpUnclamped(0.7f, -1f, p_data.m_leftHand.m_bends[3])); UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.LeftRing3Stretched, 0.7f - p_data.m_leftHand.m_bends[3] * 2f);
UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.LeftRingSpread, Mathf.LerpUnclamped(-2f, 2f, p_data.m_leftHand.m_spreads[3])); UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.LeftRingSpread, -p_data.m_leftHand.m_spreads[3]);
UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.LeftLittle1Stretched, Mathf.LerpUnclamped(0.7f, -1f, p_data.m_leftHand.m_bends[4])); UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.LeftLittle1Stretched, 0.5f - p_data.m_leftHand.m_bends[4]);
UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.LeftLittle2Stretched, Mathf.LerpUnclamped(0.7f, -1f, p_data.m_leftHand.m_bends[4])); UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.LeftLittle2Stretched, 0.7f - p_data.m_leftHand.m_bends[4] * 2f);
UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.LeftLittle3Stretched, Mathf.LerpUnclamped(0.7f, -1f, p_data.m_leftHand.m_bends[4])); UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.LeftLittle3Stretched, 0.7f - p_data.m_leftHand.m_bends[4] * 2f);
UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.LeftLittleSpread, Mathf.LerpUnclamped(-0.5f, 1f, p_data.m_leftHand.m_spreads[4])); UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.LeftLittleSpread, -p_data.m_leftHand.m_spreads[4]);
} }
if(p_data.m_rightHand.m_present) if(p_data.m_rightHand.m_present)
{ {
UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.RightThumb1Stretched, Mathf.LerpUnclamped(0.85f, -0.85f, p_data.m_rightHand.m_bends[0])); UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.RightThumb1Stretched, -0.5f-p_data.m_rightHand.m_bends[0]);
UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.RightThumb2Stretched, Mathf.LerpUnclamped(0.85f, -0.85f, p_data.m_rightHand.m_bends[0])); UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.RightThumb2Stretched, 0.7f - p_data.m_rightHand.m_bends[0] * 2f);
UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.RightThumb3Stretched, Mathf.LerpUnclamped(0.85f, -0.85f, p_data.m_rightHand.m_bends[0])); UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.RightThumb3Stretched, 0.7f - p_data.m_rightHand.m_bends[0] * 2f);
UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.RightThumbSpread, Mathf.LerpUnclamped(-1.5f, 1.0f, p_data.m_rightHand.m_spreads[0])); // Ok UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.RightThumbSpread, -p_data.m_rightHand.m_spreads[0]);
UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.RightIndex1Stretched, Mathf.LerpUnclamped(0.7f, -1f, p_data.m_rightHand.m_bends[1])); UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.RightIndex1Stretched, 0.5f - p_data.m_rightHand.m_bends[1]);
UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.RightIndex2Stretched, Mathf.LerpUnclamped(0.7f, -1f, p_data.m_rightHand.m_bends[1])); UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.RightIndex2Stretched, 0.7f - p_data.m_rightHand.m_bends[1] * 2f);
UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.RightIndex3Stretched, Mathf.LerpUnclamped(0.7f, -1f, p_data.m_rightHand.m_bends[1])); UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.RightIndex3Stretched, 0.7f - p_data.m_rightHand.m_bends[1] * 2f);
UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.RightIndexSpread, Mathf.LerpUnclamped(1f, -1f, p_data.m_rightHand.m_spreads[1])); // Ok UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.RightIndexSpread, p_data.m_rightHand.m_spreads[1]);
UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.RightMiddle1Stretched, Mathf.LerpUnclamped(0.7f, -1f, p_data.m_rightHand.m_bends[2])); UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.RightMiddle1Stretched, 0.5f - p_data.m_rightHand.m_bends[2]);
UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.RightMiddle2Stretched, Mathf.LerpUnclamped(0.7f, -1f, p_data.m_rightHand.m_bends[2])); UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.RightMiddle2Stretched, 0.7f - p_data.m_rightHand.m_bends[2] * 2f);
UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.RightMiddle3Stretched, Mathf.LerpUnclamped(0.7f, -1f, p_data.m_rightHand.m_bends[2])); UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.RightMiddle3Stretched, 0.7f - p_data.m_rightHand.m_bends[2] * 2f);
UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.RightMiddleSpread, Mathf.LerpUnclamped(2f, -2f, p_data.m_rightHand.m_spreads[2])); UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.RightMiddleSpread, p_data.m_rightHand.m_spreads[2]);
UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.RightRing1Stretched, Mathf.LerpUnclamped(0.7f, -1f, p_data.m_rightHand.m_bends[3])); UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.RightRing1Stretched, 0.5f - p_data.m_rightHand.m_bends[3]);
UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.RightRing2Stretched, Mathf.LerpUnclamped(0.7f, -1f, p_data.m_rightHand.m_bends[3])); UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.RightRing2Stretched, 0.7f - p_data.m_rightHand.m_bends[3] * 2f);
UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.RightRing3Stretched, Mathf.LerpUnclamped(0.7f, -1f, p_data.m_rightHand.m_bends[3])); UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.RightRing3Stretched, 0.7f - p_data.m_rightHand.m_bends[3] * 2f);
UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.RightRingSpread, Mathf.LerpUnclamped(-2f, 2f, p_data.m_rightHand.m_spreads[3])); UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.RightRingSpread, -p_data.m_rightHand.m_spreads[3]);
UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.RightLittle1Stretched, Mathf.LerpUnclamped(0.7f, -1f, p_data.m_rightHand.m_bends[4])); UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.RightLittle1Stretched, 0.5f - p_data.m_rightHand.m_bends[4]);
UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.RightLittle2Stretched, Mathf.LerpUnclamped(0.7f, -1f, p_data.m_rightHand.m_bends[4])); UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.RightLittle2Stretched, 0.7f - p_data.m_rightHand.m_bends[4] * 2f);
UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.RightLittle3Stretched, Mathf.LerpUnclamped(0.7f, -1f, p_data.m_rightHand.m_bends[4])); UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.RightLittle3Stretched, 0.7f - p_data.m_rightHand.m_bends[4] * 2f);
UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.RightLittleSpread, Mathf.LerpUnclamped(-0.5f, 1f, p_data.m_rightHand.m_spreads[4])); UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.RightLittleSpread, -p_data.m_rightHand.m_spreads[4]);
} }
} }
@ -424,6 +424,8 @@ namespace ml_lme
{ {
if(p_pose.muscles.Length > p_index) if(p_pose.muscles.Length > p_index)
p_pose.muscles[p_index] = p_value; p_pose.muscles[p_index] = p_value;
//p_pose.muscles[p_index] = (p_clamped ? Mathf.Lerp(ms_muscleLimits[p_index].x, ms_muscleLimits[p_index].y, p_value) : Mathf.LerpUnclamped(ms_muscleLimits[p_index].x, ms_muscleLimits[p_index].y, p_value));
} }
} }
} }

View file

@ -114,7 +114,7 @@ namespace ml_lme
{ {
if(Settings.Enabled) if(Settings.Enabled)
{ {
GestureMatcher.LeapData l_data = LeapManager.Instance.GetLatestData(); LeapParser.LeapData l_data = LeapManager.Instance.GetLatestData();
if(l_data.m_leftHand.m_present) if(l_data.m_leftHand.m_present)
{ {

View file

@ -1,6 +1,4 @@
using System.Reflection; [assembly: MelonLoader.MelonInfo(typeof(ml_lme.LeapMotionExtension), "LeapMotionExtension", "1.4.1", "SDraw", "https://github.com/SDraw/ml_mods_cvr")]
[assembly: MelonLoader.MelonInfo(typeof(ml_lme.LeapMotionExtension), "LeapMotionExtension", "1.4.0", "SDraw", "https://github.com/SDraw/ml_mods_cvr")]
[assembly: MelonLoader.MelonGame(null, "ChilloutVR")] [assembly: MelonLoader.MelonGame(null, "ChilloutVR")]
[assembly: MelonLoader.MelonOptionalDependencies("ml_pmc")] [assembly: MelonLoader.MelonOptionalDependencies("ml_pmc")]
[assembly: MelonLoader.MelonPlatform(MelonLoader.MelonPlatformAttribute.CompatiblePlatforms.WINDOWS_X64)] [assembly: MelonLoader.MelonPlatform(MelonLoader.MelonPlatformAttribute.CompatiblePlatforms.WINDOWS_X64)]

View file

@ -47,7 +47,7 @@ namespace ml_lme
} }
} }
public void Update(GestureMatcher.HandData p_data) public void Update(LeapParser.HandData p_data)
{ {
if(m_wrist != null) if(m_wrist != null)
{ {

View file

@ -4,7 +4,7 @@
<TargetFramework>netstandard2.1</TargetFramework> <TargetFramework>netstandard2.1</TargetFramework>
<Platforms>x64</Platforms> <Platforms>x64</Platforms>
<PackageId>LeapMotionExtension</PackageId> <PackageId>LeapMotionExtension</PackageId>
<Version>1.4.0</Version> <Version>1.4.1</Version>
<Authors>SDraw</Authors> <Authors>SDraw</Authors>
<Company>None</Company> <Company>None</Company>
<Product>LeapMotionExtension</Product> <Product>LeapMotionExtension</Product>

View file

@ -67,7 +67,7 @@ namespace ml_pmc
if(CVRPlayerManager.Instance.GetPlayerPuppetMaster(p_id, out PuppetMaster l_puppetMaster)) if(CVRPlayerManager.Instance.GetPlayerPuppetMaster(p_id, out PuppetMaster l_puppetMaster))
{ {
if(IsInSight(MovementSystem.Instance.proxyCollider, l_puppetMaster.GetComponent<CapsuleCollider>(), Utils.GetWorldMovementLimit())) if(IsInSight(MovementSystem.Instance.proxyCollider, l_puppetMaster.GetComponent<CapsuleCollider>(), Utils.GetWorldMovementLimit()))
m_localCopycat.SetTarget(l_puppetMaster.gameObject); m_localCopycat.SetTarget(l_puppetMaster);
else else
ModUi.ShowAlert("Selected player is too far away or obstructed"); ModUi.ShowAlert("Selected player is too far away or obstructed");
} }

View file

@ -122,8 +122,7 @@ namespace ml_pmc
// Currently broken in BTKUILib, waiting for fix // Currently broken in BTKUILib, waiting for fix
static void UpdateToggleColor(bool p_state) static void UpdateToggleColor(bool p_state)
{ {
//(ms_uiElements[(int)UiIndex.Toggle] as Button).ButtonIcon = (p_state ? "PMC-Dancing-On" : "PMC-Dancing"); (ms_uiElements[(int)UiIndex.Toggle] as Button).ButtonIcon = (p_state ? "PMC-Dancing-On" : "PMC-Dancing");
//(ms_uiElements[(int)UiIndex.Toggle] as Button).ButtonText = (p_state ? "PMC-Dancing-On" : "PMC-Dancing");
} }
static Stream GetIconStream(string p_name) static Stream GetIconStream(string p_name)

View file

@ -49,12 +49,12 @@ namespace ml_pmc
{ {
m_sitting = (MovementSystem.Instance.lastSeat != null); m_sitting = (MovementSystem.Instance.lastSeat != null);
if(m_active && (m_puppetParser != null)) if(m_active)
{ {
OverrideIK(); if(m_puppetParser != null)
if(m_puppetParser.HasAnimator())
{ {
OverrideIK();
bool l_mirror = Settings.MirrorPose; bool l_mirror = Settings.MirrorPose;
if(Settings.Gestures) if(Settings.Gestures)
@ -71,6 +71,7 @@ namespace ml_pmc
IKSystem.Instance.FingerSystem.controlActive = true; IKSystem.Instance.FingerSystem.controlActive = true;
ref float[] l_curls = ref m_puppetParser.GetFingerCurls(); ref float[] l_curls = ref m_puppetParser.GetFingerCurls();
ref float[] l_spreads = ref m_puppetParser.GetFingerSpreads();
CVRInputManager.Instance.fingerCurlLeftThumb = l_curls[l_mirror ? 5 : 0]; CVRInputManager.Instance.fingerCurlLeftThumb = l_curls[l_mirror ? 5 : 0];
CVRInputManager.Instance.fingerCurlLeftIndex = l_curls[l_mirror ? 6 : 1]; CVRInputManager.Instance.fingerCurlLeftIndex = l_curls[l_mirror ? 6 : 1];
@ -82,6 +83,17 @@ namespace ml_pmc
CVRInputManager.Instance.fingerCurlRightMiddle = l_curls[l_mirror ? 2 : 7]; CVRInputManager.Instance.fingerCurlRightMiddle = l_curls[l_mirror ? 2 : 7];
CVRInputManager.Instance.fingerCurlRightRing = l_curls[l_mirror ? 3 : 8]; CVRInputManager.Instance.fingerCurlRightRing = l_curls[l_mirror ? 3 : 8];
CVRInputManager.Instance.fingerCurlRightPinky = l_curls[l_mirror ? 4 : 9]; CVRInputManager.Instance.fingerCurlRightPinky = l_curls[l_mirror ? 4 : 9];
CVRInputManager.Instance.fingerSpreadLeftThumb = l_spreads[l_mirror ? 5 : 0];
CVRInputManager.Instance.fingerSpreadLeftIndex = l_spreads[l_mirror ? 6 : 1];
CVRInputManager.Instance.fingerSpreadLeftMiddle = l_spreads[l_mirror ? 7 : 2];
CVRInputManager.Instance.fingerSpreadLeftRing = l_spreads[l_mirror ? 8 : 3];
CVRInputManager.Instance.fingerSpreadLeftPinky = l_spreads[l_mirror ? 9 : 4];
CVRInputManager.Instance.fingerSpreadRightThumb = l_spreads[l_mirror ? 0 : 5];
CVRInputManager.Instance.fingerSpreadRightIndex = l_spreads[l_mirror ? 1 : 6];
CVRInputManager.Instance.fingerSpreadRightMiddle = l_spreads[l_mirror ? 2 : 7];
CVRInputManager.Instance.fingerSpreadRightRing = l_spreads[l_mirror ? 3 : 8];
CVRInputManager.Instance.fingerSpreadRightPinky = l_spreads[l_mirror ? 4 : 9];
} }
else else
{ {
@ -92,7 +104,7 @@ namespace ml_pmc
} }
} }
Matrix4x4 l_offset = m_puppetParser.GetOffset(); Matrix4x4 l_offset = m_puppetParser.GetLastOffset();
Vector3 l_pos = l_offset * ms_pointVector; Vector3 l_pos = l_offset * ms_pointVector;
Quaternion l_rot = l_offset.rotation; Quaternion l_rot = l_offset.rotation;
@ -120,27 +132,26 @@ namespace ml_pmc
else else
PlayerSetup.Instance.transform.rotation = l_result.rotation; PlayerSetup.Instance.transform.rotation = l_result.rotation;
} }
}
else if(Vector3.Distance(this.transform.position, m_puppetParser.transform.position) > m_distanceLimit)
{
if(!m_puppetParser.IsWaitingAnimator())
SetTarget(null); SetTarget(null);
} }
else
if(Vector3.Distance(this.transform.position, m_puppetParser.transform.position) > m_distanceLimit)
SetTarget(null); SetTarget(null);
} }
} }
void LateUpdate() void LateUpdate()
{ {
if(m_active && (m_animator != null) && (m_puppetParser != null) && m_puppetParser.IsPoseParsed()) if(m_active && (m_animator != null) && (m_puppetParser != null))
{ {
OverrideIK(); OverrideIK();
m_puppetParser.GetPose().CopyTo(ref m_pose); m_puppetParser.GetPose().CopyTo(ref m_pose);
if(Settings.MirrorPose) if(Settings.MirrorPose)
Utils.MirrorPose(ref m_pose); Utils.MirrorPose(ref m_pose);
m_poseHandler.SetHumanPose(ref m_pose); m_poseHandler.SetHumanPose(ref m_pose);
} }
} }
@ -160,7 +171,11 @@ namespace ml_pmc
m_poseHandler?.Dispose(); m_poseHandler?.Dispose();
m_poseHandler = null; m_poseHandler = null;
if(m_active)
OnActivityChange?.Invoke(false);
m_active = false; m_active = false;
m_distanceLimit = float.MaxValue; m_distanceLimit = float.MaxValue;
m_fingerTracking = false; m_fingerTracking = false;
m_pose = new HumanPose(); m_pose = new HumanPose();
@ -222,15 +237,16 @@ namespace ml_pmc
} }
// Arbitrary // Arbitrary
public void SetTarget(GameObject p_target) public void SetTarget(PuppetMaster p_target)
{ {
if(m_animator != null) if(m_animator != null)
{ {
if(!m_active) if(!m_active)
{ {
if(p_target != null) if((p_target != null) && (p_target.animatorManager != null) && (p_target.animatorManager.animator != null) && p_target.animatorManager.animator.isHuman)
{ {
m_puppetParser = p_target.AddComponent<PuppetParser>(); m_puppetParser = p_target.animatorManager.animator.gameObject.AddComponent<PuppetParser>();
m_puppetParser.m_puppetMaster = p_target;
m_distanceLimit = Utils.GetWorldMovementLimit(); m_distanceLimit = Utils.GetWorldMovementLimit();
m_active = true; m_active = true;
@ -295,6 +311,17 @@ namespace ml_pmc
CVRInputManager.Instance.fingerCurlRightMiddle = 0f; CVRInputManager.Instance.fingerCurlRightMiddle = 0f;
CVRInputManager.Instance.fingerCurlRightRing = 0f; CVRInputManager.Instance.fingerCurlRightRing = 0f;
CVRInputManager.Instance.fingerCurlRightPinky = 0f; CVRInputManager.Instance.fingerCurlRightPinky = 0f;
CVRInputManager.Instance.fingerSpreadLeftThumb = 0.5f;
CVRInputManager.Instance.fingerSpreadLeftIndex = 0.5f;
CVRInputManager.Instance.fingerSpreadLeftMiddle = 0.5f;
CVRInputManager.Instance.fingerSpreadLeftRing = 0.5f;
CVRInputManager.Instance.fingerSpreadLeftPinky = 0.5f;
CVRInputManager.Instance.fingerSpreadRightThumb = 0.5f;
CVRInputManager.Instance.fingerSpreadRightIndex = 0.5f;
CVRInputManager.Instance.fingerSpreadRightMiddle = 0.5f;
CVRInputManager.Instance.fingerSpreadRightRing = 0.5f;
CVRInputManager.Instance.fingerSpreadRightPinky = 0.5f;
} }
} }
} }

View file

@ -1,6 +1,6 @@
using System.Reflection; using System.Reflection;
[assembly: MelonLoader.MelonInfo(typeof(ml_pmc.PlayerMovementCopycat), "PlayerMovementCopycat", "1.0.1", "SDraw", "https://github.com/SDraw/ml_mods_cvr")] [assembly: MelonLoader.MelonInfo(typeof(ml_pmc.PlayerMovementCopycat), "PlayerMovementCopycat", "1.0.2", "SDraw", "https://github.com/SDraw/ml_mods_cvr")]
[assembly: MelonLoader.MelonGame(null, "ChilloutVR")] [assembly: MelonLoader.MelonGame(null, "ChilloutVR")]
[assembly: MelonLoader.MelonPriority(3)] [assembly: MelonLoader.MelonPriority(3)]
[assembly: MelonLoader.MelonAdditionalDependencies("BTKUILib")] [assembly: MelonLoader.MelonAdditionalDependencies("BTKUILib")]

View file

@ -6,18 +6,12 @@ namespace ml_pmc
[DisallowMultipleComponent] [DisallowMultipleComponent]
class PuppetParser : MonoBehaviour class PuppetParser : MonoBehaviour
{ {
static readonly Vector4 ms_pointVector = new Vector4(0f, 0f, 0f, 1f); internal PuppetMaster m_puppetMaster = null;
PuppetMaster m_puppetMaster = null;
Animator m_animator = null; Animator m_animator = null;
AnimatorCullingMode m_cullMode; AnimatorCullingMode m_cullMode;
float m_armatureScale = 1f;
float m_armatureHeight = 0f;
bool m_waitAnimator = true;
HumanPoseHandler m_poseHandler = null; HumanPoseHandler m_poseHandler = null;
HumanPose m_pose; HumanPose m_pose;
bool m_poseParsed = false;
Matrix4x4 m_matrix = Matrix4x4.identity; Matrix4x4 m_matrix = Matrix4x4.identity;
Matrix4x4 m_offset = Matrix4x4.identity; Matrix4x4 m_offset = Matrix4x4.identity;
@ -27,26 +21,34 @@ namespace ml_pmc
float m_rightGesture = 0f; float m_rightGesture = 0f;
bool m_fingerTracking = false; bool m_fingerTracking = false;
float[] m_fingerCurls = null; float[] m_fingerCurls = null;
float[] m_fingerSpreads = null;
internal PuppetParser() internal PuppetParser()
{ {
m_fingerCurls = new float[10]; m_fingerCurls = new float[10];
m_fingerSpreads = new float[10];
} }
// Unity events // Unity events
void Start() void Start()
{ {
m_puppetMaster = this.GetComponent<PuppetMaster>(); m_animator = this.GetComponent<Animator>();
m_cullMode = m_animator.cullingMode;
m_animator.cullingMode = AnimatorCullingMode.AlwaysAnimate;
m_poseHandler = new HumanPoseHandler(m_animator.avatar, m_animator.transform);
m_poseHandler.GetHumanPose(ref m_pose);
m_matrix = this.transform.GetMatrix(); m_matrix = this.transform.GetMatrix();
StartCoroutine(WaitForAnimator());
} }
void OnDestroy() void OnDestroy()
{ {
m_puppetMaster = null;
if(m_animator != null) if(m_animator != null)
m_animator.cullingMode = m_cullMode; m_animator.cullingMode = m_cullMode;
m_animator = null;
m_poseHandler?.Dispose(); m_poseHandler?.Dispose();
m_poseHandler = null;
} }
void Update() void Update()
@ -69,88 +71,38 @@ namespace ml_pmc
m_fingerCurls[7] = m_puppetMaster.PlayerAvatarMovementDataInput.RightMiddleCurl; m_fingerCurls[7] = m_puppetMaster.PlayerAvatarMovementDataInput.RightMiddleCurl;
m_fingerCurls[8] = m_puppetMaster.PlayerAvatarMovementDataInput.RightRingCurl; m_fingerCurls[8] = m_puppetMaster.PlayerAvatarMovementDataInput.RightRingCurl;
m_fingerCurls[9] = m_puppetMaster.PlayerAvatarMovementDataInput.RightPinkyCurl; m_fingerCurls[9] = m_puppetMaster.PlayerAvatarMovementDataInput.RightPinkyCurl;
}
}
if(!ReferenceEquals(m_animator, null)) m_fingerSpreads[0] = m_puppetMaster.PlayerAvatarMovementDataInput.LeftThumbSpread;
{ m_fingerSpreads[1] = m_puppetMaster.PlayerAvatarMovementDataInput.LeftIndexSpread;
if(m_animator != null) m_fingerSpreads[2] = m_puppetMaster.PlayerAvatarMovementDataInput.LeftMiddleSpread;
{ m_fingerSpreads[3] = m_puppetMaster.PlayerAvatarMovementDataInput.LeftRingSpread;
Matrix4x4 l_current = this.transform.GetMatrix(); m_fingerSpreads[4] = m_puppetMaster.PlayerAvatarMovementDataInput.LeftPinkySpread;
m_offset = m_matrix.inverse * l_current; m_fingerSpreads[5] = m_puppetMaster.PlayerAvatarMovementDataInput.RightThumbSpread;
m_matrix = l_current; m_fingerSpreads[6] = m_puppetMaster.PlayerAvatarMovementDataInput.RightIndexSpread;
m_fingerSpreads[7] = m_puppetMaster.PlayerAvatarMovementDataInput.RightMiddleSpread;
m_fingerSpreads[8] = m_puppetMaster.PlayerAvatarMovementDataInput.RightRingSpread;
m_fingerSpreads[9] = m_puppetMaster.PlayerAvatarMovementDataInput.RightPinkySpread;
} }
else
Reset(); Matrix4x4 l_current = this.transform.GetMatrix();
m_offset = m_matrix.inverse * l_current;
m_matrix = l_current;
} }
} }
void LateUpdate() void LateUpdate()
{ {
if(m_animator != null) if((m_animator != null) && (m_poseHandler != null))
{
m_poseHandler.GetHumanPose(ref m_pose); m_poseHandler.GetHumanPose(ref m_pose);
m_pose.bodyPosition *= m_armatureScale;
m_pose.bodyPosition.y += m_armatureHeight;
m_poseParsed = true;
}
} }
// Arbitrary
System.Collections.IEnumerator WaitForAnimator()
{
while(m_puppetMaster.avatarObject == null)
yield return null;
while(m_animator == null)
{
m_animator = m_puppetMaster.avatarObject.GetComponent<Animator>();
yield return null;
}
if(m_animator.isHuman)
{
m_cullMode = m_animator.cullingMode;
m_animator.cullingMode = AnimatorCullingMode.AlwaysAnimate;
Transform l_hips = m_animator.GetBoneTransform(HumanBodyBones.Hips);
if((l_hips != null) && (l_hips.parent != null))
{
m_armatureScale = l_hips.parent.localScale.y;
m_armatureHeight = ((m_puppetMaster.transform.GetMatrix().inverse * l_hips.parent.GetMatrix()) * ms_pointVector).y;
}
m_poseHandler = new HumanPoseHandler(m_animator.avatar, m_animator.transform);
m_matrix = this.transform.GetMatrix();
}
else
Reset();
m_waitAnimator = false;
}
void Reset()
{
m_animator = null;
m_poseHandler?.Dispose();
m_poseHandler = null;
m_pose = new HumanPose();
m_poseParsed = false;
m_offset = Matrix4x4.identity;
m_sitting = false;
m_leftGesture = 0f;
m_rightGesture = 0f;
}
public bool IsWaitingAnimator() => m_waitAnimator;
public bool HasAnimator() => !ReferenceEquals(m_animator, null);
public ref HumanPose GetPose() => ref m_pose; public ref HumanPose GetPose() => ref m_pose;
public bool IsPoseParsed() => m_poseParsed; public ref Matrix4x4 GetLastOffset() => ref m_offset;
public ref Matrix4x4 GetOffset() => ref m_offset;
public bool IsSitting() => m_sitting; public bool IsSitting() => m_sitting;
public float GetLeftGesture() => m_leftGesture; public float GetLeftGesture() => m_leftGesture;
public float GetRightGesture() => m_rightGesture; public float GetRightGesture() => m_rightGesture;
public bool HasFingerTracking() => m_fingerTracking; public bool HasFingerTracking() => m_fingerTracking;
public ref float[] GetFingerCurls() => ref m_fingerCurls; public ref float[] GetFingerCurls() => ref m_fingerCurls;
public ref float[] GetFingerSpreads() => ref m_fingerSpreads;
} }
} }

View file

@ -7,7 +7,7 @@
<Authors>SDraw</Authors> <Authors>SDraw</Authors>
<Company>None</Company> <Company>None</Company>
<Product>PlayerMovementCopycat</Product> <Product>PlayerMovementCopycat</Product>
<Version>1.0.1</Version> <Version>1.0.2</Version>
</PropertyGroup> </PropertyGroup>
<Target Name="PostBuild" AfterTargets="PostBuildEvent"> <Target Name="PostBuild" AfterTargets="PostBuildEvent">

View file

@ -1,6 +1,6 @@
using System.Reflection; using System.Reflection;
[assembly: MelonLoader.MelonInfo(typeof(ml_prm.PlayerRagdollMod), "PlayerRagdollMod", "1.0.6", "SDraw", "https://github.com/SDraw/ml_mods_cvr")] [assembly: MelonLoader.MelonInfo(typeof(ml_prm.PlayerRagdollMod), "PlayerRagdollMod", "1.0.7", "SDraw", "https://github.com/SDraw/ml_mods_cvr")]
[assembly: MelonLoader.MelonGame(null, "ChilloutVR")] [assembly: MelonLoader.MelonGame(null, "ChilloutVR")]
[assembly: MelonLoader.MelonPriority(2)] [assembly: MelonLoader.MelonPriority(2)]
[assembly: MelonLoader.MelonOptionalDependencies("BTKUILib")] [assembly: MelonLoader.MelonOptionalDependencies("BTKUILib")]

View file

@ -454,7 +454,12 @@ namespace ml_prm
if(MovementSystem.Instance.flying) if(MovementSystem.Instance.flying)
MovementSystem.Instance.ChangeFlight(false); MovementSystem.Instance.ChangeFlight(false);
bool l_crouch = MovementSystem.Instance.crouching;
bool l_prone = MovementSystem.Instance.prone;
MovementSystem.Instance.SetImmobilized(true); MovementSystem.Instance.SetImmobilized(true);
MovementSystem.Instance.ChangeCrouch(l_crouch);
MovementSystem.Instance.ChangeProne(l_prone);
PlayerSetup.Instance.animatorManager.SetAnimatorParameterTrigger("CancelEmote"); PlayerSetup.Instance.animatorManager.SetAnimatorParameterTrigger("CancelEmote");
m_ragdolledParameter.SetValue(true); m_ragdolledParameter.SetValue(true);
if(!BodySystem.isCalibrating) if(!BodySystem.isCalibrating)

View file

@ -4,7 +4,7 @@
<TargetFramework>netstandard2.1</TargetFramework> <TargetFramework>netstandard2.1</TargetFramework>
<Platforms>x64</Platforms> <Platforms>x64</Platforms>
<PackageId>PlayerRagdollMod</PackageId> <PackageId>PlayerRagdollMod</PackageId>
<Version>1.0.6</Version> <Version>1.0.7</Version>
<Authors>SDraw</Authors> <Authors>SDraw</Authors>
<Company>None</Company> <Company>None</Company>
<Product>PlayerRagdollMod</Product> <Product>PlayerRagdollMod</Product>