ParticleSystemModule.h 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339
  1. //
  2. // ParticleSystemModule.h
  3. // libcocos2d Mac
  4. //
  5. // Created by 徐俊杰 on 2020/4/24.
  6. //
  7. #ifndef ParticleSystemModule_h
  8. #define ParticleSystemModule_h
  9. #include "base/CCRef.h"
  10. #include "3d/CCPlane.h"
  11. //#include "cocos2d.h"
  12. #include "rparticle/Macros/RParticleMacros.h"
  13. #include "rparticle/Utilities/dynamic_array.h"
  14. #include "rparticle/ParticleSystemCommon.h"
  15. #include "rparticle/ParticleSystemCurves.h"
  16. namespace cocos2d {
  17. class Texture2D;
  18. };
  19. NS_RRP_BEGIN
  20. #define DECLARE_MODULE(name) const char* GetName () { return #name; }// DEFINE_GET_TYPESTRING(name)
  21. class RParticleSystem;
  22. struct RRP_PARTICLEQUAD_BORDER {
  23. RRP_PARTICLEQUAD_BORDER()
  24. : left(1)
  25. , right(1)
  26. , bottom(1)
  27. , top(1)
  28. {}
  29. RRP_PARTICLEQUAD_BORDER(float l, float r, float b, float t)
  30. : left(l)
  31. , right(r)
  32. , bottom(b)
  33. , top(t)
  34. {}
  35. float left;
  36. float right;
  37. float bottom;
  38. float top;
  39. void set(float l, float r, float b, float t) {
  40. left = l;
  41. right = r;
  42. bottom = b;
  43. top = t;
  44. }
  45. };
  46. struct RRP_PARTICLEQUAD_VERTEX_INFO {
  47. RRP_PARTICLEQUAD_VERTEX_INFO()
  48. {}
  49. RRP_PARTICLEQUAD_VERTEX_INFO(RRP_PARTICLEQUAD_BORDER _centerPercentage, cocos2d::Tex2F _bl, cocos2d::Tex2F _br, cocos2d::Tex2F _tl, cocos2d::Tex2F _tr)
  50. : centerPercentage(_centerPercentage)
  51. , bl(_bl)
  52. , br(_br)
  53. , tl(_tl)
  54. , tr(_tr)
  55. {}
  56. static RRP_PARTICLEQUAD_VERTEX_INFO Create(cocos2d::Texture2D *_texture, const cocos2d::Rect& pointRect, bool isRotaed, const cocos2d::Vec2& offset, const cocos2d::Vec2& originalSize);
  57. // -------------
  58. // | t% |
  59. // | --- |
  60. // | l% | · | r% |
  61. // | --- |
  62. // | b% |
  63. // -------------
  64. RRP_PARTICLEQUAD_BORDER centerPercentage; // 以中心点为原点,四个方向边占原边的比值 0~1
  65. cocos2d::Tex2F bl;
  66. cocos2d::Tex2F br;
  67. cocos2d::Tex2F tl;
  68. cocos2d::Tex2F tr;
  69. };
  70. struct ParticleSystemEmissionState
  71. {
  72. ParticleSystemEmissionState() { Clear(); }
  73. inline void Clear()
  74. {
  75. m_ToEmitAccumulator = 0.0f;
  76. m_ParticleSpacing = 0.0f;
  77. }
  78. float m_ParticleSpacing;
  79. float m_ToEmitAccumulator;
  80. };
  81. struct ParticleSystemEmissionData
  82. {
  83. enum { kMaxNumBursts = 4 };
  84. int type;
  85. MinMaxCurve rate;
  86. float burstTime[kMaxNumBursts];
  87. UInt16 burstParticleCount[kMaxNumBursts];
  88. UInt8 burstCount;
  89. };
  90. struct ParticleSystemSubEmitterData
  91. {
  92. ParticleSystemSubEmitterData()
  93. :maxLifetime(0.0f)
  94. ,startDelayInSec(0.0f)
  95. ,lengthInSec(0.0f)
  96. ,properties(0)
  97. {}
  98. ParticleSystemEmissionData emissionData;
  99. float maxLifetime;
  100. float startDelayInSec;
  101. float lengthInSec;
  102. int properties;
  103. RParticleSystem* emitter;
  104. };
  105. // @TODO: Find "pretty" place for shared structs and enums?
  106. struct ParticleSystemEmitReplay
  107. {
  108. float t;
  109. float aliveTime;
  110. float emissionOffset;
  111. float emissionGap;
  112. int particlesToEmit;
  113. size_t numContinuous;
  114. UInt32 randomSeed;
  115. ParticleSystemEmitReplay (float inT, int inParticlesToEmit, float inEmissionOffset, float inEmissionGap, size_t inNumContinuous, UInt32 inRandomSeed)
  116. : t (inT), particlesToEmit (inParticlesToEmit), aliveTime(0.0F), emissionOffset(inEmissionOffset), emissionGap(inEmissionGap), numContinuous(inNumContinuous), randomSeed(inRandomSeed)
  117. {}
  118. };
  119. struct SubEmitterInheritValues
  120. {
  121. SubEmitterInheritValues()
  122. : color(255, 255, 255, 255)
  123. //, size(1.0f, 1.0f, 1.0f)
  124. //, rotation(0.0f, 0.0f, 0.0f)
  125. , size(1.0f)
  126. , rotation(0.0f)
  127. , axisOfRotation(Vector3f::UNIT_Z)
  128. , lifetimeMultiplier(1.0f)
  129. , normalizedT(std::numeric_limits<float>::infinity ())
  130. , randomSeed(0)
  131. {}
  132. ColorRGBA32 color;
  133. //Vector3f size;
  134. //Vector3f rotation;
  135. float size;
  136. float rotation;
  137. Vector3f axisOfRotation;
  138. float lifetimeMultiplier;
  139. float normalizedT;
  140. UInt32 randomSeed;
  141. };
  142. struct SubEmitterEmitCommand
  143. {
  144. SubEmitterEmitCommand(ParticleSystemEmissionState inEmissionState, Vector3f inPosition, Vector3f inVelocity, const SubEmitterInheritValues& inInheritValues, ParticleSystemSubType inSubEmitterType, int inSubEmitterIndex, int inParticlesToEmit, int inParticlesToEmitContinuous, float inParentT, float inDeltaTime)
  145. :emissionState(inEmissionState)
  146. ,position(inPosition)
  147. ,velocity(inVelocity)
  148. ,inheritValues(inInheritValues)
  149. ,subEmitterType(inSubEmitterType)
  150. ,subEmitterIndex(inSubEmitterIndex)
  151. ,particlesToEmit(inParticlesToEmit)
  152. ,particlesToEmitContinuous(inParticlesToEmitContinuous)
  153. ,deltaTime(inDeltaTime)
  154. ,parentT(inParentT)
  155. ,timeAlive(0.0f)
  156. {
  157. }
  158. ParticleSystemEmissionState emissionState;
  159. Vector3f position;
  160. Vector3f velocity;
  161. SubEmitterInheritValues inheritValues;
  162. ParticleSystemSubType subEmitterType;
  163. int subEmitterIndex;
  164. int particlesToEmit;
  165. int particlesToEmitContinuous;
  166. float deltaTime;
  167. float parentT; // Used for StartModules
  168. float timeAlive;
  169. };
  170. struct ParticleSystemSubEmitCmdBuffer
  171. {
  172. ParticleSystemSubEmitCmdBuffer()
  173. :commands(0)
  174. ,commandCount(0)
  175. ,maxCommandCount(0)
  176. {}
  177. inline void AddCommand(const ParticleSystemEmissionState& emissionState, const Vector3f& initialPosition, const Vector3f& initialVelocity, const SubEmitterInheritValues& initiaValues, const ParticleSystemSubType type, const int index, const int particlesToEmit, const int particlesToEmitContinuous, const float parentT, const float dt)
  178. {
  179. commands[commandCount++] = SubEmitterEmitCommand(emissionState, initialPosition, initialVelocity, initiaValues, type, index, particlesToEmit, particlesToEmitContinuous, parentT, dt);
  180. }
  181. inline bool IsFull() { return commandCount >= maxCommandCount; }
  182. SubEmitterEmitCommand* commands;
  183. int commandCount;
  184. int maxCommandCount; // Mostly to assert/test against trashing memory
  185. };
  186. struct ParticleSystemExternalCachedForce
  187. {
  188. Vector3f position;
  189. Vector3f direction;
  190. int forceType;
  191. float radius;
  192. float forceMain;
  193. float forceTurbulence; // not yet implemented
  194. };
  195. // @TODO: Maybe there's a better name for this? ParticleSystemSerializedState? Some shit like that :)
  196. struct ParticleSystemReadOnlyState
  197. {
  198. ParticleSystemReadOnlyState();
  199. void CheckConsistency();
  200. float lengthInSec;
  201. float startDelay;
  202. float speed;
  203. UInt32 randomSeed;
  204. bool looping;
  205. bool prewarm;
  206. int scalingMode;
  207. bool playOnAwake;
  208. bool useLocalSpace;
  209. float scale;
  210. float GetRenderScale() const;
  211. template<class TransferFunction>
  212. void Transfer (TransferFunction& transfer);
  213. };
  214. struct ParticleSystemState
  215. {
  216. RParticleSystem* system;
  217. // state
  218. float accumulatedDt;
  219. float delayT;
  220. bool playing;
  221. bool needRestart;
  222. bool stopEmitting;
  223. size_t rayBudget;
  224. size_t nextParticleToTrace;
  225. bool GetIsSubEmitter() const { return isSubEmitter; }
  226. private:
  227. // When setting this we need to ensure some other things happen as well
  228. bool isSubEmitter;
  229. public:
  230. bool recordSubEmits;
  231. // Procedural mode / culling
  232. bool supportsProcedural; // With the current parameter set, does the emitter support procedural mode?
  233. bool invalidateProcedural; // This is set if anything changes from script at some point when running a system
  234. bool culled; // Is particle system currently culled?
  235. double cullTime; // Absolute time, so we need as double in case it runs for ages
  236. int numLoops; // Number of loops executed
  237. // per-frame
  238. Matrix4x4f localToWorld;
  239. Matrix4x4f worldToLocal;
  240. Vector3f emitterVelocity;
  241. Vector3f emitterScale;
  242. MinMaxAABB minMaxAABB;
  243. float maxSize; // Maximum size of particles due to setting from script
  244. float t;
  245. // Temp alloc stuff
  246. ParticleSystemSubEmitterData* cachedSubDataBirth;
  247. size_t numCachedSubDataBirth;
  248. ParticleSystemSubEmitterData* cachedSubDataCollision;
  249. size_t numCachedSubDataCollision;
  250. ParticleSystemSubEmitterData* cachedSubDataDeath;
  251. size_t numCachedSubDataDeath;
  252. ParticleSystemExternalCachedForce* cachedForces;
  253. size_t numCachedForces;
  254. cocos2d::Plane* cachedCollisionPlanes;
  255. size_t numCachedCollisionPlanes;
  256. ParticleSystemSubEmitCmdBuffer subEmitterCommandBuffer;
  257. dynamic_array<ParticleSystemEmitReplay> emitReplay;
  258. ParticleSystemEmissionState emissionState;
  259. ParticleSystemState (RParticleSystem* system_);
  260. void Tick (const ParticleSystemReadOnlyState& constState, float dt);
  261. void ClearSubEmitterCommandBuffer();
  262. void SetIsSubEmitter(bool inIsSubEmitter)
  263. {
  264. if(inIsSubEmitter)
  265. {
  266. stopEmitting = true;
  267. invalidateProcedural = true;
  268. }
  269. isSubEmitter = inIsSubEmitter;
  270. }
  271. template<class TransferFunction>
  272. void Transfer (TransferFunction& transfer);
  273. };
  274. class CC_DLL ParticleSystemModule//: public cocos2d::Ref
  275. {
  276. public:
  277. // DECLARE_SERIALIZE (ParticleSystemModule)
  278. template<class TransferFunction>
  279. void Transfer (TransferFunction& transfer);
  280. ParticleSystemModule (bool enabled) : m_Enabled (enabled) {}
  281. virtual ~ParticleSystemModule () {}
  282. inline bool GetEnabled() const { return m_Enabled; }
  283. inline void SetEnabled(bool enabled) { m_Enabled = enabled; }
  284. private:
  285. // shared data
  286. bool m_Enabled;
  287. };
  288. NS_RRP_END
  289. #endif /* ParticleSystemModule_h */