BVB Source Codes

CRYENGINE Show ParamModImpl.h Source code

Return Download CRYENGINE: download ParamModImpl.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. #include <CrySerialization/SmartPtr.h>
  11. #include "ParamMod.h"
  12.  
  13. namespace pfx2
  14. {
  15.  
  16. template<typename TPointer, typename TContext>
  17. FilteredClassFactory<TPointer, TContext>::FilteredClassFactory()
  18. {
  19.         TContext context;
  20.         auto& baseFactory = BaseClass::the();
  21.         auto pCreator = baseFactory.creatorChain();
  22.         for (; pCreator; pCreator = pCreator->next)
  23.         {
  24.                 std::unique_ptr<TPointer> obj(pCreator->create());
  25.                 if (obj->CanCreate(context))
  26.                         this->BaseClass::registerCreator(pCreator);
  27.         }
  28. }
  29.  
  30. template<typename TPointer, typename TContext>
  31. FilteredClassFactory<TPointer, TContext>& FilteredClassFactory<TPointer, TContext >::the()
  32. {
  33.         static FilteredClassFactory<TPointer, TContext> factory;
  34.         return factory;
  35. }
  36.  
  37. template<typename TPointer, typename T>
  38. bool Serialize(Serialization::IArchive& ar, _context_smart_ptr<TPointer, T>& ptr, const char* name, const char* label)
  39. {
  40.         FilteredSmartPtrSerializer<TPointer, T> serializer(ptr);
  41.         return ar(static_cast<Serialization::IPointer&>(serializer), name, label);
  42. }
  43.  
  44. ILINE void IModifier::Serialize(Serialization::IArchive& ar)
  45. {
  46.         ar(m_enabled);
  47. }
  48.  
  49. ILINE IParamModContext& IModifier::GetContext(Serialization::IArchive& ar) const
  50. {
  51.         IParamModContext* pContext = ar.context<IParamModContext>();
  52.         return *pContext;
  53. }
  54.  
  55. template<typename TParamModContext, typename T>
  56. CParamMod<TParamModContext, T>::CParamMod(TType defaultValue)
  57.         : m_baseValue(defaultValue)
  58. {
  59. }
  60.  
  61. template<typename TParamModContext, typename T>
  62. void CParamMod<TParamModContext, T >::AddToComponent(CParticleComponent* pComponent, CParticleFeature* pFeature)
  63. {
  64.         m_modInit.clear();
  65.         m_modUpdate.clear();
  66.         auto it = std::remove_if(m_modifiers.begin(), m_modifiers.end(), [](const PModifier& ptr) { return !ptr; });
  67.         m_modifiers.erase(it, m_modifiers.end());
  68.  
  69.         pComponent->AddToUpdateList(EUL_InitUpdate, pFeature);
  70.  
  71.         for (auto& pModifier : m_modifiers)
  72.         {
  73.                 if (pModifier && pModifier->IsEnabled())
  74.                         pModifier->AddToParam(pComponent, this);
  75.         }
  76. }
  77.  
  78. template<typename TParamModContext, typename T>
  79. void CParamMod<TParamModContext, T >::AddToComponent(CParticleComponent* pComponent, CParticleFeature* pFeature, EParticleDataType dataType)
  80. {
  81.         AddToComponent(pComponent, pFeature);
  82.         pComponent->AddParticleData(dataType);
  83.  
  84.         if (dataType.info().hasInit && !m_modUpdate.empty())
  85.         {
  86.                 pComponent->AddParticleData(InitType(dataType));
  87.                 pComponent->AddToUpdateList(EUL_Update, pFeature);
  88.         }
  89. }
  90.  
  91. template<typename TParamModContext, typename T>
  92. void CParamMod<TParamModContext, T >::Serialize(Serialization::IArchive& ar)
  93. {
  94.         TParamModContext modContext;
  95.         Serialization::SContext _modContext(ar, static_cast<IParamModContext*>(&modContext));
  96.         ar(m_baseValue, "value", "^");
  97.         ar(m_modifiers, "modifiers", "^");
  98.  
  99.         if (ar.isInput())
  100.         {
  101.                 for (auto& pMod : m_modifiers)
  102.                 {
  103.                         if (!pMod)
  104.                                 continue;
  105.                         if (IModifier* pNewMod = pMod->VersionFixReplace())
  106.                         {
  107.                                 pMod.reset(pNewMod);
  108.                         }
  109.                 }
  110.         }
  111. }
  112.  
  113. template<typename TParamModContext, typename T>
  114. void CParamMod<TParamModContext, T >::InitParticles(const SUpdateContext& context, EParticleDataType dataType) const
  115. {
  116.         CRY_PFX2_PROFILE_DETAIL;
  117.  
  118.         CParticleContainer& container = context.m_container;
  119.         IOFStream dataStream = GetParticleStream(container, dataType);
  120.  
  121.         CRY_PFX2_ASSERT(dataStream.IsValid());
  122.  
  123.         SUpdateRange spawnRange;
  124.         spawnRange.m_firstParticleId = context.m_container.GetFirstSpawnParticleId();
  125.         spawnRange.m_lastParticleId = context.m_container.GetLastParticleId();
  126.         const floatv baseValue = ToFloatv(m_baseValue);
  127.  
  128.         CRY_PFX2_FOR_SPAWNED_PARTICLEGROUP(context)
  129.         {
  130.                 dataStream.Store(particleGroupId, baseValue);
  131.         }
  132.         CRY_PFX2_FOR_END
  133.  
  134.         for (auto & pModifier : m_modInit)
  135.                 pModifier->Modify(context, spawnRange, dataStream, dataType, EMD_PerParticle);
  136.  
  137.         container.CopyData(InitType(dataType), dataType, container.GetSpawnedRange());
  138. }
  139.  
  140. template<typename TParamModContext, typename T>
  141. void CParamMod<TParamModContext, T >::Update(const SUpdateContext& context, EParticleDataType dataType) const
  142. {
  143.         CParticleContainer& container = context.m_container;
  144.         IOFStream stream = GetParticleStream(container, dataType);
  145.         for (auto& pModifier : m_modUpdate)
  146.                 pModifier->Modify(context, context.m_updateRange, stream, dataType, EMD_PerParticle);
  147. }
  148.  
  149. template<typename TParamModContext, typename T>
  150. void CParamMod<TParamModContext, T >::ModifyInit(const SUpdateContext& context, TType* data, SUpdateRange range) const
  151. {
  152.         CRY_PFX2_PROFILE_DETAIL;
  153.         IOFStream dataStream(data);
  154.  
  155.         const floatv baseValue = ToFloatv(m_baseValue.Get());
  156.         CRY_PFX2_FOR_RANGE_PARTICLESGROUP(range)
  157.         {
  158.                 dataStream.Store(particleGroupId, baseValue);
  159.         }
  160.         CRY_PFX2_FOR_END
  161.  
  162.         const EModDomain domain = Context().GetDomain();
  163.         for (auto& pModifier : m_modInit)
  164.                 pModifier->Modify(context, range, dataStream, EParticleDataType(), domain);
  165. }
  166.  
  167. template<typename TParamModContext, typename T>
  168. void CParamMod<TParamModContext, T >::ModifyUpdate(const SUpdateContext& context, TType* data, SUpdateRange range) const
  169. {
  170.         CRY_PFX2_PROFILE_DETAIL;
  171.         IOFStream dataStream(data);
  172.  
  173.         const EModDomain domain = Context().GetDomain();
  174.         for (auto& pModifier : m_modUpdate)
  175.                 pModifier->Modify(context, range, dataStream, EParticleDataType(), domain);
  176. }
  177.  
  178. template<typename TParamModContext, typename T>
  179. TRange<typename T::TType> CParamMod<TParamModContext, T >::GetValues(const SUpdateContext& context, TType* data, SUpdateRange range, EModDomain domain, bool updating) const
  180. {
  181.         TRange<TType> minmax(1);
  182.         IOFStream stream(data);
  183.  
  184.         const floatv baseValue = ToFloatv(m_baseValue.Get());
  185.         CRY_PFX2_FOR_RANGE_PARTICLESGROUP(range)
  186.         {
  187.                 stream.Store(particleGroupId, baseValue);
  188.         }
  189.         CRY_PFX2_FOR_END
  190.  
  191.         for (auto & pMod : m_modInit)
  192.         {
  193.                 if (pMod->GetDomain() >= domain)
  194.                         pMod->Modify(context, range, stream, EParticleDataType(), domain);
  195.                 else
  196.                         minmax = minmax * pMod->GetMinMax();
  197.         }
  198.         for (auto& pMod : m_modUpdate)
  199.         {
  200.                 if (updating && pMod->GetDomain() >= domain)
  201.                         pMod->Modify(context, range, stream, EParticleDataType(), domain);
  202.                 else
  203.                         minmax = minmax * pMod->GetMinMax();
  204.         }
  205.         return minmax;
  206. }
  207.  
  208. template<typename TParamModContext, typename T>
  209. TRange<typename T::TType> CParamMod<TParamModContext, T >::GetValues(const SUpdateContext& context, Array<TType, uint> data, EModDomain domain, bool updating) const
  210. {
  211.         return GetValues(context, data.data(), SUpdateRange(0, data.size()), domain, updating);
  212. }
  213.  
  214. template<typename TParamModContext, typename T>
  215. void CParamMod<TParamModContext, T >::AddToInitParticles(IModifier* pMod)
  216. {
  217.         if (std::find(m_modInit.begin(), m_modInit.end(), pMod) == m_modInit.end())
  218.                 m_modInit.push_back(pMod);
  219. }
  220.  
  221. template<typename TParamModContext, typename T>
  222. void CParamMod<TParamModContext, T >::AddToUpdate(IModifier* pMod)
  223. {
  224.         if (std::find(m_modUpdate.begin(), m_modUpdate.end(), pMod) == m_modUpdate.end())
  225.                 m_modUpdate.push_back(pMod);
  226. }
  227.  
  228. template<typename TParamModContext, typename T>
  229. TRange<typename T::TType> CParamMod<TParamModContext, T >::GetValueRange(const SUpdateContext& context) const
  230. {
  231.         floatv curValue;
  232.         auto minmax = GetValues(context, (float*)&curValue, SUpdateRange(0, 1), EMD_PerEffect, true);
  233.         return minmax * (*(float*)&curValue);
  234. }
  235.  
  236. template<typename TParamModContext, typename T>
  237. TRange<typename T::TType> CParamMod<TParamModContext, T >::GetValueRange() const
  238. {
  239.         TRange<TType> minmax(m_baseValue.Get());
  240.         for (auto& pMod : m_modInit)
  241.                 minmax = minmax * pMod->GetMinMax();
  242.         for (auto& pMod : m_modUpdate)
  243.                 minmax = minmax * pMod->GetMinMax();
  244.         return minmax;
  245. }
  246.  
  247. template<typename TParamModContext, typename T>
  248. void pfx2::CParamMod<TParamModContext, T >::Sample(TType* samples, int numSamples) const
  249. {
  250.         const T baseValue = m_baseValue.Get();
  251.         for (int i = 0; i < numSamples; ++i)
  252.         {
  253.                 samples[i] = baseValue;
  254.         }
  255.  
  256.         for (auto& pModifier : m_modifiers)
  257.         {
  258.                 if (pModifier->IsEnabled())
  259.                         pModifier->Sample(samples, numSamples);
  260.         }
  261. }
  262.  
  263. template<typename TParamModContext, typename T>
  264. IOFStream CParamMod<TParamModContext, T >::GetParticleStream(CParticleContainer& container, EParticleDataType dataType) const
  265. {
  266.         if (container.GetMaxParticles() == 0 || !container.HasData(dataType))
  267.                 return IOFStream();
  268.         IOFStream stream = container.GetIOFStream(dataType);
  269.         return stream;
  270. }
  271.  
  272. }
  273.  
downloadParamModImpl.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