MayaFlux 0.4.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches
Tapestry.cpp
Go to the documentation of this file.
1#include "Tapestry.hpp"
2
6
7namespace MayaFlux::Nexus {
8
10 std::shared_ptr<Vruta::TaskScheduler> scheduler,
11 std::shared_ptr<Vruta::EventManager> event_manager)
12 : m_scheduler(std::move(scheduler))
13 , m_event_manager(std::move(event_manager))
14{
15}
16
17Tapestry::~Tapestry() = default;
18
19std::shared_ptr<Fabric> Tapestry::create_fabric(float cell_size)
20{
21 auto fabric = std::make_shared<Fabric>(*m_scheduler, *m_event_manager, cell_size);
22 fabric->set_id(m_next_id++);
23 m_fabrics.push_back(fabric);
24 return fabric;
25}
26
27std::shared_ptr<Fabric> Tapestry::create_fabric(std::string name, float cell_size)
28{
29 if (m_named_fabrics.contains(name)) {
31 "Tapestry::create_fabric: name '{}' already registered, returning existing", name);
32 return m_named_fabrics[name].lock();
33 }
34
35 auto fabric = std::make_shared<Fabric>(*m_scheduler, *m_event_manager, cell_size);
36 fabric->set_id(m_next_id++);
37 fabric->set_name(name);
38 m_fabrics.push_back(fabric);
39 m_named_fabrics.emplace(std::move(name), fabric);
40 return fabric;
41}
42
43void Tapestry::remove_fabric(const std::shared_ptr<Fabric>& fabric)
44{
45 auto it = std::ranges::find(m_fabrics, fabric);
46 if (it == m_fabrics.end()) {
47 return;
48 }
49 m_fabrics.erase(it);
50
51 for (auto nit = m_named_fabrics.begin(); nit != m_named_fabrics.end();) {
52 if (nit->second.lock() == fabric) {
53 nit = m_named_fabrics.erase(nit);
54 } else {
55 ++nit;
56 }
57 }
58}
59
60void Tapestry::remove_fabric(std::string_view name)
61{
62 auto nit = m_named_fabrics.find(std::string(name));
63 if (nit == m_named_fabrics.end()) {
64 return;
65 }
66 auto fabric = nit->second.lock();
67 m_named_fabrics.erase(nit);
68 if (fabric) {
69 std::erase(m_fabrics, fabric);
70 }
71}
72
73std::shared_ptr<Fabric> Tapestry::get_fabric(std::string_view name) const
74{
75 auto it = m_named_fabrics.find(std::string(name));
76 return it != m_named_fabrics.end() ? it->second.lock() : nullptr;
77}
78
79const std::vector<std::shared_ptr<Fabric>>& Tapestry::all_fabrics() const
80{
81 return m_fabrics;
82}
83
84std::shared_ptr<Expanse> Tapestry::create_expanse(
85 std::string name,
86 Expanse::ContainsFn contains,
87 Expanse::CrossingFn on_enter,
88 Expanse::CrossingFn on_exit)
89{
90 auto expanse = std::make_shared<Expanse>(
91 name,
92 std::move(contains),
93 std::move(on_enter),
94 std::move(on_exit));
95 m_expanses.emplace(std::move(name), expanse);
96 return expanse;
97}
98
99std::shared_ptr<Expanse> Tapestry::get_expanse(std::string_view name) const
100{
101 auto it = m_expanses.find(std::string(name));
102 return it != m_expanses.end() ? it->second : nullptr;
103}
104
105void Tapestry::remove_expanse(std::string_view name)
106{
107 m_expanses.erase(std::string(name));
108}
109
111{
112 for (auto& fabric : m_fabrics) {
113 fabric->commit();
114 }
115}
116
117} // namespace MayaFlux::Nexus
#define MF_WARN(comp, ctx,...)
std::function< void(uint32_t)> CrossingFn
Definition Expanse.hpp:34
std::function< bool(const glm::vec3 &)> ContainsFn
Definition Expanse.hpp:33
std::vector< std::shared_ptr< Fabric > > m_fabrics
Definition Tapestry.hpp:128
Tapestry(std::shared_ptr< Vruta::TaskScheduler > scheduler, std::shared_ptr< Vruta::EventManager > event_manager)
Construct with shared scheduler and event manager.
Definition Tapestry.cpp:9
void remove_fabric(const std::shared_ptr< Fabric > &fabric)
Remove a Fabric by pointer.
Definition Tapestry.cpp:43
void remove_expanse(std::string_view name)
Remove Tapestry's owning reference to a named Expanse.
Definition Tapestry.cpp:105
std::unordered_map< std::string, std::shared_ptr< Expanse > > m_expanses
Definition Tapestry.hpp:130
std::shared_ptr< Fabric > get_fabric(std::string_view name) const
Look up a named Fabric.
Definition Tapestry.cpp:73
std::shared_ptr< Expanse > create_expanse(std::string name, Expanse::ContainsFn contains, Expanse::CrossingFn on_enter, Expanse::CrossingFn on_exit)
Create and register a named Expanse.
Definition Tapestry.cpp:84
std::shared_ptr< Vruta::EventManager > m_event_manager
Definition Tapestry.hpp:126
const std::vector< std::shared_ptr< Fabric > > & all_fabrics() const
All woven Fabrics, named and unnamed.
Definition Tapestry.cpp:79
std::shared_ptr< Expanse > get_expanse(std::string_view name) const
Look up a named Expanse.
Definition Tapestry.cpp:99
void commit_all()
Commit all woven Fabrics in insertion order.
Definition Tapestry.cpp:110
std::shared_ptr< Fabric > create_fabric(float cell_size=1.0F)
create_fabric a new unnamed Fabric into the Tapestry.
Definition Tapestry.cpp:19
std::shared_ptr< Vruta::TaskScheduler > m_scheduler
Definition Tapestry.hpp:125
std::unordered_map< std::string, std::weak_ptr< Fabric > > m_named_fabrics
Definition Tapestry.hpp:129
@ Init
Engine/subsystem initialization.
@ Nexus
Spatial indexing and scheduling for user-defined behaviour.