BVB Source Codes

CRYENGINE Show ParticleEmitter.h Source code

Return Download CRYENGINE: download ParticleEmitter.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:   ParticleEmitter.h
  5. //  Version:     v1.00
  6. //  Created:     18/7/2003 by Timur.
  7. //  Compilers:   Visual Studio.NET
  8. //  Description:
  9. // -------------------------------------------------------------------------
  10. //  History:
  11. //
  12. ////////////////////////////////////////////////////////////////////////////
  13.  
  14. #ifndef __particleemitter_h__
  15. #define __particleemitter_h__
  16. #pragma once
  17.  
  18. #if CRY_PLATFORM_WINDOWS || CRY_PLATFORM_DURANGO
  19.         #pragma warning(disable: 4355)
  20. #endif
  21.  
  22. #include "ParticleEffect.h"
  23. #include "ParticleEnviron.h"
  24. #include "ParticleContainer.h"
  25. #include "ParticleSubEmitter.h"
  26. #include "ParticleManager.h"
  27.  
  28. #include <CryEntitySystem/IEntity.h>
  29.  
  30. #undef PlaySound
  31.  
  32. class CParticle;
  33.  
  34. //////////////////////////////////////////////////////////////////////////
  35. // A top-level emitter system, interfacing to 3D engine
  36. class CParticleEmitter : public IParticleEmitter, public CParticleSource
  37. {
  38. public:
  39.  
  40.         CParticleEmitter(const IParticleEffect* pEffect, const QuatTS& loc, const SpawnParams* pSpawnParams = NULL);
  41.         ~CParticleEmitter();
  42.  
  43.         //////////////////////////////////////////////////////////////////////////
  44.         // IRenderNode implementation.
  45.         //////////////////////////////////////////////////////////////////////////
  46.         virtual void        ReleaseNode(bool bImmediate) { Register(false, bImmediate); Kill(); }
  47.         virtual EERType     GetRenderNodeType()          { return eERType_ParticleEmitter; }
  48.  
  49.         virtual char const* GetName() const              { return m_pTopEffect ? m_pTopEffect->GetName() : ""; }
  50.         virtual char const* GetEntityClassName() const   { return "ParticleEmitter"; }
  51.         virtual string      GetDebugString(char type = 0) const;
  52.  
  53.         virtual Vec3        GetPos(bool bWorldOnly = true) const { return GetLocation().t; }
  54.  
  55.         virtual const AABB  GetBBox() const                      { return m_bbWorld; }
  56.         virtual void        SetBBox(const AABB& WSBBox)          { m_bbWorld = WSBBox; }
  57.         virtual void        FillBBox(AABB& aabb)                 { aabb = GetBBox(); }
  58.  
  59.         virtual void        GetLocalBounds(AABB& bbox);
  60.         virtual void        SetViewDistRatio(int nViewDistRatio)
  61.         {
  62.                 // Override to cache normalized value.
  63.                 IRenderNode::SetViewDistRatio(nViewDistRatio);
  64.                 m_fViewDistRatio = GetViewDistRatioNormilized();
  65.         }
  66.         ILINE float              GetViewDistRatioFloat() const { return m_fViewDistRatio; }
  67.         virtual float            GetMaxViewDist();
  68.  
  69.         virtual void             SetMatrix(Matrix34 const& mat)    { if (mat.IsValid()) SetLocation(QuatTS(mat)); }
  70.  
  71.         virtual void             SetMaterial(IMaterial* pMaterial) { m_pMaterial = pMaterial; }
  72.         virtual IMaterial*       GetMaterial(Vec3* pHitPos = NULL) const;
  73.         virtual IMaterial*       GetMaterialOverride()             { return m_pMaterial; }
  74.  
  75.         virtual IPhysicalEntity* GetPhysics() const                { return 0; }
  76.         virtual void             SetPhysics(IPhysicalEntity*)      {}
  77.  
  78.         virtual void             Render(SRendParams const& rParam, const SRenderingPassInfo& passInfo);
  79.         virtual void             OnPhysAreaChange() { m_PhysEnviron.m_nNonUniformFlags &= ~EFF_LOADED; }
  80.  
  81.         virtual void             Hide(bool bHide);
  82.  
  83.         virtual void             GetMemoryUsage(ICrySizer* pSizer) const;
  84.  
  85.         //////////////////////////////////////////////////////////////////////////
  86.         // IParticleEmitter implementation.
  87.         //////////////////////////////////////////////////////////////////////////
  88.         virtual int                    GetVersion() const { return 1; }
  89.         virtual void                   SetEffect(IParticleEffect const* pEffect);
  90.         virtual const IParticleEffect* GetEffect() const
  91.         { return m_pTopEffect.get(); };
  92.  
  93.         virtual QuatTS        GetLocation() const
  94.         { return CParticleSource::GetLocation(); }
  95.         virtual void          SetLocation(const QuatTS& loc);
  96.  
  97.         ParticleTarget const& GetTarget() const
  98.         { return m_Target; }
  99.         virtual void          SetTarget(ParticleTarget const& target)
  100.         {
  101.                 if ((int)target.bPriority >= (int)m_Target.bPriority)
  102.                         m_Target = target;
  103.         }
  104.         virtual void                 SetEmitGeom(const GeomRef& geom);
  105.         virtual void                 SetSpawnParams(const SpawnParams& spawnParams);
  106.         virtual void                 GetSpawnParams(SpawnParams& sp) const { sp = m_SpawnParams; }
  107.         const SpawnParams&           GetSpawnParams() const                { return m_SpawnParams; }
  108.  
  109.         virtual bool                 IsAlive() const;
  110.         virtual bool                 IsInstant() const;
  111.         virtual void                 Activate(bool bActive);
  112.         virtual void                 Kill();
  113.         virtual void                 Restart();
  114.         virtual void                 Update();
  115.         virtual void                 EmitParticle(const EmitParticleData* pData = NULL);
  116.  
  117.         virtual void                 SetEntity(IEntity* pEntity, int nSlot);
  118.         virtual void                 InvalidateCachedEntityData() final;
  119.         virtual void                 OffsetPosition(const Vec3& delta);
  120.         virtual bool                 UpdateStreamableComponents(float fImportance, const Matrix34A& objMatrix, IRenderNode* pRenderNode, float fEntDistance, bool bFullUpdate, int nLod);
  121.         virtual EntityId             GetAttachedEntityId();
  122.         virtual int                  GetAttachedEntitySlot()
  123.         { return m_nEntitySlot; }
  124.         virtual IParticleAttributes& GetAttributes();
  125.  
  126.         //////////////////////////////////////////////////////////////////////////
  127.         // Other methods.
  128.         //////////////////////////////////////////////////////////////////////////
  129.  
  130.         bool IsActive() const
  131.         // Has particles
  132.         { return m_fAge <= m_fDeathAge; }
  133.  
  134.         void        UpdateEmitCountScale();
  135.         float       GetNearestDistance(const Vec3& vPos, float fBoundsScale) const;
  136.  
  137.         void        SerializeState(TSerialize ser);
  138.         void        Register(bool b, bool bImmediate = false);
  139.         ILINE float GetEmitCountScale() const
  140.         { return m_fEmitCountScale; }
  141.  
  142.         void                RefreshEffect();
  143.  
  144.         void                UpdateEffects();
  145.  
  146.         void                UpdateState();
  147.         void                UpdateResetAge();
  148.  
  149.         void                CreateIndirectEmitters(CParticleSource* pSource, CParticleContainer* pCont);
  150.  
  151.         SPhysEnviron const& GetPhysEnviron() const
  152.         {
  153.                 return m_PhysEnviron;
  154.         }
  155.         SVisEnviron const& GetVisEnviron() const
  156.         {
  157.                 return m_VisEnviron;
  158.         }
  159.         void OnVisAreaDeleted(IVisArea* pVisArea)
  160.         {
  161.                 m_VisEnviron.OnVisAreaDeleted(pVisArea);
  162.         }
  163.  
  164.         void GetDynamicBounds(AABB& bb) const
  165.         {
  166.                 bb.Reset();
  167.                 for (const auto& c : m_Containers)
  168.                         bb.Add(c.GetDynamicBounds());
  169.         }
  170.         ILINE uint32 GetEnvFlags() const
  171.         {
  172.                 return m_nEnvFlags & CParticleManager::Instance()->GetAllowedEnvironmentFlags();
  173.         }
  174.         void AddEnvFlags(uint32 nFlags)
  175.         {
  176.                 m_nEnvFlags |= nFlags;
  177.         }
  178.  
  179.         float GetParticleScale() const
  180.         {
  181.                 // Somewhat obscure. But top-level emitters spawned from entities,
  182.                 // and not attached to other objects, should apply the entity scale to their particles.
  183.                 if (!GetEmitGeom())
  184.                         return m_SpawnParams.fSizeScale * GetLocation().s;
  185.                 else
  186.                         return m_SpawnParams.fSizeScale;
  187.         }
  188.  
  189.         void InvalidateStaticBounds()
  190.         {
  191.                 m_bbWorld.Reset();
  192.                 for (auto& c : m_Containers)
  193.                 {
  194.                         float fStableTime = c.InvalidateStaticBounds();
  195.                         m_fBoundsStableAge = max(m_fBoundsStableAge, fStableTime);
  196.                 }
  197.         }
  198.         void     RenderDebugInfo();
  199.         IEntity* GetEntity() const;
  200.         void     UpdateFromEntity();
  201.         bool     IsIndependent() const
  202.         {
  203.                 return  Unique();
  204.         }
  205.         bool NeedSerialize() const
  206.         {
  207.                 return IsIndependent() && !m_pTopEffect->IsTemporary();
  208.         }
  209.         float TimeNotRendered() const
  210.         {
  211.                 return GetAge() - m_fAgeLastRendered;
  212.         }
  213.  
  214.         void GetCounts(SParticleCounts& counts) const
  215.         {
  216.                 for (const auto& c : m_Containers)
  217.                 {
  218.                         c.GetCounts(counts);
  219.                 }
  220.         }
  221.         void GetAndClearCounts(SParticleCounts& counts)
  222.         {
  223.                 FUNCTION_PROFILER(GetISystem(), PROFILE_PARTICLE);
  224.                 for (auto& c : m_Containers)
  225.                 {
  226.                         c.GetCounts(counts);
  227.                         c.ClearCounts();
  228.                 }
  229.         }
  230.  
  231.         ParticleList<CParticleContainer> const& GetContainers() const
  232.         {
  233.                 return m_Containers;
  234.         }
  235.  
  236.         bool IsEditSelected() const
  237.         {
  238. #if CRY_PLATFORM_DESKTOP
  239.                 if (gEnv->IsEditing())
  240.                 {
  241.                         if (IEntity* pEntity = GetEntity())
  242.                         {
  243.                                 if (IEntityRender* pIEntityRender = pEntity->GetRenderInterface())
  244.                                 {
  245.                                         if (IRenderNode* pRenderNode = pIEntityRender->GetRenderNode())
  246.                                                 return (pRenderNode->GetRndFlags() & ERF_SELECTED) != 0;
  247.                                 }
  248.                         }
  249.                 }
  250. #endif
  251.                 return false;
  252.         }
  253.  
  254.         void AddUpdateParticlesJob();
  255.         void SyncUpdateParticlesJob();
  256.         void UpdateAllParticlesJob();
  257.  
  258.         void Reset()
  259.         {
  260.                 SetUpdateParticlesJobState(nullptr);
  261.                 Register(false);
  262.  
  263.                 // Free unneeded memory.
  264.                 m_Containers.clear();
  265.  
  266.                 // Release and remove external geom refs.
  267.                 GeomRef::Release();
  268.                 GeomRef::operator=(GeomRef());
  269.         }
  270.  
  271.         void SetUpdateParticlesJobState(JobManager::SJobState* pJobState)
  272.         {
  273.                 m_pUpdateParticlesJobState = pJobState;
  274.         }
  275.  
  276. public:
  277.         int m_nPhysAreaChangedProxyId;
  278. private:
  279.  
  280.         // Internal emitter flags, extend EParticleEmitterFlags
  281.         enum EFlags
  282.         {
  283.                 ePEF_HasPhysics        = BIT(6),
  284.                 ePEF_HasTarget         = BIT(7),
  285.                 ePEF_HasAttachment     = BIT(8),
  286.                 ePEF_NeedsEntityUpdate = BIT(9),
  287.                 ePEF_Registered        = BIT(10),
  288.         };
  289.  
  290.         JobManager::SJobState* m_pUpdateParticlesJobState;
  291.  
  292.         // Constant values, effect-related.
  293.         _smart_ptr<CParticleEffect> m_pTopEffect;
  294.         _smart_ptr<IMaterial>       m_pMaterial;          // Override material for this emitter.
  295.  
  296.         // Cache values derived from the main effect.
  297.         float       m_fMaxParticleSize;
  298.  
  299.         CTimeValue  m_timeLastUpdate;                     // Track this to automatically update age.
  300.         SpawnParams m_SpawnParams;                        // External settings modifying emission.
  301.         float       m_fEmitCountScale;                    // Composite particle count scale.
  302.         float       m_fViewDistRatio;                     // Normalised value of IRenderNode version.
  303.  
  304.         ParticleList<CParticleContainer>
  305.                        m_Containers;
  306.         uint32         m_nEnvFlags;                       // Union of environment flags affecting emitters.
  307.         uint64         m_nRenObjFlags;                    // Union of render feature flags.
  308.         ParticleTarget m_Target;                          // Target set from external source.
  309.  
  310.         AABB           m_bbWorld;                         // World bbox.
  311.  
  312.         float          m_fAgeLastRendered;
  313.         float          m_fBoundsStableAge;                // Next age at which bounds stable.
  314.         float          m_fResetAge;                       // Age to purge unseen particles.
  315.         float          m_fStateChangeAge;                 // Next age at which a container's state changes.
  316.         float          m_fDeathAge;                       // Age when all containers (particles) dead.
  317.  
  318.         // Entity connection params.
  319.         int          m_nEntitySlot;
  320.  
  321.         uint32       m_nEmitterFlags;
  322.  
  323.         SPhysEnviron m_PhysEnviron;                       // Common physical environment (uniform forces only) for emitter.
  324.         SVisEnviron  m_VisEnviron;
  325.  
  326.         // Functions.
  327.         void                ResetUnseen();
  328.         void                AllocEmitters();
  329.         void                UpdateContainers();
  330.         void                UpdateTimes(float fAgeAdjust = 0.f);
  331.  
  332.         void                AddEffect(CParticleContainer* pParentContainer, CParticleEffect const* pEffect, bool bUpdate = true);
  333.         CParticleContainer* AddContainer(CParticleContainer* pParentContainer, const CParticleEffect* pEffect);
  334. };
  335.  
  336. #endif // __particleemitter_h__
  337.  
downloadParticleEmitter.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