From 77ae35e3641088001c9e465b5cc0734186677c35 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Tue, 5 Nov 2024 03:46:41 +0300 Subject: [PATCH] feat: make Decorator listen to block interactions --- src/frontend/LevelFrontend.cpp | 2 +- src/frontend/screens/LevelScreen.cpp | 5 ++-- src/graphics/render/Decorator.cpp | 43 +++++++++++++++++----------- src/graphics/render/Decorator.hpp | 5 +++- src/logic/BlocksController.hpp | 2 +- 5 files changed, 36 insertions(+), 21 deletions(-) diff --git a/src/frontend/LevelFrontend.cpp b/src/frontend/LevelFrontend.cpp index 6c54a83d..977a0350 100644 --- a/src/frontend/LevelFrontend.cpp +++ b/src/frontend/LevelFrontend.cpp @@ -25,7 +25,7 @@ LevelFrontend::LevelFrontend( "block-previews" ); controller->getBlocksController()->listenBlockInteraction( - [=](Player* player, glm::ivec3 pos, const Block& def, BlockInteraction type) { + [=](auto player, const auto& pos, const auto& def, BlockInteraction type) { auto material = level->content->findBlockMaterial(def.material); if (material == nullptr) { return; diff --git a/src/frontend/screens/LevelScreen.cpp b/src/frontend/screens/LevelScreen.cpp index ad8f35c6..2dda016c 100644 --- a/src/frontend/screens/LevelScreen.cpp +++ b/src/frontend/screens/LevelScreen.cpp @@ -46,8 +46,9 @@ LevelScreen::LevelScreen(Engine* engine, std::unique_ptr levelPtr) worldRenderer = std::make_unique(engine, frontend.get(), controller->getPlayer()); hud = std::make_unique(engine, frontend.get(), controller->getPlayer()); - decorator = - std::make_unique(*level, *worldRenderer->particles, *assets); + decorator = std::make_unique( + *controller, *worldRenderer->particles, *assets + ); keepAlive(settings.graphics.backlight.observe([=](bool) { controller->getLevel()->chunks->saveAndClear(); diff --git a/src/graphics/render/Decorator.cpp b/src/graphics/render/Decorator.cpp index eb2255a6..4bac77af 100644 --- a/src/graphics/render/Decorator.cpp +++ b/src/graphics/render/Decorator.cpp @@ -7,6 +7,7 @@ #include "voxels/Block.hpp" #include "world/Level.hpp" #include "window/Camera.hpp" +#include "logic/LevelController.hpp" /// @brief Not greather than 64 for this BIG_PRIME value inline constexpr int UPDATE_AREA_DIAMETER = 32; @@ -19,9 +20,32 @@ inline constexpr int ITERATIONS = 512; inline constexpr int BIG_PRIME = 666667; Decorator::Decorator( - const Level& level, ParticlesRenderer& particles, const Assets& assets + LevelController& controller, ParticlesRenderer& particles, const Assets& assets ) - : level(level), particles(particles), assets(assets) { + : level(*controller.getLevel()), particles(particles), assets(assets) { + controller.getBlocksController()->listenBlockInteraction( + [this](auto player, const auto& pos, const auto& def, BlockInteraction type) { + if (type == BlockInteraction::placing && def.particles) { + addParticles(def, pos); + } + }); +} + +void Decorator::addParticles(const Block& def, const glm::ivec3& pos) { + const auto& found = blockEmitters.find(pos); + if (found == blockEmitters.end()) { + auto treg = util::get_texture_region( + assets, def.particles->texture, "" + ); + blockEmitters[pos] = particles.add(std::make_unique( + level, + glm::vec3{pos.x + 0.5, pos.y + 0.5, pos.z + 0.5}, + *def.particles, + treg.texture, + treg.region, + -1 + )); + } } void Decorator::update( @@ -42,20 +66,7 @@ void Decorator::update( if (auto vox = chunks.get(pos)) { const auto& def = indices.blocks.require(vox->id); if (def.particles) { - const auto& found = blockEmitters.find(pos); - if (found == blockEmitters.end()) { - auto treg = util::get_texture_region( - assets, def.particles->texture, "" - ); - blockEmitters[pos] = particles.add(std::make_unique( - level, - glm::vec3{pos.x + 0.5, pos.y + 0.5, pos.z + 0.5}, - *def.particles, - treg.texture, - treg.region, - -1 - )); - } + addParticles(def, pos); } } } diff --git a/src/graphics/render/Decorator.hpp b/src/graphics/render/Decorator.hpp index 83d8a661..32f9540a 100644 --- a/src/graphics/render/Decorator.hpp +++ b/src/graphics/render/Decorator.hpp @@ -10,6 +10,8 @@ class Level; class Chunks; class Camera; class Assets; +struct Block; +class LevelController; class ParticlesRenderer; class Decorator { @@ -22,9 +24,10 @@ class Decorator { void update( float delta, const glm::ivec3& areaStart, const glm::ivec3& areaCenter ); + void addParticles(const Block& def, const glm::ivec3& pos); public: Decorator( - const Level& level, ParticlesRenderer& particles, const Assets& assets + LevelController& level, ParticlesRenderer& particles, const Assets& assets ); void update(float delta, const Camera& camera); diff --git a/src/logic/BlocksController.hpp b/src/logic/BlocksController.hpp index 19a270f0..86bbe395 100644 --- a/src/logic/BlocksController.hpp +++ b/src/logic/BlocksController.hpp @@ -20,7 +20,7 @@ enum class BlockInteraction { step, destruction, placing }; /// @brief Player argument is nullable using on_block_interaction = std::function< - void(Player*, glm::ivec3, const Block&, BlockInteraction type)>; + void(Player*, const glm::ivec3&, const Block&, BlockInteraction type)>; /// BlocksController manages block updates and data (inventories, metadata) class BlocksController {