BVB Source Codes

CRYENGINE Show EntityCoverSampler.cpp Source code

Return Download CRYENGINE: download EntityCoverSampler.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 "EntityCoverSampler.h"
  5. #include "CoverSystem.h"
  6.  
  7. #include "DebugDrawContext.h"
  8.  
  9. EntityCoverSampler::EntityCoverSampler()
  10.         : m_sampler(0)
  11.         , m_currentSide(Left)
  12.         , m_lastSort(0ll)
  13. {
  14. }
  15.  
  16. EntityCoverSampler::~EntityCoverSampler()
  17. {
  18.         if (m_sampler)
  19.                 m_sampler->Release();
  20.         m_sampler = 0;
  21. }
  22.  
  23. void EntityCoverSampler::Clear()
  24. {
  25.         m_queue.clear();
  26.  
  27.         m_lastSort.SetValue(0ll);
  28. }
  29.  
  30. void EntityCoverSampler::Queue(EntityId entityID, const Callback& callback)
  31. {
  32.         m_queue.push_back(QueuedEntity(entityID, callback));
  33. }
  34.  
  35. void EntityCoverSampler::Cancel(EntityId entityID)
  36. {
  37.         if (!m_queue.empty())
  38.         {
  39.                 QueuedEntities::iterator it = m_queue.begin();
  40.                 QueuedEntities::iterator end = m_queue.end();
  41.  
  42.                 if (entityID == m_queue.front().entityID)
  43.                         m_queue.pop_front();
  44.                 else
  45.                 {
  46.                         for (; it != end; ++it)
  47.                         {
  48.                                 QueuedEntity& queued = *it;
  49.  
  50.                                 if (queued.entityID == entityID)
  51.                                 {
  52.                                         m_queue.erase(it);
  53.                                         break;
  54.                                 }
  55.                         }
  56.                 }
  57.         }
  58. }
  59.  
  60. void EntityCoverSampler::Update()
  61. {
  62.         FUNCTION_PROFILER(gEnv->pSystem, PROFILE_AI);
  63.  
  64.         CTimeValue now = gEnv->pTimer->GetFrameStartTime();
  65.  
  66.         while (!m_queue.empty())
  67.         {
  68.                 if ((now - m_lastSort).GetMilliSecondsAsInt64() > 1250)
  69.                 {
  70.                         if (CAIObject* player = GetAISystem()->GetPlayer())
  71.                         {
  72.                                 Vec3 center = player->GetPos();
  73.  
  74.                                 QueuedEntities::iterator it = m_queue.begin();
  75.                                 QueuedEntities::iterator end = m_queue.end();
  76.  
  77.                                 for (; it != end; ++it)
  78.                                 {
  79.                                         QueuedEntity& queued = *it;
  80.  
  81.                                         if (IEntity* entity = gEnv->pEntitySystem->GetEntity(queued.entityID))
  82.                                                 queued.distanceSq = (center - entity->GetWorldPos()).GetLengthSquared2D();
  83.                                         else
  84.                                                 queued.distanceSq = FLT_MAX;
  85.                                 }
  86.  
  87.                                 if (m_queue.front().state != QueuedEntity::Queued)
  88.                                         std::sort(m_queue.begin() + 1, m_queue.end(), QueuedEntitySorter());
  89.                                 else
  90.                                         std::sort(m_queue.begin(), m_queue.end(), QueuedEntitySorter());
  91.  
  92.                                 m_lastSort = now;
  93.                         }
  94.                 }
  95.  
  96.                 QueuedEntity& queued = m_queue.front();
  97.  
  98.                 if (!m_sampler)
  99.                         m_sampler = gAIEnv.pCoverSystem->CreateCoverSampler("Default");
  100.  
  101.                 assert(m_sampler);
  102.  
  103.                 IEntity* entity = gEnv->pEntitySystem->GetEntity(queued.entityID);
  104.                 assert(entity);
  105.  
  106.                 if (queued.state == QueuedEntity::Queued)
  107.                 {
  108.                         if (IPhysicalEntity* physicalEntity = entity->GetPhysics())
  109.                         {
  110.                                 pe_status_nparts nparts;
  111.  
  112.                                 if (int partCount = physicalEntity->GetStatus(&nparts))
  113.                                 {
  114.                                         AABB localBB(AABB::RESET);
  115.  
  116.                                         pe_status_pos pp;
  117.                                         primitives::box box;
  118.  
  119.                                         for (int p = 0; p < partCount; ++p)
  120.                                         {
  121.                                                 pp.ipart = p;
  122.                                                 pp.flags = status_local;
  123.  
  124.                                                 if (physicalEntity->GetStatus(&pp))
  125.                                                 {
  126.                                                         if (IGeometry* geometry = pp.pGeomProxy ? pp.pGeomProxy : pp.pGeom)
  127.                                                         {
  128.                                                                 geometry->GetBBox(&box);
  129.  
  130.                                                                 Vec3 center = box.center * pp.scale;
  131.                                                                 Vec3 size = box.size * pp.scale;
  132.  
  133.                                                                 center = pp.pos + pp.q * center;
  134.                                                                 Matrix33 orientationTM = Matrix33(pp.q) * box.Basis.GetTransposed();
  135.  
  136.                                                                 localBB.Add(center + orientationTM * Vec3(size.x, size.y, size.z));
  137.                                                                 localBB.Add(center + orientationTM * Vec3(size.x, size.y, -size.z));
  138.                                                                 localBB.Add(center + orientationTM * Vec3(size.x, -size.y, size.z));
  139.                                                                 localBB.Add(center + orientationTM * Vec3(size.x, -size.y, -size.z));
  140.                                                                 localBB.Add(center + orientationTM * Vec3(-size.x, size.y, size.z));
  141.                                                                 localBB.Add(center + orientationTM * Vec3(-size.x, size.y, -size.z));
  142.                                                                 localBB.Add(center + orientationTM * Vec3(-size.x, -size.y, size.z));
  143.                                                                 localBB.Add(center + orientationTM * Vec3(-size.x, -size.y, -size.z));
  144.                                                         }
  145.                                                 }
  146.                                         }
  147.  
  148.                                         Matrix34 worldTM = entity->GetWorldTM();
  149.  
  150.                                         m_obb = OBB::CreateOBBfromAABB(Matrix33(worldTM), localBB);
  151.  
  152.                                         float upSign = fsgnf(worldTM.GetColumn2().dot(CoverUp));
  153.  
  154.                                         m_params.position = worldTM.GetTranslation() + m_obb.m33.TransformVector(m_obb.c) +
  155.                                                             (m_obb.m33.GetColumn0() * -m_obb.h.x * upSign) + m_obb.m33.GetColumn2() * -m_obb.h.z * upSign;
  156.                                         Vec3 dir = m_obb.m33.GetColumn0() * upSign;
  157.                                         dir.z = 0.0f;
  158.                                         dir.normalize();
  159.                                         m_params.referenceEntity = entity;
  160.                                         m_params.heightSamplerInterval = 0.25f;
  161.                                         m_params.widthSamplerInterval = 0.25f;
  162.                                         m_params.heightAccuracy = 0.125f;
  163.                                         m_params.limitDepth = 0.5f;
  164.                                         m_params.maxStartHeight = m_params.minHeight;
  165.                                         m_params.maxCurvatureAngleCos = 0.087f; // 85
  166.                                         m_params.limitHeight = m_obb.h.z * 2.125f;
  167.                                         m_params.limitLeft = m_obb.h.y * 1.075f;
  168.                                         m_params.limitRight = m_obb.h.y * 1.075f;
  169.  
  170.                                         m_params.direction = dir;
  171.  
  172.                                         m_currentSide = Left;
  173.                                         m_sampler->StartSampling(m_params);
  174.  
  175.                                         queued.state = QueuedEntity::SamplingLeft;
  176.                                         break;
  177.                                 }
  178.                         }
  179.  
  180.                         // nothing to sample
  181.                         if (queued.callback)
  182.                                 queued.callback(queued.entityID, LastSide, ICoverSystem::SurfaceInfo());
  183.  
  184.                         m_queue.pop_front();
  185.  
  186.                         continue;
  187.                 }
  188.  
  189.                 ICoverSampler::ESamplerState state = m_sampler->Update(0.00025f);
  190.  
  191.                 if (gAIEnv.CVars.DebugDrawDynamicCoverSampler)
  192.                         m_sampler->DebugDraw();
  193.  
  194.                 if (state != ICoverSampler::InProgress)
  195.                 {
  196.                         ICoverSystem::SurfaceInfo surfaceInfo;
  197.  
  198.                         if (state == ICoverSampler::Finished)
  199.                         {
  200.                                 surfaceInfo.flags = m_sampler->GetSurfaceFlags();
  201.                                 surfaceInfo.samples = m_sampler->GetSamples();
  202.                                 surfaceInfo.sampleCount = m_sampler->GetSampleCount();
  203.                         }
  204.  
  205.                         if (queued.callback)
  206.                                 queued.callback(queued.entityID, (ESide)m_currentSide, surfaceInfo);
  207.  
  208.                         if (++m_currentSide > LastSide)
  209.                                 m_queue.pop_front();
  210.                         else
  211.                         {
  212.                                 Matrix34 worldTM = entity->GetWorldTM();
  213.  
  214.                                 float upSign = fsgnf(worldTM.GetColumn2().dot(CoverUp));
  215.  
  216.                                 switch (m_currentSide)
  217.                                 {
  218.                                 case Right:
  219.                                         {
  220.                                                 queued.state = QueuedEntity::SamplingRight;
  221.  
  222.                                                 m_params.position = worldTM.GetTranslation() + m_obb.m33.TransformVector(m_obb.c) +
  223.                                                                     (m_obb.m33.GetColumn0() * m_obb.h.x * upSign) + m_obb.m33.GetColumn2() * -m_obb.h.z * upSign;
  224.  
  225.                                                 m_params.direction = -m_params.direction;
  226.  
  227.                                                 m_sampler->StartSampling(m_params);
  228.                                         }
  229.                                         break;
  230.                                 case Front:
  231.                                         {
  232.                                                 queued.state = QueuedEntity::SamplingFront;
  233.  
  234.                                                 m_params.position = worldTM.GetTranslation() + m_obb.m33.TransformVector(m_obb.c) +
  235.                                                                     (m_obb.m33.GetColumn1() * m_obb.h.y * upSign) + m_obb.m33.GetColumn2() * -m_obb.h.z * upSign;
  236.                                                 /*
  237.                                                    FrancescoR: Switching -upSign with (-1 * upSign) to break a Visual Studio 2010
  238.                                                    assembly optimization that causes a crash in Profile|64 (It looks to be a compiler bug)
  239.                                                  */
  240.                                                 Vec3 dir = -1 * upSign * m_obb.m33.GetColumn1();
  241.                                                 dir.z = 0.0f;
  242.                                                 dir.normalize();
  243.                                                 m_params.limitHeight = m_obb.h.z * 2.125f;
  244.                                                 m_params.limitLeft = m_obb.h.x * 1.075f;
  245.                                                 m_params.limitRight = m_obb.h.x * 1.075f;
  246.  
  247.                                                 m_params.direction = dir;
  248.  
  249.                                                 m_sampler->StartSampling(m_params);
  250.                                         }
  251.                                         break;
  252.                                 case Back:
  253.                                         {
  254.                                                 queued.state = QueuedEntity::SamplingBack;
  255.  
  256.                                                 m_params.position = worldTM.GetTranslation() + m_obb.m33.TransformVector(m_obb.c) +
  257.                                                                     (m_obb.m33.GetColumn1() * -m_obb.h.y * upSign) + m_obb.m33.GetColumn2() * -m_obb.h.z * upSign;
  258.  
  259.                                                 m_params.direction = -m_params.direction;
  260.  
  261.                                                 m_sampler->StartSampling(m_params);
  262.                                         }
  263.                                         break;
  264.                                 }
  265.                         }
  266.                 }
  267.                 break;
  268.         }
  269.  
  270.         if (gAIEnv.CVars.DebugDrawDynamicCoverSampler)
  271.                 DebugDraw();
  272. }
  273.  
  274. void EntityCoverSampler::DebugDraw()
  275. {
  276.         CDebugDrawContext dc;
  277.  
  278.         const float fontSize = 1.25f;
  279.         const float lineHeight = 11.0f;
  280.  
  281.         float y = 30.0f;
  282.         dc->Draw2dLabel(10.0f, y, 1.45f, m_queue.empty() ? Col_DarkGray : Col_DarkSlateBlue, false,
  283.                         "Entity Cover Sampler Queue (%" PRISIZE_T ")", m_queue.size());
  284.         y += lineHeight * 1.45f;
  285.  
  286.         QueuedEntities::const_iterator it = m_queue.begin();
  287.         QueuedEntities::const_iterator end = m_queue.end();
  288.  
  289.         for (; it != end; ++it)
  290.         {
  291.                 const QueuedEntity& queued = *it;
  292.  
  293.                 const char* side = 0;
  294.                 const char* name = "<invalid>";
  295.  
  296.                 if (IEntity* entity = gEnv->pEntitySystem->GetEntity(queued.entityID))
  297.                         name = entity->GetName();
  298.  
  299.                 if (queued.state == QueuedEntity::Queued)
  300.                         dc->Draw2dLabel(10.0f, y, 1.25f, Col_Gray, false, "%s", name);
  301.                 else
  302.                 {
  303.                         switch (queued.state)
  304.                         {
  305.                         case QueuedEntity::SamplingLeft:
  306.                                 side = "left";
  307.                                 break;
  308.                         case QueuedEntity::SamplingRight:
  309.                                 side = "right";
  310.                                 break;
  311.                         case QueuedEntity::SamplingFront:
  312.                                 side = "front";
  313.                                 break;
  314.                         case QueuedEntity::SamplingBack:
  315.                                 side = "back";
  316.                                 break;
  317.                         default:
  318.                                 assert(0);
  319.                                 break;
  320.                         }
  321.  
  322.                         dc->Draw2dLabel(10.0f, y, 1.25f, Col_BlueViolet, false, "%s: %s", name, side);
  323.                 }
  324.  
  325.                 y += lineHeight * fontSize;
  326.         }
  327. }
  328.  
downloadEntityCoverSampler.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