From 83ddbda90b503d5bfb497bc762b57653354ef5be Mon Sep 17 00:00:00 2001 From: MihailRis Date: Sun, 3 Nov 2024 13:05:42 +0300 Subject: [PATCH] implement entity-bound emitters --- src/graphics/render/Emitter.cpp | 12 +++++++++--- src/graphics/render/Emitter.hpp | 3 +++ src/graphics/render/ParticlesRenderer.cpp | 13 +++++++++---- 3 files changed, 21 insertions(+), 7 deletions(-) diff --git a/src/graphics/render/Emitter.cpp b/src/graphics/render/Emitter.cpp index ea64a93d..6a7dacd8 100644 --- a/src/graphics/render/Emitter.cpp +++ b/src/graphics/render/Emitter.cpp @@ -6,15 +6,19 @@ #include "window/Camera.hpp" #include "graphics/core/Texture.hpp" +#include "objects/Entities.hpp" +#include "world/Level.hpp" Emitter::Emitter( + const Level& level, std::variant origin, Particle prototype, const Texture* texture, float spawnInterval, int count ) - : origin(std::move(origin)), + : level(level), + origin(std::move(origin)), prototype(std::move(prototype)), texture(texture), spawnInterval(spawnInterval), @@ -38,8 +42,10 @@ void Emitter::update( glm::vec3 position {}; if (auto staticPos = std::get_if(&origin)) { position = *staticPos; - } else { - // TODO: implement for entity origin + } else if (auto entityId = std::get_if(&origin)) { + if (auto entity = level.entities->get(*entityId)) { + position = entity->getTransform().pos; + } } if (glm::distance2(position, cameraPosition) > maxDistance * maxDistance) { if (count > 0) { diff --git a/src/graphics/render/Emitter.hpp b/src/graphics/render/Emitter.hpp index b8783ea8..884ba11e 100644 --- a/src/graphics/render/Emitter.hpp +++ b/src/graphics/render/Emitter.hpp @@ -9,6 +9,7 @@ #include "maths/UVRegion.hpp" #include "maths/util.hpp" +class Level; class Emitter; struct Particle { @@ -36,6 +37,7 @@ struct ParticleBehaviour { }; class Emitter { + const Level& level; /// @brief Static position or entity std::variant origin; /// @brief Particle prototype @@ -60,6 +62,7 @@ public: ParticleBehaviour behaviour; Emitter( + const Level& level, std::variant origin, Particle prototype, const Texture* texture, diff --git a/src/graphics/render/ParticlesRenderer.cpp b/src/graphics/render/ParticlesRenderer.cpp index f9c2e4d1..0ad5c1d5 100644 --- a/src/graphics/render/ParticlesRenderer.cpp +++ b/src/graphics/render/ParticlesRenderer.cpp @@ -19,10 +19,15 @@ ParticlesRenderer::ParticlesRenderer( : batch(std::make_unique(1024)), level(level), settings(settings) { - auto region = util::get_texture_region(assets, "blocks:grass_top", ""); - emitters.push_back(std::make_unique(glm::vec3(0, 80, 0), Particle { - nullptr, 0, glm::vec3(), glm::vec3(), 5.0f, region.region - }, region.texture, 0.002f, -1)); + auto region = util::get_texture_region(assets, "blocks:grass_side", ""); + emitters.push_back(std::make_unique( + level, + glm::vec3(0, 80, 0), + Particle {nullptr, 0, glm::vec3(), glm::vec3(), 5.0f, region.region}, + region.texture, + 0.002f, + -1 + )); } ParticlesRenderer::~ParticlesRenderer() = default;