using UnityEngine; using System.Collections; namespace RootMotion.Dynamics { // Helper methods for BehaviourPuppet public partial class BehaviourPuppet : BehaviourBase { /// /// Determines whether this ragdoll is facing up (false) or down (true). /// public bool IsProne() { if (isQuadruped) { float qDot = Vector3.Dot(puppetMaster.muscles[0].transform.rotation * hipsUp, puppetMaster.targetRoot.right); return qDot > 0f; } float dot = Vector3.Dot(puppetMaster.muscles[0].transform.rotation * hipsForward, puppetMaster.targetRoot.up); return dot < 0f; } // Gets the falloff value of muscle 'i' according to its kinship degree from muscle 'muscleIndex' and the parent and child falloff values. private float GetFalloff(int i, int muscleIndex, float falloffParents, float falloffChildren) { if (i == muscleIndex) return 1f; bool isChild = puppetMaster.muscles[muscleIndex].childFlags[i]; int kinshipDegree = puppetMaster.muscles[muscleIndex].kinshipDegrees[i]; return Mathf.Pow(isChild? falloffChildren: falloffParents, kinshipDegree); } // Gets the falloff value of muscle 'i' according to its kinship degree from muscle 'muscleIndex' and the parent, child and group falloff values. private float GetFalloff(int i, int muscleIndex, float falloffParents, float falloffChildren, float falloffGroup) { float falloff = GetFalloff(i, muscleIndex, falloffParents, falloffChildren); if (falloffGroup > 0f && i != muscleIndex && InGroup(puppetMaster.muscles[i].props.group, puppetMaster.muscles[muscleIndex].props.group)) { falloff = Mathf.Max(falloff, falloffGroup); } return falloff; } // Returns true is the groups match directly OR in the group overrides. private bool InGroup(Muscle.Group group1, Muscle.Group group2) { if (group1 == group2) return true; foreach (MusclePropsGroup musclePropsGroup in groupOverrides) { foreach (Muscle.Group g in musclePropsGroup.groups) { if (g == group1) { foreach (Muscle.Group g2 in musclePropsGroup.groups) { if (g2 == group2) return true; } } } } return false; } // Returns the MusclePropsGroup of the specified muscle group. private MuscleProps GetProps(Muscle.Group group) { foreach (MusclePropsGroup g in groupOverrides) { foreach (Muscle.Group group2 in g.groups) { if (group2 == group) return g.props; } } return defaults; } } }