From 7f95306c6525b91765c55ce8b1ada46d5dc77e2b Mon Sep 17 00:00:00 2001 From: MihailRis Date: Mon, 23 Dec 2024 16:48:07 +0300 Subject: [PATCH] add 'min_angular_vel', 'max_angular_vel' properties --- src/graphics/render/Emitter.cpp | 5 +++++ src/graphics/render/Emitter.hpp | 2 ++ src/graphics/render/ParticlesRenderer.cpp | 2 ++ src/presets/ParticlesPreset.cpp | 4 ++++ src/presets/ParticlesPreset.hpp | 4 ++++ 5 files changed, 17 insertions(+) diff --git a/src/graphics/render/Emitter.cpp b/src/graphics/render/Emitter.cpp index 09e1ddc8..76b2f018 100644 --- a/src/graphics/render/Emitter.cpp +++ b/src/graphics/render/Emitter.cpp @@ -88,6 +88,11 @@ void Emitter::update( particle.angle = random.randFloat() * preset.angleSpread * glm::pi() * 2; } + particle.angularVelocity = + (preset.minAngularVelocity + + random.randFloat() * + (preset.maxAngularVelocity - preset.minAngularVelocity)) * + ((random.rand() % 2) * 2 - 1); glm::vec3 spawnOffset = generate_coord(preset.spawnShape); spawnOffset *= preset.spawnSpread; diff --git a/src/graphics/render/Emitter.hpp b/src/graphics/render/Emitter.hpp index 0ad34053..b2a371ad 100644 --- a/src/graphics/render/Emitter.hpp +++ b/src/graphics/render/Emitter.hpp @@ -29,6 +29,8 @@ struct Particle { UVRegion region; /// @brief Current rotation angle float angle; + /// @brief Angular velocity + float angularVelocity; }; class Texture; diff --git a/src/graphics/render/ParticlesRenderer.cpp b/src/graphics/render/ParticlesRenderer.cpp index 6c3ed73c..f3a30cdd 100644 --- a/src/graphics/render/ParticlesRenderer.cpp +++ b/src/graphics/render/ParticlesRenderer.cpp @@ -31,12 +31,14 @@ static inline void update_particle( const auto& preset = particle.emitter->preset; auto& pos = particle.position; auto& vel = particle.velocity; + auto& angle = particle.angle; vel += delta * preset.acceleration; if (preset.collision && chunks.isObstacleAt(pos + vel * delta)) { vel *= 0.0f; } pos += vel * delta; + angle += particle.angularVelocity * delta; particle.lifetime -= delta; } diff --git a/src/presets/ParticlesPreset.cpp b/src/presets/ParticlesPreset.cpp index 27274442..8a007076 100644 --- a/src/presets/ParticlesPreset.cpp +++ b/src/presets/ParticlesPreset.cpp @@ -44,6 +44,8 @@ dv::value ParticlesPreset::serialize() const { root["size"] = dv::to_value(size); root["size_spread"] = sizeSpread; root["angle_spread"] = angleSpread; + root["min_angular_vel"] = minAngularVelocity; + root["max_angular_vel"] = maxAngularVelocity; root["spawn_spread"] = dv::to_value(size); root["spawn_shape"] = to_string(spawnShape); root["random_sub_uv"] = randomSubUV; @@ -60,6 +62,8 @@ void ParticlesPreset::deserialize(const dv::value& src) { src.at("lifetime").get(lifetime); src.at("lifetime_spread").get(lifetimeSpread); src.at("angle_spread").get(angleSpread); + src.at("min_angular_vel").get(minAngularVelocity); + src.at("max_angular_vel").get(maxAngularVelocity); src.at("random_sub_uv").get(randomSubUV); if (src.has("velocity")) { dv::get_vec(src["velocity"], velocity); diff --git a/src/presets/ParticlesPreset.hpp b/src/presets/ParticlesPreset.hpp index 10b9f088..2b955d13 100644 --- a/src/presets/ParticlesPreset.hpp +++ b/src/presets/ParticlesPreset.hpp @@ -46,6 +46,10 @@ struct ParticlesPreset : public Serializable { float sizeSpread = 0.2f; /// @brief Random initial angle spread float angleSpread = 0.0f; + /// @brief Minimum angular velocity + float minAngularVelocity = 0.0f; + /// @brief Maximum angular velocity + float maxAngularVelocity = 0.0f; /// @brief Spawn spread shape ParticleSpawnShape spawnShape = BALL; /// @brief Spawn spread