BVB Source Codes

CRYENGINE Show VehicleUsableActionFlip.cpp Source code

Return Download CRYENGINE: download VehicleUsableActionFlip.cpp Source code - Download CRYENGINE Source code - Type:.cpp
  1. // Copyright 2001-2016 Crytek GmbH / Crytek Group. All rights reserved.
  2.  
  3. /*************************************************************************
  4.    -------------------------------------------------------------------------
  5.    $Id$
  6.    $DateTime$
  7.    Description: Implements a usable action to recover a vehicle by flipping it over
  8.  
  9.    -------------------------------------------------------------------------
  10.    History:
  11.    - Created by Stan Fichele
  12.  
  13. *************************************************************************/
  14. #include "StdAfx.h"
  15. #include "CryAction.h"
  16. #include "GameObjects/GameObject.h"
  17. #include "IActorSystem.h"
  18. #include "IGameObject.h"
  19. #include "IItem.h"
  20. #include "IItemSystem.h"
  21. #include "IVehicleSystem.h"
  22. #include "Vehicle.h"
  23. #include "VehicleUsableActionFlip.h"
  24.  
  25. static const float s_postOrientTime = 0.5f;
  26. static const float s_reorientCutOffDot = 0.707f;
  27.  
  28. //------------------------------------------------------------------------
  29. CVehicleUsableActionFlip::CVehicleUsableActionFlip()
  30.         : m_pVehicle(nullptr)
  31.         , m_postReorientedTimer(0.0f)
  32.         , m_localAngVel(ZERO)
  33.         , m_timer(0.0f)
  34. {
  35. }
  36.  
  37. bool CVehicleUsableActionFlip::Init(IVehicle* pVehicle, const CVehicleParams& table)
  38. {
  39.         m_pVehicle = static_cast<CVehicle*>(pVehicle);
  40.         return 1;
  41. }
  42.  
  43. void CVehicleUsableActionFlip::Reset()
  44. {
  45.         // Inform the vehicle that the flipping has stopped
  46.         SVehicleEventParams params;
  47.         params.bParam = false;
  48.         m_pVehicle->BroadcastVehicleEvent(eVE_BeingFlipped, params);
  49.         m_pVehicle->SetObjectUpdate(this, IVehicle::eVOU_NoUpdate);
  50.         m_timer = 0.f;
  51.         m_postReorientedTimer = 0.f;
  52. }
  53.  
  54. //------------------------------------------------------------------------
  55. int CVehicleUsableActionFlip::OnEvent(int eventType, SVehicleEventParams& eventParams)
  56. {
  57.         if (IPhysicalEntity* pPhysics = m_pVehicle->GetEntity()->GetPhysics())
  58.         {
  59.                 if (eventType == eVAE_IsUsable)
  60.                 {
  61.                         return 1;
  62.                 }
  63.                 else if (eventType == eVAE_OnUsed)
  64.                 {
  65.                         if (m_pVehicle->IsFlipped())
  66.                         {
  67.                                 IEntity* pEntity = gEnv->pEntitySystem->GetEntity(eventParams.entityId);
  68.                                 if (pEntity)
  69.                                 {
  70.                                         static const float speed = 3.f;
  71.  
  72.                                         // Decide which axis to turn around
  73.                                         pe_status_pos physPos;
  74.                                         pe_status_dynamics physDyn;
  75.                                         pPhysics->GetStatus(&physPos);
  76.                                         pPhysics->GetStatus(&physDyn);
  77.                                         const Vec3 xAxis = physPos.q.GetColumn0();
  78.                                         const Vec3 yAxis = physPos.q.GetColumn1();
  79.  
  80.                                         if (fabsf(yAxis.z) > 0.6f)
  81.                                         {
  82.                                                 // Standing on its nose or tail
  83.                                                 // Rotate about the x
  84.                                                 m_localAngVel.Set(speed * (float)__fsel(yAxis.z, -1.f, +1.f), 0.f, 0.f);
  85.                                         }
  86.                                         else
  87.                                         {
  88.                                                 // Rotate about the y (away from the user)
  89.                                                 const Vec3 centre = physPos.pos + (physPos.BBox[0] + physPos.BBox[1]) * 0.5f;
  90.                                                 const Vec3 entityPos = pEntity->GetWorldPos();
  91.                                                 m_localAngVel.Set(0.f, speed * (float)__fsel((entityPos - centre).dot(xAxis), +1.f, -1.f), 0.f);
  92.                                         }
  93.  
  94.                                         // Start the update
  95.                                         m_pVehicle->SetObjectUpdate(this, IVehicle::eVOU_AlwaysUpdate);
  96.  
  97.                                         // Inform the vehicle that flipping has started
  98.                                         SVehicleEventParams params;
  99.                                         params.bParam = true;
  100.                                         m_pVehicle->BroadcastVehicleEvent(eVE_BeingFlipped, params);
  101.                                         m_pVehicle->NeedsUpdate(IVehicle::eVUF_AwakePhysics);
  102.                                 }
  103.                         }
  104.                         return 0;
  105.                 }
  106.         }
  107.  
  108.         return 0;
  109. }
  110.  
  111. void CVehicleUsableActionFlip::Update(const float deltaTime)
  112. {
  113.         if (IPhysicalEntity* pPhysics = m_pVehicle->GetEntity()->GetPhysics())
  114.         {
  115.                 pe_status_pos physPos;
  116.                 pe_status_dynamics physDyn;
  117.                 pPhysics->GetStatus(&physPos);
  118.                 pPhysics->GetStatus(&physDyn);
  119.                 const Vec3 zAxis = physPos.q.GetColumn2();
  120.                 const Vec3 centre = physPos.pos + (physPos.BBox[0] + physPos.BBox[1]) * 0.5f;
  121.                 const Vec3 angVel = physPos.q * m_localAngVel;
  122.                 const Vec3 vel = angVel.cross(physDyn.centerOfMass - centre);
  123.                 pe_action_set_velocity setVelocity;
  124.                 setVelocity.v = vel;
  125.                 setVelocity.w = angVel;
  126.                 pPhysics->Action(&setVelocity);
  127.  
  128.                 if (zAxis.z > 0.1f)
  129.                 {
  130.                         m_postReorientedTimer += deltaTime;
  131.                 }
  132.                 else
  133.                 {
  134.                         m_postReorientedTimer = 0.0f;
  135.                 }
  136.                 m_timer += deltaTime;
  137.                 if ((m_timer > 5.f) || ((zAxis.z > 0.1f) && (m_postReorientedTimer > s_postOrientTime)) || (zAxis.z > s_reorientCutOffDot))
  138.                 {
  139.                         // Stop
  140.                         Reset();
  141.                 }
  142.         }
  143.         else
  144.         {
  145.                 Reset();
  146.         }
  147.  
  148. }
  149.  
  150. void CVehicleUsableActionFlip::GetMemoryStatistics(ICrySizer* s)
  151. {
  152.         s->Add(*this);
  153. }
  154.  
  155. DEFINE_VEHICLEOBJECT(CVehicleUsableActionFlip);
  156.  
downloadVehicleUsableActionFlip.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