BVB Source Codes

CRYENGINE Show BoundingVolume.cpp Source code

Return Download CRYENGINE: download BoundingVolume.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 "BoundingVolume.h"
  5.  
  6. namespace MNM
  7. {
  8. void BoundingVolume::Swap(BoundingVolume& other)
  9. {
  10.         vertices.swap(other.vertices);
  11.         std::swap(aabb, other.aabb);
  12.         std::swap(height, other.height);
  13. }
  14.  
  15. bool BoundingVolume::Overlaps(const AABB& _aabb) const
  16. {
  17.         if (!Overlap::AABB_AABB(aabb, _aabb))
  18.                 return false;
  19.  
  20.         const size_t vertexCount = vertices.size();
  21.  
  22.         for (size_t i = 0; i < vertexCount; ++i)
  23.         {
  24.                 const Vec3& v0 = vertices[i];
  25.  
  26.                 if (Overlap::Point_AABB2D(v0, _aabb))
  27.                         return true;
  28.         }
  29.  
  30.         float midz = aabb.min.z + (aabb.max.z - aabb.min.z) * 0.5f;
  31.  
  32.         if (Contains(Vec3(_aabb.min.x, _aabb.min.y, midz)))
  33.                 return true;
  34.  
  35.         if (Contains(Vec3(_aabb.min.x, _aabb.max.y, midz)))
  36.                 return true;
  37.  
  38.         if (Contains(Vec3(_aabb.max.x, _aabb.max.y, midz)))
  39.                 return true;
  40.  
  41.         if (Contains(Vec3(_aabb.max.x, _aabb.min.y, midz)))
  42.                 return true;
  43.  
  44.         size_t ii = vertexCount - 1;
  45.         for (size_t i = 0; i < vertexCount; ++i)
  46.         {
  47.                 const Vec3& v0 = vertices[ii];
  48.                 const Vec3& v1 = vertices[i];
  49.                 ii = i;
  50.  
  51.                 if (Overlap::Lineseg_AABB2D(Lineseg(v0, v1), _aabb))
  52.                         return true;
  53.         }
  54.  
  55.         return false;
  56. }
  57.  
  58. BoundingVolume::ExtendedOverlap BoundingVolume::Contains(const AABB& _aabb) const
  59. {
  60.         if (!Overlap::AABB_AABB(aabb, _aabb))
  61.                 return NoOverlap;
  62.  
  63.         const size_t vertexCount = vertices.size();
  64.         size_t inCount = 0;
  65.  
  66.         if (Contains(Vec3(_aabb.min.x, _aabb.min.y, _aabb.min.z)))
  67.                 ++inCount;
  68.  
  69.         if (Contains(Vec3(_aabb.min.x, _aabb.min.y, _aabb.max.z)))
  70.                 ++inCount;
  71.  
  72.         if (Contains(Vec3(_aabb.min.x, _aabb.max.y, _aabb.min.z)))
  73.                 ++inCount;
  74.  
  75.         if (Contains(Vec3(_aabb.min.x, _aabb.max.y, _aabb.max.z)))
  76.                 ++inCount;
  77.  
  78.         if (Contains(Vec3(_aabb.max.x, _aabb.max.y, _aabb.min.z)))
  79.                 ++inCount;
  80.  
  81.         if (Contains(Vec3(_aabb.max.x, _aabb.max.y, _aabb.max.z)))
  82.                 ++inCount;
  83.  
  84.         if (Contains(Vec3(_aabb.max.x, _aabb.min.y, _aabb.max.z)))
  85.                 ++inCount;
  86.  
  87.         if (Contains(Vec3(_aabb.max.x, _aabb.min.y, _aabb.max.z)))
  88.                 ++inCount;
  89.  
  90.         if (inCount != 8)
  91.                 return PartialOverlap;
  92.  
  93.         size_t ii = vertexCount - 1;
  94.  
  95.         for (size_t i = 0; i < vertexCount; ++i)
  96.         {
  97.                 const Vec3& v0 = vertices[ii];
  98.                 const Vec3& v1 = vertices[i];
  99.                 ii = i;
  100.  
  101.                 if (Overlap::Lineseg_AABB2D(Lineseg(v0, v1), _aabb))
  102.                         return PartialOverlap;
  103.         }
  104.  
  105.         return FullOverlap;
  106. }
  107.  
  108. bool BoundingVolume::Contains(const Vec3& point) const
  109. {
  110.         if (!Overlap::Point_AABB(point, aabb))
  111.                 return false;
  112.  
  113.         const size_t vertexCount = vertices.size();
  114.         bool count = false;
  115.  
  116.         size_t ii = vertexCount - 1;
  117.         for (size_t i = 0; i < vertexCount; ++i)
  118.         {
  119.                 const Vec3& v0 = vertices[ii];
  120.                 const Vec3& v1 = vertices[i];
  121.                 ii = i;
  122.  
  123.                 if ((((v1.y <= point.y) && (point.y < v0.y)) || ((v0.y <= point.y) && (point.y < v1.y))) &&
  124.                     (point.x < (v0.x - v1.x) * (point.y - v1.y) / (v0.y - v1.y) + v1.x))
  125.                 {
  126.                         count = !count;
  127.                 }
  128.         }
  129.  
  130.         return count != 0;
  131. }
  132.  
  133. /*
  134.    bool BoundingVolume::IntersectLineSeg(const Vec3& start, const Vec3& end, float* t, size_t* segment) const
  135.    {
  136.    float bestt = FLT_MAX;
  137.    size_t bestSeg = ~0ul;
  138.  
  139.    const size_t vertexCount = vertices.size();
  140.  
  141.    size_t ii = vertexCount - 1;
  142.  
  143.    for (size_t i = 0; i < vertexCount; ++i)
  144.    {
  145.     const Vec3& v0 = vertices[ii];
  146.     const Vec3& v1 = vertices[i];
  147.     ii = i;
  148.  
  149.     float a, b;
  150.     if (Intersect::Lineseg_Lineseg2D(Lineseg(start, end), Lineseg(v0, v1), a, b))
  151.     {
  152.       if (a < bestt)
  153.       {
  154.         bestt = a;
  155.         bestSeg = ii;
  156.       }
  157.     }
  158.    }
  159.  
  160.    if (bestSeg != ~0ul)
  161.    {
  162.     if (t)
  163.  * t = bestt;
  164.  
  165.     if (segment)
  166.  * segment = bestSeg;
  167.  
  168.     return true;
  169.    }
  170.  
  171.    return false;
  172.    }
  173.  */
  174.  
  175. void BoundingVolume::OffsetVerticesAndAABB(const Vec3& delta)
  176. {
  177. #ifdef SEG_WORLD
  178.         const size_t vertexCount = vertices.size();
  179.         for (size_t i = 0; i < vertexCount; ++i)
  180.         {
  181.                 vertices[i] += delta;
  182.         }
  183.         aabb.Move(delta);
  184. #endif
  185. }
  186. }
  187.  
downloadBoundingVolume.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