void _ComputeBaseHipsTransform()
{
Assert( internalValues != null );
if( bodyEffectors == null ) { // Note: bodyEffectors is public.
return;
}
Effector hipsEffector = bodyEffectors.hips;
if( hipsEffector == null || rootEffector == null ) {
return;
}
if( hipsEffector.rotationEnabled && hipsEffector.rotationWeight > IKEpsilon ) {
Quaternion hipsRotation = hipsEffector.worldRotation * Inverse( hipsEffector._defaultRotation );
if( hipsEffector.rotationWeight < 1.0f - IKEpsilon ) {
Quaternion rootRotation = rootEffector.worldRotation * Inverse( rootEffector._defaultRotation );
Quaternion tempRotation = Quaternion.Lerp( rootRotation, hipsRotation, hipsEffector.rotationWeight );
SAFBIKMatSetRot( out internalValues.baseHipsBasis, ref tempRotation );
} else {
SAFBIKMatSetRot( out internalValues.baseHipsBasis, ref hipsRotation );
}
} else {
Quaternion rootEffectorWorldRotation = rootEffector.worldRotation;
SAFBIKMatSetRotMultInv1( out internalValues.baseHipsBasis, ref rootEffectorWorldRotation, ref rootEffector._defaultRotation );
}
if( hipsEffector.positionEnabled && hipsEffector.positionWeight > IKEpsilon ) {
Vector3 hipsEffectorWorldPosition = hipsEffector.worldPosition;
SAFBIKMatMultVecPreSubAdd(
out internalValues.baseHipsPos,
ref internalValues.baseHipsBasis,
ref rootEffector._defaultPosition,
ref hipsEffector._defaultPosition,
ref hipsEffectorWorldPosition );
if( hipsEffector.positionWeight < 1.0f - IKEpsilon ) {
Vector3 rootEffectorWorldPosition = rootEffector.worldPosition;
Vector3 hipsPosition;
SAFBIKMatMultVecPreSubAdd(
out hipsPosition,
ref internalValues.baseHipsBasis,
ref hipsEffector._defaultPosition,
ref rootEffector._defaultPosition,
ref rootEffectorWorldPosition );
internalValues.baseHipsPos = Vector3.Lerp( hipsPosition, internalValues.baseHipsPos, hipsEffector.positionWeight );
}
} else {
Vector3 rootEffectorWorldPosition = rootEffector.worldPosition;
SAFBIKMatMultVecPreSubAdd(
out internalValues.baseHipsPos,
ref internalValues.baseHipsBasis,
ref hipsEffector._defaultPosition,
ref rootEffector._defaultPosition,
ref rootEffectorWorldPosition );
}
}