EmissionModule.cpp 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. //
  2. // EmissionModule.cpp
  3. // libcocos2d Mac
  4. //
  5. // Created by 徐俊杰 on 2020/4/24.
  6. //
  7. #include "EmissionModule.h"
  8. //#include "UnityPrefix.h"
  9. //#include "rparticle/Modules/EmissionModule.h"
  10. //#include "Runtime/BaseClasses/ObjectDefines.h"
  11. #include "rparticle/Serialize/TransferFunctions/SerializeTransfer.h"
  12. //#include "Runtime/Math/Vector2.h"
  13. NS_RRP_BEGIN
  14. static int AccumulateBursts (const ParticleSystemEmissionData& emissionData, float t0, float t1)
  15. {
  16. const float epsilon = 0.0001f;
  17. int burstParticles = 0;
  18. const size_t count = emissionData.burstCount;
  19. for (size_t q = 0; q < count; ++q)
  20. {
  21. if (emissionData.burstTime[q] - t0 > -epsilon && emissionData.burstTime[q] < t1)
  22. burstParticles += emissionData.burstParticleCount[q];
  23. }
  24. return burstParticles;
  25. }
  26. static float AccumulateContinuous(const ParticleSystemEmissionData& emissionData, const float length, const float toT, const float dt)
  27. {
  28. DebugAssert (length > 0.0001f);
  29. DebugAssert (toT >= 0.0f);
  30. DebugAssert (toT <= length);
  31. float normalizedT = toT / length;
  32. return std::max<float> (0.0f, Evaluate (emissionData.rate, normalizedT)) * dt;
  33. };
  34. EmissionModule::EmissionModule () : ParticleSystemModule(true)
  35. {
  36. m_EmissionData.burstCount = 0;
  37. m_EmissionData.type = kEmissionTypeTime;
  38. for(int i = 0; i < ParticleSystemEmissionData::kMaxNumBursts; i++)
  39. {
  40. m_EmissionData.burstParticleCount[i] = 30;
  41. m_EmissionData.burstTime[i] = 0.0f;
  42. }
  43. }
  44. void EmissionModule::Emit (const ParticleSystemReadOnlyState& roState, ParticleSystemEmissionState& emissionState, size_t& amountOfParticlesToEmit, size_t& numContinuous, const ParticleSystemEmissionData& emissionData, const Vector3f velocity, float fromT, float toT, float dt, float length)
  45. {
  46. const float epsilon = 0.0001f;
  47. if(kEmissionTypeTime == emissionData.type)
  48. {
  49. float rate = 0.0f;
  50. float t0 = std::max<float> (0.0f, fromT);
  51. float t1 = std::max<float> (0.0f, toT);
  52. if (t1 < t0) // handle loop
  53. {
  54. rate += AccumulateContinuous (emissionData, length, t1, t1); // from start to current time
  55. t1 = length; // from last time to end
  56. }
  57. rate += AccumulateContinuous (emissionData, length, t1, t1 - t0); // from start to current time
  58. const float newParticles = rate;
  59. if(newParticles >= epsilon)
  60. emissionState.m_ParticleSpacing = 1.0f / newParticles;
  61. else
  62. emissionState.m_ParticleSpacing = 1.0f;
  63. emissionState.m_ToEmitAccumulator += newParticles;
  64. amountOfParticlesToEmit = (int)emissionState.m_ToEmitAccumulator;
  65. emissionState.m_ToEmitAccumulator -= (float)amountOfParticlesToEmit;
  66. // Continuous emits
  67. numContinuous = amountOfParticlesToEmit;
  68. // Bursts
  69. t0 = std::max<float> (0.0f, fromT);
  70. t1 = std::max<float> (0.0f, toT);
  71. if (t1 < t0) // handle loop
  72. {
  73. amountOfParticlesToEmit += AccumulateBursts (emissionData, 0.0f, t1); // from start to current time
  74. t1 = length + epsilon; // from last time to end
  75. }
  76. amountOfParticlesToEmit += AccumulateBursts (emissionData, t0, t1); // from start to current time
  77. }
  78. else
  79. {
  80. float newParticles = AccumulateContinuous (emissionData, length, toT, dt) / roState.GetRenderScale() * Magnitude (velocity); // from start to current time
  81. if(newParticles >= epsilon)
  82. emissionState.m_ParticleSpacing = 1.0f / newParticles;
  83. else
  84. emissionState.m_ParticleSpacing = 1.0f;
  85. emissionState.m_ToEmitAccumulator += newParticles;
  86. amountOfParticlesToEmit = (int)emissionState.m_ToEmitAccumulator;
  87. emissionState.m_ToEmitAccumulator -= (float)amountOfParticlesToEmit;
  88. // Continuous emits
  89. numContinuous = amountOfParticlesToEmit;
  90. }
  91. }
  92. void EmissionModule::CheckConsistency ()
  93. {
  94. m_EmissionData.rate.SetScalar(std::max<float> (0.0f, m_EmissionData.rate.GetScalar()));
  95. const size_t count = m_EmissionData.burstCount;
  96. for (size_t q = 0; q < count; ++q)
  97. {
  98. m_EmissionData.burstTime[q] = std::max<float> (0.0f, m_EmissionData.burstTime[q]);
  99. }
  100. }
  101. template<class TransferFunction>
  102. void EmissionModule::Transfer (TransferFunction& transfer)
  103. {
  104. ParticleSystemModule::Transfer (transfer);
  105. transfer.Transfer (m_EmissionData.type, "m_Type");
  106. transfer.Transfer (m_EmissionData.rate, "rate");
  107. const char* kCountNames [ParticleSystemEmissionData::kMaxNumBursts] = { "cnt0", "cnt1", "cnt2", "cnt3", };
  108. const char* kTimeNames [ParticleSystemEmissionData::kMaxNumBursts] = { "time0", "time1", "time2", "time3", };
  109. for(int i = 0; i < ParticleSystemEmissionData::kMaxNumBursts; i++)
  110. transfer.Transfer (m_EmissionData.burstParticleCount[i], kCountNames[i]);
  111. for(int i = 0; i < ParticleSystemEmissionData::kMaxNumBursts; i++)
  112. transfer.Transfer (m_EmissionData.burstTime[i], kTimeNames[i]);
  113. transfer.Transfer (m_EmissionData.burstCount, "m_BurstCount"); transfer.Align();
  114. }
  115. INSTANTIATE_TEMPLATE_TRANSFER(EmissionModule)
  116. NS_RRP_END