BVB Source Codes

CRYENGINE Show AIRadialOcclusion.h Source code

Return Download CRYENGINE: download AIRadialOcclusion.h Source code - Download CRYENGINE Source code - Type:.h
  1. // Copyright 2001-2016 Crytek GmbH / Crytek Group. All rights reserved.
  2.  
  3. /********************************************************************
  4.    -------------------------------------------------------------------------
  5.    File name:   AIRadialOcclusion.h
  6.    $Id$
  7.    Description:
  8.  
  9.    -------------------------------------------------------------------------
  10.    History:
  11.    - ?
  12.    - 2 Mar 2009                  : Evgeny Adamenkov: Removed IRenderer
  13.  
  14.  *********************************************************************/
  15. #ifndef _AIRADIALOCCLUSION_H_
  16. #define _AIRADIALOCCLUSION_H_
  17.  
  18. #if _MSC_VER > 1000
  19.         #pragma once
  20. #endif
  21.  
  22. #include <CryMath/Cry_Vector3.h>
  23. #include <math.h>
  24. #include <vector>
  25.  
  26. //====================================================================
  27. // CAIRadialOcclusion
  28. // Radial occlusion buffer.
  29. //====================================================================
  30. class CAIRadialOcclusion
  31. {
  32. public:
  33.         CAIRadialOcclusion() : m_center(0, 0, 0)
  34.         {
  35.                 for (unsigned i = 0; i < SAMPLE_COUNT; ++i)
  36.                         m_buffer[i] = 0;
  37.         }
  38.  
  39.         // Reset the buffer to specified center and range
  40.         void Reset(const Vec3& c, float r);
  41.  
  42.         // Rasterize circle like object into the buffer.
  43.         void RasterizeCircle(const Vec3& pos, float r);
  44.  
  45.         // Rasterize linear object into the buffer.
  46.         void RasterizeEdge(const Vec3& start, const Vec3& end, bool cull);
  47.  
  48.         // Returns true if the specified point is visible.
  49.         inline bool IsVisible(const Vec3& pos) const
  50.         {
  51.                 Vec3 v = pos - m_center;
  52.                 float a = atan2f(v.y, v.x);
  53.                 int ia = ((int)floor(a / gf_PI2 * SAMPLE_COUNT)) & SAMPLE_MASK;
  54.                 return v.GetLengthSquared2D() < sqr(m_buffer[ia]);
  55.         }
  56.  
  57.         // Returns sample index from a position
  58.         inline int GetIndex(const Vec3& pos) const
  59.         {
  60.                 Vec3 v = pos - m_center;
  61.                 float a = atan2f(v.y, v.x);
  62.                 return ((int)floor(a / gf_PI2 * SAMPLE_COUNT)) & SAMPLE_MASK;
  63.         }
  64.  
  65.         // Returns the center of the occlusion buffer.
  66.         inline const Vec3& GetCenter() const           { return m_center; }
  67.         // Returns an occlusion buffer sample.
  68.         inline float       GetSample(unsigned i) const { return m_buffer[i]; }
  69.  
  70.         void               operator=(const CAIRadialOcclusion& rhs);
  71.  
  72.         static const unsigned SAMPLE_COUNT = (1 << 8);
  73.         static const unsigned SAMPLE_MASK = SAMPLE_COUNT - 1;
  74.  
  75. private:
  76.         Vec3  m_center;
  77.         float m_buffer[SAMPLE_COUNT];
  78. };
  79.  
  80. //====================================================================
  81. // CAIRadialOccypancy
  82. //====================================================================
  83. class CAIRadialOccypancy
  84. {
  85. public:
  86.         CAIRadialOccypancy();
  87.         ~CAIRadialOccypancy();
  88.  
  89.         void               Reset(const Vec3& center, const Vec3& forward, float radius);
  90.  
  91.         Vec3               GetNearestUnoccupiedDirection(const Vec3& dir, float& bias);
  92.  
  93.         inline const Vec3& GetCenter() const { return m_center; }
  94.         inline const Vec3& GetAxisX() const  { return m_axisx; }
  95.         inline const Vec3& GetAxisY() const  { return m_axisy; }
  96.  
  97.         void               AddObstructionCircle(const Vec3& pos, float radius);
  98.         void               AddObstructionLine(const Vec3& p0, const Vec3& p1);
  99.         void               AddObstructionDirection(const Vec3& dir);
  100.  
  101.         struct SSpan
  102.         {
  103.                 SSpan(float smin, float smax) : smin(smin), smax(smax) {}
  104.                 float smin, smax;
  105.         };
  106.         inline unsigned     GetSpanCount() const      { return m_spans.size(); }
  107.         inline const SSpan& GetSpan(unsigned i) const { return m_spans[i]; }
  108.  
  109.         void                DebugDraw(const Vec3& center, ColorB color);
  110.  
  111. private:
  112.  
  113.         void AddAndMergeSegment(const Vec3& p0, const Vec3& p1);
  114.         void AddAndMergeSpan(float a, float b);
  115.         bool IntersectSegmentCircle(const Vec3& p0, const Vec3& p1, const Vec3& center, float rad, float& t0, float& t1);
  116.  
  117.         std::vector<SSpan> m_spans;
  118.         Vec3               m_center;
  119.         Vec3               m_axisy, m_axisx;
  120.         float              m_radius;
  121. };
  122.  
  123. //====================================================================
  124. // CAIRadialOcclusionRaycast
  125. //====================================================================
  126. class CAIRadialOcclusionRaycast
  127. {
  128. public:
  129.         CAIRadialOcclusionRaycast(float rangeDepth, float rangeHeight, float spread, unsigned width, unsigned height);
  130.         ~CAIRadialOcclusionRaycast();
  131.  
  132.         void        Reset();
  133.  
  134.         void        Update(const Vec3& center, const Vec3& target, float unitHeight, bool flat, unsigned raysPerUpdate);
  135.  
  136.         const Vec3& GetCenter() const { return m_center; }
  137.         const Vec3& GetTarget() const { return m_target; }
  138.  
  139.         inline bool IsVisible(const Vec3& pos) const
  140.         {
  141.                 if (pos.z < m_heightMin || pos.z > m_heightMax)
  142.                         return false;
  143.                 Vec3 v = pos - m_center;
  144.                 float lx = m_basis.GetColumn0().Dot(v);
  145.                 float ly = m_basis.GetColumn1().Dot(v);
  146.                 float a = atan2f(lx, ly) + m_spread / 2;
  147.                 if (a < 0.0f || a > m_spread)
  148.                         return false;
  149.                 unsigned i = (unsigned)floorf(a / m_spread * m_width);
  150.                 if (i > m_width - 1) i = m_width - 1;
  151.                 float dist = sqrtf(lx * lx + ly * ly);
  152.                 return dist < m_combined[i];
  153.         }
  154.  
  155.         void        DebugDraw(bool drawFilled = true);
  156.  
  157.         static void UpdateActiveCount();
  158.  
  159. private:
  160.  
  161.         struct SSample
  162.         {
  163.                 float dist;
  164.                 float height;
  165.                 bool  pending;
  166.  
  167.         };
  168.  
  169.         CTimeValue           m_lastUpdatedTime;
  170.         Vec3                 m_center;
  171.         Vec3                 m_target;
  172.         Matrix33             m_basis;
  173.         float                m_heightMin, m_heightMax;
  174.         std::vector<float>   m_combined;
  175.         std::vector<SSample> m_samples;
  176.         unsigned             m_cx, m_cy;
  177.         bool                 m_firstUpdate;
  178.         const float          m_depthRange;
  179.         const float          m_heightRange;
  180.         const float          m_spread;
  181.         const unsigned       m_width, m_height;
  182.         /*      INT_PTR m_id;
  183.            static INT_PTR m_idGen;*/
  184.  
  185.         int m_id;
  186.  
  187.         struct SSampleRayQuery
  188.         {
  189.                 SSampleRayQuery() : id(0), i(0), pRaycaster(0) {}
  190.                 unsigned                   id;
  191.                 unsigned                   i;
  192.                 CAIRadialOcclusionRaycast* pRaycaster;
  193.         };
  194.  
  195.         /*      static std::map<INT_PTR, SSampleRayQuery> m_queries;*/
  196.  
  197.         static const int                               MAX_QUERIES = 100;
  198.         static SSampleRayQuery                         m_queries[MAX_QUERIES];
  199.         static bool                                    m_physListenerInit;
  200.         static std::vector<CAIRadialOcclusionRaycast*> m_physListeners;
  201.         static int m_idGen;
  202.  
  203.         static int m_activeCount;
  204.  
  205.         static SSampleRayQuery* GetQuery(int idx, CAIRadialOcclusionRaycast* pCaller)
  206.         {
  207.                 for (unsigned i = 0; i < MAX_QUERIES; ++i)
  208.                 {
  209.                         if (m_queries[i].id == 0)
  210.                         {
  211.                                 m_queries[i].id = pCaller->m_id;
  212.                                 m_queries[i].i = idx;
  213.                                 m_queries[i].pRaycaster = pCaller;
  214.                                 return &m_queries[i];
  215.                         }
  216.                 }
  217.                 return 0;
  218.         }
  219.  
  220.         static void InitPhysCallback(CAIRadialOcclusionRaycast* occ);
  221.         static void RemovePhysCallback(CAIRadialOcclusionRaycast* occ);
  222.         static int  OnRwiResult(const EventPhys* pEvent);
  223. };
  224.  
  225. #endif
  226.  
downloadAIRadialOcclusion.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