1 #pragma once
2 
3 #ifndef PARTICLES_CONTAINER
4 #define PARTICLES_CONTAINER
5 
6 #include "tsmartpointer.h"
7 #include "trenderresourcemanager.h"
8 #include "trandom.h"
9 #include "particles.h"
10 
11 #include <QThreadStorage>
12 #include <QMutex>
13 
14 //-----------------------------------------------------------------------
15 
16 //  Forward declarations
17 class Particle;
18 class TRandom;
19 
20 //-----------------------------------------------------------------------
21 
22 class ParticlesManager final : public TRenderResourceManager {
23   T_RENDER_RESOURCE_MANAGER
24 
25 public:
26   struct FxData;
27 
28   struct FrameData {
29     FxData *m_fxData;
30     double m_frame;
31     TRandom m_random;
32     std::list<Particle> m_particles;
33     bool m_calculated;
34     int m_maxTrail;
35     int m_totalParticles;
36 
37     FrameData(FxData *fxData);
38     ~FrameData();
39 
40     void buildMaxTrail();
41     void clear();
42   };
43 
44   struct FxData final : public TSmartObject {
45     DECLARE_CLASS_CODE
46 
47     QThreadStorage<FrameData *> m_frames;
48 
49     FxData();
50   };
51 
52 public:
53   ParticlesManager();
54   ~ParticlesManager();
55 
56   static ParticlesManager *instance();
57 
58   FrameData *data(unsigned long fxId);
59 
60 private:
61   std::map<unsigned long, FxData *> m_fxs;
62   QMutex m_mutex;
63 
64   int m_renderStatus;
65 
66   void onRenderStatusStart(int renderStatus) override;
67 };
68 
69 #endif
70