BVB Source Codes

CRYENGINE Show ClusterDetector.h Source code

Return Download CRYENGINE: download ClusterDetector.h Source code - Download CRYENGINE Source code - Type:.h
  1. // Copyright 2001-2016 Crytek GmbH / Crytek Group. All rights reserved.
  2.  
  3. // -------------------------------------------------------------------------
  4. //  File name:   ClusterDetector.h
  5. //  Version:     v1.00
  6. //  Created:     01/01/2008 by Francesco Roccucci.
  7. //  Description: This is the actual class that implements the detection of
  8. //               the different clusters in the world space.
  9. //               This suystem only knows about the presence of points into
  10. //               the space and he group them into clusters
  11. // -------------------------------------------------------------------------
  12. //  History:
  13. //
  14. ////////////////////////////////////////////////////////////////////////////
  15.  
  16. #ifndef __ClusterDetector_h__
  17. #define __ClusterDetector_h__
  18.  
  19. #include <CryAISystem/IClusterDetector.h>
  20.  
  21. struct Cluster
  22. {
  23.         typedef float                                 DistanceSqFromCenter;
  24.         typedef std::pair<DistanceSqFromCenter, Vec3> DistancePointPair;
  25.  
  26.         Cluster()
  27.                 : centerPos(ZERO)
  28.                 , numberOfElements(0)
  29.                 , pointsWeight(1.0f)
  30.                 , pointAtMaxDistanceSqFromCenter(FLT_MIN, Vec3(ZERO))
  31.         {
  32.         }
  33.  
  34.         Cluster(const Vec3& _pos)
  35.                 : centerPos(_pos)
  36.                 , numberOfElements(0)
  37.                 , pointsWeight(1.0f)
  38.                 , pointAtMaxDistanceSqFromCenter(FLT_MIN, Vec3(ZERO))
  39.         {
  40.         }
  41.  
  42.         Vec3              centerPos;
  43.         uint8             numberOfElements;
  44.         float             pointsWeight;
  45.         DistancePointPair pointAtMaxDistanceSqFromCenter;
  46. };
  47.  
  48. struct ClusterRequest : public IClusterRequest
  49. {
  50.  
  51.         enum EClusterRequestState
  52.         {
  53.                 eRequestState_Created,
  54.                 eRequestState_ReadyToBeProcessed,
  55.         };
  56.  
  57.         ClusterRequest();
  58.  
  59.         virtual void                SetNewPointInRequest(const uint32 pointId, const Vec3& location);
  60.         virtual size_t              GetNumberOfPoint() const;
  61.         virtual void                SetMaximumSqDistanceAllowedPerCluster(float maxDistanceSq);
  62.         virtual void                SetCallback(Callback callback);
  63.         virtual const ClusterPoint* GetPointAt(const size_t pointIndex) const;
  64.         virtual size_t              GetTotalClustersNumber() const;
  65.  
  66.         typedef std::vector<ClusterPoint> PointsList;
  67.         PointsList           m_points;
  68.         Callback             m_callback;
  69.         EClusterRequestState m_state;
  70.         float                m_maxDistanceSq;
  71.         size_t               m_totalClustersNumber;
  72. };
  73.  
  74. class ClusterDetector : public IClusterDetector
  75. {
  76.         typedef std::vector<Cluster> ClustersArray;
  77.  
  78.         struct CurrentRequestState
  79.         {
  80.                 CurrentRequestState()
  81.                         : pCurrentRequest(NULL)
  82.                         , currentRequestId(~0)
  83.                         , aabbCenter(ZERO)
  84.                         , spawningPositionForNextCluster(ZERO)
  85.                 {
  86.                 }
  87.  
  88.                 void Reset();
  89.  
  90.                 ClusterRequest*  pCurrentRequest;
  91.                 ClusterRequestID currentRequestId;
  92.                 ClustersArray    clusters;
  93.                 Vec3             aabbCenter;
  94.                 Vec3             spawningPositionForNextCluster;
  95.         };
  96.  
  97. public:
  98.  
  99.         enum EStatus
  100.         {
  101.                 eStatus_Waiting = 0,
  102.                 eStatus_ClusteringInProgress,
  103.                 eStatus_ClusteringCompleted,
  104.         };
  105.  
  106.         ClusterDetector();
  107.  
  108.         virtual IClusterRequestPair CreateNewRequest();
  109.         virtual void                QueueRequest(const ClusterRequestID requestId);
  110.  
  111.         void                        Update(float frameDeltaTime);
  112.         void                        Reset();
  113.  
  114.         typedef std::pair<ClusterRequestID, ClusterRequest> ClusterRequestPair;
  115.  
  116. private:
  117.  
  118.         bool                InitializeNextRequest();
  119.  
  120.         ClusterRequestID    GenerateUniqueClusterRequestId();
  121.         ClusterRequestPair* ChooseRequestToServe();
  122.         size_t              CalculateRuleOfThumbClusterSize(const size_t numberOfPoints);
  123.         void                InitializeClusters();
  124.         Vec3                CalculateInitialClusterPosition(const size_t clusterIndex, const float spreadAngleUnit) const;
  125.  
  126.         // Steps
  127.         bool ExecuteClusteringStep();
  128.         void UpdateClustersCenter();
  129.         void ResetClustersElements();
  130.         bool AddNewCluster();
  131.         bool IsNewClusterNeeded();
  132.  
  133. private:
  134.         typedef std::list<ClusterRequestPair> RequestsList;
  135.         CurrentRequestState m_internalState;
  136.         ClusterRequestID    m_nextUniqueRequestID;
  137.         RequestsList        m_requests;
  138.         EStatus             m_status;
  139. };
  140.  
  141. #endif // __ClusterDetector_h__
  142.  
downloadClusterDetector.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