7#include "scene/GameObject.h"
14vec3 ReadVec3(
const nlohmann::json &json,
const char *key,
const vec3 &fallback)
16 if (!json.contains(key) || !json[key].is_object())
20 const auto &obj = json[key];
21 return vec3(obj.value(
"x", fallback.x), obj.value(
"y", fallback.y), obj.value(
"z", fallback.z));
24vec4 ReadVec4(
const nlohmann::json &json,
const char *key,
const vec4 &fallback)
26 if (!json.contains(key) || !json[key].is_object())
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));
37f32 RandRange(std::mt19937 &rng,
f32 lo,
f32 hi)
43 std::uniform_real_distribution<f32> dist(lo, hi);
50 if (!m_emitting || deltaTime <= 0.0F || m_rate <= 0.0F)
55 m_accum += deltaTime * m_rate;
56 while (m_accum >= 1.0F)
65 for (
int i = 0; i < count; ++i)
71void ParticleEmitterComponent::EmitOne()
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));
86 particle.sizeStart = m_sizeStart;
87 particle.sizeEnd = m_sizeEnd;
88 particle.colorStart = m_colorStart;
89 particle.colorEnd = m_colorEnd;
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);
Spawns particles each frame at the owner's world position.
Pool-allocated CPU particles drawn as additive billboards.
static Engine & GetInstance()
Returns the single Engine instance (created on first call).
ParticleSystem & GetParticleSystem()
Returns the global particle pool. Emitter components push particles via Spawn().
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).
glm::vec3 vec3
3-component float vector (e.g. world position, RGB colour, normals).
float f32
32-bit IEEE float — the standard GL scalar type.