SizeModule.cpp 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. //
  2. // SizeModule.cpp
  3. // cocos2d_libs
  4. //
  5. // Created by 徐俊杰 on 2020/4/24.
  6. //
  7. #include "rparticle/Modules/SizeModule.h"
  8. //#include "UnityPrefix.h"
  9. //#include "rparticle/Modules/SizeModule.h"
  10. //#include "Runtime/BaseClasses/ObjectDefines.h"
  11. #include "rparticle/Serialize/TransferFunctions/SerializeTransfer.h"
  12. #include "rparticle/Math/Random/Random.h"
  13. #include "rparticle/ParticleSystemUtils.h"
  14. NS_RRP_BEGIN
  15. template<ParticleSystemCurveEvalMode mode>
  16. void UpdateTpl(const MinMaxCurve& curve, const ParticleSystemParticles& ps, float* tempSize, size_t fromIndex, size_t toIndex)
  17. {
  18. for (size_t q = fromIndex; q < toIndex; ++q)
  19. {
  20. const float time = NormalizedTime(ps, q);
  21. const float random = GenerateRandom(ps.randomSeed[q] + kParticleSystemSizeCurveId);
  22. tempSize[q] *= MAX(0.0f, Evaluate<mode> (curve, time, random));
  23. }
  24. }
  25. template<ParticleSystemCurveEvalMode mode>
  26. void UpdateTplSingle(const MinMaxCurve& curve, const ParticleSystemParticle& particle, float& tempSize)
  27. {
  28. const float time = NormalizedTime(particle);
  29. const float random = GenerateRandom(particle.randomSeed + kParticleSystemSizeCurveId);
  30. tempSize *= std::max<float>(0.0f, Evaluate<mode>(curve, time, random));
  31. }
  32. SizeModule::SizeModule() : ParticleSystemModule(false)
  33. {}
  34. void SizeModule::Update (const ParticleSystemParticles& ps, float* tempSize, size_t fromIndex, size_t toIndex)
  35. {
  36. DebugAssert(toIndex <= ps.array_size ());
  37. if(m_Curve.minMaxState == kMMCScalar)
  38. UpdateTpl<kEMScalar>(m_Curve, ps, tempSize, fromIndex, toIndex);
  39. else if (m_Curve.IsOptimized() && m_Curve.UsesMinMax ())
  40. UpdateTpl<kEMOptimizedMinMax>(m_Curve, ps, tempSize, fromIndex, toIndex);
  41. else if(m_Curve.IsOptimized())
  42. UpdateTpl<kEMOptimized>(m_Curve, ps, tempSize, fromIndex, toIndex);
  43. else
  44. UpdateTpl<kEMSlow>(m_Curve, ps, tempSize, fromIndex, toIndex);
  45. }
  46. void SizeModule::UpdateSingle(const ParticleSystemParticle& particle, bool uses3DSize, float& tempSize) const
  47. {
  48. if(m_Curve.minMaxState == kMMCScalar)
  49. UpdateTplSingle<kEMScalar>(m_Curve, particle, tempSize);
  50. else if (m_Curve.IsOptimized() && m_Curve.UsesMinMax ())
  51. UpdateTplSingle<kEMOptimizedMinMax>(m_Curve, particle, tempSize);
  52. else if(m_Curve.IsOptimized())
  53. UpdateTplSingle<kEMOptimized>(m_Curve, particle, tempSize);
  54. else
  55. UpdateTplSingle<kEMSlow>(m_Curve, particle, tempSize);
  56. }
  57. template<class TransferFunction>
  58. void SizeModule::Transfer (TransferFunction& transfer)
  59. {
  60. ParticleSystemModule::Transfer (transfer);
  61. transfer.Transfer (m_Curve, "curve");
  62. }
  63. INSTANTIATE_TEMPLATE_TRANSFER(SizeModule)
  64. NS_RRP_END