MayaFlux 0.1.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches
NodeBindingsProcessor.cpp
Go to the documentation of this file.
3
5
6namespace MayaFlux::Buffers {
7
9 const std::string& name,
10 const std::shared_ptr<Nodes::Node>& node,
11 uint32_t offset,
12 size_t size)
13{
14 m_bindings[name] = NodeBinding { .node = node, .push_constant_offset = offset, .size = size };
15}
16
17void NodeBindingsProcessor::unbind_node(const std::string& name)
18{
19 m_bindings.erase(name);
20}
21
22bool NodeBindingsProcessor::has_binding(const std::string& name) const
23{
24 return m_bindings.contains(name);
25}
26
27std::vector<std::string> NodeBindingsProcessor::get_binding_names() const
28{
29 std::vector<std::string> names;
30 names.reserve(m_bindings.size());
31 for (const auto& [name, _] : m_bindings) {
32 names.push_back(name);
33 }
34 return names;
35}
36
39 const std::shared_ptr<VKBuffer>& buffer)
40{
42
44}
45
47{
48 if (m_bindings.empty()) {
50 "No node bindings configured for NodeBindingsProcessor");
51 return;
52 }
53
54 auto& pc_data = get_push_constant_data();
55
56 for (auto& [name, binding] : m_bindings) {
57
58 if (!binding.node) {
60 "Node binding '{}' has null node", name);
61 continue;
62 }
63 double value {};
64 uint32_t state = binding.node->m_state.load();
65
66 if (state == Utils::NodeState::INACTIVE) {
67 value = binding.node->process_sample();
68 } else {
69 binding.node->save_state();
70 value = binding.node->process_sample();
71 binding.node->restore_state();
72 }
73
74 if (binding.size == sizeof(float)) {
75 auto float_val = static_cast<float>(value);
76 std::memcpy(
77 pc_data.data() + binding.push_constant_offset,
78 &float_val,
79 sizeof(float));
80 } else if (binding.size == sizeof(double)) {
81 std::memcpy(
82 pc_data.data() + binding.push_constant_offset,
83 &value,
84 sizeof(double));
85 }
86 }
87}
88
89} // namespace MayaFlux::Buffers
#define MF_RT_ERROR(comp, ctx,...)
#define MF_WARN(comp, ctx,...)
void on_before_dispatch(Portal::Graphics::CommandBufferID cmd_id, const std::shared_ptr< VKBuffer > &buffer) override
Hook called before shader dispatch Automatically updates push constants from bound nodes.
bool has_binding(const std::string &name) const
Check if binding exists.
void bind_node(const std::string &name, const std::shared_ptr< Nodes::Node > &node, uint32_t offset, size_t size=sizeof(float))
Bind node output to push constant offset.
std::unordered_map< std::string, NodeBinding > m_bindings
void unbind_node(const std::string &name)
Remove node binding.
std::vector< std::string > get_binding_names() const
Get all binding names.
const std::vector< uint8_t > & get_push_constant_data() const
Get current push constant data.
virtual void on_before_dispatch(Portal::Graphics::CommandBufferID cmd_id, const std::shared_ptr< VKBuffer > &buffer)
Called before each dispatch.
@ BufferProcessing
Buffer processing (Buffers::BufferManager, processing chains)
@ Buffers
Buffers, Managers, processors and processing chains.
@ INACTIVE
Engine is not processing this node.
Definition Utils.hpp:29