BVB Source Codes

CRYENGINE Show ParticleEnviron.h Source code

Return Download CRYENGINE: download ParticleEnviron.h Source code - Download CRYENGINE Source code - Type:.h
  1. // Copyright 2001-2016 Crytek GmbH / Crytek Group. All rights reserved.
  2.  
  3. #ifndef PARTICLE_ENVIRON_H
  4. #define PARTICLE_ENVIRON_H
  5.  
  6. #include <CryParticleSystem/ParticleParams.h>
  7. #include "ParticleEffect.h"
  8. #include <CryCore/Containers/CryPtrArray.h>
  9.  
  10. class CParticleEmitter;
  11.  
  12. //////////////////////////////////////////////////////////////////////////
  13. // Physical environment management.
  14. //
  15. struct SPhysEnviron : Cry3DEngineBase
  16. {
  17.         // PhysArea caching.
  18.         SPhysForces m_UniformForces;
  19.         ETrinary    m_tUnderWater;
  20.         uint32      m_nNonUniformFlags;         // EParticleEnviron flags of non-uniform areas found.
  21.         uint32      m_nNonCachedFlags;          // Env flags of areas requiring physics system access.
  22.  
  23.         // Nonuniform area support.
  24.         struct SArea
  25.         {
  26.                 const SPhysEnviron*
  27.                               m_pEnviron;               // Parent environment.
  28.                 _smart_ptr<IPhysicalEntity>
  29.                               m_pArea;
  30.                 volatile int* m_pLock;                  // Copy of lock for area.
  31.  
  32.                 SPhysForces   m_Forces;
  33.                 AABB          m_bbArea;                 // Bounds of area, for quick checks.
  34.                 uint32        m_nFlags;
  35.                 bool          m_bOutdoorOnly;           // Force only for outdoor areas.
  36.  
  37.                 // Area params, for simple evaluation.
  38.                 bool     m_bCacheForce;                 // Quick cached force info.
  39.                 bool     m_bRadial;                     // Forces are radial from center.
  40.                 uint8    m_nGeomShape;                  // GEOM_BOX, GEOM_SPHERE, ...
  41.                 Vec3     m_vCenter;                     // Area position (for radial forces).
  42.                 Matrix33 m_matToLocal;                  // Convert to unit sphere space.
  43.                 float    m_fFalloffScale;               // For scaling to inner/outer force bounds.
  44.  
  45.                 SArea()
  46.                 { ZeroStruct(*this); }
  47.                 void  GetForces(SPhysForces& forces, Vec3 const& vPos, uint32 nFlags) const;
  48.                 void  GetForcesPhys(SPhysForces& forces, Vec3 const& vPos) const;
  49.                 float GetWaterPlane(Plane& plane, Vec3 const& vPos, float fMaxDist = -WATER_LEVEL_UNKNOWN) const;
  50.                 void  GetMemoryUsage(ICrySizer* pSizer) const
  51.                 {}
  52.  
  53.                 void AddRef()
  54.                 {
  55.                         m_nRefCount++;
  56.                 }
  57.                 void Release()
  58.                 {
  59.                         assert(m_nRefCount >= 0);
  60.                         if (--m_nRefCount == 0)
  61.                                 delete this;
  62.                 }
  63.  
  64.         private:
  65.                 int m_nRefCount;
  66.         };
  67.  
  68.         SPhysEnviron()
  69.         {
  70.                 Clear();
  71.         }
  72.  
  73.         // Phys areas
  74.         void Clear();
  75.         void FreeMemory();
  76.  
  77.         // Query world phys areas.
  78.         void GetWorldPhysAreas(uint32 nFlags = ~0, bool bNonUniformAreas = true);
  79.  
  80.         // Query subset of phys areas.
  81.         void GetPhysAreas(SPhysEnviron const& envSource, AABB const& box, bool bIndoors, uint32 nFlags = ~0, bool bNonUniformAreas = true, const CParticleEmitter* pEmitterSkip = 0);
  82.  
  83.         bool IsCurrent() const
  84.         {
  85.                 return (m_nNonUniformFlags & EFF_LOADED) != 0;
  86.         }
  87.  
  88.         void OnPhysAreaChange(const EventPhysAreaChange& event);
  89.  
  90.         void LockAreas(uint32 nFlags, int iLock) const
  91.         {
  92.                 if (m_nNonCachedFlags & nFlags)
  93.                 {
  94.                         for (auto& area : m_NonUniformAreas)
  95.                         {
  96.                                 if (area.m_nFlags & nFlags)
  97.                                         if (!area.m_bCacheForce)
  98.                                                 CryInterlockedAdd(area.m_pLock, iLock);
  99.                         }
  100.                 }
  101.         }
  102.  
  103.         void GetForces(SPhysForces& forces, Vec3 const& vPos, uint32 nFlags) const
  104.         {
  105.                 forces = m_UniformForces;
  106.                 if (m_nNonUniformFlags & nFlags & ENV_PHYS_AREA)
  107.                         GetNonUniformForces(forces, vPos, nFlags);
  108.         }
  109.  
  110.         float GetWaterPlane(Plane& plWater, Vec3 const& vPos, float fMaxDist = -WATER_LEVEL_UNKNOWN) const
  111.         {
  112.                 plWater = m_UniformForces.plWater;
  113.                 float fDist = m_UniformForces.plWater.DistFromPlane(vPos);
  114.                 if (fDist > 0.f)
  115.                 {
  116.                         if (m_nNonUniformFlags & ENV_WATER)
  117.                                 fDist = GetNonUniformWaterPlane(plWater, vPos, min(fDist, fMaxDist));
  118.                 }
  119.                 return fDist;
  120.         }
  121.  
  122.         // Phys collision
  123.         static bool PhysicsCollision(ray_hit& hit, Vec3 const& vStart, Vec3 const& vEnd, float fRadius, uint32 nEnvFlags, IPhysicalEntity* pThisEntity = 0);
  124.  
  125.         void        GetMemoryUsage(ICrySizer* pSizer) const
  126.         {
  127.                 pSizer->AddContainer(m_NonUniformAreas);
  128.         }
  129.  
  130. protected:
  131.  
  132.         SmartPtrArray<SArea> m_NonUniformAreas;
  133.  
  134.         void  GetNonUniformForces(SPhysForces& forces, Vec3 const& vPos, uint32 nFlags) const;
  135.         float GetNonUniformWaterPlane(Plane& plWater, Vec3 const& vPos, float fMaxDist = -WATER_LEVEL_UNKNOWN) const;
  136. };
  137.  
  138. //////////////////////////////////////////////////////////////////////////
  139. // Vis area management.
  140. //
  141. struct SVisEnviron : Cry3DEngineBase
  142. {
  143.         SVisEnviron()
  144.         {
  145.                 Clear();
  146.         }
  147.  
  148.         void Clear()
  149.         {
  150.                 memset(this, 0, sizeof(*this));
  151.         }
  152.  
  153.         void Invalidate()
  154.         {
  155.                 m_bValid = false;
  156.         }
  157.  
  158.         void      Update(Vec3 const& vOrigin, AABB const& bbExtents);
  159.  
  160.         IVisArea* GetClipVisArea(IVisArea* pVisAreaCam, AABB const& bb) const;
  161.  
  162.         bool      ClipVisAreas(IVisArea* pClipVisArea, Sphere& sphere, Vec3 const& vNormal) const
  163.         {
  164.                 // Clip inside or outside specified area.
  165.                 return pClipVisArea->ClipToVisArea(pClipVisArea == m_pVisArea, sphere, vNormal);
  166.         }
  167.  
  168.         bool OriginIndoors() const
  169.         {
  170.                 return m_pVisArea != 0;
  171.         }
  172.  
  173.         void OnVisAreaDeleted(IVisArea* pVisArea)
  174.         {
  175.                 if (m_pVisArea == pVisArea)
  176.                         Clear();
  177.         }
  178.  
  179. protected:
  180.         bool      m_bValid;                     // True if VisArea determination up to date.
  181.         bool      m_bCrossesVisArea;
  182.         IVisArea* m_pVisArea;                   // VisArea emitter is in, if needed and if any.
  183.         void*     m_pVisNodeCache;
  184. };
  185.  
  186. #endif
  187.  
downloadParticleEnviron.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