From 6d63c712218dc1d1feffad41506c2c5b022fd3f3 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Sun, 3 Nov 2024 12:45:46 +0300 Subject: [PATCH] add Emitter maxDistance --- src/graphics/render/Emitter.cpp | 23 +++++++++++++++++++++-- src/graphics/render/Emitter.hpp | 16 ++++++++++++---- src/graphics/render/ParticlesRenderer.cpp | 2 +- 3 files changed, 34 insertions(+), 7 deletions(-) diff --git a/src/graphics/render/Emitter.cpp b/src/graphics/render/Emitter.cpp index e4fb9d47..ea64a93d 100644 --- a/src/graphics/render/Emitter.cpp +++ b/src/graphics/render/Emitter.cpp @@ -1,7 +1,10 @@ #include "Emitter.hpp" #include +#define GLM_ENABLE_EXPERIMENTAL +#include +#include "window/Camera.hpp" #include "graphics/core/Texture.hpp" Emitter::Emitter( @@ -24,8 +27,12 @@ const Texture* Emitter::getTexture() const { return texture; } -void Emitter::update(float delta, std::vector& particles) { - if (count == 0) { +void Emitter::update( + float delta, + const glm::vec3& cameraPosition, + std::vector& particles +) { + if (count == 0 || (count == -1 && spawnInterval < FLT_EPSILON)) { return; } glm::vec3 position {}; @@ -34,6 +41,18 @@ void Emitter::update(float delta, std::vector& particles) { } else { // TODO: implement for entity origin } + if (glm::distance2(position, cameraPosition) > maxDistance * maxDistance) { + if (count > 0) { + if (spawnInterval < FLT_EPSILON) { + count = 0; + return; + } + int skipped = timer / spawnInterval; + count = std::max(0, count - skipped); + timer -= skipped * spawnInterval; + } + return; + } timer += delta; while (count && timer > spawnInterval) { // spawn particle diff --git a/src/graphics/render/Emitter.hpp b/src/graphics/render/Emitter.hpp index 431d2e49..b8783ea8 100644 --- a/src/graphics/render/Emitter.hpp +++ b/src/graphics/render/Emitter.hpp @@ -15,6 +15,7 @@ struct Particle { /// @brief Pointer used to access common behaviour. /// Emitter must be utilized after all related particles despawn. Emitter* emitter; + /// @brief Some random integer for visuals configuration. int random; /// @brief Global position glm::vec3 position; @@ -44,15 +45,17 @@ class Emitter { /// @brief Particles spawn interval float spawnInterval; /// @brief Number of particles should be spawned before emitter deactivation. - /// -1 is infinite + /// -1 is infinite. int count; /// @brief Spawn timer used to determine number of particles /// to spawn on update. May be innacurate. float timer = 0.0f; - /// @brief Random velocity magnitude applying to spawned particles + /// @brief Random velocity magnitude applying to spawned particles. glm::vec3 explosion {8.0f}; + /// @brief Max distance of actually spawning particles. + float maxDistance = 32.0f; - util::PseudoRandom random; + util::PseudoRandom random; public: ParticleBehaviour behaviour; @@ -71,8 +74,13 @@ public: /// @brief Update emitter and spawn particles /// @param delta delta time + /// @param cameraPosition current camera global position /// @param particles destination particles vector - void update(float delta, std::vector& particles); + void update( + float delta, + const glm::vec3& cameraPosition, + std::vector& particles + ); /// @brief Set initial random velocity magitude void setExplosion(const glm::vec3& magnitude); diff --git a/src/graphics/render/ParticlesRenderer.cpp b/src/graphics/render/ParticlesRenderer.cpp index e7b72c00..f9c2e4d1 100644 --- a/src/graphics/render/ParticlesRenderer.cpp +++ b/src/graphics/render/ParticlesRenderer.cpp @@ -119,7 +119,7 @@ void ParticlesRenderer::render(const Camera& camera, float delta) { } else { vec = &found->second; } - emitter.update(delta, *vec); + emitter.update(delta, camera.position, *vec); iter++; } }