RParticleSystem.h 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607
  1. //
  2. // RParticleSystem.h
  3. // cocos2d_libs
  4. //
  5. // Created by 徐俊杰 on 2020/4/25.
  6. //
  7. #ifndef RParticleSystem_h
  8. #define RParticleSystem_h
  9. //#include "cocos2d.h"
  10. #include "rparticle/Macros/RParticleMacros.h"
  11. #include "base/CCDirector.h"
  12. #include "rparticle/Modules/ParticleSystemModule.h"
  13. #include "rparticle/ParticleSystemParticle.h"
  14. #include "rparticle/Modules/EmissionModule.h"
  15. #include "rparticle/Modules/InitialModule.h"
  16. #include "rparticle/Modules/ShapeModule.h"
  17. #include "renderer/CCCustomCommand.h"
  18. #include "renderer/CCQuadCommand.h"
  19. #include "renderer/CCMaterial.h"
  20. #include "base/CCRefPtr.h"
  21. #include "2d/IEditorNodeLoadListener.h"
  22. #include "rparticle/Datas/EditorDatas.h"
  23. #if REDREAM_EDITOR
  24. namespace cocos2d {
  25. class DrawNode3D;
  26. }
  27. #endif
  28. NS_RRP_BEGIN
  29. //注意:传入时间(无),Render,Transform 这3个相关的操作可能会有问题,还需要验证。
  30. //todo :碰撞
  31. class ParticleSystemRenderer;
  32. class RParticleSystem;
  33. class CollisionModule;
  34. class RotationModule;
  35. class RotationBySpeedModule;
  36. class SubModule;
  37. class SubEmitterModule;
  38. class ExternalForcesModule;
  39. class VelocityModule;
  40. class ForceModule;
  41. class ClampVelocityModule;
  42. class SizeModule;
  43. class ColorModule;
  44. class UVModule;
  45. class SizeBySpeedModule;
  46. class ColorBySpeedModule;
  47. class CC_DLL RParticleSystem : public cocos2d::Node, public cocos2d::TextureProtocol, public IEditorNodeLoadListener
  48. {
  49. public:
  50. enum
  51. {
  52. kParticleBuffer0,
  53. #if UNITY_EDITOR // Double buffered + interpolation
  54. kParticleBuffer1,
  55. #endif
  56. kNumParticleBuffers,
  57. };
  58. template<class TransferFunction> void Transfer (TransferFunction& transfer);
  59. static RParticleSystem* create();
  60. ~RParticleSystem();
  61. static void SyncJobs();
  62. static void BeginUpdateAll();
  63. static void EndUpdateAll();
  64. static void Emit(RParticleSystem& system, const SubEmitterEmitCommand& command, ParticleSystemEmitMode emitMode);
  65. inline bool IsActive () const
  66. {
  67. // return _bActive;
  68. //TODO: 应该递归判断父节点
  69. return this->isVisible();
  70. }
  71. float GetLengthInSec () const;
  72. ParticleSystemParticles& GetParticles (int index = -1);
  73. size_t GetParticleCount () const;
  74. static size_t EmitFromData (const ParticleSystemReadOnlyState& roState, ParticleSystemEmissionState& emissionState, size_t& numContinuous, const ParticleSystemEmissionData& emissionData, const Vector3f velocity, float fromT, float toT, float dt, float length);
  75. void Stop ();
  76. bool GetLoop () const;
  77. void Play (bool autoPrewarm = true);
  78. void Clear (bool updateBounds = true);
  79. void AwakeFromLoadGroup ();
  80. void PlayGroup ();
  81. void StopGroup ();
  82. void ClearGroup ();
  83. void StopAndClearGroup();
  84. bool IsPlaying () const;
  85. void GetNumTiles(int& uvTilesX, int& uvTilesY) const;
  86. void onEnter() override;
  87. void onExit() override;
  88. virtual void setVisible(bool visible) override;
  89. void onEditorNodeLoaded() { AwakeFromLoad(); }
  90. cocos2d::CustomCommand _command;
  91. cocos2d::QuadCommand _quadCommand;
  92. virtual void draw(cocos2d::Renderer *renderer, const cocos2d::Mat4 &transform, uint32_t flags) override;
  93. void onDraw();
  94. #if REDREAM_EDITOR
  95. cocos2d::DrawNode3D* drawNode = nullptr;
  96. void OnDrawGizmosSelected();
  97. #endif
  98. private:
  99. static void Update0 (RParticleSystem& system, const ParticleSystemReadOnlyState& roState, ParticleSystemState& state, float dt, bool fixedTimeStep);
  100. static void Update1 (RParticleSystem& system, ParticleSystemParticles& ps, float dt, bool fixedTimeStep, bool useProcedural, int rayBudget = 0);
  101. static void Update2 (RParticleSystem& system, const ParticleSystemReadOnlyState& roState, ParticleSystemState& state, bool fixedTimeStep);
  102. static void Update1Incremental(RParticleSystem& system, const ParticleSystemReadOnlyState& roState, ParticleSystemState& state, ParticleSystemParticles& ps, size_t fromIndex, float dt, bool useProcedural);
  103. static void UpdateProcedural(RParticleSystem& system, const ParticleSystemReadOnlyState& roState, ParticleSystemState& state, ParticleSystemParticles& ps);
  104. static void UpdateBounds(const RParticleSystem& system, const ParticleSystemParticles& ps, ParticleSystemState& state);
  105. static void UpdateModulesPreSimulationIncremental (const RParticleSystem& system, const ParticleSystemReadOnlyState& roState, const ParticleSystemState& state, ParticleSystemParticles& ps, const size_t fromIndex, const size_t toIndex, float dt);
  106. static void UpdateModulesIncremental (const RParticleSystem& system, const ParticleSystemReadOnlyState& roState, ParticleSystemState& state, ParticleSystemParticles& ps, size_t fromIndex, float dt);
  107. static void SimulateParticles (const ParticleSystemReadOnlyState& roState, ParticleSystemState& state, ParticleSystemParticles& ps, const size_t fromIndex, float dt);
  108. static void UpdateModulesPostSimulationIncremental (const RParticleSystem& system, const ParticleSystemReadOnlyState& roState, ParticleSystemState& state, ParticleSystemParticles& ps, const size_t fromIndex, float dt);
  109. static void UpdateModulesNonIncremental (const RParticleSystem& system, const ParticleSystemParticles& ps, ParticleSystemParticlesTempData& psTemp, int fromIndex, int toIndex);
  110. static size_t EmitFromModules (const RParticleSystem& system, const ParticleSystemReadOnlyState& roState, ParticleSystemEmissionState& emissionState, size_t& numContinuous, const Vector3f velocity, float fromT, float toT, float dt);
  111. static void StartModules (RParticleSystem& system, const ParticleSystemReadOnlyState& roState, ParticleSystemState& state, const ParticleSystemEmissionState& emissionState, Vector3f initialVelocity, const Matrix4x4f& matrix, ParticleSystemParticles& ps, size_t fromIndex, float dt, float t, size_t numContinuous, float frameOffset);
  112. static void StartParticles(RParticleSystem& system, ParticleSystemParticles& ps, const float prevT, const float t, const float dt, const size_t numContinuous, size_t amountOfParticlesToEmit, float frameOffset);
  113. static void StartParticlesProcedural(RParticleSystem& system, ParticleSystemParticles& ps, const float prevT, const float t, const float dt, const size_t numContinuous, size_t amountOfParticlesToEmit, float frameOffset);
  114. static void AddStagingBuffer(RParticleSystem& system);
  115. static int SetupSubEmitters(RParticleSystem& shuriken, ParticleSystemState& state);
  116. static bool CheckSupportsProcedural(const RParticleSystem& system);
  117. static void PlaybackSubEmitterCommandBuffer(const RParticleSystem& shuriken, ParticleSystemState& state, bool fixedTimeStep);
  118. bool GetIsDistanceEmitter() const;
  119. size_t AddNewParticles(ParticleSystemParticles& particles, size_t newParticles) const;
  120. size_t LimitParticleCount(size_t requestSize) const;
  121. void KeepUpdating();
  122. void SetUsesAxisOfRotation();
  123. void Cull();
  124. private:
  125. RParticleSystem();
  126. bool init() override;
  127. void AwakeFromLoad();
  128. RParticleSystem* FindGroupRoot();
  129. void AwakeFromLoadTree();
  130. void PlayTree();
  131. void StopTree();
  132. void ClearTree();
  133. void StopAndClearTree();
  134. //void WalkTree(std::function<void(RParticleSystem*)> func);
  135. void AddToManager();
  136. void RemoveFromManager();
  137. void SetUsesRotationalSpeed();
  138. void SetUsesEmitAccumulator(int numAccumulators);
  139. /** initializes the texture with a rectangle measured Points */
  140. void initTexCoordsWithRect(const cocos2d::Rect& rect, bool isrotaed, const cocos2d::Vec2& offset, const cocos2d::Vec2& originalSize);
  141. void setTextureInternal(cocos2d::Texture2D* spriteFrame);
  142. void setTextureWithRect(cocos2d::Texture2D* texture, const cocos2d::Rect& rect, bool isRotated, const cocos2d::Vec2& offset, const cocos2d::Vec2 &originalSize);
  143. void TransferMinMaxCurveToData(const MinMaxCurve& curve, MinMaxCurveData &data) const;
  144. void TransferMinMaxCurveFromData(MinMaxCurve& curve, const MinMaxCurveData &data);
  145. void TransferMinMaxGradientToData(const MinMaxGradient& gradient, MinMaxGradientData &data) const;
  146. void TransferMinMaxGradientFromData(MinMaxGradient& gradient, const MinMaxGradientData &data);
  147. void TransferEmissionToData(const ParticleSystemEmissionData& emission, EmissionData &data) const;
  148. void TransferEmissionFromData(ParticleSystemEmissionData& emission, const EmissionData& data);
  149. public:
  150. const ColorModule* GetColorModule() const { return m_ColorModule; }
  151. const ColorBySpeedModule* GetColorBySpeedModule() const { return m_ColorBySpeedModule; }
  152. const SizeModule* GetSizeModule() const { return m_SizeModule; }
  153. const SizeBySpeedModule* GetSizeBySpeedModule() const { return m_SizeBySpeedModule; }
  154. // Getters Setters for Editor
  155. // m_ReadOnlyState
  156. void setLengthInSec(float value) { m_ReadOnlyState->lengthInSec = value; }
  157. float getLengthInSec() const { return m_ReadOnlyState->lengthInSec; }
  158. void setStartDelay(float value) { m_ReadOnlyState->startDelay = value; }
  159. float getStartDelay() const { return m_ReadOnlyState->startDelay; }
  160. void setSpeed(float value) { m_ReadOnlyState->speed = value; }
  161. float getSpeed() const { return m_ReadOnlyState->speed; }
  162. void setRandomSeed(UInt32 value) { m_ReadOnlyState->randomSeed = value; }
  163. UInt32 getRandomSeed() const { return m_ReadOnlyState->randomSeed; }
  164. void setLooping(bool value) { m_ReadOnlyState->looping = value; }
  165. bool getLooping() const { return m_ReadOnlyState->looping; }
  166. void setPrewarm(bool value) { m_ReadOnlyState->prewarm = value; }
  167. bool getPrewarm() const { return m_ReadOnlyState->prewarm; }
  168. void setScalingMode(int value) { m_ReadOnlyState->scalingMode = value; }
  169. int getScalingMode() const { return m_ReadOnlyState->scalingMode; }
  170. void setPlayOnAwake(bool value) { m_ReadOnlyState->playOnAwake = value; }
  171. bool getPlayOnAwake() const { return m_ReadOnlyState->playOnAwake; }
  172. void setUseLocalSpace(bool value) { m_ReadOnlyState->useLocalSpace = value; }
  173. bool getUseLocalSpace() const { return m_ReadOnlyState->useLocalSpace; }
  174. // m_InitialModule
  175. // void setInitialModuleEnabled(bool value) { m_InitialModule.SetEnabled(value); }
  176. // bool getInitialModuleEnabled() const { return m_InitialModule.GetEnabled(); }
  177. void setInitialModuleLifetime(const MinMaxCurveData& value) {
  178. TransferMinMaxCurveFromData(m_InitialModule.GetLifeTimeCurve(), value);
  179. }
  180. MinMaxCurveData getInitialModuleLifetime() const {
  181. MinMaxCurveData data;
  182. TransferMinMaxCurveToData(m_InitialModule.GetLifeTimeCurve(), data);
  183. return data;
  184. }
  185. void setInitialModuleSpeed(const MinMaxCurveData& value) {
  186. TransferMinMaxCurveFromData(m_InitialModule.GetSpeedCurve(), value);
  187. }
  188. MinMaxCurveData getInitialModuleSpeed() const {
  189. MinMaxCurveData data;
  190. TransferMinMaxCurveToData(m_InitialModule.GetSpeedCurve(), data);
  191. return data;
  192. }
  193. void setInitialModuleColor(const MinMaxGradientData& value) {
  194. TransferMinMaxGradientFromData(m_InitialModule.GetColor(), value);
  195. }
  196. MinMaxGradientData getInitialModuleColor() const {
  197. MinMaxGradientData data;
  198. TransferMinMaxGradientToData(m_InitialModule.GetColor(), data);
  199. return data;
  200. }
  201. void setInitialModuleSize(const MinMaxCurveData& value) {
  202. TransferMinMaxCurveFromData(m_InitialModule.GetSizeCurve(), value);
  203. }
  204. MinMaxCurveData getInitialModuleSize() const {
  205. MinMaxCurveData data;
  206. TransferMinMaxCurveToData(m_InitialModule.GetSizeCurve(), data);
  207. return data;
  208. }
  209. void setInitialModuleRotation(const MinMaxCurveData& value) {
  210. TransferMinMaxCurveFromData(m_InitialModule.GetRotationCurve(), value);
  211. }
  212. MinMaxCurveData getInitialModuleRotation() const {
  213. MinMaxCurveData data;
  214. TransferMinMaxCurveToData(m_InitialModule.GetRotationCurve(), data);
  215. return data;
  216. }
  217. void setInitialModuleGravityModifier(float value) { m_InitialModule.SetGravityModifier(value); }
  218. float getInitialModuleGravityModifier() const { return m_InitialModule.GetGravityModifier(); }
  219. void setInitialModuleInheritVelocity(float value) { m_InitialModule.SetInheritVelocity(value); }
  220. float getInitialModuleInheritVelocity() const { return m_InitialModule.GetInheritVelocity(); }
  221. void setInitialModuleMaxNumParticles(int value) { m_InitialModule.SetMaxNumParticles(value); }
  222. int getInitialModuleMaxNumParticles() const { return m_InitialModule.GetMaxNumParticles(); }
  223. // m_EmissionModule
  224. void setEmissionModuleEnabled(bool value) { m_EmissionModule.SetEnabled(value); }
  225. bool getEmissionModuleEnabled() const { return m_EmissionModule.GetEnabled(); }
  226. void setEmissionModuleType(int value) { m_EmissionModule.GetEmissionData().type = value; }
  227. int getEmissionModuleType() const { return m_EmissionModule.GetEmissionData().type; }
  228. void setEmissionModuleRate(const MinMaxCurveData& value) {
  229. TransferMinMaxCurveFromData(m_EmissionModule.GetEmissionData().rate, value);
  230. }
  231. MinMaxCurveData getEmissionModuleRate() const {
  232. MinMaxCurveData data;
  233. TransferMinMaxCurveToData(m_EmissionModule.GetEmissionData().rate, data);
  234. return data;
  235. }
  236. /*
  237. void setEmissionModuleBurstTime0(float value) { m_EmissionModule.GetEmissionData().burstTime[0] = value; }
  238. float getEmissionModuleBurstTime0() const { return m_EmissionModule.GetEmissionData().burstTime[0]; }
  239. void setEmissionModuleBurstTime1(float value) { m_EmissionModule.GetEmissionData().burstTime[1] = value; }
  240. float getEmissionModuleBurstTime1() const { return m_EmissionModule.GetEmissionData().burstTime[1]; }
  241. void setEmissionModuleBurstTime2(float value) { m_EmissionModule.GetEmissionData().burstTime[2] = value; }
  242. float getEmissionModuleBurstTime2() const { return m_EmissionModule.GetEmissionData().burstTime[2]; }
  243. void setEmissionModuleBurstTime3(float value) { m_EmissionModule.GetEmissionData().burstTime[3] = value; }
  244. float getEmissionModuleBurstTime3() const { return m_EmissionModule.GetEmissionData().burstTime[3]; }
  245. void setEmissionModuleBurstParticleCount0(UInt16 value) { m_EmissionModule.GetEmissionData().burstParticleCount[0] = value; }
  246. UInt16 getEmissionModuleBurstParticleCount0() const { return m_EmissionModule.GetEmissionData().burstParticleCount[0]; }
  247. void setEmissionModuleBurstParticleCount1(UInt16 value) { m_EmissionModule.GetEmissionData().burstParticleCount[1] = value; }
  248. UInt16 getEmissionModuleBurstParticleCount1() const { return m_EmissionModule.GetEmissionData().burstParticleCount[1]; }
  249. void setEmissionModuleBurstParticleCount2(UInt16 value) { m_EmissionModule.GetEmissionData().burstParticleCount[2] = value; }
  250. UInt16 getEmissionModuleBurstParticleCount2() const { return m_EmissionModule.GetEmissionData().burstParticleCount[2]; }
  251. void setEmissionModuleBurstParticleCount3(UInt16 value) { m_EmissionModule.GetEmissionData().burstParticleCount[3] = value; }
  252. UInt16 getEmissionModuleBurstParticleCount3() const { return m_EmissionModule.GetEmissionData().burstParticleCount[3]; }
  253. void setEmissionModuleBurstCount(UInt8 value) { m_EmissionModule.GetEmissionData().burstCount = value; }
  254. UInt8 getEmissionModuleBurstCount() const { return m_EmissionModule.GetEmissionData().burstCount; }
  255. */
  256. void setEmissionModuleBurstData(const EmissionData& value);
  257. EmissionData getEmissionModuleBurstData() const {
  258. EmissionData data;
  259. TransferEmissionToData(m_EmissionModule.GetEmissionData(), data);
  260. return data;
  261. }
  262. // m_ShapeModule
  263. void setShapeModuleEnabled(bool value) { m_ShapeModule.SetEnabled(value); }
  264. bool getShapeModuleEnabled() const { return m_ShapeModule.GetEnabled(); }
  265. void setShapeModuleType(int value) { m_ShapeModule.SetType(value); }
  266. int getShapeModuleType() const { return m_ShapeModule.GetType(); }
  267. void setShapeModuleRadius(float value) { m_ShapeModule.SetRadius(value); }
  268. float getShapeModuleRadius() const { return m_ShapeModule.GetRadius(); }
  269. void setShapeModuleRadiusThickness(float value) { m_ShapeModule.SetRadiusThickness(value); }
  270. float getShapeModuleRadiusThickness() const { return m_ShapeModule.GetRadiusThickness(); }
  271. void setShapeModuleAngle(float value) { m_ShapeModule.SetAngle(value); }
  272. float getShapeModuleAngle() const { return m_ShapeModule.GetAngle(); }
  273. void setShapeModuleLength(float value) { m_ShapeModule.SetLength(value); }
  274. float getShapeModuleLength() const { return m_ShapeModule.GetLength(); }
  275. void setShapeModuleArc(float value) { m_ShapeModule.SetArc(value); }
  276. float getShapeModuleArc() const { return m_ShapeModule.GetArc(); }
  277. void setShapeModuleBurstSpread(bool value) { m_ShapeModule.SetBurstSpread(value); }
  278. bool getShapeModuleBurstSpread() const { return m_ShapeModule.GetBurstSpread(); }
  279. void setShapeModuleSpreadSpaceThickness(float value) { m_ShapeModule.SetSpreadSpaceThickness(value); }
  280. float getShapeModuleSpreadSpaceThickness() const { return m_ShapeModule.GetSpreadSpaceThickness(); }
  281. void setShapeModuleBoxX(float value) { m_ShapeModule.SetBoxX(value); }
  282. float getShapeModuleBoxX() const { return m_ShapeModule.GetBoxX(); }
  283. void setShapeModuleBoxY(float value) { m_ShapeModule.SetBoxY(value); }
  284. float getShapeModuleBoxY() const { return m_ShapeModule.GetBoxY(); }
  285. void setShapeModuleBoxZ(float value) { m_ShapeModule.SetBoxZ(value); }
  286. float getShapeModuleBoxZ() const { return m_ShapeModule.GetBoxZ(); }
  287. void setShapeModuleRandomDirection(bool value) { m_ShapeModule.SetRandomDirection(value); }
  288. bool getShapeModuleRandomDirection() const { return m_ShapeModule.GetRandomDirection(); }
  289. // m_RotationModule
  290. void setRotationModuleEnabled(bool value);
  291. bool getRotationModuleEnabled() const;
  292. void setRotationModuleRate(const MinMaxCurveData& value);
  293. MinMaxCurveData getRotationModuleRate() const;
  294. // m_CollisionModule
  295. // m_SubModule
  296. /*
  297. void setSubModuleEnabled(bool value);
  298. bool getSubModuleEnabled() const;
  299. void setSubModuleEmittersBirthID0(int value);
  300. int getSubModuleEmittersBirthID0() const;
  301. void setSubModuleEmittersBirthID1(int value);
  302. int getSubModuleEmittersBirthID1() const;
  303. void setSubModuleEmittersCollisionID0(int value);
  304. int getSubModuleEmittersCollisionID0() const;
  305. void setSubModuleEmittersCollisionID1(int value);
  306. int getSubModuleEmittersCollisionID1() const;
  307. void setSubModuleEmittersDeathID0(int value);
  308. int getSubModuleEmittersDeathID0() const;
  309. void setSubModuleEmittersDeathID1(int value);
  310. int getSubModuleEmittersDeathID1() const;
  311. */
  312. // m_SubEmitterModule
  313. void setSubEmitterModuleEnabled(bool value);
  314. bool getSubEmitterModuleEnabled() const;
  315. void setSubEmitterModuleSubEmitterType(int value);
  316. int getSubEmitterModuleSubEmitterType() const;
  317. bool getSubEmitterModuleInheritColor() const;
  318. void setSubEmitterModuleInheritColor(bool value);
  319. bool getSubEmitterModuleInheritSize() const;
  320. void setSubEmitterModuleInheritSize(bool value);
  321. bool getSubEmitterModuleInheritRotation() const;
  322. void setSubEmitterModuleInheritRotation(bool value);
  323. bool getSubEmitterModuleInheritLifetime() const;
  324. void setSubEmitterModuleInheritLifetime(bool value);
  325. bool getSubEmitterModuleInheritDuration() const;
  326. void setSubEmitterModuleInheritDuration(bool value);
  327. // m_ExternalForcesModule
  328. void setExternalForcesModuleEnabled(bool value);
  329. bool getExternalForcesModuleEnabled() const;
  330. void setExternalForcesModuleMultiplier(float value);
  331. float getExternalForcesModuleMultiplier() const;
  332. // m_RotationBySpeedModule
  333. void setRotationBySpeedModuleEnabled(bool value);
  334. bool getRotationBySpeedModuleEnabled() const;
  335. void setRotationBySpeedModuleCurve(const MinMaxCurveData& value);
  336. MinMaxCurveData getRotationBySpeedModuleCurve() const;
  337. void setRotationBySpeedModuleRange(const Vector2f& value);
  338. const Vector2f& getRotationBySpeedModuleRange() const;
  339. // m_VelocityModule
  340. void setVelocityModuleEnabled(bool value);
  341. bool getVelocityModuleEnabled() const;
  342. void setVelocityModuleXCurve(const MinMaxCurveData& value);
  343. MinMaxCurveData getVelocityModuleXCurve() const;
  344. void setVelocityModuleYCurve(const MinMaxCurveData& value);
  345. MinMaxCurveData getVelocityModuleYCurve() const;
  346. void setVelocityModuleZCurve(const MinMaxCurveData& value);
  347. MinMaxCurveData getVelocityModuleZCurve() const;
  348. void setVelocityModuleInWorldSpace(bool value);
  349. bool getVelocityModuleInWorldSpace() const;
  350. // m_ForceModule
  351. void setForceModuleEnabled(bool value);
  352. bool getForceModuleEnabled() const;
  353. void setForceModuleXCurve(const MinMaxCurveData& value);
  354. MinMaxCurveData getForceModuleXCurve() const;
  355. void setForceModuleYCurve(const MinMaxCurveData& value);
  356. MinMaxCurveData getForceModuleYCurve() const;
  357. void setForceModuleZCurve(const MinMaxCurveData& value);
  358. MinMaxCurveData getForceModuleZCurve() const;
  359. void setForceModuleInWorldSpace(bool value);
  360. bool getForceModuleInWorldSpace() const;
  361. void setForceModuleRandomizePerFrame(bool value);
  362. bool getForceModuleRandomizePerFrame() const;
  363. // m_ClampVelocityModule
  364. void setClampVelocityModuleEnabled(bool value);
  365. bool getClampVelocityModuleEnabled() const;
  366. void setClampVelocityModuleXCurve(const MinMaxCurveData& value);
  367. MinMaxCurveData getClampVelocityModuleXCurve() const;
  368. void setClampVelocityModuleYCurve(const MinMaxCurveData& value);
  369. MinMaxCurveData getClampVelocityModuleYCurve() const;
  370. void setClampVelocityModuleZCurve(const MinMaxCurveData& value);
  371. MinMaxCurveData getClampVelocityModuleZCurve() const;
  372. void setClampVelocityModuleMagnitude(const MinMaxCurveData& value);
  373. MinMaxCurveData getClampVelocityModuleMagnitude() const;
  374. void setClampVelocityModuleDrag(const MinMaxCurveData& value);
  375. MinMaxCurveData getClampVelocityModuleDrag() const;
  376. void setClampVelocityModuleInWorldSpace(bool value);
  377. bool getClampVelocityModuleInWorldSpace() const;
  378. void setClampVelocityModuleSeparateAxis(bool value);
  379. bool getClampVelocityModuleSeparateAxis() const;
  380. void setClampVelocityModuleMultiplyDragByParticleSize(bool value);
  381. bool getClampVelocityModuleMultiplyDragByParticleSize() const;
  382. void setClampVelocityModuleMultiplyDragByParticleVelocity(bool value);
  383. bool getClampVelocityModuleMultiplyDragByParticleVelocity() const;
  384. void setClampVelocityModuleDampen(float value);
  385. float getClampVelocityModuleDampen() const;
  386. // m_SizeModule
  387. void setSizeModuleEnabled(bool value);
  388. bool getSizeModuleEnabled() const;
  389. void setSizeModuleCurve(const MinMaxCurveData& value);
  390. MinMaxCurveData getSizeModuleCurve() const;
  391. // m_ColorModule
  392. void setColorModuleEnabled(bool value);
  393. bool getColorModuleEnabled() const;
  394. void setColorModuleGradient(const MinMaxGradientData& value);
  395. MinMaxGradientData getColorModuleGradient() const;
  396. // m_UVModule
  397. void setUVModuleEnabled(bool value);
  398. bool getUVModuleEnabled() const;
  399. void setUVModuleCurve(const MinMaxCurveData& value);
  400. MinMaxCurveData getUVModuleCurve() const;
  401. void setUVModuleTilesX(int value);
  402. int getUVModuleTilesX() const;
  403. void setUVModuleTilesY(int value);
  404. int getUVModuleTilesY() const;
  405. void setUVModuleAnimationType(int value);
  406. int getUVModuleAnimationType() const;
  407. void setUVModuleRowIndex(int value);
  408. int getUVModuleRowIndex() const;
  409. void setUVModuleCycles(float value);
  410. float getUVModuleCycles() const;
  411. void setUVModuleRandomRow(bool value);
  412. bool getUVModuleRandomRow() const;
  413. void setUVModuleMode(int value);
  414. int getUVModuleMode() const;
  415. void setUVModuleFrameNamePrefix(const std::string& value);
  416. const std::string& getUVModuleFrameNamePrefix() const;
  417. void setUVModuleFrameStartIndex(int value);
  418. int getUVModuleFrameStartIndex() const;
  419. void setUVModuleFrameEndIndex(int value);
  420. int getUVModuleFrameEndIndex() const;
  421. void setUVModuleFrameCount(int value);
  422. int getUVModuleFrameCount() const;
  423. // m_SizeBySpeedModule
  424. void setSizeBySpeedModuleEnabled(bool value);
  425. bool getSizeBySpeedModuleEnabled() const;
  426. void setSizeBySpeedModuleCurve(const MinMaxCurveData& value);
  427. MinMaxCurveData getSizeBySpeedModuleCurve() const;
  428. void setSizeBySpeedModuleRange(const Vector2f& value);
  429. const Vector2f& getSizeBySpeedModuleRange() const;
  430. // m_ColorBySpeedModule
  431. void setColorBySpeedModuleEnabled(bool value);
  432. bool getColorBySpeedModuleEnabled() const;
  433. void setColorBySpeedModuleGradient(const MinMaxGradientData& value);
  434. MinMaxGradientData getColorBySpeedModuleGradient() const;
  435. void setColorBySpeedModuleRange(const Vector2f& value);
  436. const Vector2f& getColorBySpeedModuleRange() const;
  437. // m_renderer
  438. void setRendererOrthographic(bool orthographic);
  439. bool getRendererOrthographic() const;
  440. void setRendererScale(float value);
  441. float getRendererScale() const;
  442. void setRendererRenderMode(int value);
  443. int getRendererRenderMode() const;
  444. void setRendererSortMode(int value);
  445. int getRendererSortMode() const;
  446. void setRendererMaxParticleSize(float value);
  447. float getRendererMaxParticleSize() const;
  448. void setRendererCameraVelocityScale(float value);
  449. float getRendererCameraVelocityScale() const;
  450. void setRendererVelocityScale(float value);
  451. float getRendererVelocityScale() const;
  452. void setRendererLengthScale(float value);
  453. float getRendererLengthScale() const;
  454. void setRendererSortingFudge(float value);
  455. float getRendererSortingFudge() const;
  456. void setRendererNormalDirection(float value);
  457. float getRendererNormalDirection() const;
  458. // Material, Texture, Blend
  459. void setUseMaterialFile(bool useMaterialFile) { _useMaterialFile = useMaterialFile; }
  460. bool getUseMaterialFile() const { return _useMaterialFile; }
  461. void setBlendFunc(const cocos2d::BlendFunc &blendFunc) override;
  462. const cocos2d::BlendFunc& getBlendFunc() const override { return _blendFunc; }
  463. void setDisplayFrame(cocos2d::SpriteFrame *spriteFrame);
  464. virtual void setTexture(cocos2d::Texture2D *texture) override;
  465. virtual cocos2d::Texture2D* getTexture() const override { return _texture; }
  466. virtual void updateBlendFunc();
  467. // m_Material
  468. void setMaterial(cocos2d::Material* material) {
  469. m_Material = material;
  470. if (_useMaterialFile && material) {
  471. _isSpriteFrame = false;
  472. //initTexCoordsWithRect(cocos2d::Rect(0, 0, 1, 1), false, Vector2f::ZERO, Vector2f::ONE);
  473. _vertexInfo = RRP_PARTICLEQUAD_VERTEX_INFO(RRP_PARTICLEQUAD_BORDER(), cocos2d::Tex2F(0, 1), cocos2d::Tex2F(1, 1), cocos2d::Tex2F(0, 0), cocos2d::Tex2F(1, 0));
  474. }
  475. }
  476. void setMaterialFile(const std::string& materialFile) {
  477. _materialFile = materialFile;
  478. auto mat = cocos2d::Material::createWithFilename(_materialFile);
  479. setMaterial(mat);
  480. }
  481. const std::string& getMaterialFile() const {
  482. return _materialFile;
  483. }
  484. void allocMemory(int particleCount);
  485. private:
  486. int m_EmittersIndex;
  487. ParticleSystemParticles m_ParticlesStaging; // staging buffer for emitting into the emitter
  488. ParticleSystemParticles m_Particles[kNumParticleBuffers];
  489. ParticleSystemReadOnlyState* m_ReadOnlyState;
  490. ParticleSystemState* m_State;
  491. InitialModule m_InitialModule;
  492. EmissionModule m_EmissionModule;
  493. ShapeModule m_ShapeModule;
  494. RotationModule* m_RotationModule;
  495. CollisionModule* m_CollisionModule;
  496. SubModule* m_SubModule;
  497. SubEmitterModule* m_SubEmitterModule;
  498. ExternalForcesModule* m_ExternalForcesModule;
  499. RotationBySpeedModule* m_RotationBySpeedModule;
  500. // Dependent on energy value
  501. VelocityModule* m_VelocityModule;
  502. ForceModule* m_ForceModule;
  503. // Depends on velocity and modifies velocity
  504. ClampVelocityModule* m_ClampVelocityModule;
  505. // Dependent on energy value
  506. SizeModule* m_SizeModule;
  507. ColorModule* m_ColorModule;
  508. UVModule* m_UVModule;
  509. // Dependent on velocity value
  510. SizeBySpeedModule* m_SizeBySpeedModule;
  511. ColorBySpeedModule* m_ColorBySpeedModule;
  512. ParticleSystemRenderer* m_renderer;
  513. bool _useMaterialFile;
  514. cocos2d::BlendFunc _blendFunc;
  515. cocos2d::RefPtr<cocos2d::Texture2D> _texture;
  516. cocos2d::RefPtr<cocos2d::Material> m_Material;
  517. std::string _materialFile;
  518. cocos2d::V3F_C4B_T2F_Quad* _quads; // quads to be rendered
  519. int _quadCount;
  520. bool _opacityModifyRGB;
  521. RRP_PARTICLEQUAD_VERTEX_INFO _vertexInfo;
  522. bool _isSpriteFrame;
  523. public:
  524. virtual void update(float dt) override;
  525. friend class ParticleSystemRenderer;
  526. };
  527. NS_RRP_END
  528. #endif /* RParticleSystem_h */