1+ using System ;
2+ using System . Linq ;
3+ using UnhollowerBaseLib ;
4+ using UnityEngine ;
5+
6+ namespace IKTweaks
7+ {
8+ internal class AnimationsHandler
9+ {
10+ private readonly Il2CppStructArray < float > myMuscles = new ( HumanTrait . MuscleCount ) ;
11+ private readonly HumanPoseHandler myPoseHandler ;
12+ private readonly Transform myHips ;
13+ private readonly CachedSolver mySolver ;
14+
15+ public AnimationsHandler ( HumanPoseHandler poseHandler , Transform hips , in CachedSolver solver )
16+ {
17+ myPoseHandler = poseHandler ;
18+ myHips = hips ;
19+ mySolver = solver ;
20+ }
21+
22+ internal void ResetBonePositions ( bool onlySpine , bool hasLegTargets )
23+ {
24+ if ( mySolver . Solver . IKPositionWeight < 0.9f ) return ;
25+
26+ myHips . get_position_Injected ( out var hipPos ) ;
27+ myHips . get_rotation_Injected ( out var hipRot ) ;
28+
29+ myPoseHandler . GetHumanPose ( out var bodyPos , out var bodyRot , myMuscles ) ;
30+
31+ for ( var i = 0 ; i < myMuscles . Count ; i ++ )
32+ {
33+ var currentMask = ourBoneResetMasks [ i ] ;
34+ if ( onlySpine && currentMask != BoneResetMask . Spine ) continue ;
35+ if ( ! hasLegTargets && ( currentMask == BoneResetMask . LeftLeg || currentMask == BoneResetMask . RightLeg ) ) continue ;
36+
37+ if ( IkTweaksSettings . IgnoreAnimationsModeParsed == IgnoreAnimationsMode . All )
38+ {
39+ myMuscles [ i ] *= currentMask == BoneResetMask . Never ? 1 : 0 ;
40+ continue ;
41+ }
42+
43+ switch ( currentMask )
44+ {
45+ case BoneResetMask . Never :
46+ break ;
47+ case BoneResetMask . Spine :
48+ myMuscles [ i ] *= 1 - mySolver . Spine . pelvisPositionWeight ;
49+ break ;
50+ case BoneResetMask . LeftArm :
51+ myMuscles [ i ] *= 1 - mySolver . LeftArm . positionWeight ;
52+ break ;
53+ case BoneResetMask . RightArm :
54+ myMuscles [ i ] *= 1 - mySolver . RightArm . positionWeight ;
55+ break ;
56+ case BoneResetMask . LeftLeg :
57+ myMuscles [ i ] *= 1 - mySolver . LeftLeg . positionWeight ;
58+ break ;
59+ case BoneResetMask . RightLeg :
60+ myMuscles [ i ] *= 1 - mySolver . RightLeg . positionWeight ;
61+ break ;
62+ default :
63+ throw new ArgumentOutOfRangeException ( ) ;
64+ }
65+ }
66+
67+ myPoseHandler . SetHumanPose ( ref bodyPos , ref bodyRot , myMuscles ) ;
68+
69+ myHips . position = hipPos ;
70+ myHips . rotation = hipRot ;
71+ }
72+
73+
74+ private enum BoneResetMask
75+ {
76+ Never ,
77+ Spine ,
78+ LeftArm ,
79+ RightArm ,
80+ LeftLeg ,
81+ RightLeg ,
82+ }
83+
84+ private static readonly string [ ] ourNeverBones = { "Index" , "Thumb" , "Middle" , "Ring" , "Little" , "Jaw" , "Eye" } ;
85+ private static readonly string [ ] ourArmBones = { "Arm" , "Forearm" , "Hand" , "Shoulder" } ;
86+ private static readonly string [ ] ourLegBones = { "Leg" , "Foot" , "Toes" } ;
87+
88+ private static BoneResetMask JudgeBone ( string name )
89+ {
90+ if ( ourNeverBones . Any ( name . Contains ) )
91+ return BoneResetMask . Never ;
92+
93+ if ( ourArmBones . Any ( name . Contains ) )
94+ {
95+ return name . Contains ( "Left" ) ? BoneResetMask . LeftArm : BoneResetMask . RightArm ;
96+ }
97+
98+ if ( ourLegBones . Any ( name . Contains ) )
99+ return name . Contains ( "Left" ) ? BoneResetMask . LeftLeg : BoneResetMask . RightLeg ;
100+
101+ return BoneResetMask . Spine ;
102+ }
103+
104+ private static readonly BoneResetMask [ ] ourBoneResetMasks = HumanTrait . MuscleName . Select ( JudgeBone ) . ToArray ( ) ;
105+ }
106+ }
0 commit comments