BVB Source Codes

CRYENGINE Show VisionMap.h Source code

Return Download CRYENGINE: download VisionMap.h Source code - Download CRYENGINE Source code - Type:.h
  1. // Copyright 2001-2016 Crytek GmbH / Crytek Group. All rights reserved.
  2.  
  3. /*************************************************************************
  4.    -------------------------------------------------------------------------
  5.    $Id$
  6.    $DateTime$
  7.    Description: Implements a visibility determination map for use with AI.
  8.  
  9.    -------------------------------------------------------------------------
  10.    History:
  11.    - 4:3:2009   11:38 : Created by M谩rcio Martins
  12.  
  13. *************************************************************************/
  14. #ifndef __VisionMap_h__
  15. #define __VisionMap_h__
  16.  
  17. #pragma once
  18.  
  19. #include <CryAISystem/IVisionMap.h>
  20.  
  21. #include <CryAISystem/HashGrid.h>
  22.  
  23. #ifdef CRYAISYSTEM_DEBUG
  24.         #define VISIONMAP_DEBUG 1
  25. #endif
  26.  
  27. class CVisionMap : public IVisionMap
  28. {
  29. public:
  30.         CVisionMap();
  31.         virtual ~CVisionMap();
  32.  
  33.         virtual void                    Reset();
  34.  
  35.         virtual VisionID                CreateVisionID(const char* name);
  36.  
  37.         virtual void                    RegisterObserver(const ObserverID& observerID, const ObserverParams& observerParams);
  38.         virtual void                    UnregisterObserver(const ObserverID& observerID);
  39.  
  40.         virtual void                    RegisterObservable(const ObservableID& observableID, const ObservableParams& observerParams);
  41.         virtual void                    UnregisterObservable(const ObservableID& observableID);
  42.  
  43.         virtual void                    ObserverChanged(const ObserverID& observerID, const ObserverParams& observerParams, uint32 hint);
  44.         virtual void                    ObservableChanged(const ObservableID& observableID, const ObservableParams& newObservableParams, uint32 hint);
  45.  
  46.         virtual bool                    IsVisible(const ObserverID& observerID, const ObservableID& observableID) const;
  47.  
  48.         virtual const ObserverParams*   GetObserverParams(const ObserverID& observerID) const;
  49.         virtual const ObservableParams* GetObservableParams(const ObservableID& observableID) const;
  50.  
  51.         virtual void                    AddPriorityMapEntry(const PriorityMapEntry& priorityMapEntry);
  52.         virtual void                    ClearPriorityMap();
  53.  
  54.         virtual void                    Update(float frameTime);
  55.  
  56. #if VISIONMAP_DEBUG
  57.         void DebugDraw();
  58. #endif
  59.  
  60. private:
  61.         struct ObservableInfo
  62.         {
  63.                 ObservableInfo(const ObservableID& _observableID, const ObservableParams& _observableParams)
  64.                         : observableID(_observableID)
  65.                         , observableParams(_observableParams) {};
  66.  
  67.                 ObservableID     observableID;
  68.                 ObservableParams observableParams;
  69.         };
  70.  
  71.         struct ObservablePosition
  72.         {
  73.                 inline Vec3 operator()(const ObservableInfo* observableInfo) const
  74.                 {
  75.                         return observableInfo->observableParams.observablePositions[0];
  76.                 }
  77.         };
  78.  
  79.         typedef hash_grid<256, ObservableInfo*, hash_grid_2d<Vec3, Vec3i>, ObservablePosition> ObservablesGrid;
  80.         typedef std::unordered_map<ObservableID, ObservableInfo, stl::hash_uint32>             Observables;
  81.  
  82.         struct PVSEntry
  83.         {
  84.                 PVSEntry(const ObservableInfo& _observableInfo, RayCastRequest::Priority _priority)
  85.                         : pendingRayID(0)
  86.                         , observableInfo(_observableInfo)
  87.                         , visible(false)
  88.                         , currentTestPositionIndex(0)
  89.                         , priority(_priority)
  90.                         , needsUpdate(true)
  91. #if VISIONMAP_DEBUG
  92.                         , obstructionPosition(ZERO)
  93.                         , lastObserverPositionChecked(ZERO)
  94.                         , lastObservablePositionChecked(ZERO)
  95.                         , rayQueueTimestamp(0.0f)
  96. #endif
  97.                 {};
  98.  
  99.                 QueuedRayID              pendingRayID;
  100.                 RayCastRequest::Priority priority;
  101.                 const ObservableInfo&    observableInfo;
  102.  
  103.                 bool                     visible;
  104.                 bool                     needsUpdate;
  105.                 int8                     currentTestPositionIndex;
  106.                 int8                     firstVisPos;
  107.  
  108. #if VISIONMAP_DEBUG
  109.                 Vec3  obstructionPosition;
  110.                 Vec3  lastObserverPositionChecked;
  111.                 Vec3  lastObservablePositionChecked;
  112.                 float rayQueueTimestamp;
  113. #endif
  114.         };
  115.  
  116.         typedef std::map<ObservableID, PVSEntry> PVS;
  117.  
  118.         struct ObserverInfo
  119.         {
  120.                 ObserverInfo(ObserverID _observerID)
  121.                         : observerID(_observerID)
  122.                         , needsPVSUpdate(false)
  123.                         , needsVisibilityUpdate(false)
  124.                         , queuedForPVSUpdate(false)
  125.                         , queuedForVisibilityUpdate(false)
  126.                         , updateAllVisibilityStatus(false)
  127.                         , nextPVSUpdateTime(0.0f)
  128.                         , nextVisibilityUpdateTime(0.0f)
  129.                 {
  130.                 }
  131.  
  132.                 ObserverID     observerID;
  133.                 ObserverParams observerParams;
  134.  
  135.                 PVS            pvs;
  136.                 bool           needsPVSUpdate;
  137.                 bool           needsVisibilityUpdate;
  138.                 bool           queuedForPVSUpdate;
  139.                 bool           queuedForVisibilityUpdate;
  140.                 bool           updateAllVisibilityStatus;
  141.                 CTimeValue     nextPVSUpdateTime;
  142.                 CTimeValue     nextVisibilityUpdateTime;
  143. #if VISIONMAP_DEBUG
  144.                 CTimeValue     queuedForPVSUpdateTime;
  145.                 CTimeValue     queuedForVisibilityUpdateTime;
  146. #endif
  147.         };
  148.  
  149.         typedef std::unordered_map<ObserverID, ObserverInfo, stl::hash_uint32> Observers;
  150.  
  151.         struct PendingRayInfo
  152.         {
  153.                 PendingRayInfo(const ObserverInfo& _observerInfo, PVSEntry& _pvsEntry)
  154.                         : observerInfo(_observerInfo)
  155.                         , pvsEntry(_pvsEntry)
  156. #if VISIONMAP_DEBUG
  157.                         , observerPosition(ZERO)
  158.                         , observablePosition(ZERO)
  159. #endif
  160.                 {
  161.                 }
  162.  
  163.                 const ObserverInfo& observerInfo;
  164.                 PVSEntry&           pvsEntry;
  165.  
  166. #if VISIONMAP_DEBUG
  167.                 Vec3 observerPosition;
  168.                 Vec3 observablePosition;
  169. #endif
  170.         };
  171.  
  172.         std::vector<PriorityMapEntry> m_priorityMap;
  173.  
  174.         void AcquireSkipList(IPhysicalEntity** skipList, uint32 skipListSize);
  175.         void ReleaseSkipList(IPhysicalEntity** skipList, uint32 skipListSize);
  176.  
  177. #if VISIONMAP_DEBUG
  178.         void UpdateDebugVisionMapObjects();
  179.         void DebugDrawObservers();
  180.         void DebugDrawObservables();
  181.         void DebugDrawVisionMapStats();
  182. #endif
  183.  
  184.         void                     AddToObserverPVS(ObserverInfo& observerInfo, const ObservableInfo& observableInfo);
  185.  
  186.         void                     UpdateObservers();
  187.         void                     UpdatePVS(ObserverInfo& observerInfo);
  188.  
  189.         bool                     ShouldBeAddedToObserverPVS(const ObserverInfo& observerInfo, const ObservableInfo& observableInfo) const;
  190.  
  191.         void                     UpdateVisibilityStatus(ObserverInfo& observerInfo);
  192.  
  193.         bool                     ShouldObserve(const ObserverInfo& observerInfo, const ObservableInfo& observableInfo) const;
  194.         bool                     IsInSightRange(const ObserverInfo& observerInfo, const ObservableInfo& observableInfo) const;
  195.         bool                     IsInFoV(const ObserverInfo& observerInfo, const ObservableInfo& observableInfo) const;
  196.         bool                     IsUserConditionSatisfied(const ObserverInfo& observerInfo, const ObservableInfo& observableInfo) const;
  197.  
  198.         void                     QueueRay(const ObserverInfo& observerInfo, PVSEntry& pvsEntry);
  199.         bool                     RayCastSubmit(const QueuedRayID& queuedRayID, RayCastRequest& request);
  200.         void                     RayCastComplete(const QueuedRayID& queuedRayID, const RayCastResult& rayCastResult);
  201.         RayCastRequest::Priority GetRayCastRequestPriority(const ObserverParams& observerParams, const ObservableParams& observable);
  202.  
  203.         void                     DeletePendingRay(PVSEntry& pvsEntry);
  204.         void                     DeletePendingRays(PVS& pvs);
  205.  
  206.         void                     TriggerObserverCallback(const ObserverInfo& observerInfo, const ObservableInfo& observableInfo, bool visible);
  207.         void                     TriggerObservableCallback(const ObserverInfo& observerInfo, const ObservableInfo& observableInfo, bool visible);
  208.  
  209.         Observers       m_observers;
  210.         Observables     m_observables;
  211.         ObservablesGrid m_observablesGrid;
  212.  
  213.         typedef std::deque<ObserverID> ObserverQueue;
  214.         ObserverQueue m_observerPVSUpdateQueue;
  215.         ObserverQueue m_observerVisibilityUpdateQueue;
  216.  
  217.         typedef std::vector<std::pair<float, ObservableInfo*>> QueryObservables;
  218.         QueryObservables m_queryObservables;
  219.  
  220.         typedef std::map<QueuedRayID, PendingRayInfo> PendingRays;
  221.         PendingRays m_pendingRays;
  222.  
  223. #if VISIONMAP_DEBUG
  224.         float      m_debugTimer;
  225.         uint32     m_numberOfPVSUpdatesThisFrame;
  226.         uint32     m_numberOfVisibilityUpdatesThisFrame;
  227.         uint32     m_numberOfRayCastsSubmittedThisFrame;
  228.  
  229.         VisionID   m_debugObserverVisionID;
  230.         VisionID   m_debugObservableVisionID;
  231.  
  232.         CTimeValue m_pvsUpdateQueueLatency;
  233.         CTimeValue m_visibilityUpdateQueueLatency;
  234.  
  235.         struct LatencyInfo
  236.         {
  237.                 struct
  238.                 {
  239.                         float latency;
  240.                         float occurred;
  241.                 }   buffer[512];
  242.  
  243.                 int bufferIndex;
  244.                 int usedBufferSize;
  245.         };
  246.  
  247.         LatencyInfo m_latencyInfo[RayCastRequest::TotalNumberOfPriorities];
  248.  
  249.         int         m_pendingRayCounts[RayCastRequest::TotalNumberOfPriorities];
  250. #endif
  251.  
  252.         uint32 m_visionIdCounter;
  253. };
  254.  
  255. #endif // __VisionMap_h__
  256.  
downloadVisionMap.h 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