Pioneer
Sfx.h
Go to the documentation of this file.
1 // Copyright © 2008-2021 Pioneer Developers. See AUTHORS.txt for details
2 // Licensed under the terms of the GPL v3. See licenses/GPL-3.txt
3 
4 #ifndef _SFX_H
5 #define _SFX_H
6 
7 #include "FrameId.h"
8 #include "graphics/Material.h"
9 #include "JsonFwd.h"
10 
11 #include <deque>
12 
13 class Body;
14 class Frame;
15 
16 namespace Graphics {
17  class Renderer;
18  class RenderState;
19 }
20 
21 enum SFX_TYPE {
25  TYPE_NONE
26 };
27 
28 class Sfx {
29 public:
30  friend class SfxManager;
31  Sfx() = delete;
32  Sfx(const vector3d &pos, const vector3d &vel, const float speed, const SFX_TYPE type);
33  Sfx(const Json &jsonObj);
34  void SetPosition(const vector3d &p);
35  const vector3d &GetPosition() const { return m_pos; }
36 
37  float AgeBlend() const;
38 
39 private:
40  void TimeStepUpdate(const float timeStep);
41  void SaveToJson(Json &jsonObj);
42 
43  vector3d m_pos;
44  vector3d m_vel;
45  float m_age;
46  float m_speed;
47  enum SFX_TYPE m_type;
48 };
49 
50 class SfxManager {
51 public:
52  friend class Sfx;
53 
54  static void Add(const Body *, SFX_TYPE);
55  static void AddExplosion(Body *);
56  static void AddThrustSmoke(const Body *b, float speed, const vector3d &adjustpos);
57  static void TimeStepAll(const float timeStep, FrameId f);
58  static void RenderAll(Graphics::Renderer *r, FrameId f, const FrameId camFrame);
59  static void ToJson(Json &jsonObj, const FrameId f);
60  static void FromJson(const Json &jsonObj, FrameId f);
61 
62  //create shared models
63  static void Init(Graphics::Renderer *r);
64  static void Uninit();
65  static std::unique_ptr<Graphics::Material> damageParticle;
66  static std::unique_ptr<Graphics::Material> ecmParticle;
67  static std::unique_ptr<Graphics::Material> smokeParticle;
68  static std::unique_ptr<Graphics::Material> explosionParticle;
72 
73  SfxManager();
74 
75  size_t GetNumberInstances(const SFX_TYPE t) const { return m_instances[t].size(); }
76  Sfx &GetInstanceByIndex(const SFX_TYPE t, const size_t i) { return m_instances[t][i]; }
77  void AddInstance(Sfx &inst) { return m_instances[inst.m_type].push_back(inst); }
78  void Cleanup();
79 
80 private:
81  // types
82  struct MaterialData {
83  MaterialData() :
84  effect(Graphics::EFFECT_BILLBOARD),
85  num_textures(1),
86  num_imgs_wide(1),
87  coord_downscale(1.0f) {}
88  Graphics::EffectType effect;
89  Uint32 num_textures;
90  int num_imgs_wide;
91  float coord_downscale;
92  };
93 
94  // methods
95  static SfxManager *AllocSfxInFrame(FrameId f);
96  static vector2f CalculateOffset(const enum SFX_TYPE, const Sfx &);
97  static bool SplitMaterialData(const std::string &spec, MaterialData &output);
98 
99  // static members
100  static MaterialData m_materialData[TYPE_NONE];
101 
102  // members
103  // per-frame
104  std::deque<Sfx> m_instances[TYPE_NONE];
105 };
106 
107 #endif /* _SFX_H */
nlohmann::json Json
Definition: Json.h:8
SFX_TYPE
Definition: Sfx.h:21
@ TYPE_NONE
Definition: Sfx.h:25
@ TYPE_DAMAGE
Definition: Sfx.h:23
@ TYPE_SMOKE
Definition: Sfx.h:24
@ TYPE_EXPLOSION
Definition: Sfx.h:22
Definition: Body.h:54
Definition: Frame.h:28
Definition: RenderState.h:25
Definition: Renderer.h:39
Definition: Sfx.h:50
void Cleanup()
Definition: Sfx.cpp:221
static Graphics::RenderState * alphaState
Definition: Sfx.h:69
static void AddThrustSmoke(const Body *b, float speed, const vector3d &adjustpos)
Definition: Sfx.cpp:191
Sfx & GetInstanceByIndex(const SFX_TYPE t, const size_t i)
Definition: Sfx.h:76
static std::unique_ptr< Graphics::Material > explosionParticle
Definition: Sfx.h:68
static void Add(const Body *, SFX_TYPE)
Definition: Sfx.cpp:167
static std::unique_ptr< Graphics::Material > damageParticle
Definition: Sfx.h:65
static void ToJson(Json &jsonObj, const FrameId f)
Definition: Sfx.cpp:122
static Graphics::RenderState * alphaOneState
Definition: Sfx.h:71
void AddInstance(Sfx &inst)
Definition: Sfx.h:77
static void TimeStepAll(const float timeStep, FrameId f)
Definition: Sfx.cpp:200
static Graphics::RenderState * additiveAlphaState
Definition: Sfx.h:70
static void Uninit()
Definition: Sfx.cpp:421
static std::unique_ptr< Graphics::Material > ecmParticle
Definition: Sfx.h:66
static std::unique_ptr< Graphics::Material > smokeParticle
Definition: Sfx.h:67
size_t GetNumberInstances(const SFX_TYPE t) const
Definition: Sfx.h:75
SfxManager()
Definition: Sfx.cpp:115
static void AddExplosion(Body *)
Definition: Sfx.cpp:177
static void RenderAll(Graphics::Renderer *r, FrameId f, const FrameId camFrame)
Definition: Sfx.cpp:237
static void Init(Graphics::Renderer *r)
Definition: Sfx.cpp:361
static void FromJson(const Json &jsonObj, FrameId f)
Definition: Sfx.cpp:143
Definition: Sfx.h:28
float AgeBlend() const
Definition: Sfx.cpp:104
void SetPosition(const vector3d &p)
Definition: Sfx.cpp:79
const vector3d & GetPosition() const
Definition: Sfx.h:35
Sfx()=delete
void SaveToJson(Json &obj)
Definition: Economy.cpp:285
Definition: Background.h:13
EffectType
Definition: Material.h:27
@ EFFECT_BILLBOARD
Definition: Material.h:45
Definition: FrameId.h:9