BVB Source Codes

CRYENGINE Show CAISystemPhys.cpp Source code

Return Download CRYENGINE: download CAISystemPhys.cpp Source code - Download CRYENGINE Source code - Type:.cpp
  1. // Copyright 2001-2016 Crytek GmbH / Crytek Group. All rights reserved.
  2.  
  3. /********************************************************************
  4.    -------------------------------------------------------------------------
  5.    File name:   CAISystemPhys.cpp
  6.    $Id$
  7.    Description: should contaioin all the methods of CAISystem which have to deal with Physics
  8.  
  9.    -------------------------------------------------------------------------
  10.    History:
  11.    - 2007                               : Created by Kirill Bulatsev
  12.  
  13.  
  14.  *********************************************************************/
  15.  
  16. #include "StdAfx.h"
  17. #include "CAISystem.h"
  18. #include "Puppet.h"
  19.  
  20. //===================================================================
  21. // GetWaterOcclusionValue
  22. //===================================================================
  23. float CAISystem::GetWaterOcclusionValue(const Vec3& targetPos) const
  24. {
  25.         FUNCTION_PROFILER(gEnv->pSystem, PROFILE_AI);
  26.  
  27.         float fResult = 0.0f;
  28.  
  29.         if (gAIEnv.CVars.WaterOcclusionEnable > 0)
  30.         {
  31.                 const float waterLevel = gEnv->p3DEngine->GetWaterLevel(&targetPos);
  32.                 const float inWaterDepth = waterLevel - targetPos.z;
  33.  
  34.                 if (inWaterDepth > FLT_EPSILON)
  35.                 {
  36.                         IPhysicalEntity** areas;
  37.                         int areaCount = GetPhysicalEntitiesInBox(targetPos, targetPos, areas, ent_areas);
  38.  
  39.                         for (int i = 0; i < areaCount; ++i)
  40.                         {
  41.                                 pe_params_buoyancy pb;
  42.  
  43.                                 // if this is a water area (there can be only one!1)
  44.                                 if (areas[i]->GetParams(&pb) && !is_unused(pb.waterPlane.origin))
  45.                                 {
  46.                                         pe_status_contains_point scp;
  47.                                         scp.pt = targetPos;
  48.  
  49.                                         if (areas[i]->GetStatus(&scp))
  50.                                         {
  51.                                                 const float areaWaterLevel = targetPos.z - pb.waterPlane.n.z *
  52.                                                                              (pb.waterPlane.n * (targetPos - pb.waterPlane.origin));
  53.                                                 const float areaInWaterDepth = areaWaterLevel - targetPos.z;
  54.  
  55.                                                 if (areaInWaterDepth > FLT_EPSILON)
  56.                                                 {
  57.                                                         IWaterVolumeRenderNode* waterRenderNode((IWaterVolumeRenderNode*)areas[i]
  58.                                                                                                 ->GetForeignData(PHYS_FOREIGN_ID_WATERVOLUME));
  59.  
  60.                                                         if (waterRenderNode)
  61.                                                         {
  62.                                                                 const float waterFogDensity = waterRenderNode->GetFogDensity();
  63.                                                                 const float resValue = gAIEnv.CVars.WaterOcclusionScale * exp(-waterFogDensity * inWaterDepth);
  64.  
  65.                                                                 // make sure it's in 0-1 range
  66.                                                                 fResult = 1.0f - min(1.0f, resValue);
  67.                                                         }
  68.                                                         else
  69.                                                         {
  70.                                                                 // no render node if in the ocean
  71.                                                                 // make sure it's in 0-1 range
  72.                                                                 const float resValue = gAIEnv.CVars.WaterOcclusionScale * inWaterDepth * (1.0f / 6.0f);
  73.                                                                 fResult = min(1.0f, resValue);
  74.                                                         }
  75.                                                 }
  76.                                                 break;
  77.                                         }
  78.                                 }
  79.                         }
  80.                 }
  81.         }
  82.  
  83.         return fResult;
  84. }
  85.  
  86. //
  87. //-----------------------------------------------------------------------------------------------------------
  88. bool CAISystem::CheckPointsVisibility(const Vec3& from, const Vec3& to, float rayLength, IPhysicalEntity* pSkipEnt, IPhysicalEntity* pSkipEntAux)
  89. {
  90.         Vec3 dir = to - from;
  91.         if (rayLength && dir.GetLengthSquared() > rayLength * rayLength)
  92.                 dir *= rayLength / dir.GetLength();
  93.  
  94.         IPhysicalEntity* skipList[2] =
  95.         {
  96.                 pSkipEnt,
  97.                 pSkipEntAux,
  98.         };
  99.  
  100.         uint skipListSize = 0;
  101.         if (!skipList[0])
  102.         {
  103.                 skipList[0] = skipList[1];
  104.                 skipList[1] = 0;
  105.         }
  106.  
  107.         skipListSize += (skipList[0] != 0) ? 1 : 0;
  108.         skipListSize += (skipList[1] != 0) ? 1 : 0;
  109.  
  110.         return !gAIEnv.pRayCaster->Cast(
  111.           RayCastRequest(
  112.             from, dir, COVER_OBJECT_TYPES,
  113.             AI_VISION_RAY_CAST_FLAG_BLOCKED_BY_SOLID_COVER | AI_VISION_RAY_CAST_FLAG_BLOCKED_BY_SOFT_COVER,
  114.             skipList, skipListSize));
  115. }
  116.  
  117. //
  118. //-----------------------------------------------------------------------------------------------------------
  119. bool CAISystem::CheckObjectsVisibility(const IAIObject* pObj1, const IAIObject* pObj2, float rayLength)
  120. {
  121.         Vec3 dir = pObj2->GetPos() - pObj1->GetPos();
  122.         if (rayLength && dir.GetLengthSquared() > sqr(rayLength))
  123.                 dir *= rayLength / dir.GetLength();
  124.  
  125.         PhysSkipList skipList;
  126.         if (const CAIActor* pActor = pObj1->CastToCAIActor())
  127.                 pActor->GetPhysicalSkipEntities(skipList);
  128.         if (const CAIActor* pActor = pObj2->CastToCAIActor())
  129.                 pActor->GetPhysicalSkipEntities(skipList);
  130.  
  131.         const RayCastResult& result = gAIEnv.pRayCaster->Cast(
  132.           RayCastRequest(
  133.             pObj1->GetPos(), dir, COVER_OBJECT_TYPES,
  134.             AI_VISION_RAY_CAST_FLAG_BLOCKED_BY_SOLID_COVER | AI_VISION_RAY_CAST_FLAG_BLOCKED_BY_SOFT_COVER, &skipList[0], skipList.size()));
  135.  
  136.         // Allow small fudge in th test just in case the point is exactly on ground.
  137.         return !result || result[0].dist > (dir.GetLength() - 0.1f);
  138. }
  139.  
  140. //-----------------------------------------------------------------------------------------------------------
  141. //
  142. bool CAISystem::CheckVisibilityToBody(CAIActor* pObserver, CAIActor* pBody, float& closestDistSq, IPhysicalEntity* pSkipEnt)
  143. {
  144.         int newFlags = AI_VISION_RAY_CAST_FLAG_BLOCKED_BY_SOLID_COVER | AI_VISION_RAY_CAST_FLAG_BLOCKED_BY_SOFT_COVER;
  145.  
  146.         FUNCTION_PROFILER(gEnv->pSystem, PROFILE_AI);
  147.  
  148.         Vec3 bodyPos(pBody->GetPos());
  149.  
  150.         const Vec3& puppetPos = pObserver->GetPos();
  151.         Vec3 posDiff = bodyPos - puppetPos;
  152.         float distSq = posDiff.GetLengthSquared();
  153.         if (distSq > closestDistSq)
  154.                 return false;
  155.  
  156.         if (IAIObject::eFOV_Outside == pObserver->IsObjectInFOV(pBody, pObserver->GetParameters().m_PerceptionParams.perceptionScale.visual * 0.75f))
  157.                 return false;
  158.  
  159.         //--------------- ACCURATE MEASURING
  160.         float dist = sqrtf(distSq);
  161.  
  162.         PhysSkipList skipList;
  163.         pObserver->GetPhysicalSkipEntities(skipList);
  164.         pBody->GetPhysicalSkipEntities(skipList);
  165.         if (pSkipEnt)
  166.                 stl::push_back_unique(skipList, pSkipEnt);
  167.  
  168.         const RayCastResult& result = gAIEnv.pRayCaster->Cast(RayCastRequest(puppetPos, posDiff, COVER_OBJECT_TYPES, newFlags,
  169.                                                                              &skipList[0], skipList.size()));
  170.  
  171.         bool isVisible = !result;
  172.  
  173.         // check if collider is the body itself
  174.         if (!isVisible)
  175.         {
  176.                 const ray_hit& hit = result[0];
  177.                 isVisible = hit.pCollider == pBody->GetProxy()->GetPhysics() || hit.pCollider == pBody->GetProxy()->GetPhysics(true);
  178.         }
  179.  
  180.         if (!isVisible)
  181.                 return false;
  182.  
  183.         closestDistSq = distSq;
  184.  
  185.         return true;
  186. }
  187.  
downloadCAISystemPhys.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