本文整理汇总了C++中ISkeletonPose类的典型用法代码示例。如果您正苦于以下问题:C++ ISkeletonPose类的具体用法?C++ ISkeletonPose怎么用?C++ ISkeletonPose使用的例子?那么, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了ISkeletonPose类的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: SetDrivingProxy
//------------------------------------------------------------------------
void CVehiclePartAnimated::Reset()
{
CVehiclePartBase::Reset();
SetDrivingProxy(false);
if (m_slot > -1 && m_pCharInstance)
{
ISkeletonAnim* pSkeletonAnim = m_pCharInstance->GetISkeletonAnim();
CRY_ASSERT(pSkeletonAnim);
ISkeletonPose* pSkeletonPose = m_pCharInstance->GetISkeletonPose();
CRY_ASSERT(pSkeletonPose);
IDefaultSkeleton &rIDefaultSkeleton = m_pCharInstance->GetIDefaultSkeleton();
pSkeletonAnim->StopAnimationsAllLayers();
pSkeletonPose->SetDefaultPose();
pSkeletonPose->SetForceSkeletonUpdate(0);
for (int i = 0; i < rIDefaultSkeleton.GetJointCount(); ++i)
{
pSkeletonPose->SetMaterialOnJoint(i, NULL);
}
}
m_iRotChangedFrameId = 0;
}
示例2: ChangeChildState
//------------------------------------------------------------------------
bool CVehiclePartAnimated::ChangeChildState(CVehiclePartAnimatedJoint* pPart, EVehiclePartState state, int flags)
{
// only handle range between intact and destroyed
if (state > pPart->GetState() && (state < eVGS_Damaged1 || state >= eVGS_Destroyed))
return false;
if (state < pPart->GetState() && pPart->GetState() >= eVGS_Destroyed)
return false;
int jointId = pPart->GetJointId();
if (pPart->GetState() == eVGS_Default)
{
ISkeletonPose* pSkeletonPose = m_pCharInstance ? m_pCharInstance->GetISkeletonPose() : NULL;
if (IStatObj* pStatObjIntact = pSkeletonPose ? pSkeletonPose->GetStatObjOnJoint(jointId) : NULL)
{
IDefaultSkeleton &rIDefaultSkeleton = m_pCharInstance->GetIDefaultSkeleton();
const char* jointName = rIDefaultSkeleton.GetJointNameByID(jointId);
if (m_intactStatObjs.find(CONST_TEMP_STRING(jointName)) == m_intactStatObjs.end())
m_intactStatObjs.insert(TStringStatObjMap::value_type(jointName, pStatObjIntact));
}
}
if (m_jointParts.find(pPart->GetName()) == m_jointParts.end())
m_jointParts.insert(TStringVehiclePartMap::value_type(pPart->GetName(), pPart));
IStatObj* pStatObj = GetGeometryForState(pPart, state);
if (pStatObj)
SetCGASlot(jointId, pStatObj, (flags & eVPSF_Physicalize) != 0);
return true;
}
示例3: GetEntity
void CLivingEntitySample::ResetCharacterModel()
{
IEntity* pEntity = GetEntity();
const int slot = 0;
const char* modelFilename = DEFAULT_MODEL_NAME;
pEntity->LoadCharacter( slot, modelFilename );
ICharacterInstance* pCharacterInstance = pEntity->GetCharacter( slot );
if ( pCharacterInstance == NULL )
{
return;
}
ISkeletonAnim* pSkeletonAnim = pCharacterInstance->GetISkeletonAnim();
if ( pSkeletonAnim == NULL )
{
return;
}
ISkeletonPose* pSkeletonPose = pCharacterInstance->GetISkeletonPose();
if ( pSkeletonPose == NULL )
{
return;
}
pSkeletonPose->SetFootAnchoring( 1 );
pSkeletonAnim->SetAnimationDrivenMotion( 1 );
// We will want to set motion parameters directly ourselves for this sample:
pSkeletonAnim->SetCharEditMode( 1 );
}
示例4: GetDestroyedGeometry
//------------------------------------------------------------------------
IStatObj* CVehiclePartAnimated::GetDestroyedGeometry(const char* pJointName, unsigned int index)
{
if (pJointName[0] && m_pCharInstanceDestroyed)
{
IDefaultSkeleton& rICharacterModelSkeletonDestroyed = m_pCharInstanceDestroyed->GetIDefaultSkeleton();
ISkeletonPose* pSkeletonDestroyed = m_pCharInstanceDestroyed->GetISkeletonPose();
CRY_ASSERT(pSkeletonDestroyed);
char buffer[256];
const char* pSuffix = !m_pSharedParameters->m_destroyedSuffix.empty() ? m_pSharedParameters->m_destroyedSuffix.c_str() :
GetDestroyedGeometrySuffix(eVGS_Destroyed);
if (index == 0)
_snprintf(buffer, sizeof(buffer), "%s%s", pJointName, pSuffix);
else
_snprintf(buffer, sizeof(buffer), "%s_debris_%d", pJointName, index);
buffer[sizeof(buffer)-1] = '\0';
int16 jointIdForDestroyed = rICharacterModelSkeletonDestroyed.GetJointIDByName(buffer);
if (jointIdForDestroyed > -1)
{
return pSkeletonDestroyed->GetStatObjOnJoint(jointIdForDestroyed);
}
}
return NULL;
}
开发者ID:NightOwlsEntertainment,项目名称:PetBox_A_Journey_to_Conquer_Elementary_Algebra,代码行数:30,代码来源:VehiclePartAnimated.cpp
示例5: GetRopeBoneId
//------------------------------------------------------------------------
int CCannonBall::GetRopeBoneId(const EventPhysCollision& collision, IEntity& target, IPhysicalEntity* pRopePhysicalEntity) const
{
int boneId = -1;
ICharacterInstance* pCharacterInstance = target.GetCharacter(0);
if (!pCharacterInstance)
return boneId;
ISkeletonPose* pSkeletonPose = pCharacterInstance->GetISkeletonPose();
if (!pSkeletonPose)
return boneId;
int auxPhys = 0;
while (IPhysicalEntity* pPhysicalEntity = pSkeletonPose->GetCharacterPhysics(auxPhys))
{
if (pRopePhysicalEntity == pPhysicalEntity)
{
boneId = pSkeletonPose->GetAuxPhysicsBoneId(auxPhys, collision.partid[1]);
break;
}
++auxPhys;
}
return boneId;
}
示例6: CRY_ASSERT
bool CTransformationPinning::Execute(const SAnimationPoseModifierParams& params)
{
if (m_factor == 0.0f)
return false;
CRY_ASSERT(m_source && (m_jointID > 0.0f));
if (!m_jointsInitialised)
{
Init(params);
}
ISkeletonPose* pSkeletonPose = params.pCharacterInstance->GetISkeletonPose();
int sourceJoints = m_source->GetJointCount();
CRY_ASSERT(sourceJoints == pSkeletonPose->GetJointCount());
for (int i=0; i<sourceJoints; i++)
{
const QuatT &sourceJoint = m_source->GetAbsJointByID(i);
const QuatT &relSourceJoint = m_source->GetRelJointByID(i);
CRY_ASSERT(params.pPoseData->GetJointAbsolute(i).IsValid());
CRY_ASSERT(sourceJoint.IsValid());
switch (m_jointTypes[i])
{
case TransformationPinJoint::Copy:
if (m_factor < 1.0f)
{
QuatT diff = params.pPoseData->GetJointAbsolute(i).GetInverted() * sourceJoint;
params.pPoseData->SetJointAbsolute(i,
params.pPoseData->GetJointAbsolute(i) * diff.GetScaled(m_factor));
diff = params.pPoseData->GetJointRelative(i).GetInverted() * relSourceJoint;
params.pPoseData->SetJointRelative(i, params.pPoseData->GetJointRelative(i) * diff.GetScaled(m_factor));
}
else
{
params.pPoseData->SetJointAbsolute(i, sourceJoint);
params.pPoseData->SetJointRelative(i, relSourceJoint);
}
break;
case TransformationPinJoint::Feather:
{
int16 parent = m_source->GetParentIDByID(i);
QuatT invParent = params.pPoseData->GetJointAbsolute(parent).GetInverted();
params.pPoseData->SetJointRelative(i, invParent * params.pPoseData->GetJointAbsolute(i));
QuatT thisJnt = params.pPoseData->GetJointAbsolute(parent) * params.pPoseData->GetJointRelative(i);
CRY_ASSERT(params.pPoseData->GetJointRelative(i).IsValid());
CRY_ASSERT(thisJnt.IsValid());
}
break;
case TransformationPinJoint::Inherit:
break;
}
}
return true;
}
示例7: GetDestroyedGeometryTM
//------------------------------------------------------------------------
Matrix34 CVehiclePartAnimated::GetDestroyedGeometryTM(const char* pJointName, unsigned int index)
{
if (pJointName[0] && m_pCharInstanceDestroyed)
{
IDefaultSkeleton &rICharacterModelSkeletonDestroyed = m_pCharInstanceDestroyed->GetIDefaultSkeleton();
ISkeletonPose* pSkeletonDestroyed = m_pCharInstanceDestroyed->GetISkeletonPose();
CRY_ASSERT(pSkeletonDestroyed);
char buffer[256];
const char* pSuffix = !m_pSharedParameters->m_destroyedSuffix.empty() ? m_pSharedParameters->m_destroyedSuffix.c_str() : GetDestroyedGeometrySuffix(eVGS_Destroyed);
if (index == 0)
{
cry_sprintf(buffer, "%s%s", pJointName, pSuffix);
}
else
{
cry_sprintf(buffer, "%s_debris_%u", pJointName, index);
}
buffer[sizeof(buffer) - 1] = '\0';
int16 jointIdForDestroyed = rICharacterModelSkeletonDestroyed.GetJointIDByName(buffer);
if (jointIdForDestroyed > -1)
return Matrix34(pSkeletonDestroyed->GetAbsJointByID(jointIdForDestroyed));
}
Matrix34 identTM;
identTM.SetIdentity();
return identTM;
}
示例8: GetGeometryForState
//------------------------------------------------------------------------
IStatObj* CVehiclePartAnimated::GetGeometryForState(CVehiclePartAnimatedJoint* pPart, EVehiclePartState state)
{
string name;
pPart->GetGeometryName(state, name);
IStatObj* pStatObj = 0;
if (state > eVGS_Default)
{
if (pPart->m_pDestroyedGeometry)
{
pStatObj = pPart->m_pDestroyedGeometry;
}
else
{
IDefaultSkeleton* pIDefaultSkeleton = m_pCharInstanceDestroyed ? &m_pCharInstanceDestroyed->GetIDefaultSkeleton() : 0;
if (pIDefaultSkeleton)
{
int jointId = pIDefaultSkeleton->GetJointIDByName(name.c_str());
ISkeletonPose* pSkeletonPose = m_pCharInstanceDestroyed->GetISkeletonPose();
if (jointId != -1)
pStatObj = pSkeletonPose->GetStatObjOnJoint(jointId);
}
}
}
else
{
TStringStatObjMap::const_iterator it = m_intactStatObjs.find(name.c_str());
if (it != m_intactStatObjs.end())
pStatObj = it->second;
}
return pStatObj;
}
示例9: GetSkeleton
Vec3 CVehicleSeatActionOrientateBoneToView::GetCurrentLookPosition() const
{
ISkeletonPose* pSkeleton = GetSkeleton();
CRY_ASSERT_MESSAGE(pSkeleton, "CVehicleSeatActionOrientateBoneToView::GetCurrentLookPosition - Couldn't get ISkeletonPose from vehicle entity");
QuatT lookQuat = pSkeleton->GetAbsJointByID(m_LookBoneId);
return m_pVehicle->GetEntity()->GetWorldPos() + lookQuat.t;
}
开发者ID:NightOwlsEntertainment,项目名称:PetBox_A_Journey_to_Conquer_Elementary_Algebra,代码行数:8,代码来源:VehicleSeatActionOrientateBoneToView.cpp
示例10: Init
void CLookAim_Helper::UpdateLook(CPlayer* pPlayer, ICharacterInstance* pCharacter, bool bEnabled, f32 FOV, const Vec3& targetGlobal,const f32 *customBlends /*= NULL*/)
{
if (!m_initialized)
{
Init(pPlayer, pCharacter);
}
bool useLookAtComplex;
bool useLookAtSimple;
if (m_canUseLookAtComplex)
{
// for now just use the old 'complex' look at method until we sort out how to properly blend old and new look at
useLookAtComplex = true;
useLookAtSimple = false;
}
else
{
useLookAtComplex = true; // for backwards compatibility reasons we still update the old look-at even when m_canUseLookAtComplex is false
useLookAtSimple = m_canUseLookAtSimple;
}
// ---------------------------
// Complex (old style) Look-At
// ---------------------------
ISkeletonPose * pSkeletonPose = pCharacter->GetISkeletonPose();
pSkeletonPose->SetLookIK(useLookAtComplex && bEnabled, FOV, targetGlobal, customBlends);
// ---------------------------
// Simple Head-Only Look-At
// ---------------------------
if (m_canUseLookAtSimple)
{
float frameTime = gEnv->pTimer->GetFrameTime();
// Fade In/Out the Weight
m_lookAtWeight = bEnabled ? CLAMP(m_lookAtWeight + (frameTime * m_lookAtFadeInSpeed), 0.0f, 1.0f) : CLAMP(m_lookAtWeight - (frameTime * m_lookAtFadeOutSpeed), 0.0f, 1.0f);
// Blend To The Target
if (targetGlobal.IsValid())
{
m_lookAtTargetGlobal = targetGlobal;
}
SmoothCD(m_lookAtInterpolatedTargetGlobal, m_lookAtTargetRate, frameTime, m_lookAtTargetGlobal, m_lookAtTargetSmoothTime);
// Push the LookAtSimple PoseModifier
if (useLookAtSimple && (m_lookAtWeight > 0.0f))
{
m_lookAtSimple->SetTargetGlobal(m_lookAtInterpolatedTargetGlobal);
m_lookAtSimple->SetWeight(m_lookAtWeight);
pCharacter->GetISkeletonAnim()->PushLayer(cryinterface_cast<IAnimationPoseModifier>(m_lookAtSimple));
}
}
}
示例11: GetEntity
//------------------------------------------------------------------------
const Matrix33 &CItem::GetSlotHelperRotation(int slot, const char *helper, bool worldSpace, bool relative)
{
static Matrix33 rotation;
rotation.SetIdentity();
IEntity* pEntity = GetEntity();
if(!pEntity)
return rotation;
SEntitySlotInfo info;
if (pEntity->GetSlotInfo(slot, info))
{
if (info.pStatObj)
{
IStatObj *pStatObj = info.pStatObj;
rotation = Matrix33(pStatObj->GetHelperTM(helper));
rotation.OrthonormalizeFast();
rotation = Matrix33(GetEntity()->GetSlotLocalTM(slot, false))*rotation;
}
else if (info.pCharacter)
{
ICharacterInstance *pCharacter = info.pCharacter;
if(!pCharacter)
return rotation;
IAttachment* pAttachment = pCharacter->GetIAttachmentManager()->GetInterfaceByName(helper);
if(pAttachment)
{
rotation = Matrix33(worldSpace ? pAttachment->GetAttWorldAbsolute().q : pAttachment->GetAttModelRelative().q);
return rotation;
}
else
{
ICharacterModelSkeleton* pICharacterModelSkeleton = pCharacter->GetICharacterModel()->GetICharacterModelSkeleton();
ISkeletonPose* pSkeletonPose = pCharacter->GetISkeletonPose();
int16 id = pICharacterModelSkeleton->GetJointIDByName(helper);
if (id > -1)
{
rotation = relative ? Matrix33(pSkeletonPose->GetRelJointByID(id).q) : Matrix33(pSkeletonPose->GetAbsJointByID(id).q);
}
}
if (!relative)
{
rotation = Matrix33(pEntity->GetSlotLocalTM(slot, false)) * rotation;
}
}
}
if (worldSpace)
{
rotation = Matrix33(pEntity->GetWorldTM()) * rotation;
}
return rotation;
}
示例12: while
void CFlowConvoyNode::DiscoverConvoyCoaches(IEntity *pEntity)
{
m_coaches.resize(0);
while (pEntity)
{
SConvoyCoach tc;
ICharacterInstance *pCharacterInstance = pEntity->GetCharacter(0);
ISkeletonPose *pSkeletonPose = pCharacterInstance ? pCharacterInstance->GetISkeletonPose() : NULL;
ICharacterModelSkeleton* pICharacterModelSkeleton = pCharacterInstance ? pCharacterInstance->GetICharacterModel()->GetICharacterModelSkeleton() : NULL;
IPhysicalEntity* pPhysics = pEntity->GetPhysics();
if(!pPhysics)
{
// don't need physics here, but need it later, so don't use entity if it's not physicalized
GameWarning("Convoy entity [%s] is not physicalized", pEntity->GetName());
break;
}
AABB bbox;
pEntity->GetLocalBounds(bbox);
//tc.m_coachOffset = (bbox.max.y - bbox.min.y) * .5f;
tc.m_coachOffset = 10.0f;
tc.m_frontWheelBase = pICharacterModelSkeleton ? pICharacterModelSkeleton->GetJointIDByName("wheel_base1") : -1;
tc.m_backWheelBase = pICharacterModelSkeleton ? pICharacterModelSkeleton->GetJointIDByName("wheel_base2") : -1;
if (tc.m_frontWheelBase >=0 && tc.m_backWheelBase >= 0)
{
QuatT qt1 = pSkeletonPose->GetRelJointByID(tc.m_frontWheelBase);
QuatT qt2 = pSkeletonPose->GetRelJointByID(tc.m_backWheelBase);
tc.m_wheelDistance = qt1.t.GetDistance(qt2.t) * .5f;
}
else
{
// Fallback for entities that don't have wheel_base joints
if ( m_bXAxisFwd )
tc.m_wheelDistance = (bbox.max.x - bbox.min.x) * .5f;
else
tc.m_wheelDistance = (bbox.max.y - bbox.min.y) * .5f;
}
tc.m_pEntity = pEntity;
// pEntity->SetConvoyEntity();
//for (int i = 0; i < pEntity->GetChildCount(); i++)
// pEntity->GetChild(i)->SetConvoyEntity();
//tc.m_pEntitySoundsProxy = (IEntitySoundProxy*) tc.m_pEntity->CreateProxy(ENTITY_PROXY_SOUND);
//assert(tc.m_pEntitySoundsProxy);
m_coaches.push_back(tc);
IEntityLink *pEntityLink = pEntity->GetEntityLinks();
pEntity = pEntityLink ? gEnv->pEntitySystem->GetEntity(pEntityLink->entityId) : NULL;
}
}
示例13: AttachToCharacter
bool CMFXParticleEffect::AttachToCharacter( IEntity& targetEntity, const SMFXParticleEntry& particleParams, const SMFXRunTimeEffectParams& params, const Vec3& dir, float scale )
{
if (params.partID >= 0)
{
//Assume character is loaded in first slot
//We could iterate through all available slots, but first one should be good enough
ICharacterInstance* pCharacterInstace = targetEntity.GetCharacter(0);
ISkeletonPose* pSkeletonPose = pCharacterInstace ? pCharacterInstace->GetISkeletonPose() : NULL;
if (pSkeletonPose)
{
IDefaultSkeleton& rIDefaultSkeleton = pCharacterInstace->GetIDefaultSkeleton();
//It hit the character, but probably in a physicalized attached part, like armor plates, etc
if (params.partID >= rIDefaultSkeleton.GetJointCount())
{
return false;
}
//It hit some valid joint, create an attachment
const char* boneName = rIDefaultSkeleton.GetJointNameByID(params.partID);
TAttachmentName attachmentName;
GetNextCharacterAttachmentName(attachmentName);
IAttachmentManager* pAttachmentManager = pCharacterInstace->GetIAttachmentManager();
CRY_ASSERT(pAttachmentManager);
//Remove the attachment first (in case was created before)
pAttachmentManager->RemoveAttachmentByName(attachmentName.c_str());
//Create attachment on nearest hit bone
IAttachment* pAttachment = pAttachmentManager->CreateAttachment(attachmentName.c_str(), CA_BONE, boneName, false);
if (pAttachment)
{
//Apply relative offsets
const QuatT boneLocation = pSkeletonPose->GetAbsJointByID(params.partID);
Matrix34 inverseJointTM = targetEntity.GetWorldTM() * Matrix34(boneLocation);
inverseJointTM.Invert();
Vec3 attachmentOffsetPosition = inverseJointTM * params.pos;
Quat attachmentOffsetRotation = Quat(inverseJointTM) * targetEntity.GetRotation();
CRY_ASSERT(attachmentOffsetPosition.IsValid());
//CRY_ASSERT(attachmentOffsetRotation.IsUnit());
pAttachment->SetAttRelativeDefault(QuatT(attachmentOffsetRotation, attachmentOffsetPosition));
//Finally attach the effect
CEffectAttachment* pEffectAttachment = new CEffectAttachment(particleParams.name.c_str(), Vec3(0,0,0), dir, scale);
pAttachment->AddBinding(pEffectAttachment);
return true;
}
}
}
return false;
}
开发者ID:NightOwlsEntertainment,项目名称:PetBox_A_Journey_to_Conquer_Elementary_Algebra,代码行数:55,代码来源:MFXParticleEffect.cpp
示例14: CRY_ASSERT
void CProceduralContextAim::InitialisePoseBlenderAim()
{
CRY_ASSERT( m_entity );
const int slot = 0;
ICharacterInstance* pCharacterInstance = m_entity->GetCharacter( slot );
if ( pCharacterInstance == NULL )
{
return;
}
ISkeletonPose* pSkeletonPose = pCharacterInstance->GetISkeletonPose();
if ( pSkeletonPose == NULL )
{
return;
}
m_pPoseBlenderAim = pSkeletonPose->GetIPoseBlenderAim();
if ( m_pPoseBlenderAim )
{
m_defaultPolarCoordinatesSmoothTimeSeconds = 0.1f;
float polarCoordinatesMaxYawDegreesPerSecond = 360.f;
float polarCoordinatesMaxPitchDegreesPerSecond = 360.f;
float fadeInSeconds = 0.25f;
float fadeOutSeconds = 0.25f;
float fadeOutMinDistance = 0.f;
IScriptTable* pScriptTable = m_entity->GetScriptTable();
if ( pScriptTable )
{
SmartScriptTable pProceduralContextAimTable;
pScriptTable->GetValue( "ProceduralContextAim", pProceduralContextAimTable );
if ( pProceduralContextAimTable )
{
pProceduralContextAimTable->GetValue( "polarCoordinatesSmoothTimeSeconds", m_defaultPolarCoordinatesSmoothTimeSeconds );
pProceduralContextAimTable->GetValue( "polarCoordinatesMaxYawDegreesPerSecond", polarCoordinatesMaxYawDegreesPerSecond );
pProceduralContextAimTable->GetValue( "polarCoordinatesMaxPitchDegreesPerSecond", polarCoordinatesMaxPitchDegreesPerSecond );
pProceduralContextAimTable->GetValue( "fadeInSeconds", fadeInSeconds );
pProceduralContextAimTable->GetValue( "fadeOutSeconds", fadeOutSeconds );
pProceduralContextAimTable->GetValue( "fadeOutMinDistance", fadeOutMinDistance );
}
}
m_defaultPolarCoordinatesMaxSmoothRateRadiansPerSecond = Vec2( DEG2RAD( polarCoordinatesMaxYawDegreesPerSecond ), DEG2RAD( polarCoordinatesMaxPitchDegreesPerSecond ) );
m_pPoseBlenderAim->SetPolarCoordinatesSmoothTimeSeconds( m_defaultPolarCoordinatesSmoothTimeSeconds );
m_pPoseBlenderAim->SetPolarCoordinatesMaxRadiansPerSecond( m_defaultPolarCoordinatesMaxSmoothRateRadiansPerSecond );
m_pPoseBlenderAim->SetFadeInSpeed( fadeInSeconds );
m_pPoseBlenderAim->SetFadeOutSpeed( fadeOutSeconds );
m_pPoseBlenderAim->SetFadeOutMinDistance( fadeOutMinDistance );
m_pPoseBlenderAim->SetState( false );
}
}
示例15: position
//------------------------------------------------------------------------
Vec3 CItem::GetSlotHelperPos(int slot, const char *helper, bool worldSpace, bool relative) const
{
Vec3 position(0,0,0);
SEntitySlotInfo info;
if (GetEntity()->GetSlotInfo(slot, info))
{
if (info.pStatObj)
{
IStatObj *pStatsObj = info.pStatObj;
position = pStatsObj->GetHelperPos(helper);
position = GetEntity()->GetSlotLocalTM(slot, false).TransformPoint(position);
}
else if (info.pCharacter)
{
ICharacterInstance *pCharacter = info.pCharacter;
IAttachment* pAttachment = pCharacter->GetIAttachmentManager()->GetInterfaceByName(helper);
if (pAttachment)
{
position = worldSpace ? pAttachment->GetAttWorldAbsolute().t : pAttachment->GetAttModelRelative().t;
return position;
}
else
{
ICharacterModelSkeleton* pICharacterModelSkeleton = pCharacter->GetICharacterModel()->GetICharacterModelSkeleton();
ISkeletonPose* pSkeletonPose = pCharacter->GetISkeletonPose();
int16 id = pICharacterModelSkeleton->GetJointIDByName(helper);
if (id > -1)
{
position = relative ? pSkeletonPose->GetRelJointByID(id).t : pSkeletonPose->GetAbsJointByID(id).t;
}
}
if (!relative)
{
position = GetEntity()->GetSlotLocalTM(slot, false).TransformPoint(position);
}
}
}
if (worldSpace)
{
position = GetWorldTM().TransformPoint(position);
}
return position;
}