diff --git a/source/engine/graphics/front/engine/Engine.cpp b/source/engine/graphics/front/engine/Engine.cpp index a47862c12a3480ea7938e8d605986230b9dd1f61..9adda5a3d7ad97f0769c82d6c124c7725618d18c 100644 --- a/source/engine/graphics/front/engine/Engine.cpp +++ b/source/engine/graphics/front/engine/Engine.cpp @@ -32,6 +32,16 @@ namespace megu { return {}; } + std::optional<std::reference_wrapper<const Renderable>> GraphicEngine::get(const Identifiable & id) const { + for(const auto & [p, layer] : this->_layers) { + auto renderable = layer->get(id); + if(renderable.has_value()) { + return renderable; + } + } + return {}; + } + void GraphicEngine::step() { if(this->_window.isOpen()) { // Draw Layers diff --git a/source/engine/graphics/front/engine/Engine.hpp b/source/engine/graphics/front/engine/Engine.hpp index 7d83972c829dd8fd75312a4929a19f28141b1b6d..f85a3365579a61074d38235cffbb8f582c358b94 100644 --- a/source/engine/graphics/front/engine/Engine.hpp +++ b/source/engine/graphics/front/engine/Engine.hpp @@ -30,6 +30,7 @@ namespace megu { void remove(Priority); std::optional<std::reference_wrapper<const Layer>> get(Priority) const; + std::optional<std::reference_wrapper<const Renderable>> get(const Identifiable &) const; inline bool empty() const {return this->_layers.empty();} inline const std::map<Priority, std::unique_ptr<Layer>> & layers() const {return this->_layers;} diff --git a/source/engine/graphics/front/engine/Layer.hpp b/source/engine/graphics/front/engine/Layer.hpp index a1dbccead8a58e09a502d76f78c6222b7dfd1d82..5b6febabf6437f522ba55db61b002cdb34ae10fc 100644 --- a/source/engine/graphics/front/engine/Layer.hpp +++ b/source/engine/graphics/front/engine/Layer.hpp @@ -37,6 +37,14 @@ namespace megu { this->_objects[priority] = renderable; }*/ + std::optional<std::reference_wrapper<const Renderable>> get(const Identifiable & id) const { + for(const auto & [priority, object] : this->_objects) { + if(object.id() == id.id()) { + return object; + } + } + } + const Texture & draw(const Window & w, const TextureArray & a) { this->_frameBuffer.bind(); this->_renderer.clear(); diff --git a/source/engine/physic/front/engine/Engine.cpp b/source/engine/physic/front/engine/Engine.cpp index 5b21c127b1eef07b800d8ce5d342e92c10780608..6aa664b5fa088acc05fe41dec8e99f1352318231 100644 --- a/source/engine/physic/front/engine/Engine.cpp +++ b/source/engine/physic/front/engine/Engine.cpp @@ -43,4 +43,24 @@ namespace megu { } } } + + std::optional<std::reference_wrapper<const Tangible>> PhysicEngine::get(const Identifiable & id) const { + for(auto & [priotiy, objects] : this->_statics) { + for(auto & object : objects) { + if(object.get().id() == id.id()) { + return object.get(); + } + } + } + + for(auto & [priotiy, objects] : this->_dynamic) { + for(auto & object : objects) { + if(object.get().id() == id.id()) { + return object.get(); + } + } + } + + return {}; + } } \ No newline at end of file diff --git a/source/engine/physic/front/engine/Engine.hpp b/source/engine/physic/front/engine/Engine.hpp index 79bbabddfd8770c96f7052ccedf8a6fcd8995e19..b1db159b6dec5bd702fa414b79a52301f2d0235d 100644 --- a/source/engine/physic/front/engine/Engine.hpp +++ b/source/engine/physic/front/engine/Engine.hpp @@ -3,6 +3,7 @@ #include <vector> #include <map> #include <set> +#include <optional> #include <engine/physic/front/object/Tangible.hpp> #include <engine/physic/front/object/TangibleStatic.hpp> @@ -24,6 +25,8 @@ namespace megu { void step(double); void step(double, Priority); + std::optional<std::reference_wrapper<const Tangible>> get(const Identifiable &) const; + inline void clearCollision() {this->_collisions.clear();} const std::set<Collision, reference_sorter<Collision>> & collision() const {return this->_collisions;} diff --git a/source/kernel/back/engine/Engine.hpp b/source/kernel/back/engine/Engine.hpp index 6a8111da165ae67641792c5f2dea5ba548ff0f88..b69f67fff6e3c5c7be5293da146c8f3e7ecd08d2 100644 --- a/source/kernel/back/engine/Engine.hpp +++ b/source/kernel/back/engine/Engine.hpp @@ -4,7 +4,7 @@ namespace megu::kernel { class Props; class Kernel; - template <class T, class C> + template <class T, class C, class O> class Engine { public: virtual void boot(Kernel &) = 0; @@ -12,6 +12,7 @@ namespace megu::kernel { virtual void step(Kernel &, double) = 0; virtual T & get() = 0; + virtual const O & get(const C &) const = 0; virtual void add(Kernel &, C &) = 0; }; diff --git a/source/kernel/back/engine/GraphicEngine.cpp b/source/kernel/back/engine/GraphicEngine.cpp index 314f19b55e312e7860d3d1a8c2e22281072c534a..2ee0f7050a72b4fede19cae10e8b7e34f06156cf 100644 --- a/source/kernel/back/engine/GraphicEngine.cpp +++ b/source/kernel/back/engine/GraphicEngine.cpp @@ -4,12 +4,10 @@ namespace megu::kernel { GraphicEngine::GraphicEngine(Window & window) - : _engine(window), _renderer(360, 360), _tmp_ta("assets/textures/Tile_Test_3.png", 1, 1, 32.f) {} + : _engine(window), _renderer(360, 360) {} void GraphicEngine::boot(Kernel &) { this->_engine.push(0, this->_renderer); - - //this->_engine.push(0, 0, this->_tmp_ta, &this->_tmp_mod); } void GraphicEngine::stop(Kernel &) { @@ -23,4 +21,12 @@ namespace megu::kernel { void GraphicEngine::add(Kernel & kernel, Graphical<GraphicEngine> & graphical) { graphical.apply(kernel, *this); } + + const Renderable & GraphicEngine::get(const Graphical<GraphicEngine> & graphical) const { + auto object = this->_engine.get(graphical); + if(object.has_value()) { + return object.value(); + } + throw std::runtime_error("Cannot find in physic object : " + graphical.id()); + } } \ No newline at end of file diff --git a/source/kernel/back/engine/GraphicEngine.hpp b/source/kernel/back/engine/GraphicEngine.hpp index 885d7a5705834f9a3d0bea2f1011e34612b9cc0d..41d8546172642a711035f6f5920a9db5fc32f471 100644 --- a/source/kernel/back/engine/GraphicEngine.hpp +++ b/source/kernel/back/engine/GraphicEngine.hpp @@ -13,17 +13,19 @@ #include <kernel/back/props/Graphical.hpp> namespace megu::kernel { - class GraphicEngine : public Engine<megu::GraphicEngine, Graphical<GraphicEngine>> { + class GraphicEngine : public Engine<megu::GraphicEngine, Graphical<GraphicEngine>, Renderable> { public: GraphicEngine(Window &); + inline megu::GraphicEngine & get() {return this->_engine;} + void boot(Kernel &) override; void stop(Kernel &) override; void step(Kernel &, double) override; void add(Kernel &, Graphical<GraphicEngine> &) override; - inline megu::GraphicEngine & get() {return this->_engine;} + const megu::Renderable & get(const Graphical<GraphicEngine> &) const override; inline const megu::GraphicEngine & engine() const {return this->_engine;} inline const megu::Renderer & renderer() const {return this->_renderer;} @@ -31,8 +33,5 @@ namespace megu::kernel { private: megu::GraphicEngine _engine; megu::Renderer _renderer; - - megu::TileArray _tmp_ta; - megu::TileArray_Module _tmp_mod; }; } \ No newline at end of file diff --git a/source/kernel/back/engine/PhysicEngine.cpp b/source/kernel/back/engine/PhysicEngine.cpp index f6794078c0a360275492f7e18464df4b44bb9db5..25e1c3ae57883f723fb61113a178647d3f65d26a 100644 --- a/source/kernel/back/engine/PhysicEngine.cpp +++ b/source/kernel/back/engine/PhysicEngine.cpp @@ -21,4 +21,13 @@ namespace megu::kernel { void PhysicEngine::add(Kernel & kernel, Physical<PhysicEngine> & props) { props.apply(kernel, *this); } + + const megu::Tangible & PhysicEngine::get(const Physical<PhysicEngine> & props) const { + auto tangible = this->_engine.get(props); + if(tangible.has_value()) { + return tangible.value(); + } + throw std::runtime_error("Cannot find in physic object : " + props.id()); + + } } \ No newline at end of file diff --git a/source/kernel/back/engine/PhysicEngine.hpp b/source/kernel/back/engine/PhysicEngine.hpp index d1c100f92d4360b6bacdc8352c70c2b1bce737e0..38919d9583c54140134e9884d1bc475b1cd3e534 100644 --- a/source/kernel/back/engine/PhysicEngine.hpp +++ b/source/kernel/back/engine/PhysicEngine.hpp @@ -6,17 +6,19 @@ #include <kernel/back/props/Physical.hpp> namespace megu::kernel { - class PhysicEngine : public Engine<megu::PhysicEngine, Physical<PhysicEngine>> { + class PhysicEngine : public Engine<megu::PhysicEngine, Physical<PhysicEngine>, Tangible> { public: PhysicEngine(); + inline megu::PhysicEngine & get() override {return this->_engine;} + void boot(Kernel &) override; void stop(Kernel &) override; void step(Kernel &, double) override; void add(Kernel &, Physical<PhysicEngine> &) override; - inline megu::PhysicEngine & get() override {return this->_engine;} + const megu::Tangible & get(const Physical<PhysicEngine> &) const override; private: megu::PhysicEngine _engine; diff --git a/source/kernel/back/props/Component.hpp b/source/kernel/back/props/Component.hpp index 229e22b780900b4b35f8f81dc64907443ae47eff..2a3538ab0b5f27f0d138bad4909da08c8c93e00c 100644 --- a/source/kernel/back/props/Component.hpp +++ b/source/kernel/back/props/Component.hpp @@ -1,12 +1,13 @@ #pragma once #include <kernel/back/engine/Engine.hpp> +#include <utility/Identifiable.hpp> namespace megu::kernel { class Kernel; template <class E> - class Component { + class Component : public virtual Identifiable { public: virtual void apply(Kernel & k, E &) = 0; }; diff --git a/source/kernel/back/props/Physical.hpp b/source/kernel/back/props/Physical.hpp index df8505630795306452f329b01c3af7f741a7da0f..92d17ce587f14bd678b1acf8f7e197c93edee22f 100644 --- a/source/kernel/back/props/Physical.hpp +++ b/source/kernel/back/props/Physical.hpp @@ -9,8 +9,8 @@ namespace megu::kernel { template <class Pe> class Physical : public Component<Pe> { public: - virtual void on_collide(double, const Identifiable &, Physical &) = 0; + virtual void on_collide(const Kernel &, const Pe &, Physical &, double) = 0; - using CollideLambda = std::function<void(double, const Identifiable &, Physical &)>; + using CollideLambda = std::function<void(const Kernel &, const Pe &, const Physical &, double)>; }; } \ No newline at end of file diff --git a/source/kernel/front/Kernel.cpp b/source/kernel/front/Kernel.cpp index e5ab814bdf790cd1e0af09d2d9f59256fab45a48..84cd925eb218d45048fd9056c2800a3af6290099 100644 --- a/source/kernel/front/Kernel.cpp +++ b/source/kernel/front/Kernel.cpp @@ -13,15 +13,15 @@ namespace megu::kernel { } void Kernel::step() { - double delta = Window::Time(); + double time = Window::Time(); if(this->_window.isOpen()) { - this->_gEngine.step(*this, delta); - this->_gResolver.resolve(delta, this->_gEngine, this->_props); + this->_gEngine.step(*this, time); + this->_gResolver.resolve(*this, this->_gEngine, time); } - this->_pEngine.step(*this, delta); - this->_pResolver.resolve(delta, this->_pEngine, this->_props); + this->_pEngine.step(*this, time); + this->_pResolver.resolve(*this, this->_pEngine, time); } void Kernel::add(Props * props) { @@ -29,11 +29,13 @@ namespace megu::kernel { auto * pComponent = props->getPhysicComponent(); if(pComponent != nullptr) { this->_pEngine.add(*this, *pComponent); + this->_pResolver.add(*pComponent); } auto * gComponent = props->getGraphicComponent(); if(gComponent != nullptr) { this->_gEngine.add(*this, *gComponent); + this->_gResolver.add(*gComponent); } } } \ No newline at end of file diff --git a/source/kernel/front/Kernel.hpp b/source/kernel/front/Kernel.hpp index 7ba3eac435a1fd42794e441659b2f28ac988463f..6a89a5063d744501372ac2bbc15fbebebb1e44cd 100644 --- a/source/kernel/front/Kernel.hpp +++ b/source/kernel/front/Kernel.hpp @@ -22,6 +22,9 @@ namespace megu::kernel { inline Identifiable_Map<Props> & props() {return this->_props;} + inline PhysicEngine & getPhysicEngine() {return this->_pEngine;} + inline GraphicEngine & getGraphicEngine() {return this->_gEngine;} + private: Window & _window; diff --git a/source/kernel/front/component/physic/Fixed.cpp b/source/kernel/front/component/physic/Fixed.cpp index f96705912082f42c1d3adaac2fc2ec4a0e2000ef..e981a4234a7eacbcbcfcab7f4a170bda4c66c41f 100644 --- a/source/kernel/front/component/physic/Fixed.cpp +++ b/source/kernel/front/component/physic/Fixed.cpp @@ -12,9 +12,9 @@ namespace megu::kernel { } } - void Fixed::on_collide(double time, const Identifiable & identifiable, Physical<PhysicEngine> & physical) { + void Fixed::on_collide(const Kernel & kernel, const PhysicEngine & engine, Physical & physical, double time) { if(this->_collide != nullptr) { - this->_collide(time, identifiable, physical); + this->_collide(kernel, engine, physical, time); } } diff --git a/source/kernel/front/component/physic/Fixed.hpp b/source/kernel/front/component/physic/Fixed.hpp index e40d35ef8b96d7b228cd65df0b416cbe61cd828d..9439be8a1cda62037de3440aff74cc4bf191478e 100644 --- a/source/kernel/front/component/physic/Fixed.hpp +++ b/source/kernel/front/component/physic/Fixed.hpp @@ -13,7 +13,7 @@ namespace megu::kernel { Fixed(float x, float y, float w, float h); void update_physic(double) const override; - void on_collide(double, const Identifiable &, Physical<PhysicEngine> &) override; + void on_collide(const Kernel &, const PhysicEngine &, Physical &, double) override; void apply(Kernel & k, PhysicEngine &) override; void setCollideLambda(const CollideLambda &); diff --git a/source/kernel/front/component/physic/FixedArray.cpp b/source/kernel/front/component/physic/FixedArray.cpp new file mode 100644 index 0000000000000000000000000000000000000000..7482b8daf87be9e443040387d46f2d6c7b477d45 --- /dev/null +++ b/source/kernel/front/component/physic/FixedArray.cpp @@ -0,0 +1,37 @@ +#include "FixedArray.hpp" + +#include <kernel/front/Kernel.hpp> + +namespace megu::kernel { + std::optional<std::reference_wrapper<const TangibleStatic>> FixedArray::at(const Position & position) const { + if(this->_tangibles.contains(position)) { + return this->_tangibles.at(position); + } + return {}; + } + + void FixedArray::push(const Fixed & tangible) { + this->_tangibles.insert({tangible.getPosition(), tangible}); + } + + void FixedArray::erase(const Fixed & tangible) { + this->_tangibles.erase(tangible.getPosition()); + } + + void FixedArray::erase(const Position & position) { + this->_tangibles.erase(position); + } + + void FixedArray::on_collide(const Kernel & kernel, const PhysicEngine & engine, Physical & physical, double time) { + auto & tangible = engine.get(physical); + for(auto & [position, fixed] : this->_tangibles) { + if(fixed.isColliding(tangible)) { + physical.on_collide(kernel, engine, fixed, time); + } + } + } + + void FixedArray::apply(Kernel & kernel, PhysicEngine & engine) { + engine.get().push(0, *this); + } +} \ No newline at end of file diff --git a/source/kernel/front/component/physic/FixedArray.hpp b/source/kernel/front/component/physic/FixedArray.hpp new file mode 100644 index 0000000000000000000000000000000000000000..473b06ba38213184153cbacd95ff1519881927d2 --- /dev/null +++ b/source/kernel/front/component/physic/FixedArray.hpp @@ -0,0 +1,27 @@ +#pragma once + +#include <kernel/back/props/Physical.hpp> +#include <kernel/back/engine/PhysicEngine.hpp> +#include <vector> +#include <functional> + +#include "Fixed.hpp" + +namespace megu::kernel { + class FixedArray : public Physical<PhysicEngine>, public TangibleStatic { + public: + std::optional<std::reference_wrapper<const TangibleStatic>> at(const Position &) const; + + void push(const Fixed &); + void erase(const Fixed &); + void erase(const Position &); + + void on_collide(const Kernel &, const PhysicEngine &, Physical &, double) override; + void apply(Kernel & k, PhysicEngine &) override; + + private: + std::map<Position, Fixed> _tangibles; + CollideLambda _collide; + UpdateLambda _update; + }; +} \ No newline at end of file diff --git a/source/kernel/front/component/physic/Movable.cpp b/source/kernel/front/component/physic/Movable.cpp index 01292d3b2eaaccda48158cb12ef9e6c6940d7ec4..0fd7504d963f0d1fbbaed76c1a7853a7d881446a 100644 --- a/source/kernel/front/component/physic/Movable.cpp +++ b/source/kernel/front/component/physic/Movable.cpp @@ -10,9 +10,9 @@ namespace megu::kernel { } } - void Movable::on_collide(double time, const Identifiable & identifiable, Physical<PhysicEngine> & physical) { + void Movable::on_collide(const Kernel & kernel, const PhysicEngine & engine, Physical & physical, double time) { if(this->_collide != nullptr) { - this->_collide(time, identifiable, physical); + this->_collide(kernel, engine, physical, time); } } diff --git a/source/kernel/front/component/physic/Movable.hpp b/source/kernel/front/component/physic/Movable.hpp index 48fd9078c72de360d0084c3e64109ae272d6d04f..f74c85b15059d12dade4c44e1b3b8816491a8ecc 100644 --- a/source/kernel/front/component/physic/Movable.hpp +++ b/source/kernel/front/component/physic/Movable.hpp @@ -13,7 +13,7 @@ namespace megu::kernel { Movable(float x, float y, float w, float h); void update_physic(double) override; - void on_collide(double, const Identifiable &, Physical<PhysicEngine> &) override; + void on_collide(const Kernel &, const PhysicEngine &, Physical &, double) override; void apply(Kernel & k, PhysicEngine &) override; void setCollideLambda(CollideLambda &); diff --git a/source/kernel/front/resolver/GraphicResolver.cpp b/source/kernel/front/resolver/GraphicResolver.cpp index a436473b2ebb63e9038db28a2b339de239f8b3f4..b0c2f457d0771486b54e4330ef132f6b7800f3ae 100644 --- a/source/kernel/front/resolver/GraphicResolver.cpp +++ b/source/kernel/front/resolver/GraphicResolver.cpp @@ -1,12 +1,9 @@ #include "GraphicResolver.hpp" namespace megu::kernel { - void GraphicResolver::resolve(double time, GraphicEngine &, const Identifiable_Map<Props> & props) { - for(auto & [id, object] : props) { - auto * component = object->getGraphicComponent(); - if(component != nullptr) { - component->update(time); - } + void GraphicResolver::resolve(Kernel & kernel, GraphicEngine & engine, double time) { + for(auto & component : this->components()) { + component.get().update(time); } } } \ No newline at end of file diff --git a/source/kernel/front/resolver/GraphicResolver.hpp b/source/kernel/front/resolver/GraphicResolver.hpp index e1fe0ea8ae92514df0178b1028489df46e553c54..7e2b54131757d688e6df70575aba411c63f5eec7 100644 --- a/source/kernel/front/resolver/GraphicResolver.hpp +++ b/source/kernel/front/resolver/GraphicResolver.hpp @@ -5,8 +5,8 @@ #include <kernel/back/props/Props.hpp> namespace megu::kernel { - class GraphicResolver : public Resolver<GraphicEngine, Props> { + class GraphicResolver : public Resolver<GraphicEngine, Graphical<GraphicEngine>> { public: - void resolve(double, GraphicEngine &, const Identifiable_Map<Props> &) override; + void resolve(Kernel &, GraphicEngine &, double) override; }; } \ No newline at end of file diff --git a/source/kernel/front/resolver/PhysicResolver.cpp b/source/kernel/front/resolver/PhysicResolver.cpp index 81ed40e42b57c13571647a6d60389821c54ac8e7..f2b5431512eda627e67c9591ed951330c7075c2c 100644 --- a/source/kernel/front/resolver/PhysicResolver.cpp +++ b/source/kernel/front/resolver/PhysicResolver.cpp @@ -1,24 +1,15 @@ #include "PhysicResolver.hpp" namespace megu::kernel { - void PhysicResolver::resolve(double time, PhysicEngine & engine, const Identifiable_Map<Props> & props) { + void PhysicResolver::resolve(Kernel & kernel, PhysicEngine & engine, double time) { auto & collisions = engine.get().collision(); for(auto & collision : collisions) { - const Tangible & source = collision.source(); - const Tangible & target = collision.target(); + auto source_comp = this->get(collision.source()); + auto target_comp = this->get(collision.target()); - if(props.contains(source.id()) && props.contains(target.id())) { - Props * props_source = props.at(source.id()); - Props * props_target = props.at(target.id()); - - auto * sComponent = props_source->getPhysicComponent(); - auto * tComponent = props_target->getPhysicComponent(); - - if(sComponent != nullptr && tComponent != nullptr) { - sComponent->on_collide(time, target, *tComponent); - } - + if(source_comp.has_value() && target_comp.has_value()) { + source_comp.value().get().on_collide(kernel, engine, target_comp.value().get(), time); } } diff --git a/source/kernel/front/resolver/PhysicResolver.hpp b/source/kernel/front/resolver/PhysicResolver.hpp index 0cd194d649ec522bdfd2f63e09c606aac35a32fa..349c6de7ea426d426e2e56417a48acaa4c3cb7f9 100644 --- a/source/kernel/front/resolver/PhysicResolver.hpp +++ b/source/kernel/front/resolver/PhysicResolver.hpp @@ -5,8 +5,8 @@ #include <kernel/back/props/Props.hpp> namespace megu::kernel { - class PhysicResolver : public Resolver<PhysicEngine, Props> { + class PhysicResolver : public Resolver<PhysicEngine, Physical<PhysicEngine>> { public: - void resolve(double, PhysicEngine &, const Identifiable_Map<Props> &) override; + void resolve(Kernel &, PhysicEngine &, double) override; }; } \ No newline at end of file diff --git a/source/kernel/front/resolver/Resolver.hpp b/source/kernel/front/resolver/Resolver.hpp index d7484afdda030c0de6ca3646b87d6b296ed3a980..35b4732383d513041f05ccab6b0d9e01e8a92b66 100644 --- a/source/kernel/front/resolver/Resolver.hpp +++ b/source/kernel/front/resolver/Resolver.hpp @@ -1,11 +1,25 @@ #pragma once #include <utility/Identifiable.hpp> +#include <kernel/back/props/Component.hpp> +#include <engine/utility/ref_set.hpp> +#include <optional> namespace megu::kernel { template <class E, class O> class Resolver { public: - virtual void resolve(double, E &, const Identifiable_Map<O> &) = 0; + inline ref_set<O> & components() {return this->_components;} + + void add(O &); + void erase(const Identifiable &); + std::optional<std::reference_wrapper<O>> get(const Identifiable &); + + virtual void resolve(Kernel &, E &, double) = 0; + + private: + ref_set<O> _components; }; -} \ No newline at end of file +} + +#include "Resolver.tpp" \ No newline at end of file diff --git a/source/kernel/front/resolver/Resolver.tpp b/source/kernel/front/resolver/Resolver.tpp new file mode 100644 index 0000000000000000000000000000000000000000..0a4beb034b0a5519fe55b6a961d0b3e9fc7b8aed --- /dev/null +++ b/source/kernel/front/resolver/Resolver.tpp @@ -0,0 +1,23 @@ +#include "Resolver.hpp" + +namespace megu::kernel { + template <class E, class O> + void Resolver<E, O>::add(O & c) { + this->_components.insert(c); + } + + template <class E, class O> + void Resolver<E, O>::erase(const Identifiable & c) { + this->_components.erase(c); + } + + template <class E, class O> + std::optional<std::reference_wrapper<O>> Resolver<E, O>::get(const Identifiable & c) { + for(auto & comp : this->_components) { + if(comp.get().id() == c.id()) { + return comp; + } + } + return {}; + } +} \ No newline at end of file