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; } }
//------------------------------------------------------------------------ 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; }
//------------------------------------------------------------------------ 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; }
void EntityEffects::SpawnParticleWithEntity( const IEntity* pTargetEntity, const int targetSlot, IParticleEffect* pParticleEffect, const char* helperName, const EntityEffects::SEffectSpawnParams& spawnParams ) { SEffectSpawnParams newSpawnParams = spawnParams; if (pTargetEntity) { SEntitySlotInfo slotInfo; if (pTargetEntity->GetSlotInfo(targetSlot, slotInfo)) { if (slotInfo.pStatObj) { //Get helper position from static object const Vec3 localHelperPosition = slotInfo.pStatObj->GetHelperPos(helperName); newSpawnParams.position = pTargetEntity->GetSlotWorldTM(targetSlot).TransformPoint(localHelperPosition); } else if (slotInfo.pCharacter) { //Get helper position from character IAttachmentManager *pAttachmentManager = slotInfo.pCharacter->GetIAttachmentManager(); if (IAttachment *pAttachment = pAttachmentManager->GetInterfaceByName(helperName)) { newSpawnParams.position = pAttachment->GetAttWorldAbsolute().t; } else { ICharacterModelSkeleton* pICharacterModelSkeleton = slotInfo.pCharacter->GetICharacterModel()->GetICharacterModelSkeleton(); ISkeletonPose* pSkeletonPose = slotInfo.pCharacter->GetISkeletonPose(); Vec3 localJointPosition = ZERO; const int16 jointId = pICharacterModelSkeleton->GetJointIDByName(helperName); if (jointId >= 0) { localJointPosition = pSkeletonPose->GetAbsJointByID(jointId).t; } newSpawnParams.position = pTargetEntity->GetSlotWorldTM(targetSlot).TransformPoint(localJointPosition); } } } } SpawnParticleFX(pParticleEffect, newSpawnParams); }
//------------------------------------------------------------------------ void CReplayActor::ProcessEvent(SEntityEvent &event) { switch (event.event) { case ENTITY_EVENT_PREPHYSICSUPDATE: { const int currentFrameId = gEnv->pRenderer->GetFrameID(); if(currentFrameId==m_lastFrameUpdated) return; m_lastFrameUpdated = currentFrameId; if (m_pActionController) { float frameTime = gEnv->pTimer->GetFrameTime(); m_pActionController->Update(frameTime); } ICharacterInstance* pShadowCharacter = GetShadowCharacter(); if (pShadowCharacter) { QuatTS pose = (QuatTS)GetEntity()->GetWorldTM(); SAnimationProcessParams params; params.locationAnimation = pose; params.bOnRender = 1; params.zoomAdjustedDistanceFromCamera = (GetISystem()->GetViewCamera().GetPosition()-pose.t).GetLength(); pShadowCharacter->StartAnimationProcessing(params); //--- Ensure that we disable the automatic update if we're doing it explicitly pShadowCharacter->SetFlags( pShadowCharacter->GetFlags()&(~CS_FLAG_UPDATE) ); } ICharacterInstance *pCharacter = GetEntity()->GetCharacter(0); ISkeletonPose *pSkelPose = pCharacter ? pCharacter->GetISkeletonPose() : NULL; if(pSkelPose) { ICharacterModelSkeleton* pICharacterModelSkeleton = pCharacter->GetICharacterModel()->GetICharacterModelSkeleton(); // GetJointIDByName() returns -1 if it fails; m_headBoneID is initialised to -2 // since -1 is failure and 0+ are valid bone indices. if (m_headBoneID == -2) { // TODO: Should move this to an initialisation function m_headBoneID = pICharacterModelSkeleton->GetJointIDByName("Bip01 Head"); m_cameraBoneID = pICharacterModelSkeleton->GetJointIDByName("Bip01 Camera"); } if (m_headBoneID > -1) { m_headPos = pSkelPose->GetAbsJointByID(m_headBoneID); } if (m_cameraBoneID > -1) { m_cameraPos = pSkelPose->GetAbsJointByID(m_cameraBoneID); } } } break; case ENTITY_EVENT_DONE: case ENTITY_EVENT_RETURNING_TO_POOL: { SAFE_RELEASE(m_pActionController); SAFE_DELETE(m_pAnimContext); m_itemList.OnActionControllerDeleted(); } break; } }
const Vec3& CTacticalManager::GetTacticalIconWorldPos(const EntityId tacticalEntityId, IEntity* pTacticalEntity, bool& inOutIsHeadBone) { CRY_ASSERT(tacticalEntityId != 0); CRY_ASSERT(pTacticalEntity != NULL); if (pTacticalEntity == NULL) { return m_tempVec3.Set(0.0f,0.0f,0.0f); } // Try to get pos from headbone if don't have an override pos TTacticalEntityToOverrideEntities::const_iterator iter = m_tacEntityToOverrideEntities.find(tacticalEntityId); if (iter == m_tacEntityToOverrideEntities.end()) { static IEntityClass* s_pTurretEntityClass = gEnv->pEntitySystem->GetClassRegistry()->FindClass("Turret"); IEntityClass* pEntityClass = pTacticalEntity->GetClass(); if (pEntityClass != NULL && pEntityClass == s_pTurretEntityClass) { ICharacterInstance* pCharacterInstance = pTacticalEntity->GetCharacter(0); if (pCharacterInstance != NULL) { ICharacterModelSkeleton* pICharacterModelSkeleton = pCharacterInstance->GetICharacterModel()->GetICharacterModelSkeleton(); ISkeletonPose* pSkeletonPose = pCharacterInstance->GetISkeletonPose(); CRY_ASSERT(pSkeletonPose != NULL); const int16 jointId = pICharacterModelSkeleton->GetJointIDByName("arcjoint"); if (0 <= jointId) { QuatT boneLocation = pSkeletonPose->GetAbsJointByID(jointId); m_tempVec3 = pTacticalEntity->GetWorldTM().TransformPoint(boneLocation.t); return m_tempVec3; } } } CUICVars* pCVars = g_pGame->GetUI()->GetCVars(); if (pCVars->hud_InterestPointsAtActorsHeads == 1) { CActor* pActor = static_cast<CActor*>(g_pGame->GetIGameFramework()->GetIActorSystem()->GetActor(tacticalEntityId)); // Only want units to go from headbone, since vehicles have headbone as well if(pActor) { if(pActor->HasBoneID(BONE_HEAD)) { QuatT boneLocation = pActor->GetBoneTransform(BONE_HEAD); m_tempVec3 = pTacticalEntity->GetWorldTM().TransformPoint(boneLocation.t) + Vec3(0.0f, 0.0f, 0.25f); inOutIsHeadBone = true; return m_tempVec3; } else if(pActor->HasBoneID(BONE_SPINE)) { QuatT boneLocation = pActor->GetBoneTransform(BONE_SPINE); m_tempVec3 = pTacticalEntity->GetWorldTM().TransformPoint(boneLocation.t); return m_tempVec3; } } } return GetTacticalIconCenterBBoxWorldPos(pTacticalEntity); } else // Override entity exists so it determines position { IEntity* pOverrideEntity = gEnv->pEntitySystem->GetEntity(iter->second); if (pOverrideEntity) { m_tempVec3 = pOverrideEntity->GetWorldPos(); return m_tempVec3; } else { GameWarning("CTacticalManager::GetTacticalIconWorldPos: ID exists in mapping but failed to find entity, defaulting to center bounding box position"); return GetTacticalIconCenterBBoxWorldPos(pTacticalEntity); } } }