BVB Source Codes

CRYENGINE Show TimeSourceImpl.h Source code

Return Download CRYENGINE: download TimeSourceImpl.h Source code - Download CRYENGINE Source code - Type:.h
  1. // Copyright 2001-2016 Crytek GmbH / Crytek Group. All rights reserved.
  2.  
  3. namespace pfx2
  4. {
  5.  
  6. namespace detail
  7. {
  8.  
  9. ILINE float AntiAliasParentAge(const float deltaTime, const float selfAge, const float parentInvLifeTime, const float parentAge)
  10. {
  11.         if (selfAge >= 0.0f)
  12.                 return 0.0f;
  13.         return selfAge * parentInvLifeTime * deltaTime + parentAge;
  14. }
  15.  
  16. #ifdef CRY_PFX2_USE_SSE
  17. ILINE floatv AntiAliasParentAge(const floatv deltaTime, const floatv selfAge, const floatv parentInvLifeTime, const floatv parentAge)
  18. {
  19.         const floatv tempAntAliasParentAge = MAdd(Mul(selfAge, parentInvLifeTime), deltaTime, parentAge);
  20.         const floatv sample = __fsel(selfAge, parentAge, tempAntAliasParentAge);
  21.         return sample;
  22. }
  23. #endif
  24.  
  25. class CSelfStreamSampler
  26. {
  27. public:
  28.         CSelfStreamSampler(const SUpdateContext& context, EParticleDataType sourceStreamType, EModDomain domain = EMD_PerParticle)
  29.                 : sourceStream(domain == EMD_PerParticle ? context.m_container.GetIFStream(sourceStreamType) : context.m_parentContainer.GetIFStream(sourceStreamType))
  30.         {}
  31.         ILINE floatv Sample(TParticleGroupId particleId) const
  32.         {
  33.                 return sourceStream.Load(particleId);
  34.         }
  35. private:
  36.         IFStream sourceStream;
  37. };
  38.  
  39. class CParentStreamSampler
  40. {
  41. public:
  42.         CParentStreamSampler(const SUpdateContext& context, EParticleDataType sourceStreamType)
  43.                 : deltaTime(ToFloatv(context.m_deltaTime))
  44.                 , selfAges(context.m_container.GetIFStream(EPDT_NormalAge))
  45.                 , parentSourceStream(context.m_parentContainer.GetIFStream(sourceStreamType))
  46.                 , parentInvLifeTimes(context.m_parentContainer.GetIFStream(EPDT_InvLifeTime))
  47.                 , parentIds(context.m_container.GetIPidStream(EPDT_ParentId))
  48.         {}
  49.         ILINE floatv Sample(TParticleGroupId particleId) const
  50.         {
  51.                 const uint32v parentId = parentIds.Load(particleId);
  52.                 const floatv selfAge = selfAges.Load(particleId);
  53.                 const floatv parentData = parentSourceStream.Load(parentId, 1.0f);
  54.                 const floatv parentInvLifeTime = parentInvLifeTimes.Load(parentId, 1.0f);
  55.                 return AntiAliasParentAge(deltaTime, selfAge, parentInvLifeTime, parentData);
  56.         }
  57. private:
  58.         IFStream   selfAges;
  59.         IFStream   parentSourceStream;
  60.         IFStream   parentInvLifeTimes;
  61.         IPidStream parentIds;
  62.         floatv     deltaTime;
  63. };
  64.  
  65. class CLevelTimeSampler
  66. {
  67. public:
  68.         CLevelTimeSampler(const SUpdateContext& context)
  69.                 : deltaTime(ToFloatv(context.m_deltaTime))
  70.                 , selfAges(context.m_container.GetIFStream(EPDT_NormalAge))
  71.                 , levelTime(ToFloatv(context.m_time))
  72.         {}
  73.         ILINE floatv Sample(TParticleGroupId particleId) const
  74.         {
  75.                 const floatv selfAge = selfAges.Load(particleId);
  76.                 return levelTime - DeltaTime(selfAge, deltaTime);
  77.         }
  78. private:
  79.         IFStream selfAges;
  80.         floatv   levelTime;
  81.         floatv   deltaTime;
  82. };
  83.  
  84. class CSelfSpeedSampler
  85. {
  86. public:
  87.         CSelfSpeedSampler(const SUpdateContext& context, EModDomain domain = EMD_PerParticle)
  88.                 : velocities(domain == EMD_PerParticle ? context.m_container.GetIVec3Stream(EPVF_Velocity) : context.m_parentContainer.GetIVec3Stream(EPVF_Velocity))
  89.         {}
  90.         ILINE floatv Sample(TParticleGroupId particleId) const
  91.         {
  92.                 const Vec3v velocity = velocities.Load(particleId);
  93.                 return velocity.GetLength();
  94.         }
  95. private:
  96.         IVec3Stream velocities;
  97. };
  98.  
  99. class CParentSpeedSampler
  100. {
  101. public:
  102.         CParentSpeedSampler(const SUpdateContext& context, EModDomain domain)
  103.                 : parentVelocities(context.m_parentContainer.GetIVec3Stream(EPVF_Velocity))
  104.                 , parentIds(domain == EMD_PerInstance ? context.m_runtime.GetInstanceParentIds() : context.m_container.GetIPidStream(EPDT_ParentId))
  105.         {}
  106.         ILINE floatv Sample(TParticleGroupId particleId) const
  107.         {
  108.                 const uint32v parentId = parentIds.Load(particleId);
  109.                 const Vec3v velocity = parentVelocities.Load(parentId);
  110.                 const floatv speed = velocity.GetLength();
  111.                 const floatv sample = if_else_zero(parentId != ToUint32v(gInvalidId), speed);
  112.                 return sample;
  113.         }
  114. private:
  115.         IVec3Stream parentVelocities;
  116.         IPidStream  parentIds;
  117. };
  118.  
  119. class CAttributeSampler
  120. {
  121. public:
  122.         CAttributeSampler(const SUpdateContext& context, const string& m_attributeName)
  123.         {
  124.                 const CAttributeInstance& attributes = context.m_runtime.GetEmitter()->GetAttributeInstance();
  125.                 auto attributeId = attributes.FindAttributeIdByName(m_attributeName.c_str());
  126.                 m_attributeValue = ToFloatv(attributes.GetAsFloat(attributeId, 1.0f));
  127.         }
  128.         ILINE floatv Sample(TParticleGroupId particleId) const
  129.         {
  130.                 return m_attributeValue;
  131.         }
  132. private:
  133.         floatv m_attributeValue;
  134. };
  135.  
  136. class CChaosSampler
  137. {
  138. public:
  139.         CChaosSampler(const SUpdateContext& context)
  140.                 : m_chaos(context.m_spawnRngv) {}
  141.         ILINE floatv Sample(TParticleGroupId particleId) const
  142.         {
  143.                 return m_chaos.RandUNorm();
  144.         }
  145. private:
  146.         SChaosKeyV& m_chaos;
  147. };
  148.  
  149. class CViewAngleSampler
  150. {
  151. public:
  152.         CViewAngleSampler(const SUpdateContext& context)
  153.                 : m_positions(context.m_container.GetIVec3Stream(EPVF_Position))
  154.                 , m_orientations(context.m_container.GetIQuatStream(EPQF_Orientation))
  155.                 , m_cameraPosition(ToVec3v(gEnv->p3DEngine->GetRenderingCamera().GetPosition())) {}
  156.         ILINE floatv Sample(TParticleGroupId particleId) const
  157.         {
  158.                 const Vec3v position = m_positions.Load(particleId);
  159.                 const Quatv orientation = m_orientations.Load(particleId);
  160.                 const Vec3v normal = GetColumn2(orientation);
  161.                 const Vec3v toCamera = GetNormalized(m_cameraPosition - position);
  162.                 const floatv cosAngle = fabs_tpl(toCamera.Dot(normal));
  163.                 return cosAngle;
  164.         }
  165. private:
  166.         Vec3v GetColumn2(Quatv q) const
  167.         {
  168.                 const floatv two = ToFloatv(2.0f);
  169.                 const floatv one = ToFloatv(1.0f);
  170.                 return Vec3v(
  171.                         two * (q.v.x * q.v.z + q.v.y * q.w),
  172.                         two * (q.v.y * q.v.z - q.v.x * q.w),
  173.                         two * (q.v.z * q.v.z + q.w * q.w) - one);
  174.         }
  175.         Vec3v GetNormalized(Vec3v v) const
  176.         {
  177.                 #ifdef CRY_PFX2_USE_SSE
  178.                 return v * _mm_rsqrt_ps(v.Dot(v));
  179.                 #else
  180.                 return v.GetNormalized();
  181.                 #endif
  182.         }
  183.         IVec3Stream m_positions;
  184.         IQuatStream m_orientations;
  185.         Vec3v       m_cameraPosition;
  186. };
  187.  
  188. }
  189.  
  190. ILINE CTimeSource::CTimeSource()
  191.         : m_timeSource(ETimeSource::Age)
  192.         , m_fieldSource(ETimeSourceField(EPDT_LifeTime))
  193.         , m_sourceOwner(ETimeSourceOwner::Self)
  194.         , m_timeScale(1.0f)
  195.         , m_timeBias(0.0f)
  196.         , m_spawnOnly(true)
  197. {
  198. }
  199.  
  200. template<typename TParam, typename TMod>
  201. ILINE void CTimeSource::AddToParam(CParticleComponent* pComponent, TParam* pParam, TMod* pModifier)
  202. {
  203.         if (m_spawnOnly)
  204.                 pParam->AddToInitParticles(pModifier);
  205.         else
  206.                 pParam->AddToUpdate(pModifier);
  207.  
  208.         CParticleComponent* pSourceComponent = m_sourceOwner == ETimeSourceOwner::Parent ? pComponent->GetParentComponent() : pComponent;
  209.         if (pSourceComponent)
  210.         {
  211.                 if (m_timeSource == ETimeSource::SpawnFraction)
  212.                         pSourceComponent->AddParticleData(EPDT_SpawnFraction);
  213.                 else if (m_timeSource == ETimeSource::Speed)
  214.                         pSourceComponent->AddParticleData(EPVF_Velocity);
  215.                 else if (m_timeSource == ETimeSource::Field)
  216.                         pSourceComponent->AddParticleData((EParticleDataType)m_fieldSource);
  217.                 else if (m_timeSource == ETimeSource::ViewAngle)
  218.                         pSourceComponent->AddParticleData(EPQF_Orientation);
  219.         }
  220. }
  221.  
  222. ILINE EModDomain CTimeSource::GetDomain() const
  223. {
  224.         switch (m_sourceOwner)
  225.         {
  226.         case ETimeSourceOwner::Self:
  227.                 return EMD_PerParticle;
  228.         case ETimeSourceOwner::Parent:
  229.                 return EMD_PerInstance;
  230.         default:
  231.                 return EMD_PerEffect;
  232.         }
  233. }
  234. ILINE EParticleDataType CTimeSource::GetDataType() const
  235. {
  236.         switch (m_timeSource)
  237.         {
  238.         case ETimeSource::Age:
  239.                 return EPDT_NormalAge;
  240.         case ETimeSource::SpawnFraction:
  241.                 return EPDT_SpawnFraction;
  242.         case ETimeSource::Field:
  243.                 return EParticleDataType(m_fieldSource);
  244.         default:
  245.                 return EParticleDataType::size();
  246.         }
  247. }
  248.  
  249. template<typename TBase, typename TStream>
  250. ILINE void CTimeSource::Dispatch(const SUpdateContext& context, const SUpdateRange& range, TStream stream, EModDomain domain) const
  251. {
  252.         switch (m_timeSource)
  253.         {
  254.         case ETimeSource::LevelTime:
  255.                 ((TBase*)this)->DoModify(
  256.                   context, range, stream,
  257.                   detail::CLevelTimeSampler(context));
  258.                 break;
  259.         case ETimeSource::Attribute:
  260.                 ((TBase*)this)->DoModify(
  261.                   context, range, stream,
  262.                   detail::CAttributeSampler(context, m_attributeName));
  263.                 break;
  264.         case ETimeSource::Random:
  265.                 ((TBase*)this)->DoModify(
  266.                   context, range, stream,
  267.                   detail::CChaosSampler(context));
  268.                 break;
  269.         case ETimeSource::ViewAngle:
  270.                 ((TBase*)this)->DoModify(
  271.                         context, range, stream,
  272.                         detail::CViewAngleSampler(context));
  273.                 break;
  274.  
  275.         case ETimeSource::Speed:
  276.                 if (m_sourceOwner == ETimeSourceOwner::Self)
  277.                         ((TBase*)this)->DoModify(
  278.                           context, range, stream,
  279.                           detail::CSelfSpeedSampler(context));
  280.                 else if (domain == EMD_PerInstance)
  281.                         ((TBase*)this)->DoModify(
  282.                           context, range, stream,
  283.                           detail::CSelfSpeedSampler(context, domain));
  284.                 else
  285.                         ((TBase*)this)->DoModify(
  286.                           context, range, stream,
  287.                           detail::CParentSpeedSampler(context, domain));
  288.                 break;
  289.         default:
  290.                 {
  291.                         auto dataType = GetDataType();
  292.                         if (m_sourceOwner == ETimeSourceOwner::Self)
  293.                                 ((TBase*)this)->DoModify(
  294.                                   context, range, stream,
  295.                                   detail::CSelfStreamSampler(context, dataType));
  296.                         else if (domain == EMD_PerInstance)
  297.                                 ((TBase*)this)->DoModify(
  298.                                   context, range, stream,
  299.                                   detail::CSelfStreamSampler(context, dataType, domain));
  300.                         else
  301.                                 ((TBase*)this)->DoModify(
  302.                                   context, range, stream,
  303.                                   detail::CParentStreamSampler(context, dataType));
  304.                         break;
  305.                 }
  306.  
  307.         }
  308. }
  309.  
  310. ILINE IParamModContext& CTimeSource::GetContext(Serialization::IArchive& ar) const
  311. {
  312.         IParamModContext* pContext = ar.context<IParamModContext>();
  313.         CRY_PFX2_ASSERT(pContext != nullptr);
  314.         return *pContext;
  315. }
  316.  
  317. }
  318.  
downloadTimeSourceImpl.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