MayaFlux 1.0.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,
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 return claim(std::move(name), std::move(expanse));
96}
97
98std::shared_ptr<Expanse> Tapestry::create_expanse(
99 std::string name,
101{
102 return create_expanse(std::move(name), std::move(contains), {}, {});
103}
104
105std::shared_ptr<Expanse> Tapestry::create_expanse(
106 std::string name,
107 const Kinesis::AABB3D& bounds)
108{
109 return claim(std::move(name), std::make_shared<Expanse>(bounds));
110}
111
112std::shared_ptr<Expanse> Tapestry::claim(std::string name, std::shared_ptr<Expanse> expanse)
113{
114 const auto [it, inserted] = m_expanses.try_emplace(std::move(name), std::move(expanse));
115 if (!inserted) {
117 "Tapestry::create_expanse: name '{}' already registered, returning existing", it->first);
118 }
119 return it->second;
120}
121
122std::shared_ptr<Expanse> Tapestry::get_expanse(std::string_view name) const
123{
124 auto it = m_expanses.find(std::string(name));
125 return it != m_expanses.end() ? it->second : nullptr;
126}
127
128void Tapestry::remove_expanse(std::string_view name)
129{
130 m_expanses.erase(std::string(name));
131}
132
134{
135 for (auto& fabric : m_fabrics) {
136 fabric->commit();
137 }
138}
139
140} // namespace MayaFlux::Nexus
#define MF_WARN(comp, ctx,...)
Expanse::ContainsFn contains
Definition Decoder.cpp:517
Expanse::CrossingFn on_enter
Definition Decoder.cpp:518
Expanse::CrossingFn on_exit
Definition Decoder.cpp:519
std::string name
Definition VKDevice.cpp:123
std::function< void(uint32_t)> CrossingFn
Definition Expanse.hpp:58
std::function< bool(const glm::vec3 &)> ContainsFn
Definition Expanse.hpp:57
std::vector< std::shared_ptr< Fabric > > m_fabrics
Definition Tapestry.hpp:168
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:128
std::unordered_map< std::string, std::shared_ptr< Expanse > > m_expanses
Definition Tapestry.hpp:170
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:166
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:122
void commit_all()
Commit all woven Fabrics in insertion order.
Definition Tapestry.cpp:133
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:165
std::unordered_map< std::string, std::weak_ptr< Fabric > > m_named_fabrics
Definition Tapestry.hpp:169
std::shared_ptr< Expanse > claim(std::string name, std::shared_ptr< Expanse > expanse)
Definition Tapestry.cpp:112
@ Init
Engine/subsystem initialization.
@ Nexus
Spatial indexing and scheduling for user-defined behaviour.
Axis-aligned bounding box in 3D world space.
Definition Bounds.hpp:188