BVB Source Codes

CRYENGINE Show ParamMod.h Source code

Return Download CRYENGINE: download ParamMod.h Source code - Download CRYENGINE Source code - Type:.h
  1. // Copyright 2001-2016 Crytek GmbH / Crytek Group. All rights reserved.
  2.  
  3. // -------------------------------------------------------------------------
  4. //  Created:     25/03/2015 by Filipe amim
  5. //  Description:
  6. // -------------------------------------------------------------------------
  7. //
  8. ////////////////////////////////////////////////////////////////////////////
  9.  
  10. #ifndef PARAMMOD_H
  11. #define PARAMMOD_H
  12.  
  13. #pragma once
  14.  
  15. #include "../ParticleComponent.h"
  16. #include "ParamTraits.h"
  17. #include <CrySerialization/SmartPtr.h>
  18. #include <CrySerialization/IClassFactory.h>
  19.  
  20. namespace pfx2
  21. {
  22.  
  23. enum EModDomain
  24. {
  25.         EMD_PerParticle,
  26.         EMD_PerInstance,
  27.         EMD_PerEffect,
  28. };
  29.  
  30. struct IModifier;
  31.  
  32. struct IParamMod
  33. {
  34.         virtual void AddToInitParticles(IModifier* pMod) = 0;
  35.         virtual void AddToUpdate(IModifier* pMod) = 0;
  36. };
  37.  
  38. struct IParamModContext
  39. {
  40.         virtual EModDomain GetDomain() const = 0;
  41.         virtual bool       HasInit() const = 0;
  42.         virtual bool       HasUpdate() const = 0;
  43.         virtual bool       CanInheritParent() const = 0;
  44. };
  45.  
  46. struct SModParticleField : public IParamModContext
  47. {
  48.         EModDomain GetDomain() const        { return EMD_PerParticle; }
  49.         bool       HasInit() const          { return true; }
  50.         bool       HasUpdate() const        { return true; }
  51.         bool       CanInheritParent() const { return true; }
  52. };
  53. struct SModParticleSpawnInit : public IParamModContext
  54. {
  55.         EModDomain GetDomain() const        { return EMD_PerParticle; }
  56.         bool       HasInit() const          { return true; }
  57.         bool       HasUpdate() const        { return false; }
  58.         bool       CanInheritParent() const { return false; }
  59. };
  60. struct SModInstanceCounter : public IParamModContext
  61. {
  62.         EModDomain GetDomain() const        { return EMD_PerInstance; }
  63.         bool       HasInit() const          { return true; }
  64.         bool       HasUpdate() const        { return true; }
  65.         bool       CanInheritParent() const { return false; }
  66. };
  67. struct SModInstanceTimer : public IParamModContext
  68. {
  69.         EModDomain GetDomain() const        { return EMD_PerInstance; }
  70.         bool       HasInit() const          { return true; }
  71.         bool       HasUpdate() const        { return false; }
  72.         bool       CanInheritParent() const { return false; }
  73. };
  74. struct SModEffectField : public IParamModContext
  75. {
  76.         EModDomain GetDomain() const        { return EMD_PerEffect; }
  77.         bool       HasInit() const          { return true; }
  78.         bool       HasUpdate() const        { return true; }
  79.         bool       CanInheritParent() const { return false; }
  80. };
  81.  
  82. struct IModifier : public _i_reference_target_t
  83. {
  84. public:
  85.         bool               IsEnabled() const                                { return m_enabled; }
  86.         virtual bool       CanCreate(const IParamModContext& context) const { return true; }
  87.         virtual EModDomain GetDomain() const = 0;
  88.         virtual Range      GetMinMax() const = 0;
  89.         virtual void       AddToParam(CParticleComponent* pComponent, IParamMod* pParam)                                                                             {}
  90.         virtual void       Modify(const SUpdateContext& context, const SUpdateRange& range, IOFStream stream, EParticleDataType streamType, EModDomain domain) const {}
  91.         virtual void       Sample(float* samples, const int numSamples) const                                                                                        {}
  92.         virtual void       Serialize(Serialization::IArchive& ar);
  93.         virtual IModifier* VersionFixReplace() const                                                                                                                 { return nullptr; }
  94. protected:
  95.         IParamModContext&  GetContext(Serialization::IArchive& ar) const;
  96. private:
  97.         SEnable m_enabled;
  98. };
  99.  
  100. template<typename TPointer, typename TContext>
  101. class _context_smart_ptr : public _smart_ptr<TPointer>
  102. {
  103. };
  104.  
  105. template<typename TPointer, typename TContext>
  106. class FilteredClassFactory : public Serialization::ClassFactory<TPointer>
  107. {
  108. private:
  109.         typedef Serialization::ClassFactory<TPointer> BaseClass;
  110. public:
  111.         FilteredClassFactory();
  112.         static FilteredClassFactory& the();
  113. };
  114.  
  115. template<typename TPointer, typename T>
  116. class FilteredSmartPtrSerializer : public SmartPtrSerializer<TPointer>
  117. {
  118. public:
  119.         FilteredSmartPtrSerializer(_smart_ptr<TPointer>& ptr)
  120.                 : SmartPtrSerializer<TPointer>(ptr) {}
  121.         virtual Serialization::IClassFactory* factory() const { return &FilteredClassFactory<TPointer, T>::the(); }
  122. };
  123.  
  124. template<typename TPointer, typename T>
  125. bool Serialize(Serialization::IArchive& ar, _context_smart_ptr<TPointer, T>& ptr, const char* name, const char* label);
  126.  
  127. template<typename TParamModContext, typename T = SFloat>
  128. class CParamMod : public IParamMod
  129. {
  130. private:
  131.         typedef _context_smart_ptr<IModifier, TParamModContext> PModifier;
  132.  
  133. public:
  134.         typedef typename T::TType TType;
  135.  
  136.         CParamMod(TType defaultValue = TType(1));
  137.  
  138.         virtual void                   AddToInitParticles(IModifier* pMod);
  139.         virtual void                   AddToUpdate(IModifier* pMod);
  140.  
  141.         void                           AddToComponent(CParticleComponent* pComponent, CParticleFeature* pFeature);
  142.         void                           AddToComponent(CParticleComponent* pComponent, CParticleFeature* pFeature, EParticleDataType dataType);
  143.         void                           Serialize(Serialization::IArchive& ar);
  144.  
  145.         void                           InitParticles(const SUpdateContext& context, EParticleDataType dataType) const;
  146.         void                           ModifyInit(const SUpdateContext& context, TType* data, SUpdateRange range) const;
  147.  
  148.         void                           Update(const SUpdateContext& context, EParticleDataType dataType) const;
  149.         void                           ModifyUpdate(const SUpdateContext& context, TType* data, SUpdateRange range) const;
  150.  
  151.         TRange<TType>                  GetValues(const SUpdateContext& context, TType* data, SUpdateRange range, EModDomain domain, bool updating) const;
  152.         TRange<TType>                  GetValues(const SUpdateContext& context, Array<TType,uint> data, EModDomain domain, bool updating) const;
  153.         TRange<TType>                  GetValueRange(const SUpdateContext& context) const;
  154.         TRange<TType>                  GetValueRange() const;
  155.         void                           Sample(TType* samples, int numSamples) const;
  156.  
  157.         bool                           HasModifiers() const { return !m_modInit.empty() || !m_modUpdate.empty(); }
  158.         TType                          GetBaseValue() const { return m_baseValue; }
  159.         static const TParamModContext& Context()            { static TParamModContext context; return context; }
  160.  
  161. private:
  162.         IOFStream GetParticleStream(CParticleContainer& container, EParticleDataType dataType) const;
  163.  
  164.         std::vector<PModifier>  m_modifiers;
  165.         std::vector<IModifier*> m_modInit;
  166.         std::vector<IModifier*> m_modUpdate;
  167.         T                       m_baseValue;
  168. };
  169.  
  170. struct STempModBuffer
  171. {
  172.         template<typename TParamMod>
  173.         STempModBuffer(const SUpdateContext& context, TParamMod& paramMod)
  174.                 : m_buffer(*context.m_pMemHeap, paramMod.HasModifiers() ? context.m_container.GetMaxParticles() : 0)
  175.                 , m_stream(m_buffer.data(), paramMod.GetBaseValue()) {}
  176.  
  177.         template<typename TParamMod>
  178.         void ModifyInit(const SUpdateContext& context, TParamMod& paramMod, SUpdateRange range)
  179.         {
  180.                 if (paramMod.HasModifiers())
  181.                         paramMod.ModifyInit(context, m_buffer.data(), range);
  182.         }
  183.  
  184.         template<typename TParamMod>
  185.         void ModifyUpdate(const SUpdateContext& context, TParamMod& paramMod, SUpdateRange range)
  186.         {
  187.                 if (paramMod.HasModifiers())
  188.                 {
  189.                         const float baseValue = paramMod.GetBaseValue();
  190.                         CRY_PFX2_FOR_RANGE_PARTICLES(range);
  191.                         m_buffer[particleId] = baseValue;
  192.                         CRY_PFX2_FOR_END;
  193.                         paramMod.ModifyUpdate(context, m_buffer.data(), range);
  194.                 }
  195.         }
  196.  
  197.         TFloatArray m_buffer;
  198.         IFStream    m_stream;
  199. };
  200.  
  201. }
  202.  
  203. #include "ParamModImpl.h"
  204.  
  205. #endif // PARAMMOD_H
  206.  
downloadParamMod.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