Luanti 5.11.0-dev
 
Loading...
Searching...
No Matches
particles.h
Go to the documentation of this file.
1// Luanti
2// SPDX-License-Identifier: LGPL-2.1-or-later
3// Copyright (C) 2013 celeron55, Perttu Ahola <celeron55@gmail.com>
4
5#pragma once
6
8#include "irr_ptr.h"
9#include "ISceneNode.h"
10#include "S3DVertex.h"
11#include "SMeshBuffer.h"
12
13#include <mutex>
14#include <vector>
15#include <unordered_map>
16#include "../particles.h"
17
18namespace irr::video {
19 class ITexture;
20}
21
22struct ClientEvent;
23class ParticleManager;
25struct MapNode;
26struct ContentFeatures;
27class LocalPlayer;
28class ITextureSource;
29class IGameDef;
30class Client;
31
33{
34 /* per-spawner structure used to store the ParticleTexture structs
35 * that spawned particles will refer to through ClientParticleTexRef */
37 video::ITexture *ref = nullptr;
38
41};
42
44{
45 /* per-particle structure used to avoid massively duplicating the
46 * fairly large ParticleTexture struct */
47 ParticleTexture *tex = nullptr;
48 video::ITexture *ref = nullptr;
49
51
52 /* constructor used by particles spawned from a spawner */
55
56 /* constructor used for node particles */
57 explicit ClientParticleTexRef(video::ITexture *tp): ref(tp) {};
58};
59
60class ParticleSpawner;
61class ParticleBuffer;
62
64{
65public:
67 const ParticleParameters &p,
68 const ClientParticleTexRef &texture,
69 v2f texpos,
70 v2f texsize,
71 video::SColor color,
72 ParticleSpawner *parent = nullptr,
73 std::unique_ptr<ClientParticleTexture> owned_texture = nullptr
74 );
75
76 ~Particle();
77
79
80 void step(float dtime, ClientEnvironment *env);
81
82 bool isExpired () const
83 { return m_expiration < m_time; }
84
85 ParticleSpawner *getParent() const { return m_parent; }
86
87 const ClientParticleTexRef &getTextureRef() const { return m_texture; }
88
91
92 ParticleBuffer *getBuffer() const { return m_buffer; }
93 bool attachToBuffer(ParticleBuffer *buffer);
94
95private:
96 video::SColor updateLight(ClientEnvironment *env);
97 void updateVertices(ClientEnvironment *env, video::SColor color);
98
100 u16 m_index; // index in m_buffer
101
102 float m_time = 0.0f;
104
105 // Color without lighting
106 video::SColor m_base_color;
107
114
116
117 float m_animation_time = 0.0f;
119
121 // Used if not spawned from a particlespawner
122 std::unique_ptr<ClientParticleTexture> m_owned_texture;
123};
124
126{
127public:
129 const ParticleSpawnerParameters &params,
130 u16 attached_id,
131 std::vector<ClientParticleTexture> &&texpool,
132 ParticleManager *p_manager);
133
134 void step(float dtime, ClientEnvironment *env);
135
136 bool getExpired() const
137 { return p.amount <= 0 && p.time != 0; }
138
139 bool hasActive() const { return m_active != 0; }
140 void decrActive() { m_active -= 1; }
141
142private:
143 void spawnParticle(ClientEnvironment *env, float radius,
144 const core::matrix4 *attached_absolute_pos_rot_matrix);
145
146 size_t m_active;
148 float m_time;
151 std::vector<ClientParticleTexture> m_texpool;
152 std::vector<float> m_spawntimes;
154};
155
156class ParticleBuffer : public scene::ISceneNode
157{
158 friend class ParticleManager;
159public:
160 ParticleBuffer(ClientEnvironment *env, const video::SMaterial &material);
161
162 // for pointer stability
164
165
167 std::optional<u16> allocate();
169 void release(u16 index);
170
172 video::S3DVertex *getVertices(u16 index);
173
174 inline bool isEmpty() const {
175 return m_free_list.size() == m_count;
176 }
177
178 virtual video::SMaterial &getMaterial(u32 num) override {
179 return m_mesh_buffer->getMaterial();
180 }
181 virtual u32 getMaterialCount() const override {
182 return 1;
183 }
184
185 virtual const core::aabbox3df &getBoundingBox() const override;
186
187 virtual void render() override;
188
189 virtual void OnRegisterSceneNode() override;
190
191 // we have 16-bit indices
192 static constexpr u16 MAX_PARTICLES_PER_BUFFER = 16000;
193
194private:
195 irr_ptr<scene::SMeshBuffer> m_mesh_buffer;
196 // unused (e.g. expired) particle indices for re-use
197 std::vector<u16> m_free_list;
198 // for automatic deletion when unused for a while. is reset on allocate().
199 float m_usage_timer = 0;
200 // total count of contained particles
201 u16 m_count = 0;
202 mutable bool m_bounding_box_dirty = true;
203};
204
209{
210 friend class ParticleSpawner;
211public:
215
216 void step (float dtime);
217
219 LocalPlayer *player);
220
221 void addDiggingParticles(IGameDef *gamedef, LocalPlayer *player, v3s16 pos,
222 const MapNode &n, const ContentFeatures &f);
223
224 void addNodeParticle(IGameDef *gamedef, LocalPlayer *player, v3s16 pos,
225 const MapNode &n, const ContentFeatures &f);
226
227 void reserveParticleSpace(size_t max_estimate);
228
237 {
239 }
240
241protected:
242 static bool getNodeParticleParams(const MapNode &n, const ContentFeatures &f,
243 ParticleParameters &p, video::ITexture **texture, v2f &texpos,
244 v2f &texsize, video::SColor *color, u8 tilenum = 0);
245
246 static video::SMaterial getMaterialForParticle(const Particle *texture);
247
248 bool addParticle(std::unique_ptr<Particle> toadd);
249
250private:
251 void addParticleSpawner(u64 id, std::unique_ptr<ParticleSpawner> toadd);
252 void deleteParticleSpawner(u64 id);
253
254 void stepParticles(float dtime);
255 void stepSpawners(float dtime);
256 void stepBuffers(float dtime);
257
258 void clearAll();
259
260 std::vector<std::unique_ptr<Particle>> m_particles;
261 std::unordered_map<u64, std::unique_ptr<ParticleSpawner>> m_particle_spawners;
262 std::vector<std::unique_ptr<ParticleSpawner>> m_dying_particle_spawners;
263 std::vector<irr_ptr<ParticleBuffer>> m_particle_buffers;
264
265 // Start the particle spawner ids generated from here after u32_max.
266 // lower values are for server sent spawners.
267 u64 m_next_particle_spawner_id = static_cast<u64>(U32_MAX) + 1;
268
270
272
275};
#define DISABLE_CLASS_COPY(C)
Definition basic_macros.h:26
Definition clientenvironment.h:54
Definition client.h:104
Definition gamedef.h:36
Definition texturesource.h:36
Definition numeric.h:347
Definition localplayer.h:50
Definition particles.h:157
virtual void render() override
Definition particles.cpp:647
bool m_bounding_box_dirty
Definition particles.h:202
ParticleBuffer(ClientEnvironment *env, const video::SMaterial &material)
Definition particles.cpp:550
irr_ptr< scene::SMeshBuffer > m_mesh_buffer
Definition particles.h:195
u16 m_count
Definition particles.h:201
static constexpr u16 MAX_PARTICLES_PER_BUFFER
Definition particles.h:192
void release(u16 index)
Frees the particle at index
Definition particles.cpp:592
float m_usage_timer
Definition particles.h:199
virtual void OnRegisterSceneNode() override
Definition particles.cpp:609
virtual u32 getMaterialCount() const override
Definition particles.h:181
std::optional< u16 > allocate()
Reserves one more slot for a particle (4 vertices, 6 indices)
Definition particles.cpp:561
video::S3DVertex * getVertices(u16 index)
Definition particles.cpp:601
virtual video::SMaterial & getMaterial(u32 num) override
Definition particles.h:178
bool isEmpty() const
Definition particles.h:174
virtual const core::aabbox3df & getBoundingBox() const override
Definition particles.cpp:619
std::vector< u16 > m_free_list
Definition particles.h:197
Class doing particle as well as their spawners handling.
Definition particles.h:209
u64 m_next_particle_spawner_id
Definition particles.h:267
std::mutex m_particle_list_lock
Definition particles.h:273
void stepSpawners(float dtime)
Definition particles.cpp:679
static bool getNodeParticleParams(const MapNode &n, const ContentFeatures &f, ParticleParameters &p, video::ITexture **texture, v2f &texpos, v2f &texsize, video::SColor *color, u8 tilenum=0)
Definition particles.cpp:856
void clearAll()
Definition particles.cpp:759
~ParticleManager()
Definition particles.cpp:667
IntervalLimiter m_buffer_gc
Definition particles.h:271
void addParticleSpawner(u64 id, std::unique_ptr< ParticleSpawner > toadd)
Definition particles.cpp:1066
void stepParticles(float dtime)
Definition particles.cpp:708
void addNodeParticle(IGameDef *gamedef, LocalPlayer *player, v3s16 pos, const MapNode &n, const ContentFeatures &f)
Definition particles.cpp:913
static video::SMaterial getMaterialForParticle(const Particle *texture)
Definition particles.cpp:998
void step(float dtime)
Definition particles.cpp:672
std::vector< irr_ptr< ParticleBuffer > > m_particle_buffers
Definition particles.h:263
void reserveParticleSpace(size_t max_estimate)
Definition particles.cpp:954
u64 generateSpawnerId()
This function is only used by client particle spawners.
Definition particles.h:236
void deleteParticleSpawner(u64 id)
Definition particles.cpp:1080
void addDiggingParticles(IGameDef *gamedef, LocalPlayer *player, v3s16 pos, const MapNode &n, const ContentFeatures &f)
Definition particles.cpp:898
void handleParticleEvent(ClientEvent *event, Client *client, LocalPlayer *player)
Definition particles.cpp:775
std::vector< std::unique_ptr< ParticleSpawner > > m_dying_particle_spawners
Definition particles.h:262
bool addParticle(std::unique_ptr< Particle > toadd)
Definition particles.cpp:1029
ParticleManager(ClientEnvironment *env)
Definition particles.cpp:663
void stepBuffers(float dtime)
Definition particles.cpp:730
std::unordered_map< u64, std::unique_ptr< ParticleSpawner > > m_particle_spawners
Definition particles.h:261
std::vector< std::unique_ptr< Particle > > m_particles
Definition particles.h:260
ClientEnvironment * m_env
Definition particles.h:269
std::mutex m_spawner_list_lock
Definition particles.h:274
Definition particles.h:126
ParticleSpawnerParameters p
Definition particles.h:150
float m_time
Definition particles.h:148
size_t m_active
Definition particles.h:146
std::vector< float > m_spawntimes
Definition particles.h:152
void decrActive()
Definition particles.h:140
bool hasActive() const
Definition particles.h:139
ParticleSpawner(LocalPlayer *player, const ParticleSpawnerParameters &params, u16 attached_id, std::vector< ClientParticleTexture > &&texpool, ParticleManager *p_manager)
Definition particles.cpp:253
std::vector< ClientParticleTexture > m_texpool
Definition particles.h:151
void step(float dtime, ClientEnvironment *env)
Definition particles.cpp:499
u16 m_attached_id
Definition particles.h:153
void spawnParticle(ClientEnvironment *env, float radius, const core::matrix4 *attached_absolute_pos_rot_matrix)
Definition particles.cpp:295
LocalPlayer * m_player
Definition particles.h:149
bool getExpired() const
Definition particles.h:136
ParticleManager * m_particlemanager
Definition particles.h:147
Definition particles.h:64
v3f m_velocity
Definition particles.h:112
void updateVertices(ClientEnvironment *env, video::SColor color)
Definition particles.cpp:185
ParticleSpawner * getParent() const
Definition particles.h:85
Particle(const ParticleParameters &p, const ClientParticleTexRef &texture, v2f texpos, v2f texsize, video::SColor color, ParticleSpawner *parent=nullptr, std::unique_ptr< ClientParticleTexture > owned_texture=nullptr)
Definition particles.cpp:40
u16 m_index
Definition particles.h:100
ParticleBuffer * m_buffer
Definition particles.h:99
v3f m_pos
Definition particles.h:111
float m_animation_time
Definition particles.h:117
const ParticleParameters m_p
Definition particles.h:115
bool attachToBuffer(ParticleBuffer *buffer)
Definition particles.cpp:72
v2f m_texpos
Definition particles.h:109
ParticleParamTypes::BlendMode getBlendMode() const
Definition particles.h:89
ParticleSpawner * m_parent
Definition particles.h:120
float m_time
Definition particles.h:102
const ClientParticleTexRef & getTextureRef() const
Definition particles.h:87
video::SColor updateLight(ClientEnvironment *env)
Definition particles.cpp:161
v3f m_acceleration
Definition particles.h:113
float m_expiration
Definition particles.h:103
v2f m_texsize
Definition particles.h:110
video::SColor m_base_color
Definition particles.h:106
~Particle()
Definition particles.cpp:66
int m_animation_frame
Definition particles.h:118
ClientParticleTexRef m_texture
Definition particles.h:108
void step(float dtime, ClientEnvironment *env)
Definition particles.cpp:83
bool isExpired() const
Definition particles.h:82
ParticleBuffer * getBuffer() const
Definition particles.h:92
std::unique_ptr< ClientParticleTexture > m_owned_texture
Definition particles.h:122
core::vector2d< f32 > v2f
Definition irr_v2d.h:11
core::vector3d< s16 > v3s16
Definition irr_v3d.h:13
core::vector3df v3f
Definition irr_v3d.h:11
#define U32_MAX
Definition irrlichttypes.h:29
BlendMode
Definition particles.h:237
Definition activeobjectmgr.cpp:11
Definition clientmap.h:35
Definition clientevent.h:68
Definition particles.h:44
ClientParticleTexRef(ClientParticleTexture &t)
Definition particles.h:53
ClientParticleTexRef(video::ITexture *tp)
Definition particles.h:57
ClientParticleTexRef()=default
video::ITexture * ref
Definition particles.h:48
ParticleTexture * tex
Definition particles.h:47
Definition particles.h:33
ClientParticleTexture()=default
ParticleTexture tex
Definition particles.h:36
video::ITexture * ref
Definition particles.h:37
ServerParticleTexture texture
Definition particles.h:277
Definition nodedef.h:299
Definition mapnode.h:124
Definition particles.h:304
Definition particles.h:315
u16 amount
Definition particles.h:316
f32 time
Definition particles.h:317
Definition particles.h:254
ParticleParamTypes::BlendMode blendmode
Definition particles.h:256
Definition particles.h:263
static std::string p(std::string path)
Definition test_filesys.cpp:55