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