mirror of
https://github.com/hanetzer/sdraw_mods_cvr.git
synced 2025-09-03 18:39:23 +00:00
Minor code improvements
This commit is contained in:
parent
a2f9c1303e
commit
45557943c4
35 changed files with 557 additions and 835 deletions
|
@ -109,23 +109,25 @@ namespace ml_bft
|
|||
Utils.SetAvatarTPose();
|
||||
InputHandler.Instance.Rebind(PlayerSetup.Instance.transform.rotation);
|
||||
|
||||
// Try to "fix" rotations of fingers
|
||||
foreach(var l_tuple in ms_rotationFixChains)
|
||||
if(Settings.FixFingers)
|
||||
{
|
||||
ReorientateTowards(
|
||||
PlayerSetup.Instance._animator.GetBoneTransform(l_tuple.Item1),
|
||||
PlayerSetup.Instance._animator.GetBoneTransform(l_tuple.Item2),
|
||||
InputHandler.Instance.GetSourceForBone(l_tuple.Item1, l_tuple.Item3),
|
||||
InputHandler.Instance.GetSourceForBone(l_tuple.Item2, l_tuple.Item3),
|
||||
PlaneType.OXZ
|
||||
);
|
||||
ReorientateTowards(
|
||||
PlayerSetup.Instance._animator.GetBoneTransform(l_tuple.Item1),
|
||||
PlayerSetup.Instance._animator.GetBoneTransform(l_tuple.Item2),
|
||||
InputHandler.Instance.GetSourceForBone(l_tuple.Item1, l_tuple.Item3),
|
||||
InputHandler.Instance.GetSourceForBone(l_tuple.Item2, l_tuple.Item3),
|
||||
PlaneType.OYX
|
||||
);
|
||||
foreach(var l_tuple in ms_rotationFixChains)
|
||||
{
|
||||
ReorientateTowards(
|
||||
PlayerSetup.Instance._animator.GetBoneTransform(l_tuple.Item1),
|
||||
PlayerSetup.Instance._animator.GetBoneTransform(l_tuple.Item2),
|
||||
InputHandler.Instance.GetSourceForBone(l_tuple.Item1, l_tuple.Item3),
|
||||
InputHandler.Instance.GetSourceForBone(l_tuple.Item2, l_tuple.Item3),
|
||||
PlaneType.OXZ
|
||||
);
|
||||
ReorientateTowards(
|
||||
PlayerSetup.Instance._animator.GetBoneTransform(l_tuple.Item1),
|
||||
PlayerSetup.Instance._animator.GetBoneTransform(l_tuple.Item2),
|
||||
InputHandler.Instance.GetSourceForBone(l_tuple.Item1, l_tuple.Item3),
|
||||
InputHandler.Instance.GetSourceForBone(l_tuple.Item2, l_tuple.Item3),
|
||||
PlaneType.OYX
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
// Bind hands
|
||||
|
|
|
@ -1,59 +0,0 @@
|
|||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
|
||||
namespace ml_bft
|
||||
{
|
||||
class HandHandler
|
||||
{
|
||||
protected bool m_left = false;
|
||||
protected List<Transform> m_bones = null;
|
||||
protected List<Quaternion> m_localRotations = null;
|
||||
protected Transform m_prefabRoot = null;
|
||||
protected List<Renderer> m_renderers = null;
|
||||
|
||||
protected HandHandler(bool p_left)
|
||||
{
|
||||
m_left = p_left;
|
||||
m_bones = new List<Transform>();
|
||||
m_localRotations = new List<Quaternion>();
|
||||
m_renderers = new List<Renderer>();
|
||||
|
||||
Settings.OnShowHandsChanged.AddListener(this.OnShowHandsChanged);
|
||||
}
|
||||
|
||||
public virtual void Cleanup()
|
||||
{
|
||||
if(m_prefabRoot != null)
|
||||
Object.Destroy(m_prefabRoot.gameObject);
|
||||
m_prefabRoot = null;
|
||||
|
||||
m_bones.Clear();
|
||||
m_localRotations.Clear();
|
||||
m_renderers.Clear();
|
||||
|
||||
Settings.OnShowHandsChanged.RemoveListener(this.OnShowHandsChanged);
|
||||
}
|
||||
|
||||
public virtual void Update()
|
||||
{
|
||||
}
|
||||
|
||||
public virtual Transform GetSourceForBone(HumanBodyBones p_bone)
|
||||
{
|
||||
return default;
|
||||
}
|
||||
|
||||
public virtual void Rebind(Quaternion p_base)
|
||||
{
|
||||
}
|
||||
|
||||
protected void OnShowHandsChanged(bool p_state)
|
||||
{
|
||||
foreach(var l_render in m_renderers)
|
||||
{
|
||||
if(l_render != null)
|
||||
l_render.enabled = p_state;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,17 +1,29 @@
|
|||
using UnityEngine;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
using Valve.VR;
|
||||
|
||||
namespace ml_bft
|
||||
{
|
||||
class HandHandlerVR : HandHandler
|
||||
class HandHandlerVR
|
||||
{
|
||||
// 31 bones in each hand, get index at Valve.VR.SteamVR_Skeleton_JointIndexes or SteamVR_Skeleton_JointIndexEnum
|
||||
const int c_fingerBonesCount = (int)SteamVR_Skeleton_JointIndexEnum.pinkyAux + 1;
|
||||
|
||||
bool m_left = false;
|
||||
readonly List<Transform> m_bones = null;
|
||||
readonly List<Quaternion> m_localRotations = null;
|
||||
Transform m_prefabRoot = null;
|
||||
readonly List<Renderer> m_renderers = null;
|
||||
|
||||
SteamVR_Action_Skeleton m_skeletonAction;
|
||||
|
||||
public HandHandlerVR(Transform p_root, bool p_left) : base(p_left)
|
||||
public HandHandlerVR(Transform p_root, bool p_left)
|
||||
{
|
||||
m_left = p_left;
|
||||
m_bones = new List<Transform>();
|
||||
m_localRotations = new List<Quaternion>();
|
||||
m_renderers = new List<Renderer>();
|
||||
|
||||
for(int i = 0; i < c_fingerBonesCount; i++)
|
||||
{
|
||||
m_bones.Add(null);
|
||||
|
@ -75,22 +87,30 @@ namespace ml_bft
|
|||
|
||||
m_skeletonAction = SteamVR_Input.GetAction<SteamVR_Action_Skeleton>(p_left ? "SkeletonLeftHand" : "SkeletonRightHand");
|
||||
|
||||
base.OnShowHandsChanged(Settings.ShowHands);
|
||||
OnShowHandsChanged(Settings.ShowHands);
|
||||
OnMotionRangeChanged(Settings.MotionRange);
|
||||
|
||||
Settings.OnShowHandsChanged.AddListener(this.OnShowHandsChanged);
|
||||
Settings.OnMotionRangeChanged.AddListener(this.OnMotionRangeChanged);
|
||||
}
|
||||
|
||||
public override void Cleanup()
|
||||
public void Cleanup()
|
||||
{
|
||||
base.Cleanup();
|
||||
if(m_prefabRoot != null)
|
||||
Object.Destroy(m_prefabRoot.gameObject);
|
||||
m_prefabRoot = null;
|
||||
|
||||
m_bones.Clear();
|
||||
m_localRotations.Clear();
|
||||
m_renderers.Clear();
|
||||
|
||||
m_skeletonAction = null;
|
||||
|
||||
Settings.OnShowHandsChanged.RemoveListener(this.OnShowHandsChanged);
|
||||
Settings.OnMotionRangeChanged.RemoveListener(this.OnMotionRangeChanged);
|
||||
}
|
||||
|
||||
public override void Update()
|
||||
public void Update()
|
||||
{
|
||||
if(m_skeletonAction != null)
|
||||
{
|
||||
|
@ -107,7 +127,7 @@ namespace ml_bft
|
|||
}
|
||||
}
|
||||
|
||||
public override Transform GetSourceForBone(HumanBodyBones p_bone)
|
||||
public Transform GetSourceForBone(HumanBodyBones p_bone)
|
||||
{
|
||||
Transform l_result = null;
|
||||
switch(p_bone)
|
||||
|
@ -221,7 +241,7 @@ namespace ml_bft
|
|||
return l_result;
|
||||
}
|
||||
|
||||
public override void Rebind(Quaternion p_base)
|
||||
public void Rebind(Quaternion p_base)
|
||||
{
|
||||
for(int i = 0; i < c_fingerBonesCount; i++)
|
||||
{
|
||||
|
@ -233,6 +253,16 @@ namespace ml_bft
|
|||
m_bones[(int)SteamVR_Skeleton_JointIndexEnum.root].rotation = p_base * (m_left ? Quaternion.Euler(0f, -90f, -90f) : Quaternion.Euler(0f, 90f, 90f));
|
||||
}
|
||||
|
||||
// Settings
|
||||
void OnShowHandsChanged(bool p_state)
|
||||
{
|
||||
foreach(var l_render in m_renderers)
|
||||
{
|
||||
if(l_render != null)
|
||||
l_render.enabled = p_state;
|
||||
}
|
||||
}
|
||||
|
||||
void OnMotionRangeChanged(Settings.MotionRangeType p_mode)
|
||||
{
|
||||
switch(p_mode)
|
||||
|
|
|
@ -1,229 +0,0 @@
|
|||
using UnityEngine;
|
||||
using UnityEngine.XR.OpenXR;
|
||||
using UnityEngine.XR.Hands;
|
||||
using UnityEngine.XR;
|
||||
|
||||
namespace ml_bft
|
||||
{
|
||||
class HandHandlerXR : HandHandler
|
||||
{
|
||||
// 26 bones, get in XRHandJointID enum
|
||||
const int c_fingerBonesCount = (int)XRHandJointID.EndMarker - 1;
|
||||
|
||||
public HandHandlerXR(Transform p_root, bool p_left) : base(p_left)
|
||||
{
|
||||
for(int i = 0; i < c_fingerBonesCount; i++)
|
||||
{
|
||||
m_bones.Add(null);
|
||||
m_localRotations.Add(Quaternion.identity);
|
||||
}
|
||||
|
||||
m_prefabRoot = AssetsHandler.GetAsset(string.Format("Assets/OpenXR/Models/{0}Hand_IK.prefab", m_left ? "Left" : "Right")).transform;
|
||||
m_prefabRoot.name = "[FingersTracking_XR]";
|
||||
m_prefabRoot.parent = p_root;
|
||||
m_prefabRoot.localPosition = Vector3.zero;
|
||||
m_prefabRoot.localRotation = Quaternion.identity;
|
||||
|
||||
m_prefabRoot.GetComponentsInChildren(true, m_renderers);
|
||||
|
||||
// Ah yes, the stupid code
|
||||
char l_side = (m_left ? 'L' : 'R');
|
||||
m_bones[(int)XRHandJointID.Wrist - 1] = m_prefabRoot.Find(string.Format("{0}_Wrist", l_side));
|
||||
m_bones[(int)XRHandJointID.Palm - 1] = m_prefabRoot.Find(string.Format("{0}_Wrist/{0}_Palm", l_side));
|
||||
|
||||
m_bones[(int)XRHandJointID.ThumbMetacarpal - 1] = m_prefabRoot.Find(string.Format("{0}_Wrist/{0}_ThumbMetacarpal", l_side));
|
||||
m_bones[(int)XRHandJointID.ThumbProximal - 1] = m_prefabRoot.Find(string.Format("{0}_Wrist/{0}_ThumbMetacarpal/{0}_Wrist/{0}_ThumbProximal", l_side));
|
||||
m_bones[(int)XRHandJointID.ThumbDistal - 1] = m_prefabRoot.Find(string.Format("{0}_Wrist/{0}_ThumbMetacarpal/{0}_Wrist/{0}_ThumbProximal/{0}_ThumbDistal", l_side));
|
||||
m_bones[(int)XRHandJointID.ThumbTip - 1] = m_prefabRoot.Find(string.Format("{0}_Wrist/{0}_ThumbMetacarpal/{0}_Wrist/{0}_ThumbProximal/{0}_ThumbDistal/{0}_ThumbTip", l_side));
|
||||
m_bones[(int)XRHandJointID.IndexMetacarpal - 1] = m_prefabRoot.Find(string.Format("{0}_Wrist/{0}_IndexMetacarpal", l_side));
|
||||
m_bones[(int)XRHandJointID.IndexProximal - 1] = m_prefabRoot.Find(string.Format("{0}_Wrist/{0}_IndexMetacarpal/{0}_IndexProximal", l_side));
|
||||
m_bones[(int)XRHandJointID.IndexIntermediate - 1] = m_prefabRoot.Find(string.Format("{0}_Wrist/{0}_IndexMetacarpal/{0}_IndexProximal/{0}_IndexIntermediate", l_side));
|
||||
m_bones[(int)XRHandJointID.IndexDistal - 1] = m_prefabRoot.Find(string.Format("{0}_Wrist/{0}_IndexMetacarpal/{0}_IndexProximal/{0}_IndexIntermediate/{0}_IndexDistal", l_side));
|
||||
m_bones[(int)XRHandJointID.IndexTip - 1] = m_prefabRoot.Find(string.Format("{0}_Wrist/{0}_IndexMetacarpal/{0}_IndexProximal/{0}_IndexIntermediate/{0}_IndexDistal/{0}_IndexTip", l_side));
|
||||
|
||||
m_bones[(int)XRHandJointID.MiddleMetacarpal - 1] = m_prefabRoot.Find(string.Format("{0}_Wrist/{0}_MiddleMetacarpal", l_side));
|
||||
m_bones[(int)XRHandJointID.MiddleProximal - 1] = m_prefabRoot.Find(string.Format("{0}_Wrist/{0}_MiddleMetacarpal/{0}_MiddleProximal", l_side));
|
||||
m_bones[(int)XRHandJointID.MiddleIntermediate - 1] = m_prefabRoot.Find(string.Format("{0}_Wrist/{0}_MiddleMetacarpal/{0}_MiddleProximal/{0}_MiddleIntermediate", l_side));
|
||||
m_bones[(int)XRHandJointID.MiddleDistal - 1] = m_prefabRoot.Find(string.Format("{0}_Wrist/{0}_MiddleMetacarpal/{0}_MiddleProximal/{0}_MiddleIntermediate/{0}_MiddleDistal", l_side));
|
||||
m_bones[(int)XRHandJointID.MiddleTip - 1] = m_prefabRoot.Find(string.Format("{0}_Wrist/{0}_MiddleMetacarpal/{0}_MiddleProximal/{0}_MiddleIntermediate/{0}_MiddleDistal/{0}_MiddleTip", l_side));
|
||||
|
||||
m_bones[(int)XRHandJointID.RingMetacarpal - 1] = m_prefabRoot.Find(string.Format("{0}_Wrist/{0}_RingMetacarpal", l_side));
|
||||
m_bones[(int)XRHandJointID.RingProximal - 1] = m_prefabRoot.Find(string.Format("{0}_Wrist/{0}_RingMetacarpal/{0}_RingProximal", l_side));
|
||||
m_bones[(int)XRHandJointID.RingIntermediate - 1] = m_prefabRoot.Find(string.Format("{0}_Wrist/{0}_RingMetacarpal/{0}_RingProximal/{0}_RingIntermediate", l_side));
|
||||
m_bones[(int)XRHandJointID.RingDistal - 1] = m_prefabRoot.Find(string.Format("{0}_Wrist/{0}_RingMetacarpal/{0}_RingProximal/{0}_RingIntermediate/{0}_RingDistal", l_side));
|
||||
m_bones[(int)XRHandJointID.RingTip - 1] = m_prefabRoot.Find(string.Format("{0}_Wrist/{0}_RingMetacarpal/{0}_RingProximal/{0}_RingIntermediate/{0}_RingDistal/{0}_RingTip", l_side));
|
||||
|
||||
m_bones[(int)XRHandJointID.LittleMetacarpal - 1] = m_prefabRoot.Find(string.Format("{0}_Wrist/{0}_LittleMetacarpal", l_side));
|
||||
m_bones[(int)XRHandJointID.LittleProximal - 1] = m_prefabRoot.Find(string.Format("{0}_Wrist/{0}_LittleMetacarpal/{0}_LittleProximal", l_side));
|
||||
m_bones[(int)XRHandJointID.LittleIntermediate - 1] = m_prefabRoot.Find(string.Format("{0}_Wrist/{0}_LittleMetacarpal/{0}_LittleProximal/{0}_LittleIntermediate", l_side));
|
||||
m_bones[(int)XRHandJointID.LittleDistal - 1] = m_prefabRoot.Find(string.Format("{0}_Wrist/{0}_LittleMetacarpal/{0}_LittleProximal/{0}_LittleIntermediate/{0}_LittleDistal", l_side));
|
||||
m_bones[(int)XRHandJointID.LittleTip - 1] = m_prefabRoot.Find(string.Format("{0}_Wrist/{0}_LittleMetacarpal/{0}_LittleProximal/{0}_LittleIntermediate/{0}_LittleDistal/{0}_LittleTip", l_side));
|
||||
|
||||
for(int i = 0; i < c_fingerBonesCount; i++)
|
||||
{
|
||||
if(m_bones[i] != null)
|
||||
m_localRotations[i] = m_bones[i].localRotation;
|
||||
}
|
||||
|
||||
base.OnShowHandsChanged(Settings.ShowHands);
|
||||
}
|
||||
|
||||
public override Transform GetSourceForBone(HumanBodyBones p_bone)
|
||||
{
|
||||
Transform l_result = null;
|
||||
if(m_left)
|
||||
{
|
||||
switch(p_bone)
|
||||
{
|
||||
case HumanBodyBones.LeftHand:
|
||||
l_result = m_bones[(int)XRHandJointID.Wrist - 1];
|
||||
break;
|
||||
case HumanBodyBones.LeftThumbProximal:
|
||||
l_result = m_bones[(int)XRHandJointID.ThumbMetacarpal - 1];
|
||||
break;
|
||||
case HumanBodyBones.LeftThumbIntermediate:
|
||||
l_result = m_bones[(int)XRHandJointID.ThumbProximal - 1];
|
||||
break;
|
||||
case HumanBodyBones.LeftThumbDistal:
|
||||
l_result = m_bones[(int)XRHandJointID.ThumbDistal - 1];
|
||||
break;
|
||||
|
||||
case HumanBodyBones.LeftIndexProximal:
|
||||
l_result = m_bones[(int)XRHandJointID.IndexProximal - 1];
|
||||
break;
|
||||
case HumanBodyBones.LeftIndexIntermediate:
|
||||
l_result = m_bones[(int)XRHandJointID.IndexIntermediate - 1];
|
||||
break;
|
||||
case HumanBodyBones.LeftIndexDistal:
|
||||
l_result = m_bones[(int)XRHandJointID.IndexDistal - 1];
|
||||
break;
|
||||
|
||||
case HumanBodyBones.LeftMiddleProximal:
|
||||
l_result = m_bones[(int)XRHandJointID.MiddleProximal - 1];
|
||||
break;
|
||||
case HumanBodyBones.LeftMiddleIntermediate:
|
||||
l_result = m_bones[(int)XRHandJointID.MiddleIntermediate - 1];
|
||||
break;
|
||||
case HumanBodyBones.LeftMiddleDistal:
|
||||
l_result = m_bones[(int)XRHandJointID.MiddleDistal - 1];
|
||||
break;
|
||||
|
||||
case HumanBodyBones.LeftRingProximal:
|
||||
l_result = m_bones[(int)XRHandJointID.RingProximal - 1];
|
||||
break;
|
||||
case HumanBodyBones.LeftRingIntermediate:
|
||||
l_result = m_bones[(int)XRHandJointID.RingIntermediate - 1];
|
||||
break;
|
||||
case HumanBodyBones.LeftRingDistal:
|
||||
l_result = m_bones[(int)XRHandJointID.RingDistal - 1];
|
||||
break;
|
||||
|
||||
case HumanBodyBones.LeftLittleProximal:
|
||||
l_result = m_bones[(int)XRHandJointID.LittleProximal - 1];
|
||||
break;
|
||||
case HumanBodyBones.LeftLittleIntermediate:
|
||||
l_result = m_bones[(int)XRHandJointID.LittleIntermediate - 1];
|
||||
break;
|
||||
case HumanBodyBones.LeftLittleDistal:
|
||||
l_result = m_bones[(int)XRHandJointID.LittleDistal - 1];
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
switch(p_bone)
|
||||
{
|
||||
case HumanBodyBones.RightHand:
|
||||
l_result = m_bones[(int)XRHandJointID.Wrist - 1];
|
||||
break;
|
||||
case HumanBodyBones.RightThumbProximal:
|
||||
l_result = m_bones[(int)XRHandJointID.ThumbMetacarpal - 1];
|
||||
break;
|
||||
case HumanBodyBones.RightThumbIntermediate:
|
||||
l_result = m_bones[(int)XRHandJointID.ThumbProximal - 1];
|
||||
break;
|
||||
case HumanBodyBones.RightThumbDistal:
|
||||
l_result = m_bones[(int)XRHandJointID.ThumbDistal - 1];
|
||||
break;
|
||||
|
||||
case HumanBodyBones.RightIndexProximal:
|
||||
l_result = m_bones[(int)XRHandJointID.IndexProximal - 1];
|
||||
break;
|
||||
case HumanBodyBones.RightIndexIntermediate:
|
||||
l_result = m_bones[(int)XRHandJointID.IndexIntermediate - 1];
|
||||
break;
|
||||
case HumanBodyBones.RightIndexDistal:
|
||||
l_result = m_bones[(int)XRHandJointID.IndexDistal - 1];
|
||||
break;
|
||||
|
||||
case HumanBodyBones.RightMiddleProximal:
|
||||
l_result = m_bones[(int)XRHandJointID.MiddleProximal - 1];
|
||||
break;
|
||||
case HumanBodyBones.RightMiddleIntermediate:
|
||||
l_result = m_bones[(int)XRHandJointID.MiddleIntermediate - 1];
|
||||
break;
|
||||
case HumanBodyBones.RightMiddleDistal:
|
||||
l_result = m_bones[(int)XRHandJointID.MiddleDistal - 1];
|
||||
break;
|
||||
|
||||
case HumanBodyBones.RightRingProximal:
|
||||
l_result = m_bones[(int)XRHandJointID.RingProximal - 1];
|
||||
break;
|
||||
case HumanBodyBones.RightRingIntermediate:
|
||||
l_result = m_bones[(int)XRHandJointID.RingIntermediate - 1];
|
||||
break;
|
||||
case HumanBodyBones.RightRingDistal:
|
||||
l_result = m_bones[(int)XRHandJointID.RingDistal - 1];
|
||||
break;
|
||||
|
||||
case HumanBodyBones.RightLittleProximal:
|
||||
l_result = m_bones[(int)XRHandJointID.LittleProximal - 1];
|
||||
break;
|
||||
case HumanBodyBones.RightLittleIntermediate:
|
||||
l_result = m_bones[(int)XRHandJointID.LittleIntermediate - 1];
|
||||
break;
|
||||
case HumanBodyBones.RightLittleDistal:
|
||||
l_result = m_bones[(int)XRHandJointID.LittleDistal - 1];
|
||||
break;
|
||||
}
|
||||
}
|
||||
return l_result;
|
||||
}
|
||||
|
||||
public override void Update()
|
||||
{
|
||||
var l_tracking = OpenXRSettings.Instance.GetFeature<HandTrackingFeature>();
|
||||
var l_device = InputDevices.GetDeviceAtXRNode(m_left ? XRNode.LeftHand : XRNode.RightHand);
|
||||
if((l_device != null) && l_device.TryGetFeatureValue(CommonUsages.deviceRotation, out Quaternion l_deviceRot) && (l_tracking != null))
|
||||
{
|
||||
Quaternion l_handInv = Quaternion.Inverse(l_deviceRot);
|
||||
l_tracking.GetHandJoints(m_left ? HandTrackingFeature.Hand_Index.L : HandTrackingFeature.Hand_Index.R, out var l_positions, out var l_rotations, out _);
|
||||
if(l_positions.Length >= c_fingerBonesCount)
|
||||
{
|
||||
// Joints rotations are in global space, locations are in ... space??? ... wth is wrong with OpenXR?
|
||||
Quaternion l_prefabRot = m_prefabRoot.rotation;
|
||||
for(int i = 0; i < c_fingerBonesCount; i++)
|
||||
{
|
||||
if(m_bones[i] != null)
|
||||
{
|
||||
//m_bones[i].localPosition = l_positions[i];
|
||||
m_bones[i].rotation = l_prefabRot * (l_handInv * l_rotations[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public override void Rebind(Quaternion p_base)
|
||||
{
|
||||
for(int i = 0; i < c_fingerBonesCount; i++)
|
||||
{
|
||||
if(m_bones[i] != null)
|
||||
m_bones[i].localRotation = m_localRotations[i];
|
||||
}
|
||||
|
||||
if(m_bones[(int)XRHandJointID.Wrist - 1] != null)
|
||||
m_bones[(int)XRHandJointID.Wrist - 1].rotation = p_base * (m_left ? Quaternion.Euler(0f, -90f, 0f) : Quaternion.Euler(0f, 90f, 0f));
|
||||
}
|
||||
}
|
||||
}
|
|
@ -12,8 +12,8 @@ namespace ml_bft
|
|||
|
||||
bool m_active = false;
|
||||
|
||||
HandHandler m_leftHandHandler = null;
|
||||
HandHandler m_rightHandHandler = null;
|
||||
HandHandlerVR m_leftHandHandler = null;
|
||||
HandHandlerVR m_rightHandHandler = null;
|
||||
|
||||
internal InputHandler()
|
||||
{
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
[assembly: MelonLoader.MelonInfo(typeof(ml_bft.BetterFingersTracking), "BetterFingersTracking", "1.0.4", "SDraw", "https://github.com/SDraw/ml_mods_cvr")]
|
||||
[assembly: MelonLoader.MelonInfo(typeof(ml_bft.BetterFingersTracking), "BetterFingersTracking", "1.0.5", "SDraw", "https://github.com/SDraw/ml_mods_cvr")]
|
||||
[assembly: MelonLoader.MelonGame(null, "ChilloutVR")]
|
||||
[assembly: MelonLoader.MelonPlatform(MelonLoader.MelonPlatformAttribute.CompatiblePlatforms.WINDOWS_X64)]
|
||||
[assembly: MelonLoader.MelonPlatformDomain(MelonLoader.MelonPlatformDomainAttribute.CompatibleDomains.MONO)]
|
||||
|
|
|
@ -4,7 +4,7 @@ Mod that overhauls behaviour of fingers tracking.
|
|||
# Installation
|
||||
* Install [latest MelonLoader](https://github.com/LavaGang/MelonLoader)
|
||||
* Get [latest release DLL](../../../releases/latest):
|
||||
* Put `ml_bft.dll` in `Mods` folder of game
|
||||
* Put `BetterFingersTracking.dll` in `Mods` folder of game
|
||||
|
||||
# Usage
|
||||
Available mod's settings in `Settings - Input & Key-Bindings - Better Fingers Tracking`:
|
||||
|
@ -13,6 +13,7 @@ Available mod's settings in `Settings - Input & Key-Bindings - Better Fingers Tr
|
|||
* **Filter humanoid limits:** Limits fingers rotations to be valid for Unity's Mechanim; `true` by default
|
||||
* Note: Enabling this option ensures that visual representation of your fingers will be same for you and remote players, but it cancels out additional finger segments rotations that can be better visually in most cases.
|
||||
* **Show hands model:** shows transparent hands model (mostly as debug option); `false` by default
|
||||
* **Change fingers direction at bind:** tries to allign avatar's fingers for more accurate poses
|
||||
|
||||
# Notes
|
||||
* Currently supports only SteamVR environment, OpenXR support is planned.
|
||||
|
|
|
@ -24,13 +24,15 @@ namespace ml_bft
|
|||
SkeletalInput = 0,
|
||||
MotionRange,
|
||||
ShowHands,
|
||||
MechanimFilter
|
||||
MechanimFilter,
|
||||
FixFingers
|
||||
}
|
||||
|
||||
public static bool SkeletalInput { get; private set; } = false;
|
||||
public static MotionRangeType MotionRange { get; private set; } = MotionRangeType.WithController;
|
||||
public static bool ShowHands { get; private set; } = false;
|
||||
public static bool MechanimFilter { get; private set; } = true;
|
||||
public static bool FixFingers { get; private set; } = true;
|
||||
|
||||
static MelonLoader.MelonPreferences_Category ms_category = null;
|
||||
static List<MelonLoader.MelonPreferences_Entry> ms_entries = null;
|
||||
|
@ -39,6 +41,7 @@ namespace ml_bft
|
|||
public static readonly SettingEvent<MotionRangeType> OnMotionRangeChanged = new SettingEvent<MotionRangeType>();
|
||||
public static readonly SettingEvent<bool> OnShowHandsChanged = new SettingEvent<bool>();
|
||||
public static readonly SettingEvent<bool> OnMechanimFilterChanged = new SettingEvent<bool>();
|
||||
public static readonly SettingEvent<bool> OnFixFingersChanged = new SettingEvent<bool>();
|
||||
|
||||
internal static void Init()
|
||||
{
|
||||
|
@ -49,12 +52,14 @@ namespace ml_bft
|
|||
ms_category.CreateEntry(ModSetting.SkeletalInput.ToString(), SkeletalInput),
|
||||
ms_category.CreateEntry(ModSetting.MotionRange.ToString(), (int)MotionRange),
|
||||
ms_category.CreateEntry(ModSetting.ShowHands.ToString(), ShowHands),
|
||||
ms_category.CreateEntry(ModSetting.MechanimFilter.ToString(), MechanimFilter)
|
||||
ms_category.CreateEntry(ModSetting.MechanimFilter.ToString(), MechanimFilter),
|
||||
ms_category.CreateEntry(ModSetting.FixFingers.ToString(), FixFingers)
|
||||
};
|
||||
|
||||
SkeletalInput = (bool)ms_entries[(int)ModSetting.SkeletalInput].BoxedValue;
|
||||
MotionRange = (MotionRangeType)(int)ms_entries[(int)ModSetting.MotionRange].BoxedValue;
|
||||
ShowHands = (bool)ms_entries[(int)ModSetting.ShowHands].BoxedValue;
|
||||
FixFingers = (bool)ms_entries[(int)ModSetting.FixFingers].BoxedValue;
|
||||
|
||||
MelonLoader.MelonCoroutines.Start(WaitMainMenuUi());
|
||||
}
|
||||
|
@ -110,6 +115,13 @@ namespace ml_bft
|
|||
OnMechanimFilterChanged.Invoke(MechanimFilter);
|
||||
}
|
||||
break;
|
||||
|
||||
case ModSetting.FixFingers:
|
||||
{
|
||||
FixFingers = l_value;
|
||||
OnFixFingersChanged.Invoke(FixFingers);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
ms_entries[(int)l_setting].BoxedValue = l_value;
|
||||
|
|
|
@ -5,9 +5,10 @@
|
|||
<Platforms>x64</Platforms>
|
||||
<PackageId>BetterFingersTracking</PackageId>
|
||||
<Authors>SDraw</Authors>
|
||||
<Company>None</Company>
|
||||
<Company>SDraw</Company>
|
||||
<Product>BetterFingersTracking</Product>
|
||||
<Version>1.0.4</Version>
|
||||
<Version>1.0.5</Version>
|
||||
<AssemblyName>BetterFingersTracking</AssemblyName>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
|
@ -18,7 +19,6 @@
|
|||
<ItemGroup>
|
||||
<EmbeddedResource Include="resources\mod_menu.js" />
|
||||
<EmbeddedResource Include="resources\ovr_fingers.asset" />
|
||||
<EmbeddedResource Include="resources\oxr_fingers.asset" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
|
|
|
@ -19,6 +19,13 @@
|
|||
<div id="MotionRange" class ="inp_dropdown no-scroll" data-options="0:With controller,1:Without controller" data-current="0"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class ="row-wrapper">
|
||||
<div class ="option-caption">Change fingers direction at bind: </div>
|
||||
<div class ="option-input">
|
||||
<div id="FixFingers" class ="inp_toggle no-scroll" data-current="true"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class ="row-wrapper">
|
||||
<div class ="option-caption">Filter humanoid limits: </div>
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue