Monad Engine da02fba2
> Undercity Codex_
Loading...
Searching...
No Matches
ParticleEmitterComponent.cpp
Go to the documentation of this file.
2
3#include <algorithm>
4
5#include "Engine.h"
7#include "scene/GameObject.h"
8
9namespace mnd
10{
11
12namespace
13{
14vec3 ReadVec3(const nlohmann::json &json, const char *key, const vec3 &fallback)
15{
16 if (!json.contains(key) || !json[key].is_object())
17 {
18 return fallback;
19 }
20 const auto &obj = json[key];
21 return vec3(obj.value("x", fallback.x), obj.value("y", fallback.y), obj.value("z", fallback.z));
22}
23
24vec4 ReadVec4(const nlohmann::json &json, const char *key, const vec4 &fallback)
25{
26 if (!json.contains(key) || !json[key].is_object())
27 {
28 return fallback;
29 }
30 const auto &obj = json[key];
31 return vec4(obj.value("r", fallback.r),
32 obj.value("g", fallback.g),
33 obj.value("b", fallback.b),
34 obj.value("a", fallback.a));
35}
36
37f32 RandRange(std::mt19937 &rng, f32 lo, f32 hi)
38{
39 if (hi <= lo)
40 {
41 return lo;
42 }
43 std::uniform_real_distribution<f32> dist(lo, hi);
44 return dist(rng);
45}
46} // namespace
47
49{
50 if (!m_emitting || deltaTime <= 0.0F || m_rate <= 0.0F)
51 {
52 return;
53 }
54
55 m_accum += deltaTime * m_rate;
56 while (m_accum >= 1.0F)
57 {
58 EmitOne();
59 m_accum -= 1.0F;
60 }
61}
62
64{
65 for (int i = 0; i < count; ++i)
66 {
67 EmitOne();
68 }
69}
70
71void ParticleEmitterComponent::EmitOne()
72{
73 if (m_owner == nullptr)
74 {
75 return;
76 }
77
78 Particle particle;
79 particle.position = m_owner->GetWorldPosition() + m_offset;
80 particle.velocity = vec3(RandRange(m_rng, m_velocityMin.x, m_velocityMax.x),
81 RandRange(m_rng, m_velocityMin.y, m_velocityMax.y),
82 RandRange(m_rng, m_velocityMin.z, m_velocityMax.z));
83 particle.acceleration = m_acceleration;
84 particle.lifetime = std::max(0.05F, RandRange(m_rng, m_lifetimeMin, m_lifetimeMax));
85 particle.age = 0.0F;
86 particle.sizeStart = m_sizeStart;
87 particle.sizeEnd = m_sizeEnd;
88 particle.colorStart = m_colorStart;
89 particle.colorEnd = m_colorEnd;
90
92}
93
94void ParticleEmitterComponent::LoadProperties(const nlohmann::json &json)
95{
96 m_emitting = json.value("emitting", m_emitting);
97 m_rate = std::max(0.0F, json.value("rate", m_rate));
98 m_offset = ReadVec3(json, "offset", m_offset);
99 m_velocityMin = ReadVec3(json, "velocityMin", m_velocityMin);
100 m_velocityMax = ReadVec3(json, "velocityMax", m_velocityMax);
101 m_acceleration = ReadVec3(json, "acceleration", m_acceleration);
102 m_lifetimeMin = std::max(0.05F, json.value("lifetimeMin", m_lifetimeMin));
103 m_lifetimeMax = std::max(m_lifetimeMin, json.value("lifetimeMax", m_lifetimeMax));
104 m_sizeStart = std::max(0.0F, json.value("sizeStart", m_sizeStart));
105 m_sizeEnd = std::max(0.0F, json.value("sizeEnd", m_sizeEnd));
106 m_colorStart = ReadVec4(json, "colorStart", m_colorStart);
107 m_colorEnd = ReadVec4(json, "colorEnd", m_colorEnd);
108}
109
110} // namespace mnd
Spawns particles each frame at the owner's world position.
Pool-allocated CPU particles drawn as additive billboards.
GameObject * m_owner
Definition Component.h:57
static Engine & GetInstance()
Returns the single Engine instance (created on first call).
Definition Engine.cpp:59
ParticleSystem & GetParticleSystem()
Returns the global particle pool. Emitter components push particles via Spawn().
Definition Engine.h:127
vec3 GetWorldPosition() const
Extract the world-space position from GetWorldTransform().
void LoadProperties(const nlohmann::json &json) override
void Burst(int count)
Single-shot burst at the owner's current position (e.g. on death/hit).
void Update(f32 deltaTime) override
void Spawn(const Particle &particle)
Push a fully-configured particle into the pool. Drops oldest if full.
glm::vec4 vec4
4-component float vector (e.g. RGBA colour, homogeneous coords).
Definition Types.h:52
glm::vec3 vec3
3-component float vector (e.g. world position, RGB colour, normals).
Definition Types.h:51
float f32
32-bit IEEE float — the standard GL scalar type.
Definition Types.h:40
auto ReadVec3