BVB Source Codes

CRYENGINE Show VehicleSeatActionWeaponsBone.cpp Source code

Return Download CRYENGINE: download VehicleSeatActionWeaponsBone.cpp Source code - Download CRYENGINE Source code - Type:.cpp
  1. // Copyright 2001-2016 Crytek GmbH / Crytek Group. All rights reserved.
  2.  
  3. #include "StdAfx.h"
  4. #include "VehicleSeatActionWeaponsBone.h"
  5. #include "VehicleUtils.h"
  6. #include "Vehicle.h"
  7. #include "VehicleSeat.h"
  8. #include <CryExtension/CryCreateClassInstance.h>
  9.  
  10. CVehicleSeatActionWeaponsBone::CVehicleSeatActionWeaponsBone()
  11.         : m_currentMovementRotation(IDENTITY)
  12.         , m_pSkeletonPose(NULL)
  13.         , m_positionBoneId(-1)
  14.         , m_forwardOffset(0.f)
  15. {
  16.         CryCreateClassInstance("AnimationPoseModifier_OperatorQueue", m_poseModifier);
  17. }
  18.  
  19. CVehicleSeatActionWeaponsBone::~CVehicleSeatActionWeaponsBone()
  20. {
  21.         m_pVehicle->UnregisterVehicleEventListener(this);
  22. }
  23.  
  24. bool CVehicleSeatActionWeaponsBone::Init(IVehicle* pVehicle, IVehicleSeat* pSeat, const CVehicleParams& table)
  25. {
  26.         if (!CVehicleSeatActionWeapons::Init(pVehicle, pSeat, table))
  27.                 return false;
  28.  
  29.         if (ICharacterInstance* pCharacterInstance = m_pVehicle->GetEntity()->GetCharacter(0))
  30.         {
  31.                 IDefaultSkeleton& rIDefaultSkeleton = pCharacterInstance->GetIDefaultSkeleton();
  32.                 {
  33.                         if (table.haveAttr("PositionBone"))
  34.                         {
  35.                                 const char* boneName = table.getAttr("PositionBone");
  36.                                 m_positionBoneId = rIDefaultSkeleton.GetJointIDByName(boneName);
  37.  
  38.                                 if (m_positionBoneId >= 0)
  39.                                 {
  40.                                         m_pSkeletonPose = pCharacterInstance->GetISkeletonPose();
  41.                                 }
  42.                         }
  43.  
  44.                         if (table.haveAttr("ForwardOffset"))
  45.                         {
  46.                                 table.getAttr("ForwardOffset", m_forwardOffset);
  47.                         }
  48.                 }
  49.         }
  50.  
  51.         //SVehicleWeapon& weapon = GetVehicleWeapon();
  52.         //IEntity* pWeaponEntity = gEnv->pEntitySystem->GetEntity(weapon.weaponEntityId);
  53.         //if(pWeaponEntity)
  54.         //{
  55.         //      pVehicle->GetEntity()->AttachChild(pWeaponEntity);
  56.         //}
  57.  
  58.         pVehicle->RegisterVehicleEventListener(this, "CVehicleSeatActionWeaponsBone");
  59.  
  60.         return true;
  61. }
  62.  
  63. bool CVehicleSeatActionWeaponsBone::GetProbableHit(EntityId weaponId, const IFireMode* pFireMode, Vec3& hit)
  64. {
  65.         Vec3 pos, dir;
  66.         if (CalcFiringPosDir(pos, &dir, pFireMode))
  67.         {
  68.                 m_currentMovementRotation.SetIdentity();
  69.                 hit = pos + (dir * 20.f);
  70.                 return true;
  71.         }
  72.         return false;
  73. }
  74.  
  75. bool CVehicleSeatActionWeaponsBone::GetFiringPos(EntityId weaponId, const IFireMode* pFireMode, Vec3& pos)
  76. {
  77.         FUNCTION_PROFILER(gEnv->pSystem, PROFILE_ACTION);
  78.         return CalcFiringPosDir(pos);
  79. }
  80.  
  81. bool CVehicleSeatActionWeaponsBone::GetFiringDir(EntityId weaponId, const IFireMode* pFireMode, Vec3& dir, const Vec3& probableHit, const Vec3& firingPos)
  82. {
  83.         IActor* pDriver = m_pVehicle->GetDriver();
  84.         bool isLocal = pDriver && pDriver->IsClient();
  85.  
  86.         if (isLocal)
  87.         {
  88.                 if (!probableHit.IsZero())
  89.                 {
  90.                         dir = (probableHit - firingPos).GetNormalized();
  91.                         return true;
  92.                 }
  93.                 else
  94.                 {
  95.                         Vec3 tempPos;
  96.                         if (CalcFiringPosDir(tempPos, &dir, pFireMode))
  97.                         {
  98.                                 m_currentMovementRotation.SetIdentity();
  99.                                 return true;
  100.                         }
  101.                 }
  102.  
  103.                 return CVehicleSeatActionWeapons::GetFiringDir(weaponId, pFireMode, dir, probableHit, firingPos);
  104.         }
  105.         else
  106.         {
  107.                 dir = (m_fireTarget - firingPos).normalize();
  108.                 return true;
  109.         }
  110.  
  111. }
  112.  
  113. void CVehicleSeatActionWeaponsBone::UpdateWeaponTM(SVehicleWeapon& weapon)
  114. {
  115.         FUNCTION_PROFILER(GetISystem(), PROFILE_ACTION);
  116.  
  117.         if (m_pSkeletonPose)
  118.         {
  119.                 if (IWeapon* pWeapon = GetIWeapon(weapon))
  120.                 {
  121.                         IEntity* pEntityWeapon = GetEntity(weapon);
  122.  
  123.                         IActor* pDriver = m_pVehicle->GetDriver();
  124.                         bool isLocal = pDriver && pDriver->IsClient();
  125.  
  126.                         Vec3 pos, dir;
  127.                         const Vec3 prevFireTarget(m_fireTarget);
  128.                         if (CalcFiringPosDir(pos, &dir, pWeapon->GetFireMode(pWeapon->GetCurrentFireMode())))
  129.                         {
  130.                         }
  131.                         else if (isLocal)
  132.                         {
  133.                                 const CCamera& cam = gEnv->pRenderer->GetCamera();
  134.                                 pos = cam.GetPosition();
  135.                                 dir = cam.GetViewdir();
  136.                         }
  137.                         else
  138.                         {
  139.                                 const QuatT entLoc(m_pVehicle->GetEntity()->GetWorldTM());
  140.                                 const QuatT boneWorld(entLoc * m_pSkeletonPose->GetAbsJointByID(m_positionBoneId));
  141.                                 pos = boneWorld.t;
  142.                                 dir = boneWorld.GetColumn1();
  143.                         }
  144.  
  145.                         m_fireTarget = pos + (dir * 50.f);
  146.                         if ((prevFireTarget - m_fireTarget).GetLengthSquared() > 0.01f)
  147.                         {
  148.                                 m_pSeat->ChangedNetworkState(CVehicle::ASPECT_SEAT_ACTION);
  149.                         }
  150.  
  151.                         const Quat rotation = Quat::CreateRotationVDir(dir.GetNormalized(), 0.f);
  152.                         Matrix34 worldTM = Matrix34::Create(Vec3(1.f, 1.f, 1.f), rotation, pos);
  153.                         pEntityWeapon->SetWorldTM(worldTM);
  154.  
  155. #if ENABLE_VEHICLE_DEBUG
  156.                         if (VehicleCVars().v_draw_tm)
  157.                                 VehicleUtils::DrawTM(worldTM);
  158. #endif
  159.                 }
  160.         }
  161. }
  162.  
  163. void CVehicleSeatActionWeaponsBone::Serialize(TSerialize ser, EEntityAspects aspects)
  164. {
  165.         CVehicleSeatActionWeapons::Serialize(ser, aspects);
  166.  
  167.         if (ser.GetSerializationTarget() == eST_Network && aspects & CVehicle::ASPECT_SEAT_ACTION)
  168.         {
  169.                 ser.Value("m_fireTarget", m_fireTarget, 'wrl3');
  170.         }
  171. }
  172.  
  173. void CVehicleSeatActionWeaponsBone::OnVehicleEvent(EVehicleEvent event, const SVehicleEventParams& params)
  174. {
  175.         CVehicleSeatActionWeapons::OnVehicleEvent(event, params);
  176.  
  177.         if (event == eVE_VehicleMovementRotation)
  178.         {
  179.                 const Quat currentRotation(params.fParam, params.vParam);
  180.                 m_currentMovementRotation = currentRotation;
  181.         }
  182. }
  183.  
  184. bool CVehicleSeatActionWeaponsBone::CalcFiringPosDir(Vec3& rPos, Vec3* pDir, const IFireMode* pFireMode) const
  185. {
  186.         if (m_pSkeletonPose)
  187.         {
  188.                 const QuatT entLoc(m_pVehicle->GetEntity()->GetWorldTM());
  189.                 const QuatT& boneLocal = m_pSkeletonPose->GetAbsJointByID(m_positionBoneId);
  190.                 const QuatT boneWorld(entLoc * m_currentMovementRotation.GetInverted() * boneLocal);
  191.  
  192.                 if (pDir)
  193.                 {
  194.                         Vec3 dir(boneWorld.GetColumn1().GetNormalized());
  195.                         if (pFireMode)
  196.                         {
  197.                                 pFireMode->ApplyAutoAim(dir, boneWorld.t);
  198.                                 dir = pFireMode->ApplySpread(dir, pFireMode->GetSpread()).GetNormalized();
  199.                         }
  200.                         *pDir = dir;
  201.                 }
  202.  
  203.                 rPos = boneWorld.t + (boneWorld.GetColumn1() * m_forwardOffset);
  204.                 return true;
  205.         }
  206.         return false;
  207. }
  208.  
downloadVehicleSeatActionWeaponsBone.cpp Source code - Download CRYENGINE Source code
Related Source Codes/Software:
postal - 2017-06-11
reactide - Reactide is the first dedicated IDE for React web ... 2017-06-11
rkt - rkt is a pod-native container engine for Linux. It... 2017-06-11
uWebSockets - Tiny WebSockets https://for... 2017-06-11
realworld - TodoMVC for the RealWorld - Exemplary fullstack Me... 2017-06-11
CRYENGINE - CRYENGINE is a powerful real-time game development... 2017-06-11
goreplay - GoReplay is an open-source tool for capturing and ... 2017-06-10
pyenv - Simple Python version management 2017-06-10
redux-saga - An alternative side effect model for Redux apps ... 2017-06-10
angular-starter - 2017-06-10

 Back to top