ParticleSystemParticle.h 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. //
  2. // ParticleSystemParticle.h
  3. // cocos2d_libs
  4. //
  5. // Created by 徐俊杰 on 2020/4/24.
  6. //
  7. #ifndef ParticleSystemParticle_h
  8. #define ParticleSystemParticle_h
  9. //#include "cocos2d.h"
  10. #include "rparticle/Macros/RParticleMacros.h"
  11. #include "rparticle/Utilities/dynamic_array.h"
  12. #include "rparticle/ParticleCollisionEvents.h"
  13. NS_RRP_BEGIN
  14. enum{ kParticleSystemMaxNumEmitAccumulators = 2 };
  15. // Keep in sync with struct ParticleSystem.Particle
  16. struct ParticleSystemParticle
  17. {
  18. Vector3f position;
  19. Vector3f velocity;
  20. Vector3f animatedVelocity;
  21. Vector3f axisOfRotation;
  22. float rotation;
  23. float rotationalSpeed;
  24. float size;
  25. ColorRGBA32 color;
  26. UInt32 randomSeed;
  27. float lifetime;
  28. float startLifetime;
  29. float emitAccumulator[kParticleSystemMaxNumEmitAccumulators];
  30. };
  31. typedef dynamic_array<Vector3f> ParticleSystemVector3Array;
  32. typedef dynamic_array<float> ParticleSystemFloatArray;
  33. typedef dynamic_array<ColorRGBA32> ParticleSystemColor32Array;
  34. typedef dynamic_array<UInt32> ParticleSystemUInt32Array;
  35. struct ParticleSystemParticles
  36. {
  37. ParticleSystemParticles()
  38. :numEmitAccumulators(0)
  39. ,usesAxisOfRotation(false)
  40. ,usesRotationalSpeed(false)
  41. ,usesCollisionEvents(false)
  42. ,currentCollisionEventThreadArray(0)
  43. {}
  44. ParticleSystemVector3Array position;
  45. ParticleSystemVector3Array velocity;
  46. ParticleSystemVector3Array animatedVelocity; // Would actually only need this when modules with force and velocity curves are used
  47. ParticleSystemVector3Array axisOfRotation;
  48. ParticleSystemFloatArray rotation;
  49. ParticleSystemFloatArray rotationalSpeed;
  50. ParticleSystemFloatArray size;
  51. ParticleSystemColor32Array color;
  52. ParticleSystemUInt32Array randomSeed;
  53. ParticleSystemFloatArray lifetime;
  54. ParticleSystemFloatArray startLifetime;
  55. ParticleSystemFloatArray emitAccumulator[kParticleSystemMaxNumEmitAccumulators]; // Usage: Only needed if particle system has time sub emitter
  56. // CollisionEvents collisionEvents;
  57. bool usesAxisOfRotation;
  58. bool usesRotationalSpeed;
  59. bool usesCollisionEvents;
  60. int currentCollisionEventThreadArray;
  61. int numEmitAccumulators;
  62. void AddParticle(ParticleSystemParticle* particle);
  63. void SetUsesAxisOfRotation ();
  64. void SetUsesRotationalSpeed();
  65. void SetUsesCollisionEvents(bool usesCollisionEvents);
  66. bool GetUsesCollisionEvents() const;
  67. void SetUsesEmitAccumulator (int numAccumulators);
  68. static size_t GetParticleSize();
  69. size_t array_size () const;
  70. void array_resize (size_t i);
  71. void element_swap(size_t i, size_t j);
  72. void element_assign(size_t i, size_t j);
  73. void array_assign_external(void* data, const int numParticles);
  74. void array_merge_preallocated(const ParticleSystemParticles& rhs, const int offset, const bool needAxisOfRotation, const bool needEmitAccumulator);
  75. void array_assign(const ParticleSystemParticles& rhs);
  76. static void array_lerp(ParticleSystemParticles& output, const ParticleSystemParticles& a, const ParticleSystemParticles& b, float factor);
  77. void CopyFromArrayAOS(ParticleSystemParticle* particles, int size);
  78. void CopyToArrayAOS(ParticleSystemParticle* particles, int size);
  79. };
  80. struct ParticleSystemParticlesTempData
  81. {
  82. ParticleSystemParticlesTempData();
  83. void element_swap(size_t i, size_t j);
  84. ColorRGBA32* color;
  85. float* size;
  86. float* sheetIndex;
  87. size_t particleCount;
  88. Vector3f* particleSysytemWorldPos;
  89. };
  90. inline float NormalizedTime (const ParticleSystemParticles& ps, size_t i)
  91. {
  92. return (ps.startLifetime[i] - ps.lifetime[i]) / ps.startLifetime[i];
  93. }
  94. inline float NormalizedTime(const ParticleSystemParticle& particle)
  95. {
  96. return particle.startLifetime ? ((particle.startLifetime - particle.lifetime) / particle.startLifetime) : 0.0f;
  97. }
  98. inline float NormalizedTime (float wholeTime, float currentTime)
  99. {
  100. return (wholeTime - currentTime) / wholeTime;
  101. }
  102. NS_RRP_END
  103. #endif /* ParticleSystemParticle_h */