holopy3/Assets/Plugins/RootMotion/FinalIK/IK Solvers/IKMappingBone.cs
2020-12-10 15:25:12 +01:00

78 lines
1.6 KiB
C#

using UnityEngine;
using System.Collections;
namespace RootMotion.FinalIK {
/// <summary>
/// Maps a single bone to a node in %IK Solver
/// </summary>
[System.Serializable]
public class IKMappingBone: IKMapping {
#region Main Interface
/// <summary>
/// The bone transform.
/// </summary>
public Transform bone;
/// <summary>
/// The weight of maintaining the bone's rotation after solver has finished.
/// </summary>
[Range(0f, 1f)]
public float maintainRotationWeight = 1f;
/// <summary>
/// Determines whether this IKMappingBone is valid.
/// </summary>
public override bool IsValid(IKSolver solver, ref string message) {
if (!base.IsValid(solver, ref message)) return false;
if (bone == null) {
message = "IKMappingBone's bone is null.";
return false;
}
return true;
}
#endregion Main Interface
private BoneMap boneMap = new BoneMap();
public IKMappingBone() {}
public IKMappingBone(Transform bone) {
this.bone = bone;
}
public void StoreDefaultLocalState() {
boneMap.StoreDefaultLocalState();
}
public void FixTransforms() {
boneMap.FixTransform(false);
}
/*
* Initiating and setting defaults
* */
public override void Initiate(IKSolverFullBody solver) {
if (boneMap == null) boneMap = new BoneMap();
boneMap.Initiate(bone, solver);
}
/*
* Pre-solving
* */
public void ReadPose() {
boneMap.MaintainRotation();
}
public void WritePose(float solverWeight) {
// Rotating back to the last maintained rotation
boneMap.RotateToMaintain(solverWeight * maintainRotationWeight);
}
}
}