BVB Source Codes

CRYENGINE Show OwnerAngularRotationNode.cpp Source code

Return Download CRYENGINE: download OwnerAngularRotationNode.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.  
  5. #include <CryFlowGraph/IFlowBaseNode.h>
  6.  
  7. class CRotateEntity : public CFlowBaseNode<eNCT_Instanced>
  8. {
  9.         Quat       m_worldRot;
  10.         Quat       m_localRot;
  11.         CTimeValue m_lastTime;
  12.         bool       m_bActive;
  13.  
  14. public:
  15.         CRotateEntity(SActivationInfo* pActInfo) : m_lastTime(0.0f), m_bActive(false)
  16.         {
  17.                 m_worldRot.SetIdentity();
  18.                 m_localRot.SetIdentity();
  19.         }
  20.  
  21.         IFlowNodePtr Clone(SActivationInfo* pActInfo)
  22.         {
  23.                 return new CRotateEntity(pActInfo);
  24.         }
  25.  
  26.         void Serialize(SActivationInfo* pActInfo, TSerialize ser)
  27.         {
  28.                 ser.BeginGroup("Local");
  29.                 ser.Value("m_worldRot", m_worldRot);
  30.                 ser.Value("m_localRot", m_localRot);
  31.                 ser.Value("m_lastTime", m_lastTime);
  32.                 ser.Value("m_bActive", m_bActive);
  33.                 ser.EndGroup();
  34.         }
  35.  
  36.         virtual void GetConfiguration(SFlowNodeConfig& config)
  37.         {
  38.                 static const SInputPortConfig in_config[] = {
  39.                         InputPortConfig<Vec3>("Speed",  _HELP("Speed (degrees/sec)")),
  40.                         InputPortConfig<bool>("Paused", _HELP("Pause the motion when true")),
  41.                         InputPortConfig<int>("Ref",     0,                                   _HELP("RotationAxis in World or Local Space"),_HELP("CoordSys"), _UICONFIG("enum_int:World=0,Local=1")),
  42.                         { 0 }
  43.                 };
  44.                 static const SOutputPortConfig out_config[] = {
  45.                         OutputPortConfig<Vec3>("Current",    _HELP("Current Rotation in Degrees")),
  46.                         OutputPortConfig<Vec3>("CurrentRad", _HELP("Current Rotation in Radian")),
  47.                         { 0 }
  48.                 };
  49.                 config.sDescription = _HELP("Rotate at a defined speed");
  50.                 config.nFlags |= EFLN_TARGET_ENTITY | EFLN_AISEQUENCE_SUPPORTED;
  51.                 config.pInputPorts = in_config;
  52.                 config.pOutputPorts = out_config;
  53.                 config.SetCategory(EFLN_APPROVED);
  54.         }
  55.         virtual void ProcessEvent(EFlowEvent event, SActivationInfo* pActInfo)
  56.         {
  57.                 switch (event)
  58.                 {
  59.                 case eFE_Activate:
  60.                         {
  61.                                 m_lastTime = gEnv->pTimer->GetFrameStartTime();
  62.                                 m_bActive = !GetPortBool(pActInfo, 1);
  63.                                 pActInfo->pGraph->SetRegularlyUpdated(pActInfo->myID, m_bActive);
  64.  
  65.                                 if (!m_bActive)
  66.                                 {
  67.                                         ResetVelocity(pActInfo);
  68.                                 }
  69.                         }
  70.  
  71.                         break;
  72.                 case eFE_Initialize:
  73.                         {
  74.                                 if (pActInfo->pEntity)
  75.                                         m_localRot = pActInfo->pEntity->GetRotation();
  76.                                 else
  77.                                         m_localRot.SetIdentity();
  78.                                 m_worldRot.SetIdentity();
  79.                                 m_lastTime = gEnv->pTimer->GetFrameStartTime();
  80.                                 m_bActive = !GetPortBool(pActInfo, 1);
  81.                                 pActInfo->pGraph->SetRegularlyUpdated(pActInfo->myID, m_bActive);
  82.                                 break;
  83.                         }
  84.  
  85.                 case eFE_Update:
  86.                         {
  87.                                 if (m_bActive && pActInfo->pEntity)
  88.                                 {
  89.                                         CTimeValue time = gEnv->pTimer->GetFrameStartTime();
  90.                                         float timeDifference = (time - m_lastTime).GetSeconds();
  91.                                         m_lastTime = time;
  92.  
  93.                                         IEntity* pEntity = pActInfo->pEntity;
  94.                                         const bool bUseWorld = GetPortInt(pActInfo, 2) == 0 ? true : false;
  95.                                         Vec3 speed = GetPortVec3(pActInfo, 0);
  96.                                         speed *= timeDifference;
  97.                                         Quat deltaRot(Ang3(DEG2RAD(speed)));
  98.                                         Quat finalRot;
  99.                                         if (bUseWorld == false)
  100.                                         {
  101.                                                 finalRot = pEntity->GetRotation();
  102.                                                 finalRot *= deltaRot;
  103.                                         }
  104.                                         else
  105.                                         {
  106.                                                 m_worldRot *= deltaRot;
  107.                                                 finalRot = m_worldRot;
  108.                                                 finalRot *= m_localRot;
  109.                                         }
  110.                                         finalRot.NormalizeSafe();
  111.  
  112.                                         IPhysicalEntity* piPhysEnt = pEntity->GetPhysics();
  113.                                         if (piPhysEnt && piPhysEnt->GetType() != PE_STATIC)
  114.                                         {
  115.                                                 if (timeDifference > 0.0001f)
  116.                                                 {
  117.                                                         pe_action_set_velocity asv;
  118.                                                         asv.w = Quat::log(deltaRot) * (2.f / timeDifference);
  119.                                                         asv.bRotationAroundPivot = 1;
  120.                                                         pEntity->GetPhysics()->Action(&asv);
  121.                                                 }
  122.                                         }
  123.                                         else
  124.                                         {
  125.                                                 pEntity->SetRotation(finalRot);
  126.                                         }
  127.                                         Ang3 currentAng = Ang3(finalRot);
  128.                                         ActivateOutput(pActInfo, 1, Vec3(currentAng));
  129.                                         currentAng = RAD2DEG(currentAng);
  130.                                         ActivateOutput(pActInfo, 0, Vec3(currentAng));
  131.                                 }
  132.                                 break;
  133.                         }
  134.                 }
  135.                 ;
  136.         };
  137.  
  138.         virtual void GetMemoryUsage(ICrySizer* s) const
  139.         {
  140.                 s->Add(*this);
  141.         }
  142.  
  143. private:
  144.  
  145.         void ResetVelocity(SActivationInfo* pActInfo)
  146.         {
  147.                 IEntity* pGraphEntity = pActInfo->pEntity;
  148.                 if (pGraphEntity)
  149.                 {
  150.                         IPhysicalEntity* pPhysicalEntity = pGraphEntity->GetPhysics();
  151.                         if (pPhysicalEntity && pPhysicalEntity->GetType() != PE_STATIC)
  152.                         {
  153.                                 pe_action_set_velocity setVel;
  154.                                 setVel.v.zero();
  155.                                 setVel.w.zero();
  156.                                 pPhysicalEntity->Action(&setVel);
  157.                         }
  158.                 }
  159.         }
  160. };
  161.  
  162. REGISTER_FLOW_NODE("Movement:RotateEntity", CRotateEntity);
  163.  
downloadOwnerAngularRotationNode.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