Luanti 5.15.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 "CMeshBuffer.h"
12
13#include <mutex>
14#include <memory>
15#include <vector>
16#include <unordered_map>
17#include "../particles.h"
18#include "util/numeric.h"
19
20namespace video {
21 class ITexture;
22}
23
24struct ClientEvent;
25class ParticleManager;
27struct MapNode;
28struct ContentFeatures;
29class LocalPlayer;
30class ITextureSource;
31class IGameDef;
32class Client;
33
35{
36 /* per-spawner structure used to store the ParticleTexture structs
37 * that spawned particles will refer to through ClientParticleTexRef */
39 video::ITexture *ref = nullptr;
40
43};
44
46{
47 /* per-particle structure used to avoid massively duplicating the
48 * fairly large ParticleTexture struct */
49 ParticleTexture *tex = nullptr;
50 video::ITexture *ref = nullptr;
51
53
54 /* constructor used by particles spawned from a spawner */
57
58 /* constructor used for node particles */
59 explicit ClientParticleTexRef(video::ITexture *tp): ref(tp) {};
60};
61
62class ParticleSpawner;
63class ParticleBuffer;
64
66{
67public:
69 const ParticleParameters &p,
70 const ClientParticleTexRef &texture,
71 v2f texpos,
72 v2f texsize,
73 video::SColor color,
74 ParticleSpawner *parent = nullptr,
75 std::unique_ptr<ClientParticleTexture> owned_texture = nullptr
76 );
77
78 ~Particle();
79
81
82 void step(float dtime, ClientEnvironment *env);
83
84 bool isExpired () const
85 { return m_expiration < m_time; }
86
87 ParticleSpawner *getParent() const { return m_parent; }
88
89 const ClientParticleTexRef &getTextureRef() const { return m_texture; }
90
93
94 ParticleBuffer *getBuffer() const { return m_buffer; }
95 bool attachToBuffer(ParticleBuffer *buffer);
96
97private:
98 video::SColor updateLight(ClientEnvironment *env);
99 void updateVertices(ClientEnvironment *env, video::SColor color);
100
102 u16 m_index; // index in m_buffer
103
104 float m_time = 0.0f;
106
107 // Color without lighting
108 video::SColor m_base_color;
109
116
118
119 float m_animation_time = 0.0f;
121
123 // Used if not spawned from a particlespawner
124 std::unique_ptr<ClientParticleTexture> m_owned_texture;
125};
126
128{
129public:
131 const ParticleSpawnerParameters &params,
132 u16 attached_id,
133 std::vector<ClientParticleTexture> &&texpool,
134 ParticleManager *p_manager);
135
136 void step(float dtime, ClientEnvironment *env);
137
138 bool getExpired() const
139 { return p.amount <= 0 && p.time != 0; }
140
141 bool hasActive() const { return m_active != 0; }
142 void decrActive() { m_active -= 1; }
143
144private:
145 void spawnParticle(ClientEnvironment *env, float radius,
146 const core::matrix4 *attached_absolute_pos_rot_matrix);
147
148 size_t m_active;
150 float m_time;
153 std::vector<ClientParticleTexture> m_texpool;
154 std::vector<float> m_spawntimes;
156};
157
158class ParticleBuffer : public scene::ISceneNode
159{
160 friend class ParticleManager;
161public:
162 ParticleBuffer(ClientEnvironment *env, const video::SMaterial &material);
163
164 // for pointer stability
166
167
169 std::optional<u16> allocate();
171 void release(u16 index);
172
174 video::S3DVertex *getVertices(u16 index);
175
176 inline bool isEmpty() const {
177 return m_free_list.size() == m_count;
178 }
179
180 virtual video::SMaterial &getMaterial(u32 num) override {
181 return m_mesh_buffer->getMaterial();
182 }
183 virtual u32 getMaterialCount() const override {
184 return 1;
185 }
186
187 virtual const core::aabbox3df &getBoundingBox() const override;
188
189 virtual void render() override;
190
191 virtual void OnRegisterSceneNode() override;
192
193 // we have 16-bit indices
194 static constexpr u16 MAX_PARTICLES_PER_BUFFER = 16000;
195
196private:
197 irr_ptr<scene::SMeshBuffer> m_mesh_buffer;
198 // unused (e.g. expired) particle indices for re-use
199 std::vector<u16> m_free_list;
200 // for automatic deletion when unused for a while. is reset on allocate().
201 float m_usage_timer = 0;
202 // total count of contained particles
203 u16 m_count = 0;
204 mutable bool m_bounding_box_dirty = true;
205};
206
211{
212 friend class ParticleSpawner;
213public:
217
218 void step (float dtime);
219
221 LocalPlayer *player);
222
223 void addDiggingParticles(LocalPlayer *player, v3s16 pos,
224 const MapNode &n);
225
226 void addNodeParticle(LocalPlayer *player, v3s16 pos,
227 const MapNode &n);
228
229 void reserveParticleSpace(size_t max_estimate);
230
239 {
241 }
242
243protected:
244 static bool getNodeParticleParams(Client *client, const MapNode &n,
245 ParticleParameters &p, video::ITexture **texture, v2f &texpos,
246 v2f &texsize, video::SColor *color, u8 tilenum = 0);
247
248 static video::SMaterial getMaterialForParticle(const Particle *texture);
249
250 bool addParticle(std::unique_ptr<Particle> toadd);
251
252private:
253 void addParticleSpawner(u64 id, std::unique_ptr<ParticleSpawner> toadd);
254 void deleteParticleSpawner(u64 id);
255
256 void stepParticles(float dtime);
257 void stepSpawners(float dtime);
258 void stepBuffers(float dtime);
259
260 void clearAll();
261
262 std::vector<std::unique_ptr<Particle>> m_particles;
263 std::unordered_map<u64, std::unique_ptr<ParticleSpawner>> m_particle_spawners;
264 std::vector<std::unique_ptr<ParticleSpawner>> m_dying_particle_spawners;
265 std::vector<irr_ptr<ParticleBuffer>> m_particle_buffers;
266
267 // Start the particle spawner ids generated from here after u32_max.
268 // lower values are for server sent spawners.
269 u64 m_next_particle_spawner_id = static_cast<u64>(U32_MAX) + 1;
270
272
274
277};
#define DISABLE_CLASS_COPY(C)
Definition basic_macros.h:26
Definition clientenvironment.h:54
Definition client.h:106
Definition gamedef.h:26
Definition texturesource.h:45
Definition numeric.h:386
Definition localplayer.h:48
Definition particles.h:159
virtual void render() override
Definition particles.cpp:667
bool m_bounding_box_dirty
Definition particles.h:204
ParticleBuffer(ClientEnvironment *env, const video::SMaterial &material)
Definition particles.cpp:570
irr_ptr< scene::SMeshBuffer > m_mesh_buffer
Definition particles.h:197
u16 m_count
Definition particles.h:203
static constexpr u16 MAX_PARTICLES_PER_BUFFER
Definition particles.h:194
void release(u16 index)
Frees the particle at index
Definition particles.cpp:612
float m_usage_timer
Definition particles.h:201
virtual void OnRegisterSceneNode() override
Definition particles.cpp:629
virtual u32 getMaterialCount() const override
Definition particles.h:183
std::optional< u16 > allocate()
Reserves one more slot for a particle (4 vertices, 6 indices)
Definition particles.cpp:581
video::S3DVertex * getVertices(u16 index)
Definition particles.cpp:621
virtual video::SMaterial & getMaterial(u32 num) override
Definition particles.h:180
bool isEmpty() const
Definition particles.h:176
virtual const core::aabbox3df & getBoundingBox() const override
Definition particles.cpp:639
std::vector< u16 > m_free_list
Definition particles.h:199
Class doing particle as well as their spawners handling.
Definition particles.h:211
u64 m_next_particle_spawner_id
Definition particles.h:269
std::mutex m_particle_list_lock
Definition particles.h:275
void stepSpawners(float dtime)
Definition particles.cpp:699
void clearAll()
Definition particles.cpp:779
~ParticleManager()
Definition particles.cpp:687
void addDiggingParticles(LocalPlayer *player, v3s16 pos, const MapNode &n)
Definition particles.cpp:919
IntervalLimiter m_buffer_gc
Definition particles.h:273
void addParticleSpawner(u64 id, std::unique_ptr< ParticleSpawner > toadd)
Definition particles.cpp:1078
void stepParticles(float dtime)
Definition particles.cpp:728
static video::SMaterial getMaterialForParticle(const Particle *texture)
Definition particles.cpp:1010
void step(float dtime)
Definition particles.cpp:692
std::vector< irr_ptr< ParticleBuffer > > m_particle_buffers
Definition particles.h:265
void reserveParticleSpace(size_t max_estimate)
Definition particles.cpp:966
u64 generateSpawnerId()
This function is only used by client particle spawners.
Definition particles.h:238
void deleteParticleSpawner(u64 id)
Definition particles.cpp:1092
void handleParticleEvent(ClientEvent *event, Client *client, LocalPlayer *player)
Definition particles.cpp:795
static bool getNodeParticleParams(Client *client, const MapNode &n, ParticleParameters &p, video::ITexture **texture, v2f &texpos, v2f &texsize, video::SColor *color, u8 tilenum=0)
Definition particles.cpp:876
std::vector< std::unique_ptr< ParticleSpawner > > m_dying_particle_spawners
Definition particles.h:264
bool addParticle(std::unique_ptr< Particle > toadd)
Definition particles.cpp:1041
ParticleManager(ClientEnvironment *env)
Definition particles.cpp:683
void stepBuffers(float dtime)
Definition particles.cpp:750
std::unordered_map< u64, std::unique_ptr< ParticleSpawner > > m_particle_spawners
Definition particles.h:263
std::vector< std::unique_ptr< Particle > > m_particles
Definition particles.h:262
void addNodeParticle(LocalPlayer *player, v3s16 pos, const MapNode &n)
Definition particles.cpp:929
ClientEnvironment * m_env
Definition particles.h:271
std::mutex m_spawner_list_lock
Definition particles.h:276
Definition particles.h:128
ParticleSpawnerParameters p
Definition particles.h:152
float m_time
Definition particles.h:150
size_t m_active
Definition particles.h:148
std::vector< float > m_spawntimes
Definition particles.h:154
void decrActive()
Definition particles.h:142
bool hasActive() const
Definition particles.h:141
ParticleSpawner(LocalPlayer *player, const ParticleSpawnerParameters &params, u16 attached_id, std::vector< ClientParticleTexture > &&texpool, ParticleManager *p_manager)
Definition particles.cpp:272
std::vector< ClientParticleTexture > m_texpool
Definition particles.h:153
void step(float dtime, ClientEnvironment *env)
Definition particles.cpp:519
u16 m_attached_id
Definition particles.h:155
void spawnParticle(ClientEnvironment *env, float radius, const core::matrix4 *attached_absolute_pos_rot_matrix)
Definition particles.cpp:314
LocalPlayer * m_player
Definition particles.h:151
bool getExpired() const
Definition particles.h:138
ParticleManager * m_particlemanager
Definition particles.h:149
Definition particles.h:66
v3f m_velocity
Definition particles.h:114
void updateVertices(ClientEnvironment *env, video::SColor color)
Definition particles.cpp:204
ParticleSpawner * getParent() const
Definition particles.h:87
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:59
u16 m_index
Definition particles.h:102
ParticleBuffer * m_buffer
Definition particles.h:101
v3f m_pos
Definition particles.h:113
float m_animation_time
Definition particles.h:119
const ParticleParameters m_p
Definition particles.h:117
bool attachToBuffer(ParticleBuffer *buffer)
Definition particles.cpp:91
v2f m_texpos
Definition particles.h:111
ParticleParamTypes::BlendMode getBlendMode() const
Definition particles.h:91
ParticleSpawner * m_parent
Definition particles.h:122
float m_time
Definition particles.h:104
const ClientParticleTexRef & getTextureRef() const
Definition particles.h:89
video::SColor updateLight(ClientEnvironment *env)
Definition particles.cpp:180
v3f m_acceleration
Definition particles.h:115
float m_expiration
Definition particles.h:105
v2f m_texsize
Definition particles.h:112
video::SColor m_base_color
Definition particles.h:108
~Particle()
Definition particles.cpp:85
int m_animation_frame
Definition particles.h:120
ClientParticleTexRef m_texture
Definition particles.h:110
void step(float dtime, ClientEnvironment *env)
Definition particles.cpp:102
bool isExpired() const
Definition particles.h:84
ParticleBuffer * getBuffer() const
Definition particles.h:94
std::unique_ptr< ClientParticleTexture > m_owned_texture
Definition particles.h:124
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:23
BlendMode
Definition particles.h:228
Definition activeobjectmgr.cpp:11
Definition clientmap.h:36
Definition clientevent.h:69
Definition particles.h:46
ClientParticleTexRef(ClientParticleTexture &t)
Definition particles.h:55
ClientParticleTexRef(video::ITexture *tp)
Definition particles.h:59
ClientParticleTexRef()=default
video::ITexture * ref
Definition particles.h:50
ParticleTexture * tex
Definition particles.h:49
Definition particles.h:35
ClientParticleTexture()=default
ParticleTexture tex
Definition particles.h:38
video::ITexture * ref
Definition particles.h:39
ServerParticleTexture texture
Definition particles.h:268
Definition nodedef.h:294
Definition mapnode.h:123
Definition particles.h:295
Definition particles.h:306
u16 amount
Definition particles.h:307
f32 time
Definition particles.h:308
Definition particles.h:245
ParticleParamTypes::BlendMode blendmode
Definition particles.h:247
Definition particles.h:254
static std::string p(std::string path)
Definition test_filesys.cpp:64