223 lines
6.6 KiB
C++
223 lines
6.6 KiB
C++
![]() |
//
|
||
|
// ik/IkRequest.cpp
|
||
|
//
|
||
|
// Copyright (C) 1999-2012 Rockstar Games. All Rights Reserved.
|
||
|
//
|
||
|
|
||
|
#include "IkRequest.h"
|
||
|
|
||
|
#include "IkManager.h"
|
||
|
#include "scene/Entity.h"
|
||
|
|
||
|
ANIM_OPTIMISATIONS();
|
||
|
|
||
|
///////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
CIkRequestBodyLook::CIkRequestBodyLook()
|
||
|
: m_qHeadNeckAdditive(V_IDENTITY)
|
||
|
, m_vTargetOffset(V_ZERO_WONE)
|
||
|
, m_pTargetEntity(NULL)
|
||
|
, m_eTargetBoneTag(BONETAG_INVALID)
|
||
|
, m_uFlags(0)
|
||
|
, m_sLookAtFlags(-1)
|
||
|
, m_uHashKey(0)
|
||
|
, m_uHoldTimeMs(0)
|
||
|
, m_sRequestPriority((s16)CIkManager::IK_LOOKAT_MEDIUM)
|
||
|
, m_fHeadNeckAdditiveRatio(1.0f)
|
||
|
, m_bInstant(false)
|
||
|
{
|
||
|
Default();
|
||
|
}
|
||
|
|
||
|
CIkRequestBodyLook::CIkRequestBodyLook(const CEntity* pTargetEntity,
|
||
|
eAnimBoneTag eTargetBoneTag,
|
||
|
Vec3V_In vTargetOffset,
|
||
|
u32 uFlags,
|
||
|
s32 sRequestPriority,
|
||
|
u32 uHashKey)
|
||
|
: m_qHeadNeckAdditive(V_IDENTITY)
|
||
|
, m_vTargetOffset(vTargetOffset)
|
||
|
, m_pTargetEntity(pTargetEntity)
|
||
|
, m_eTargetBoneTag(eTargetBoneTag)
|
||
|
, m_uFlags(uFlags)
|
||
|
, m_sLookAtFlags(-1)
|
||
|
, m_uHashKey(uHashKey)
|
||
|
, m_uHoldTimeMs(0)
|
||
|
, m_sRequestPriority((s16)sRequestPriority)
|
||
|
, m_fHeadNeckAdditiveRatio(1.0f)
|
||
|
, m_bInstant(false)
|
||
|
{
|
||
|
animAssertf(IsFiniteAll(vTargetOffset), "Invalid target offset for look request (%8.3f %8.3f %8.3f)", vTargetOffset.GetXf(), vTargetOffset.GetYf(), vTargetOffset.GetZf());
|
||
|
|
||
|
Default();
|
||
|
}
|
||
|
|
||
|
void CIkRequestBodyLook::SetHeadNeckAdditiveRatio(float fRatio)
|
||
|
{
|
||
|
m_fHeadNeckAdditiveRatio = Clamp(fRatio, 0.0f, 1.0f);
|
||
|
}
|
||
|
|
||
|
void CIkRequestBodyLook::SetTargetOffset(Vec3V_In vTargetOffset)
|
||
|
{
|
||
|
animAssertf(IsFiniteAll(vTargetOffset), "Invalid target offset for look request (%8.3f %8.3f %8.3f)", vTargetOffset.GetXf(), vTargetOffset.GetYf(), vTargetOffset.GetZf());
|
||
|
m_vTargetOffset = vTargetOffset;
|
||
|
}
|
||
|
|
||
|
void CIkRequestBodyLook::Default()
|
||
|
{
|
||
|
m_uRefDirTorso = LOOKIK_REF_DIR_ABSOLUTE;
|
||
|
m_uRefDirNeck = LOOKIK_REF_DIR_ABSOLUTE;
|
||
|
m_uRefDirHead = LOOKIK_REF_DIR_ABSOLUTE;
|
||
|
m_uRefDirEye = LOOKIK_REF_DIR_ABSOLUTE;
|
||
|
|
||
|
m_uTurnRate = LOOKIK_TURN_RATE_NORMAL;
|
||
|
m_uBlendInRate = LOOKIK_BLEND_RATE_NORMAL;
|
||
|
m_uBlendOutRate = LOOKIK_BLEND_RATE_NORMAL;
|
||
|
|
||
|
m_uHeadAttitude = LOOKIK_HEAD_ATT_FULL;
|
||
|
memset(m_auRotLim, 0, 3 * LOOKIK_ROT_ANGLE_NUM);
|
||
|
|
||
|
// Default head component to wide limits
|
||
|
m_auRotLim[2][0] = LOOKIK_ROT_LIM_WIDE;
|
||
|
m_auRotLim[2][1] = LOOKIK_ROT_LIM_WIDE;
|
||
|
|
||
|
m_auArmComp[0] = LOOKIK_ARM_COMP_OFF;
|
||
|
m_auArmComp[1] = LOOKIK_ARM_COMP_OFF;
|
||
|
}
|
||
|
|
||
|
///////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
CIkRequestArm::CIkRequestArm()
|
||
|
: m_vTargetOffset(V_ZERO)
|
||
|
, m_qTargetRotation(V_IDENTITY)
|
||
|
, m_qAdditive(V_IDENTITY)
|
||
|
, m_pTargetEntity(NULL)
|
||
|
, m_eTargetBoneTag(BONETAG_INVALID)
|
||
|
, m_fBlendInRange(0.0f)
|
||
|
, m_fBlendOutRange(0.0f)
|
||
|
, m_uFlags(0)
|
||
|
, m_uArm(IK_ARM_RIGHT)
|
||
|
{
|
||
|
Default();
|
||
|
}
|
||
|
|
||
|
CIkRequestArm::CIkRequestArm(IkArm eArm, const CEntity* pTargetEntity, eAnimBoneTag eTargetBoneTag, Vec3V_In vTargetOffset, u32 uFlags)
|
||
|
: m_vTargetOffset(vTargetOffset)
|
||
|
, m_qTargetRotation(V_IDENTITY)
|
||
|
, m_qAdditive(V_IDENTITY)
|
||
|
, m_pTargetEntity(pTargetEntity)
|
||
|
, m_eTargetBoneTag(eTargetBoneTag)
|
||
|
, m_fBlendInRange(0.0f)
|
||
|
, m_fBlendOutRange(0.0f)
|
||
|
, m_uFlags(uFlags)
|
||
|
, m_uArm((u8)eArm)
|
||
|
{
|
||
|
animAssertf(IsFiniteAll(vTargetOffset), "Invalid target offset for arm request (%8.3f %8.3f %8.3f)", vTargetOffset.GetXf(), vTargetOffset.GetYf(), vTargetOffset.GetZf());
|
||
|
|
||
|
Default();
|
||
|
}
|
||
|
|
||
|
CIkRequestArm::CIkRequestArm(IkArm eArm, const CEntity* pTargetEntity, eAnimBoneTag eTargetBoneTag, Vec3V_In vTargetOffset, QuatV_In qTargetRotation, u32 uFlags)
|
||
|
: m_vTargetOffset(vTargetOffset)
|
||
|
, m_qTargetRotation(qTargetRotation)
|
||
|
, m_qAdditive(V_IDENTITY)
|
||
|
, m_pTargetEntity(pTargetEntity)
|
||
|
, m_eTargetBoneTag(eTargetBoneTag)
|
||
|
, m_fBlendInRange(0.0f)
|
||
|
, m_fBlendOutRange(0.0f)
|
||
|
, m_uFlags(uFlags)
|
||
|
, m_uArm((u8)eArm)
|
||
|
{
|
||
|
animAssertf(IsFiniteAll(vTargetOffset), "Invalid target offset for arm request (%8.3f %8.3f %8.3f)", vTargetOffset.GetXf(), vTargetOffset.GetYf(), vTargetOffset.GetZf());
|
||
|
animAssertf(IsFiniteAll(qTargetRotation), "Invalid target rotation for arm request (%8.3f %8.3f %8.3f %8.3f)", qTargetRotation.GetXf(), qTargetRotation.GetYf(), qTargetRotation.GetZf(), qTargetRotation.GetWf());
|
||
|
|
||
|
Default();
|
||
|
}
|
||
|
|
||
|
void CIkRequestArm::Default()
|
||
|
{
|
||
|
m_uBlendInRate = ARMIK_BLEND_RATE_NORMAL;
|
||
|
m_uBlendOutRate = ARMIK_BLEND_RATE_NORMAL;
|
||
|
m_bBlendInRateIsEnum = true;
|
||
|
m_bBlendOutRateIsEnum = true;
|
||
|
}
|
||
|
|
||
|
void CIkRequestArm::SetTargetOffset(Vec3V_In vTargetOffset)
|
||
|
{
|
||
|
animAssertf(IsFiniteAll(vTargetOffset), "Invalid target offset for arm request (%8.3f %8.3f %8.3f)", vTargetOffset.GetXf(), vTargetOffset.GetYf(), vTargetOffset.GetZf());
|
||
|
m_vTargetOffset = vTargetOffset;
|
||
|
}
|
||
|
|
||
|
void CIkRequestArm::SetTargetRotation(QuatV_In qRotation)
|
||
|
{
|
||
|
animAssertf(IsFiniteAll(qRotation), "Invalid target rotation for arm request (%8.3f %8.3f %8.3f %8.3f)", qRotation.GetXf(), qRotation.GetYf(), qRotation.GetZf(), qRotation.GetWf());
|
||
|
m_qTargetRotation = qRotation;
|
||
|
}
|
||
|
|
||
|
void CIkRequestArm::SetAdditive(QuatV_In qAdditive)
|
||
|
{
|
||
|
animAssertf(IsFiniteAll(qAdditive), "Invalid additive rotation for arm request (%8.3f %8.3f %8.3f %8.3f)", qAdditive.GetXf(), qAdditive.GetYf(), qAdditive.GetZf(), qAdditive.GetWf());
|
||
|
m_qAdditive = qAdditive;
|
||
|
}
|
||
|
|
||
|
///////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
CIkRequestResetArm::CIkRequestResetArm(IkArm eArm)
|
||
|
: m_uArm((u8)eArm)
|
||
|
{
|
||
|
}
|
||
|
|
||
|
///////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
CIkRequestBodyReact::CIkRequestBodyReact()
|
||
|
: m_vPosition(V_ZERO)
|
||
|
, m_vDirection(V_ZERO)
|
||
|
, m_Component(0)
|
||
|
, m_WeaponGroup(0)
|
||
|
, m_bLocalInflictor(true)
|
||
|
{
|
||
|
}
|
||
|
|
||
|
CIkRequestBodyReact::CIkRequestBodyReact(Vec3V_In vPosition,
|
||
|
Vec3V_In vDirection,
|
||
|
const int component)
|
||
|
: m_vPosition(vPosition)
|
||
|
, m_vDirection(vDirection)
|
||
|
, m_Component(component)
|
||
|
, m_WeaponGroup(0)
|
||
|
, m_bLocalInflictor(true)
|
||
|
{
|
||
|
animAssertf(IsFiniteAll(vPosition) && IsFiniteAll(vDirection), "Invalid position and/or direction for body react request (%8.3f %8.3f %8.3f) (%8.3f %8.3f %8.3f)",
|
||
|
vPosition.GetXf(), vPosition.GetYf(), vPosition.GetZf(),
|
||
|
vDirection.GetXf(), vDirection.GetYf(), vDirection.GetZf());
|
||
|
}
|
||
|
|
||
|
///////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
CIkRequestBodyRecoil::CIkRequestBodyRecoil(u32 uFlags)
|
||
|
: m_uFlags(uFlags)
|
||
|
{
|
||
|
}
|
||
|
|
||
|
///////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
CIkRequestLeg::CIkRequestLeg()
|
||
|
#if FPS_MODE_SUPPORTED
|
||
|
: m_fPelvisOffset(0.0f)
|
||
|
, m_uMode(LEG_IK_MODE_PARTIAL)
|
||
|
#else
|
||
|
: m_uMode(LEG_IK_MODE_PARTIAL)
|
||
|
#endif // FPS_MODE_SUPPORTED
|
||
|
{
|
||
|
}
|
||
|
|
||
|
///////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
CIkRequestTorsoVehicle::CIkRequestTorsoVehicle()
|
||
|
: m_fAnimatedLean(0.5f)
|
||
|
, m_fReachLimitPercentage(0.95f)
|
||
|
, m_fDeltaScale(1.0f)
|
||
|
, m_uFlags(0)
|
||
|
{
|
||
|
}
|