SizeByVelocityModule.cpp 3.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. //
  2. // SizeByVelocityModule.cpp
  3. // cocos2d_libs
  4. //
  5. // Created by 徐俊杰 on 2020/4/24.
  6. //
  7. #include "rparticle/Modules/SizeByVelocityModule.h"
  8. //#include "UnityPrefix.h"
  9. //#include "rparticle/Modules/SizeByVelocityModule.h"
  10. //#include "Runtime/BaseClasses/ObjectDefines.h"
  11. #include "rparticle/Serialize/TransferFunctions/SerializeTransfer.h"
  12. #include "rparticle/ParticleSystemUtils.h"
  13. NS_RRP_BEGIN
  14. SizeBySpeedModule::SizeBySpeedModule () : ParticleSystemModule(false)
  15. , m_Range (0.0f, 1.0f)
  16. {}
  17. template<ParticleSystemCurveEvalMode mode>
  18. void UpdateTpl(const MinMaxCurve& curve, const ParticleSystemParticles& ps, float* tempSize, size_t fromIndex, size_t toIndex, const Vector2f offsetScale)
  19. {
  20. for (size_t q = fromIndex; q < toIndex; ++q)
  21. {
  22. const Vector3f vel = ps.velocity[q] + ps.animatedVelocity[q];
  23. const float t = InverseLerpFast01 (offsetScale, Magnitude (vel));
  24. const float random = GenerateRandom(ps.randomSeed[q] + kParticleSystemSizeBySpeedCurveId);
  25. tempSize[q] *= MAX(0.0f, Evaluate<mode> (curve, t, random));
  26. }
  27. }
  28. template<ParticleSystemCurveEvalMode mode>
  29. void UpdateTplSingle(const MinMaxCurve& curve, const ParticleSystemParticle& particle, float& tempSize, const Vector2f& scaleOffset)
  30. {
  31. const Vector3f vel = particle.velocity + particle.animatedVelocity;
  32. const float t = InverseLerpFast01(scaleOffset, Magnitude(vel));
  33. const float random = GenerateRandom(particle.randomSeed + kParticleSystemSizeBySpeedCurveId);
  34. tempSize *= std::max<float>(0.0f, Evaluate<mode>(curve, t, random));
  35. }
  36. void SizeBySpeedModule::Update (const ParticleSystemReadOnlyState& roState, const ParticleSystemParticles& ps, float* tempSize, size_t fromIndex, size_t toIndex)
  37. {
  38. DebugAssert(toIndex <= ps.array_size ());
  39. Vector2f offsetScale = CalculateInverseLerpOffsetScale(m_Range * roState.GetRenderScale());
  40. if (m_Curve.minMaxState == kMMCScalar)
  41. UpdateTpl<kEMScalar> (m_Curve, ps, tempSize, fromIndex, toIndex, offsetScale);
  42. else if (m_Curve.IsOptimized() && m_Curve.UsesMinMax())
  43. UpdateTpl<kEMOptimizedMinMax> (m_Curve, ps, tempSize, fromIndex, toIndex, offsetScale);
  44. else if(m_Curve.IsOptimized())
  45. UpdateTpl<kEMOptimized> (m_Curve, ps, tempSize, fromIndex, toIndex, offsetScale);
  46. else
  47. UpdateTpl<kEMSlow> (m_Curve, ps, tempSize, fromIndex, toIndex, offsetScale);
  48. }
  49. void SizeBySpeedModule::UpdateSingle(const ParticleSystemReadOnlyState& roState, const ParticleSystemParticle& particle, bool uses3DSize, float& tempSize) const
  50. {
  51. Vector2f offsetScale = CalculateInverseLerpOffsetScale(m_Range * roState.GetRenderScale());
  52. if (m_Curve.minMaxState == kMMCScalar)
  53. UpdateTplSingle<kEMScalar> (m_Curve, particle, tempSize, offsetScale);
  54. else if (m_Curve.IsOptimized() && m_Curve.UsesMinMax())
  55. UpdateTplSingle<kEMOptimizedMinMax> (m_Curve, particle, tempSize, offsetScale);
  56. else if(m_Curve.IsOptimized())
  57. UpdateTplSingle<kEMOptimized> (m_Curve, particle, tempSize, offsetScale);
  58. else
  59. UpdateTplSingle<kEMSlow> (m_Curve, particle, tempSize, offsetScale);
  60. }
  61. void SizeBySpeedModule::CheckConsistency ()
  62. {
  63. const float MyEpsilon = 0.001f;
  64. m_Range.x = std::min (m_Range.x, m_Range.y - MyEpsilon);
  65. }
  66. template<class TransferFunction>
  67. void SizeBySpeedModule::Transfer (TransferFunction& transfer)
  68. {
  69. ParticleSystemModule::Transfer (transfer);
  70. transfer.Transfer (m_Curve, "curve");
  71. transfer.Transfer (m_Range, "range");
  72. }
  73. INSTANTIATE_TEMPLATE_TRANSFER(SizeBySpeedModule)
  74. NS_RRP_END