BVB Source Codes

CRYENGINE Show VehiclePartSubPart.cpp Source code

Return Download CRYENGINE: download VehiclePartSubPart.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 part for vehicles which is the an attachment
  8.    of a parent Animated part
  9.  
  10.    -------------------------------------------------------------------------
  11.    History:
  12.    - 25:08:2005: Created by Mathieu Pinard
  13.  
  14. *************************************************************************/
  15.  
  16. #include "StdAfx.h"
  17. #include <CryAnimation/ICryAnimation.h>
  18. #include "IVehicleSystem.h"
  19. #include "CryAction.h"
  20. #include "Vehicle.h"
  21. #include "VehiclePartBase.h"
  22. #include "VehiclePartAnimated.h"
  23. #include "VehiclePartSubPart.h"
  24. #include "VehicleUtils.h"
  25.  
  26. //------------------------------------------------------------------------
  27. CVehiclePartSubPart::CVehiclePartSubPart()
  28. {
  29. }
  30.  
  31. //------------------------------------------------------------------------
  32. CVehiclePartSubPart::~CVehiclePartSubPart()
  33. {
  34. }
  35.  
  36. //------------------------------------------------------------------------
  37. bool CVehiclePartSubPart::Init(IVehicle* pVehicle, const CVehicleParams& table, IVehiclePart* pParent, CVehicle::SPartInitInfo& initInfo, int partType)
  38. {
  39.         if (!CVehiclePartBase::Init(pVehicle, table, pParent, initInfo, eVPT_SubPart))
  40.         {
  41.                 return false;
  42.         }
  43.  
  44.         m_savedTM.SetIdentity();
  45.  
  46.         if (CVehicleParams subPartTable = table.findChild("SubPart"))
  47.         {
  48.                 string fileName = subPartTable.getAttr("filename");
  49.                 const char* geoName = subPartTable.getAttr("geometryname");
  50.  
  51.                 if (!fileName.empty())
  52.                 {
  53.                         string fileExtension;
  54.  
  55.                         size_t pos = fileName.find_last_of("./\\");
  56.  
  57.                         if ((pos != string::npos) && (fileName[pos] == '.'))
  58.                         {
  59.                                 fileExtension = fileName.substr(pos);
  60.  
  61.                                 fileName.erase(pos);
  62.                         }
  63.  
  64.                         IStatObj* pStatObjPrevState = NULL;
  65.  
  66.                         for (EVehiclePartState state = eVGS_Default; state != eVGS_Last; state = static_cast<EVehiclePartState>(state + 1))
  67.                         {
  68.                                 string stateFileName = fileName;
  69.  
  70.                                 stateFileName += CVehiclePartBase::GetDestroyedGeometrySuffix(state);
  71.                                 stateFileName += fileExtension;
  72.  
  73.                                 IStatObj::SSubObject* pSubObject = NULL;
  74.  
  75.                                 IF_UNLIKELY (!gEnv->pCryPak->IsFileExist(stateFileName))
  76.                                 {
  77.                                         continue;
  78.                                 }
  79.  
  80.                                 IStatObj* pStatObj = gEnv->p3DEngine->LoadStatObj(stateFileName, geoName, &pSubObject);
  81.  
  82.                                 // tell the streaming engine to stream destroyed version together with non destroyed
  83.                                 if (pStatObjPrevState)
  84.                                         pStatObjPrevState->SetStreamingDependencyFilePath(stateFileName);
  85.                                 pStatObjPrevState = pStatObj;
  86.  
  87.                                 if (!pStatObj || pStatObj->IsDefaultObject())
  88.                                 {
  89.                                         RegisterStateGeom(state, NULL);
  90.                                 }
  91.                                 else
  92.                                 {
  93.                                         RegisterStateGeom(state, pStatObj);
  94.                                 }
  95.                         }
  96.                 }
  97.         }
  98.  
  99.         InitGeometry();
  100.  
  101.         return true;
  102. }
  103.  
  104. //------------------------------------------------------------------------
  105. void CVehiclePartSubPart::Reset()
  106. {
  107.         CVehiclePartBase::Reset();
  108.  
  109.         if (m_slot != -1)
  110.         {
  111.                 GetEntity()->SetSlotLocalTM(m_slot, m_savedTM);
  112.         }
  113. }
  114.  
  115. //------------------------------------------------------------------------
  116. void CVehiclePartSubPart::Release()
  117. {
  118.         if (m_slot != -1)
  119.         {
  120.                 m_pVehicle->GetEntity()->FreeSlot(m_slot);
  121.         }
  122.  
  123.         CVehiclePartBase::Release();
  124. }
  125.  
  126. //------------------------------------------------------------------------
  127. void CVehiclePartSubPart::OnEvent(const SVehiclePartEvent& event)
  128. {
  129.         CVehiclePartBase::OnEvent(event);
  130. }
  131.  
  132. //------------------------------------------------------------------------
  133. bool CVehiclePartSubPart::ChangeState(EVehiclePartState state, int flags)
  134. {
  135.         if (!CVehiclePartBase::ChangeState(state, flags))
  136.         {
  137.                 return false;
  138.         }
  139.  
  140.         CVehiclePartBase* pParentPartBase = (CVehiclePartBase*)m_pParentPart;
  141.  
  142.         if (!pParentPartBase)
  143.         {
  144.                 return false;
  145.         }
  146.  
  147.         IEntity* pEntity = GetEntity();
  148.  
  149.         bool swapped = false;
  150.  
  151.         for (TStateGeomVector::const_iterator iStateGeom = m_stateGeoms.begin(), iEnd = m_stateGeoms.end(); iStateGeom != iEnd; ++iStateGeom)
  152.         {
  153.                 if (iStateGeom->state == state)
  154.                 {
  155.                         if (IStatObj* pStatObj = iStateGeom->pStatObj)
  156.                         {
  157.                                 m_slot = pEntity->LoadGeometry(m_slot, pStatObj->GetFilePath(), pStatObj->GetGeoName());
  158.  
  159.                                 if (m_slot != -1)
  160.                                 {
  161.                                         pEntity->SetSlotMaterial(m_slot, pStatObj->GetMaterial());
  162.  
  163.                                         swapped = true;
  164.  
  165.                                         break;
  166.                                 }
  167.                                 else
  168.                                 {
  169.                                         CryWarning(VALIDATOR_MODULE_GAME, VALIDATOR_WARNING, "CVehiclePartSubPart::ChangeState() : Failed to load geometry '%s'", pStatObj->GetFilePath());
  170.  
  171.                                         return false;
  172.                                 }
  173.                         }
  174.                         else
  175.                         {
  176.                                 swapped = true;
  177.  
  178.                                 break;
  179.                         }
  180.                 }
  181.         }
  182.  
  183.         Matrix34 subTM(IDENTITY);
  184.  
  185.         if (IStatObj* pStatObj = pParentPartBase->GetSubGeometry(this, state, subTM, state == eVGS_Default))
  186.         {
  187.                 if (!swapped)
  188.                 {
  189.                         m_slot = pEntity->LoadGeometry(m_slot, pStatObj->GetFilePath(), pStatObj->GetGeoName());
  190.  
  191.                         if (m_slot != -1)
  192.                         {
  193.                                 pEntity->SetSlotMaterial(m_slot, pStatObj->GetMaterial());
  194.  
  195.                                 swapped = true;
  196.                         }
  197.                         else
  198.                         {
  199.                                 CryWarning(VALIDATOR_MODULE_GAME, VALIDATOR_WARNING, "CVehiclePartSubPart::ChangeState() : Failed to load geometry '%s'", pStatObj->GetFilePath());
  200.  
  201.                                 return false;
  202.                         }
  203.                 }
  204.         }
  205.  
  206.         if (state == eVGS_Default)
  207.         {
  208.                 Matrix34 localTM(IDENTITY);
  209.  
  210.                 if (!m_pSharedParameters->m_position.IsZero())
  211.                 {
  212.                         localTM.SetTranslation(m_pSharedParameters->m_position);
  213.                 }
  214.                 else if (m_pSharedParameters->m_helperPosName.empty())
  215.                 {
  216.                         localTM = subTM;
  217.                 }
  218.                 else if (IVehicleHelper* pHelper = m_pVehicle->GetHelper(m_pSharedParameters->m_helperPosName.c_str()))
  219.                 {
  220.                         pHelper->GetVehicleTM(localTM);
  221.                 }
  222.  
  223.                 pEntity->SetSlotLocalTM(m_slot, VALIDATE_MAT(localTM));
  224.  
  225.                 m_savedTM = localTM;
  226.         }
  227.  
  228.         if (m_slot > -1)
  229.         {
  230.                 if (swapped && (m_hideCount == 0))
  231.                 {
  232.                         pEntity->SetSlotFlags(m_slot, GetEntity()->GetSlotFlags(m_slot) | ENTITY_SLOT_RENDER);
  233.                 }
  234.                 else
  235.                 {
  236.                         pEntity->SetSlotFlags(m_slot, GetEntity()->GetSlotFlags(m_slot) & ~(ENTITY_SLOT_RENDER | ENTITY_SLOT_RENDER_NEAREST));
  237.                 }
  238.         }
  239.  
  240.         if (swapped && (flags & eVPSF_Physicalize))
  241.         {
  242.                 Physicalize();
  243.         }
  244.  
  245.         m_state = state;
  246.  
  247.         return true;
  248. }
  249.  
  250. //------------------------------------------------------------------------
  251. void CVehiclePartSubPart::Physicalize()
  252. {
  253.         if (m_slot != -1)
  254.         {
  255.                 GetEntity()->UnphysicalizeSlot(m_slot);
  256.  
  257.                 if (m_pSharedParameters->m_isPhysicalized)
  258.                 {
  259.                         SEntityPhysicalizeParams params;
  260.  
  261.                         params.mass = m_pSharedParameters->m_mass;
  262.                         params.density = m_pSharedParameters->m_density;
  263.                         params.nSlot = m_slot;
  264.  
  265.                         if (m_pSharedParameters->m_disableCollision)
  266.                         {
  267.                                 params.nFlagsAND = ~(geom_collides | geom_floats);
  268.                         }
  269.  
  270.                         m_physId = GetEntity()->PhysicalizeSlot(m_slot, params);
  271.  
  272.                         if (GetEntity()->GetPhysics() && m_physId > -1)
  273.                         {
  274.                                 const Matrix34& localTM = VALIDATE_MAT(GetEntity()->GetSlotLocalTM(m_slot, false));
  275.  
  276.                                 pe_params_part paramsPart;
  277.  
  278.                                 paramsPart.partid = m_physId;
  279.                                 paramsPart.pos = localTM.GetTranslation();
  280.                                 paramsPart.q = Quat(localTM);
  281.  
  282.                                 GetEntity()->GetPhysics()->SetParams(&paramsPart);
  283.  
  284.                                 CheckColltypeHeavy(m_physId);
  285.  
  286.                                 GetEntity()->SetSlotFlags(m_slot, GetEntity()->GetSlotFlags(m_slot) | ENTITY_SLOT_IGNORE_PHYSICS);
  287.                         }
  288.                 }
  289.         }
  290. }
  291.  
  292. //------------------------------------------------------------------------
  293. void CVehiclePartSubPart::Update(const float frameTime)
  294. {
  295.         CVehiclePartBase::Update(frameTime);
  296. }
  297.  
  298. //------------------------------------------------------------------------
  299. void CVehiclePartSubPart::GetMemoryUsage(ICrySizer* pSizer) const
  300. {
  301.         pSizer->Add(*this);
  302.  
  303.         GetMemoryUsageInternal(pSizer);
  304. }
  305.  
  306. //------------------------------------------------------------------------
  307. void CVehiclePartSubPart::GetMemoryUsageInternal(ICrySizer* pSizer) const
  308. {
  309.         pSizer->AddObject(this, sizeof(*this));
  310.  
  311.         CVehiclePartBase::GetMemoryUsageInternal(pSizer);
  312. }
  313.  
  314. //------------------------------------------------------------------------
  315. const Matrix34& CVehiclePartSubPart::GetLocalInitialTM()
  316. {
  317.         return m_savedTM;
  318. }
  319.  
  320. //------------------------------------------------------------------------
  321. void CVehiclePartSubPart::InitGeometry()
  322. {
  323. }
  324.  
  325. //------------------------------------------------------------------------
  326. void CVehiclePartSubPart::RegisterStateGeom(EVehiclePartState state, IStatObj* pStatObj)
  327. {
  328.         m_stateGeoms.push_back(StateGeom(state, pStatObj));
  329. }
  330.  
  331. DEFINE_VEHICLEOBJECT(CVehiclePartSubPart);
  332.  
downloadVehiclePartSubPart.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